Hopper Single GPU Attestation Example#
This page provides a complete, canonical example of attestation for a single NVIDIA Hopper H100 GPU in Confidential Computing mode.
Prerequisite#
Before starting, ensure you have completed the Installation Guide.
Performing Remote Attestation with SDK#
Attest#
For a complete example script, refer to the RemoteGPUTest.py file in the nvtrust repository.
from nv_attestation_sdk import attestation
# Create attestation client
client = attestation.Attestation()
# Set API key (if not set via environment variable)
client.set_service_key("YOUR_API_KEY")
# Add remote GPU verifier
NRAS_URL = "https://nras.attestation.nvidia.com/v4/attest/gpu"
client.add_verifier(attestation.Devices.GPU, attestation.Environment.REMOTE, NRAS_URL, "")
# Get evidence and perform attestation
evidence_list = client.get_evidence()
result = client.attest(evidence_list)
# Get the attestation token (JWT Format)
token = client.get_token()
print("[RemoteGPUTest] token : " + str(token))
# Decode the token
client.decode_token(token)
Example NRAS Token#
The token is in JWT (JSON Web Token) format with EAT (Entity Attestation Token) claims:
Show token (JWT)
[
[
"JWT", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJOVi1BdHRlc3RhdGlvbi1TREsiLCJpYXQiOjE3NjEyODU0ODgsImV4cCI6MTc2MTI4OTA4OCwibmJmIjoxNzYxMjg1MzY4LCJqdGkiOiI1YWQ2M2NlNC1iYTk3LTQ5NzYtOThmZi04ZDgyMDI3NGNhY2YifQ.KmNy9wu2H3eNpliBadX58zdAeAVYP7jQscg_azPc7n4"
],
{
"REMOTE_GPU_CLAIMS":
[
[
"JWT", "eyJraWQiOiJudi1lYXQta2lkLXN0Zy0yMDI1MTAyMzA3NDcyMzk1MS1hZTk1ZWY5ZS0wMTUzLTQ3ZDUtOTEyNy00ZjkwMTU1MTI2Y2YiLCJhbGciOiJFUzM4NCJ9.eyJzdWIiOiJOVklESUEtUExBVEZPUk0tQVRURVNUQVRJT04iLCJ4LW52aWRpYS12ZXIiOiIzLjAiLCJuYmYiOjE3NjEyODU0ODcsImlzcyI6Imh0dHBzOi8vbnJhcy5hdHRlc3RhdGlvbi1zdGcubnZpZGlhLmNvbSIsIngtbnZpZGlhLW92ZXJhbGwtYXR0LXJlc3VsdCI6dHJ1ZSwic3VibW9kcyI6eyJHUFUtMCI6WyJESUdFU1QiLFsiU0hBLTI1NiIsImIwOWE2MzkwNTM0NDYzYjJhZjIyMTg1NDBlNmI2ZGE2MDRmMGUwMzEwNWY5NTI2ODlhOGU5NzdmYTM0MjBjYTUiXV19LCJlYXRfbm9uY2UiOiI5MzFkOGRkMGFkZDIwM2FjM2Q4YjRmYmRlNzVlMTE1Mjc4ZWVmY2RjZWFjNWI4NzY3MWE3NDhmMzIzNjRkZmNiIiwiZXhwIjoxNzYxMjg5MDg3LCJpYXQiOjE3NjEyODU0ODcsImp0aSI6ImRkZmIwMjQ0LWI4YTMtNDdjMS04NWJjLTUxMDQ1MTYyZTY0MCJ9.QpluUrkJkS9owNGB7KCYcchfChdhYrg_Wln4bx53iwAKFU_6zHDUf_iIie8v8aLWEWD0ERGWHJZ5YyUrsJ_ELzam9ZQpiOsLqDvpaUq9FnpUGFvU6o8XdHymhZYOwg3t"
],
{
"GPU-0": "eyJraWQiOiJudi1lYXQta2lkLXN0Zy0yMDI1MTAyMzA3NDcyMzk1MS1hZTk1ZWY5ZS0wMTUzLTQ3ZDUtOTEyNy00ZjkwMTU1MTI2Y2YiLCJhbGciOiJFUzM4NCJ9.eyJ4LW52aWRpYS1ncHUtZHJpdmVyLXJpbS1zY2hlbWEtdmFsaWRhdGVkIjp0cnVlLCJpc3MiOiJodHRwczovL25yYXMuYXR0ZXN0YXRpb24tc3RnLm52aWRpYS5jb20iLCJlYXRfbm9uY2UiOiI5MzFkOGRkMGFkZDIwM2FjM2Q4YjRmYmRlNzVlMTE1Mjc4ZWVmY2RjZWFjNWI4NzY3MWE3NDhmMzIzNjRkZmNiIiwieC1udmlkaWEtZ3B1LXZiaW9zLXJpbS1zaWduYXR1cmUtdmVyaWZpZWQiOnRydWUsIngtbnZpZGlhLWdwdS12Ymlvcy1yaW0tZmV0Y2hlZCI6dHJ1ZSwiZXhwIjoxNzYxMjg5MDg3LCJ4LW52aWRpYS1ncHUtZHJpdmVyLXJpbS12ZXJzaW9uLW1hdGNoIjp0cnVlLCJpYXQiOjE3NjEyODU0ODcsInVlaWQiOiI1Mzc2MDUyNjQwMTkzNTk1ODc3NDExMjQyMjU1MzE0OTEyNzYxNTI2MjI3NTMyODMiLCJqdGkiOiI4NGNhMzYyZC0zMDkxLTQzYjktYmFlZS0zMmZmMDlkMjcyOTAiLCJ4LW52aWRpYS1ncHUtYXR0ZXN0YXRpb24tcmVwb3J0LW5vbmNlLW1hdGNoIjp0cnVlLCJ4LW52aWRpYS1ncHUtdmJpb3MtaW5kZXgtbm8tY29uZmxpY3QiOnRydWUsInNlY2Jvb3QiOnRydWUsIngtbnZpZGlhLWdwdS1kcml2ZXItcmltLWNlcnQtY2hhaW4iOnsieC1udmlkaWEtY2VydC1zdGF0dXMiOiJ2YWxpZCIsIngtbnZpZGlhLWNlcnQtb2NzcC1zdGF0dXMiOiJnb29kIiwieC1udmlkaWEtY2VydC1leHBpcmF0aW9uLWRhdGUiOiIyMDI3LTAyLTE2VDE5OjU3OjI0WiIsIngtbnZpZGlhLWNlcnQtcmV2b2NhdGlvbi1yZWFzb24iOm51bGx9LCJ4LW52aWRpYS1ncHUtdmJpb3MtcmltLWNlcnQtY2hhaW4iOnsieC1udmlkaWEtY2VydC1zdGF0dXMiOiJ2YWxpZCIsIngtbnZpZGlhLWNlcnQtb2NzcC1zdGF0dXMiOiJnb29kIiwieC1udmlkaWEtY2VydC1leHBpcmF0aW9uLWRhdGUiOiIyMDI2LTA3LTE1VDIzOjAyOjEwWiIsIngtbnZpZGlhLWNlcnQtcmV2b2NhdGlvbi1yZWFzb24iOm51bGx9LCJ4LW52aWRpYS1ncHUtYXR0ZXN0YXRpb24tcmVwb3J0LXBhcnNlZCI6dHJ1ZSwieC1udmlkaWEtZ3B1LWF0dGVzdGF0aW9uLXJlcG9ydC1jZXJ0LWNoYWluIjp7IngtbnZpZGlhLWNlcnQtc3RhdHVzIjoidmFsaWQiLCJ4LW52aWRpYS1jZXJ0LW9jc3Atc3RhdHVzIjoiZ29vZCIsIngtbnZpZGlhLWNlcnQtZXhwaXJhdGlvbi1kYXRlIjoiOTk5OS0xMi0zMVQyMzo1OTo1OVoiLCJ4LW52aWRpYS1jZXJ0LXJldm9jYXRpb24tcmVhc29uIjpudWxsfSwieC1udmlkaWEtZ3B1LWRyaXZlci1yaW0tc2lnbmF0dXJlLXZlcmlmaWVkIjp0cnVlLCJ4LW52aWRpYS1ncHUtYXJjaC1jaGVjayI6dHJ1ZSwieC1udmlkaWEtZ3B1LXZiaW9zLXJpbS12ZXJzaW9uLW1hdGNoIjp0cnVlLCJ4LW52aWRpYS1hdHRlc3RhdGlvbi13YXJuaW5nIjpudWxsLCJuYmYiOjE3NjEyODU0ODcsIngtbnZpZGlhLWdwdS1kcml2ZXItdmVyc2lvbiI6IjU3NS4yOCIsIngtbnZpZGlhLWdwdS1kcml2ZXItcmltLW1lYXN1cmVtZW50cy1hdmFpbGFibGUiOnRydWUsIngtbnZpZGlhLWdwdS1hdHRlc3RhdGlvbi1yZXBvcnQtc2lnbmF0dXJlLXZlcmlmaWVkIjp0cnVlLCJod21vZGVsIjoiR0gxMDAgQTAxIEdTUCBCUk9NIiwiZGJnc3RhdCI6ImRpc2FibGVkIiwieC1udmlkaWEtZ3B1LWRyaXZlci1yaW0tZmV0Y2hlZCI6dHJ1ZSwieC1udmlkaWEtZ3B1LWF0dGVzdGF0aW9uLXJlcG9ydC1jZXJ0LWNoYWluLWZ3aWQtbWF0Y2giOnRydWUsIm9lbWlkIjoiNTcwMyIsIngtbnZpZGlhLWdwdS12Ymlvcy1yaW0tc2NoZW1hLXZhbGlkYXRlZCI6dHJ1ZSwibWVhc3JlcyI6InN1Y2Nlc3MiLCJ4LW52aWRpYS1ncHUtdmJpb3MtdmVyc2lvbiI6Ijk2LjAwLkFGLjAwLjAxIiwieC1udmlkaWEtZ3B1LXZiaW9zLXJpbS1tZWFzdXJlbWVudHMtYXZhaWxhYmxlIjp0cnVlfQ.DL_i1GEBU5Znz_W8awCxs7TgaSfGYy_W-uGSo1pt0xUAtr-MEexUjoA0x0yjhWZE3fCUa4ekp2ZikdyVabC38MIc4mhrJwFUJJzD5E-VZPLJF1jeSegfbCHz6yK4BwP-"
}
]
}
]
Decoded NRAS Token#
Overall Attestation Claims
{
"sub": "NVIDIA-PLATFORM-ATTESTATION",
"x-nvidia-ver": "3.0",
"nbf": 1761285487,
"iss": "https://nras.attestation.nvidia.com",
"x-nvidia-overall-att-result": true,
"submods": {
"GPU-0": [
"DIGEST",
[
"SHA-256",
"b09a6390534463b2af2218540e6b6da604f0e03105f952689a8e977fa3420ca5"
]
]
},
"eat_nonce": "931d8dd0add203ac3d8b4fbde75e115278eefcdceac5b87671a748f32364dfcb",
"exp": 1761289087,
"iat": 1761285487,
"jti": "ddfb0244-b8a3-47c1-85bc-51045162e640"
}
Remote GPU Claims
{
"x-nvidia-gpu-driver-rim-schema-validated": true,
"iss": "https://nras.attestation.nvidia.com",
"eat_nonce": "931d8dd0add203ac3d8b4fbde75e115278eefcdceac5b87671a748f32364dfcb",
"x-nvidia-gpu-vbios-rim-signature-verified": true,
"x-nvidia-gpu-vbios-rim-fetched": true,
"exp": 1761289087,
"x-nvidia-gpu-driver-rim-version-match": true,
"iat": 1761285487,
"ueid": "537605264019359587741124225531491276152622753283",
"jti": "84ca362d-3091-43b9-baee-32ff09d27290",
"x-nvidia-gpu-attestation-report-nonce-match": true,
"x-nvidia-gpu-vbios-index-no-conflict": true,
"secboot": true,
"x-nvidia-gpu-driver-rim-cert-chain": {
"x-nvidia-cert-status": "valid",
"x-nvidia-cert-ocsp-status": "good",
"x-nvidia-cert-expiration-date": "2027-02-16T19:57:24Z",
"x-nvidia-cert-revocation-reason": null
},
"x-nvidia-gpu-vbios-rim-cert-chain": {
"x-nvidia-cert-status": "valid",
"x-nvidia-cert-ocsp-status": "good",
"x-nvidia-cert-expiration-date": "2026-07-15T23:02:10Z",
"x-nvidia-cert-revocation-reason": null
},
"x-nvidia-gpu-attestation-report-parsed": true,
"x-nvidia-gpu-attestation-report-cert-chain": {
"x-nvidia-cert-status": "valid",
"x-nvidia-cert-ocsp-status": "good",
"x-nvidia-cert-expiration-date": "9999-12-31T23:59:59Z",
"x-nvidia-cert-revocation-reason": null
},
"x-nvidia-gpu-driver-rim-signature-verified": true,
"x-nvidia-gpu-arch-check": true,
"x-nvidia-gpu-vbios-rim-version-match": true,
"x-nvidia-attestation-warning": null,
"nbf": 1761285487,
"x-nvidia-gpu-driver-version": "575.28",
"x-nvidia-gpu-driver-rim-measurements-available": true,
"x-nvidia-gpu-attestation-report-signature-verified": true,
"hwmodel": "GH100 A01 GSP BROM",
"dbgstat": "disabled",
"x-nvidia-gpu-driver-rim-fetched": true,
"x-nvidia-gpu-attestation-report-cert-chain-fwid-match": true,
"oemid": "5703",
"x-nvidia-gpu-vbios-rim-schema-validated": true,
"measres": "success",
"x-nvidia-gpu-vbios-version": "96.00.AF.00.01",
"x-nvidia-gpu-vbios-rim-measurements-available": true
}
Performing Local Attestation with SDK#
Attest#
For a complete example script, refer to the LocalGPUTest.py file in the nvtrust repository.
from nv_attestation_sdk import attestation
# Create attestation client
client = attestation.Attestation()
# Set API key (if not set via environment variable)
client.set_service_key("YOUR_API_KEY")
# Add local GPU verifier
client.add_verifier(attestation.Devices.GPU, attestation.Environment.LOCAL, "", "")
# Get evidence and perform attestation
evidence_list = client.get_evidence()
result = client.attest(evidence_list)
# Get the attestation token
token = client.get_token()
print ("[LocalGPUTest] token : "+str(token))
# Decode the token
client.decode_token(token)
Example Local Verifier Token#
The token is in JWT (JSON Web Token) format with EAT (Entity Attestation Token) claims:
Show token (JWT)
[
[
"JWT", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJOVi1BdHRlc3RhdGlvbi1TREsiLCJpYXQiOjE3NjEyODYzNTksImV4cCI6MTc2MTI4OTk1OSwibmJmIjoxNzYxMjg2MjM5LCJqdGkiOiI3Yjc5MDViNS0xZWQzLTQwNDktOTE5OS1iYWM3ZWNmM2M4ZGIifQ.QFTvCLph963cAJmIInPSe7bqubvpd8l6y5hHc1lGaiM"
],
{
"LOCAL_GPU_CLAIMS":
[
[
"JWT", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJOVklESUEtUExBVEZPUk0tQVRURVNUQVRJT04iLCJuYmYiOjE3NjEyODYyMzksImV4cCI6MTc2MTI4OTk1OSwiaWF0IjoxNzYxMjg2MzU5LCJqdGkiOiI3Y2JjNTY4Yy01ZGZlLTQ1ZWEtOTc0ZS0wMDhlM2U4Y2UzNmQiLCJ4LW52aWRpYS12ZXIiOiIzLjAiLCJpc3MiOiJMT0NBTF9HUFVfVkVSSUZJRVIiLCJ4LW52aWRpYS1vdmVyYWxsLWF0dC1yZXN1bHQiOnRydWUsInN1Ym1vZHMiOnsiR1BVLTAiOlsiRElHRVNUIixbIlNIQTI1NiIsIjdmNGI5NTM3NDAxMzY3M2RjOTg4MjRkNTY0ZGVkNThkMzhjZjE4MDI0MjM4NTA3ZWFmOGY3MWY5Yjc3YTA4ZDIiXV19LCJlYXRfbm9uY2UiOiI5MzFkOGRkMGFkZDIwM2FjM2Q4YjRmYmRlNzVlMTE1Mjc4ZWVmY2RjZWFjNWI4NzY3MWE3NDhmMzIzNjRkZmNiIn0.gNJyW6nt79UgyyTPqz2EG2ztAx9b-bB73msNa2SMpOU"
],
{
"GPU-0": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtZWFzcmVzIjoic3VjY2VzcyIsIngtbnZpZGlhLWdwdS1hcmNoLWNoZWNrIjp0cnVlLCJ4LW52aWRpYS1ncHUtZHJpdmVyLXZlcnNpb24iOiI1NzUuMjgiLCJ4LW52aWRpYS1ncHUtdmJpb3MtdmVyc2lvbiI6Ijk2LjAwLkFGLjAwLjAxIiwieC1udmlkaWEtZ3B1LWF0dGVzdGF0aW9uLXJlcG9ydC1jZXJ0LWNoYWluIjp7IngtbnZpZGlhLWNlcnQtZXhwaXJhdGlvbi1kYXRlIjoiOTk5OS0xMi0zMVQyMzo1OTo1OSIsIngtbnZpZGlhLWNlcnQtc3RhdHVzIjoidmFsaWQiLCJ4LW52aWRpYS1jZXJ0LW9jc3Atc3RhdHVzIjoiZ29vZCIsIngtbnZpZGlhLWNlcnQtcmV2b2NhdGlvbi1yZWFzb24iOm51bGx9LCJ4LW52aWRpYS1ncHUtYXR0ZXN0YXRpb24tcmVwb3J0LWNlcnQtY2hhaW4tZndpZC1tYXRjaCI6dHJ1ZSwieC1udmlkaWEtZ3B1LWF0dGVzdGF0aW9uLXJlcG9ydC1wYXJzZWQiOnRydWUsIngtbnZpZGlhLWdwdS1hdHRlc3RhdGlvbi1yZXBvcnQtbm9uY2UtbWF0Y2giOnRydWUsIngtbnZpZGlhLWdwdS1hdHRlc3RhdGlvbi1yZXBvcnQtc2lnbmF0dXJlLXZlcmlmaWVkIjp0cnVlLCJ4LW52aWRpYS1ncHUtZHJpdmVyLXJpbS1mZXRjaGVkIjp0cnVlLCJ4LW52aWRpYS1ncHUtZHJpdmVyLXJpbS1zY2hlbWEtdmFsaWRhdGVkIjp0cnVlLCJ4LW52aWRpYS1ncHUtZHJpdmVyLXJpbS1jZXJ0LWNoYWluIjp7IngtbnZpZGlhLWNlcnQtZXhwaXJhdGlvbi1kYXRlIjoiMjAyNy0wMi0xNlQxOTo1NzoyNCIsIngtbnZpZGlhLWNlcnQtc3RhdHVzIjoidmFsaWQiLCJ4LW52aWRpYS1jZXJ0LW9jc3Atc3RhdHVzIjoiZ29vZCIsIngtbnZpZGlhLWNlcnQtcmV2b2NhdGlvbi1yZWFzb24iOm51bGx9LCJ4LW52aWRpYS1ncHUtZHJpdmVyLXJpbS1zaWduYXR1cmUtdmVyaWZpZWQiOnRydWUsIngtbnZpZGlhLWdwdS1kcml2ZXItcmltLXZlcnNpb24tbWF0Y2giOnRydWUsIngtbnZpZGlhLWdwdS1kcml2ZXItcmltLW1lYXN1cmVtZW50cy1hdmFpbGFibGUiOnRydWUsIngtbnZpZGlhLWdwdS12Ymlvcy1yaW0tZmV0Y2hlZCI6dHJ1ZSwieC1udmlkaWEtZ3B1LXZiaW9zLXJpbS1zY2hlbWEtdmFsaWRhdGVkIjp0cnVlLCJ4LW52aWRpYS1ncHUtdmJpb3MtcmltLWNlcnQtY2hhaW4iOnsieC1udmlkaWEtY2VydC1leHBpcmF0aW9uLWRhdGUiOiIyMDI2LTA3LTE1VDIzOjAyOjEwIiwieC1udmlkaWEtY2VydC1zdGF0dXMiOiJ2YWxpZCIsIngtbnZpZGlhLWNlcnQtb2NzcC1zdGF0dXMiOiJnb29kIiwieC1udmlkaWEtY2VydC1yZXZvY2F0aW9uLXJlYXNvbiI6bnVsbH0sIngtbnZpZGlhLWdwdS12Ymlvcy1yaW0tdmVyc2lvbi1tYXRjaCI6dHJ1ZSwieC1udmlkaWEtZ3B1LXZiaW9zLXJpbS1zaWduYXR1cmUtdmVyaWZpZWQiOnRydWUsIngtbnZpZGlhLWdwdS12Ymlvcy1yaW0tbWVhc3VyZW1lbnRzLWF2YWlsYWJsZSI6dHJ1ZSwieC1udmlkaWEtZ3B1LXZiaW9zLWluZGV4LW5vLWNvbmZsaWN0Ijp0cnVlLCJzZWNib290Ijp0cnVlLCJkYmdzdGF0IjoiZGlzYWJsZWQiLCJlYXRfbm9uY2UiOiI5MzFkOGRkMGFkZDIwM2FjM2Q4YjRmYmRlNzVlMTE1Mjc4ZWVmY2RjZWFjNWI4NzY3MWE3NDhmMzIzNjRkZmNiIiwiaHdtb2RlbCI6IkdIMTAwIEEwMSBHU1AgQlJPTSIsInVlaWQiOiI1Mzc2MDUyNjQwMTkzNTk1ODc3NDExMjQyMjU1MzE0OTEyNzYxNTI2MjI3NTMyODMiLCJvZW1pZCI6IjU3MDMiLCJpc3MiOiJMT0NBTF9HUFVfVkVSSUZJRVIiLCJuYmYiOjE3NjEyODYyMzksImV4cCI6MTc2MTI4OTk1OSwiaWF0IjoxNzYxMjg2MzU5LCJqdGkiOiJiMmZkMjc0Ni02YmZlLTRjMDQtYTlhOC03OGIxZmVmMzMxNWIifQ.w1XkCq5RpF46yHGAwrjLagM4GKENvu3UjkXITYTn3LQ"
}
]
}
]
Decoded Local Verifier Token#
The local verifier produces similar claims to NRAS, but the issuer is local.
Validating Attestation Results#
You can validate the attestation token against a policy file. For sample policy files, refer to the policies directory in the nvtrust repository.
import json
# Load policy from file
with open("policy.json", "r") as f:
policy = json.load(f)
# Validate token against policy
result = client.validate_token(json.dumps(policy))
print("[Validation] Result: " + str(result))
Additional Resources#
Review additional attestation examples for more scenarios and advanced usage. See the Attestation Examples for a complete list.
Learn how to transition from proof-of-concept to production deployment, including NGC onboarding and integration options: POC to Production Guide.
Learn about our Attestation Client Tools, Cloud Services and Advanced documentation.