From 14344352807560845464fb2e9c906a7723430026 Mon Sep 17 00:00:00 2001 From: Karthik Jayaraman Date: Fri, 23 Feb 2024 16:23:13 -0800 Subject: [PATCH] Added 1.2.0 changes for SDK and Local Verifier --- guest_tools/attestation_sdk/README.md | 20 +- .../dist/nv-attestation-sdk-1.0.0.tar.gz | Bin 11637 -> 0 bytes .../dist/nv-attestation-sdk-1.3.0.tar.gz | Bin 0 -> 14317 bytes .../nv_attestation_sdk-1.0.0-py3-none-any.whl | Bin 11088 -> 0 bytes .../nv_attestation_sdk-1.3.0-py3-none-any.whl | Bin 0 -> 14302 bytes guest_tools/attestation_sdk/pyproject.toml | 4 +- .../gpu/attest_gpu_local.py | 1 + .../attestation_sdk/tests/RemoteGPUTest.py | 3 +- .../attestation_sdk/tests/RemoteGPUTest2.py | 15 - .../attestation_troubleshooting_guide.md | 610 ++++++++++++++++++ .../local_gpu_verifier/README.md | 2 +- .../local_gpu_verifier/pyproject.toml | 2 +- .../src/verifier/__about__.py | 2 +- .../attestation/spdm_msrt_resp_msg.py | 8 +- .../src/verifier/cc_admin.py | 22 +- .../src/verifier/cc_admin_utils.py | 50 +- .../local_gpu_verifier/src/verifier/config.py | 6 + 17 files changed, 702 insertions(+), 43 deletions(-) delete mode 100644 guest_tools/attestation_sdk/dist/nv-attestation-sdk-1.0.0.tar.gz create mode 100644 guest_tools/attestation_sdk/dist/nv-attestation-sdk-1.3.0.tar.gz delete mode 100644 guest_tools/attestation_sdk/dist/nv_attestation_sdk-1.0.0-py3-none-any.whl create mode 100644 guest_tools/attestation_sdk/dist/nv_attestation_sdk-1.3.0-py3-none-any.whl delete mode 100755 guest_tools/attestation_sdk/tests/RemoteGPUTest2.py create mode 100644 guest_tools/attestation_troubleshooting_guide.md diff --git a/guest_tools/attestation_sdk/README.md b/guest_tools/attestation_sdk/README.md index ad38446398..fc7a14ac8a 100644 --- a/guest_tools/attestation_sdk/README.md +++ b/guest_tools/attestation_sdk/README.md @@ -18,8 +18,6 @@ The Attestation SDK offers developers easy-to-use APIs for implementing attestat - [How to do Perform Attestation](#how-to-do-perform-attestation-1) - [Building Attestation SDK](#building-attestation-sdk) - [APIs](#apis) - - [Version Info](#version-info) - - [Future Roadmap](#future-roadmap) ## Features @@ -27,7 +25,7 @@ The Attestation SDK offers developers easy-to-use APIs for implementing attestat - Local GPU Attestation (using NVIDIA NVML based Python libraries) - Remote GPU Attestation (using NVIDIA Remote Attestation Service) -Note: SDK v1.2.0 is still in Early Access Release (beta), and the APIs may undergo changes until the GA release. +Note: Attestation SDK is still in Early Access Release (beta), and the APIs may undergo changes until the GA release. ## Install Attestation SDK @@ -97,6 +95,7 @@ Please refer to the [sample implementation](tests/RemoteGPUTest.py) ## APIs +### nv_attestation_sdk import attestation | API | Description | |---------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------| | Attestation(<-name->) | Create a new Attestation Object used to call other Attestation methods. | @@ -105,17 +104,12 @@ Please refer to the [sample implementation](tests/RemoteGPUTest.py) | attest() | Trigger the Attestation for client object, This uses the Attestation type configured in add_verifier method | | validate_token(<-attestation-results-policy->) | Validate the Attestation Claims against a policy | -## Version Info +### nv_attestation_sdk.gpu.attest_gpu_remote -SDK latest version - 1.2.0 - -## Future Roadmap - -The following are some exciting features and improvements that we plan to implement in upcoming releases of the Attestation SDK. Please note that these roadmap items are subject to change based on user feedback and evolving priorities. We are committed to continuously improving our project to meet the needs of our users. - -- Integration of NVIDIA Remote Attestation Service. -- Enhanced flexibility in Attestation result policies. -- Support for additional Attestation types such as CPU and DPU, among others. +| API | Description | +|---------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------| +| generate_evidence(<-nonce->) | Generate GPU attestation evidence using the Local GPU Verifier Python SDK with a user-provided nonce. | +| verify_evidence(<-nonce->, <-evidence->,<-nras_url->) |Verify the evidence with the NVIDIA Remote Attestation Service (NRAS) | diff --git a/guest_tools/attestation_sdk/dist/nv-attestation-sdk-1.0.0.tar.gz b/guest_tools/attestation_sdk/dist/nv-attestation-sdk-1.0.0.tar.gz deleted file mode 100644 index 7599d06ed9d5fac847564f81901d1283892004e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11637 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 diff --git a/guest_tools/attestation_sdk/dist/nv-attestation-sdk-1.3.0.tar.gz b/guest_tools/attestation_sdk/dist/nv-attestation-sdk-1.3.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..8b608a00429543a314bed52171ce73966b1e07ac GIT binary patch literal 14317 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 literal 0 HcmV?d00001 diff --git a/guest_tools/attestation_sdk/dist/nv_attestation_sdk-1.0.0-py3-none-any.whl b/guest_tools/attestation_sdk/dist/nv_attestation_sdk-1.0.0-py3-none-any.whl deleted file mode 100644 index b05ef6faef714bc34b2d15737cf7560320d2f891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11088 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 Q{oQ_tHGt}0!5r{^0RLtIzyJUM diff --git a/guest_tools/attestation_sdk/dist/nv_attestation_sdk-1.3.0-py3-none-any.whl b/guest_tools/attestation_sdk/dist/nv_attestation_sdk-1.3.0-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..c02713266e68cd1697299d20fe8d81792cb5f74b GIT binary patch literal 14302 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 1.2.0', 'requests ~= 2.31.0' ] keywords = [ diff --git a/guest_tools/attestation_sdk/src/nv_attestation_sdk/gpu/attest_gpu_local.py b/guest_tools/attestation_sdk/src/nv_attestation_sdk/gpu/attest_gpu_local.py index 79859be336..8feba1a635 100644 --- a/guest_tools/attestation_sdk/src/nv_attestation_sdk/gpu/attest_gpu_local.py +++ b/guest_tools/attestation_sdk/src/nv_attestation_sdk/gpu/attest_gpu_local.py @@ -32,6 +32,7 @@ def attest(nonce): 'rim_root_cert': None, 'rim_service_url': None, 'allow_hold_cert': True, + 'ocsp_url': None, 'nonce': nonce} attestation_result, jwt_token = cc_admin.attest(params) except Exception as e: diff --git a/guest_tools/attestation_sdk/tests/RemoteGPUTest.py b/guest_tools/attestation_sdk/tests/RemoteGPUTest.py index 9fce53dead..cbddf7e908 100755 --- a/guest_tools/attestation_sdk/tests/RemoteGPUTest.py +++ b/guest_tools/attestation_sdk/tests/RemoteGPUTest.py @@ -7,12 +7,13 @@ import os import json +NRAS_URL="https://nras.attestation.nvidia.com/v1/attest/gpu" client = attestation.Attestation() client.set_name("thisNode1") client.set_nonce("931d8dd0add203ac3d8b4fbde75e115278eefcdceac5b87671a748f32364dfcb") print ("[RemoteGPUTest] node name :", client.get_name()) -client.add_verifier(attestation.Devices.GPU, attestation.Environment.REMOTE, "https://nras.attestation.nvidia.com/v1/attest/gpu", "") +client.add_verifier(attestation.Devices.GPU, attestation.Environment.REMOTE, NRAS_URL, "") file = "NVGPURemotePolicyExample.json" diff --git a/guest_tools/attestation_sdk/tests/RemoteGPUTest2.py b/guest_tools/attestation_sdk/tests/RemoteGPUTest2.py deleted file mode 100755 index 2d79ae1b96..0000000000 --- a/guest_tools/attestation_sdk/tests/RemoteGPUTest2.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# -from nv_attestation_sdk.gpu import attest_gpu_remote -import secrets -nonce = secrets.token_bytes(32).hex() - -evidence = attest_gpu_remote.generate_evidence(nonce) -print(evidence) - -verify_result = attest_gpu_remote.verify_evidence(nonce,evidence, "https://nras.attestation.nvidia.com/v1/attest/gpu") - -print(verify_result) \ No newline at end of file diff --git a/guest_tools/attestation_troubleshooting_guide.md b/guest_tools/attestation_troubleshooting_guide.md new file mode 100644 index 0000000000..81823f88ef --- /dev/null +++ b/guest_tools/attestation_troubleshooting_guide.md @@ -0,0 +1,610 @@ +# Introduction + +The attestation verifier tool and SDK are used to verify the +authenticity, integrity, validity, and correctness of attestation +reports generated by GPU operating in Confidential Computing mode. This +document describes the possible error scenarios that may occur when +using the attestation verifier tool and shows the claims and output +messages that can help you recognize such errors. The document also +provides some suggestions on how to handle or avoid these errors. + +# Common Error Scenarios + +This section outlines the main classes of errors that might happen when +verifying attestation for Confidential Computing workload. Please see +the following sections for a complete list of all possible errors. + +- **Invalid or corrupted attestation report**: These errors occur when + the attestation report is not well-formed, in unsupported format, + has missing or incorrect fields, or has been tampered with. The + verifier tool and SDK will reject such reports and return an error + code indicating the reason for the failure. To avoid this error, the + user should ensure that the attestation report is generated by a + properly configured Nvidia GPU and/or transmitted securely to remote + services. + +- **Failed RIM Lookup:** These errors happen when RIM lookup cannot + find a match for a driver version or VBIOS version. This might be + because Confidential Computing does not support the versions of + driver and VBIOS being used. Users should check the NVIDIA H100 GPU + Confidential Computing guide to see the supported versions. If the + problem still occurs, user should not use the versions that fail and + report the issue to NVIDIA and the machine owner. + +- **Invalid or corrupted reference integrity measurements (RIM):** + These errors occur when driver RIM or VBIOS RIM is not available, + not well-formed, in unsupported format, has missing or incorrect + fields, or has been tampered with. To avoid this error, the user + should ensure correct VBIOS, and driver versions are installed in + the GPU and should ensure RIM is not corrupted/tampered during + transit. + +- **Expired or invalid certificate**: These errors occur when either + the certificates in the certificate chain of RIM or device are + expired or not valid for attestation purposes. Attestation SDK and + the local verifier tool use X.509 standards to validate the + certificates and check their validity period and extensions. If a + RIM for VBIOS or driver has an expired or invalid certificate, user + should update to a newer version with valid certificates and if a + device has an expired or invalid certificate, user should find a + replacement. + +- **Attestation verification error**: This error happens when one or + more measurements in an attestation report do not match with the + reference values from driver and VBIOS RIMs. This could be because + of incorrect settings of the device, altered device, altered + software, or harmful activity in the device. On encountering this + error, user must reset their device, reload the driver, and run the + attestation verification again. If the problem still remains, user + is advised to stop using the device/software and report to the + machine owner. + +- **Runtime API errors:** These are errors that happen on the local + machine when getting attestation reports, certificate chains, or + basic GPU & Software information. This could be because of a + software flaw or because of runtime disruptions. User should reboot + the VM instance and try again. If the problem still remains, user + should report the error to NVIDIA. + +- **Network or communication error:** This error occurs when the + verifier tool and SDK encounter a network or communication problem + when receiving or sending the attestation report or related data. + The verifier tool and SDK will try to retry or recover from the + network or communication error, but if the error persists, the + verifier tool and SDK will abort the verification process and return + an error code indicating the reason for the failure. To avoid this + error, the user should ensure that the network and communication + channels are reliable and stable. + +# Full list of errors from CC_Admin tool + +The table below displays the various outputs that CC_admin tool can +generate and what causes them. Please note that these outputs are +generated only while using CC_admin tool and not with attestation SDK. +Attestation SDK will only output a claims list as shown in the following +section. + + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDError infoReason for failureMitigations
1Attestation report signature verification failed.The attestation report may be invalid due to corruption, +tampering, or a software bug in the device that generated an incorrect +report.The user should retrieve the attestation report once +more and run verification. If the problem persists, they should report +the issue to Nvidia.
2No GPU runtime measurements found
3Could not parse the GET_MEASUREMENT response message
4There are no measurement blocks in the response message
5Measurement block at index " XX" not following DMTF +specification 
6No certificates found in certificate chain
7The number of certificates fetched from the GPU is unexpected.The certificate chain must contain 5 certificates, otherwise, it +will in this failure.The user should attempt to reinstall the current driver or install a +different version, as specified in the NVIDIA H100 GPU Confidential +Computing guide. If the issue persists, the user should report it to +Nvidia.
8GPU certificate chain revocation +validation failed.The OCSP validation check for the GPU certificate chain has failed +because one or more certificates in the chain have been revoked.It is recommended that the user stop the use of the current device +or software and obtain a replacement
9GPU certificate chain validation failedThe signature validation checks for the GPU certificate chain are +not successful.If the error message indicates that the “verifier_device_root.pem” +file is missing, the user may try to reinstall the attestation SDK. If +the issue persists, the user should try using a different driver +version, as outlined in the NVIDIA H100 GPU Confidential Computing guide +and report the issue to Nvidia if it continues.
10Attestation report verification failed

Attestation report verification has failed due to one +of the reasons below:

+
    +
  • Nonce mismatch in GET_MEASUREMENTS

  • +
  • Driver version mismatch

  • +
  • VBIOS version mismatch.

  • +
  • Report retrieval has failed

  • +
  • GPU certificate chain retrieval has failed

  • +
  • Extracting individual certificate has failed

  • +

Nonce mismatch

+

The user should attempt to verify the attestation again, using either +the same or a different driver version. If the problem persists, the +user should report the issue to Nvidia.

+

Driver/VBIOS version mismatch

+

To confirm these errors, the user can utilize the nvidia-smi utility +to extract the driver/VBIOS versions and cross-check them with the +versions mentioned in the attestation report. The user can try +reinstalling the driver or using different driver versions. If the issue +persists, the user should contact Nvidia for further assistance.

+

Report/Certificate chain retrieval has failed

+

Ensure that the system has CC mode enabled and that the Driver is +loaded in persistence mode. To verify that the driver has loaded +successfully, the user can use the nvidia-smi conf-compute –f +command.

+

Extracting certificates has failed

+

This issue may arise due to a bug in the driver or corruption during +the retrieval of the certificate chain. It is recommended to try again +with an updated driver version. If the issue persists, the user should +report it to Nvidia for further assistance.

11The nonce in the SPDM GET MEASUREMENT request message is not +matching with the generated nonce.
12The driver version in attestation report is not matching with the +driver version fetched from the driver
13The vbios version in attestation report is not matching with the +vbios version fetched from the driver
14Something went wrong while fetching the attestation report from the +gpu
15Something went wrong while fetching the certificate chains from the +gpu.
16Something went wrong while extracting the individual certificates +from the certificate chain.
17Unknown GPU architecture.The architecture of the detected GPU is not recognized.To ensure successful confidential computing and attestation, the +user must verify that the GPU connected to the system is compatible and +that the attestation SDK is updated to the latest version.
18GPU architecture is not supported.The architecture of the detected GPU is not supported.To ensure successful confidential computing and attestation, the +user must verify that the GPU connected to the system is compatible and +that the attestation SDK is updated to the latest version.
19No GPU foundNo GPU has been detected in the system.The user must verify that the GPU is detected on the PCI bus and +that the driver is loaded in persistence mode.
20The call to fetch attestation report timed outFailures due to time out in runtime APIs.To resolve these issues, the user should verify that the +driver is operating in persistence mode and that the system can +establish a connection with NVIDIA Remote Attestation services.
21The call to fetch GPU Cert chain timed out
22The {function_name} call timed out
23Could not fetch the rim file : {rim_id}The retrieval of Driver or VBIOS RIM was unsuccessful +due to the absence of files or problems with the network.To address these issues, the user should confirm that a +connection can be established with NVIDIA Remote Attestation services. +Additionally, when using the local verifier tool, the user should ensure +that the correct RIM file path is specified as input.
24Could not find the required VBIOS RIM file <path to VBIOS RIM +file>
25Unable to read <path to Driver RIM file>
26No Meta element found in the RIMFailures due to improperly formed or incorrectly +formatted driver or VBIOS RIM.

Steps to try:

+
    +
  1. Reinstall the attestation SDK.

  2. +
  3. Attempt to retrieve the RIMs again.

  4. +
  5. Switch to a new driver version.

  6. +
+

If the issue continues, the user should seek assistance from Nvidia +and the machine owner.

27No Signature found in the RIM
28No KeyInfor found in the RIM
29X509Data not found in the RIM
30X509Certificates not found in the RIM.
31Driver version not found in the RIM
32There was a problem while extracting the X509 certificate from the +RIM.
33No golden measurements found in Driver/VBIOS RIM
34Schema validation of Driver/VBIOS RIM failed.
35SWID schema file not found
36Multiple measurements are assigned to the same index in +{self.rim_name} rim
37RIM signature verification failedFailures when there are issues with the validation of +the RIM certificate chain

If the error message indicates that the +“verifier_device_root.pem” file is missing, the user may try to +reinstall the attestation SDK.

+

An OCSP revocation status indicates that the driver or VBIOS is no +longer usable, and the user must switch to an unrevoked version. In the +event of a RIM verification failure, the user must ensure that the +correct, supported versions of the driver and VBIOS are installed. If +the issue persists, the user should report it to Nvidia.

38Driver/VBIOS RIM cert chain verification failed
39Driver/VBIOS RIM cert chain ocsp status verification failed
40Driver/VBIOS RIM verification failed
41The runtime measurements are not matching with the
+golden measurements at the following indexes (starting from 0)
There is a mismatch between one or more measurements in the +attestation report and the reference values from the RIMs. This could be +a result of using devtools mode or unsupported versions of the driver or +VBIOS.The user must ensure that the device is booted in production mode. +If the issue persists in production mode with supported versions, the +user should stop using the system and find a replacement that passes +attestation.
42The driver and vbios RIM have measurement at the same index XXConflicting measurement indices between the VBIOS and Driver RIMs. A +conflicting index is marked as active in both the driver and VBIOS +RIM.The user should try using different versions of the driver or VBIOS +and report the issue to Nvidia for further assistance
43Invalid Nonce Size. The nonce should be 32 bytes in length +represented as Hex StringFailures due to invalid nonce size.The user must ensure that the length of Nonce passed to +Attestation SDK is 32 bytes and retry attestation.
44Length of Nonce is greater than max nonce size allowed
+ +# List of claims returned by NVIDIA Remote Verifier + +The NVIDIA Remote Attestation Service (NRAS) will return the following +claims, which will have a value of either true or false. + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDClaimConditions for the Claim to be valid
1x-nvidia-gpu-driver-rim-schema-validatedThe Driver RIM has been confirmed to be in accordance with the swid +schema
2x-nvidia-gpu-vbios-rim-cert-validated

This claim indicates if the following checks completed +successfully for vBIOS RIM.

+
    +
  1. Certificate chain is valid.

  2. +
  3. Certificate Chain belongs to NVIDIA PKI

  4. +
  5. Certificate is not expired

  6. +
  7. Certificate is not revoked.

  8. +
3x-nvidia-gpu-attestation-report-cert-chain-validated

This claim indicates if the following checks completed +successfully for Attestation report certificate chain.

+
    +
  1. Certificate chain is valid.

  2. +
  3. Certificate Chain belongs to NVIDIA PKI

  4. +
  5. Certificate is not expired

  6. +
  7. Certificate is not revoked.

  8. +
  9. FWID of the certificate matches with the Attestation +report

  10. +
4x-nvidia-gpu-driver-rim-schema-fetchedThis claim indicates if the verifier can fetch driver RIM from RIM +service.
5x-nvidia-gpu-attestation-report-parsedThis claim indicates if the Attestation Report has been successfully +parsed.
6x-nvidia-gpu-nonce-matchThe nonce in the Attestation report matches with the initial input +to the GPU while generating the report.
7x-nvidia-gpu-driver-rim-signature-verified

For the claim to be valid, the following conditions must be +met:

+
    +
  1. The driver RIM schema must be as expected.

  2. +
  3. The driver RIM certificate chain must be verified.

  4. +
  5. OCSP validation must pass for each certificate in the RIM +certificate chain.

  6. +
  7. The driver RIM signature must be verified, and the driver version +must match the version fetched from the GPU information.

  8. +
8x-nvidia-gpu-vbios-rim-signature-verified

For the claim to be valid, the following conditions must be +met:

+
    +
  1. The VBIOS RIM schema must be as expected.

  2. +
  3. The VBIOS RIM certificate chain must be verified.

  4. +
  5. OCSP validation must pass for each certificate in the RIM +certificate chain.

  6. +
  7. The VBIOS RIM signature must be verified, and the VBIOS version +must match the version fetched from the GPU information.

  8. +
9x-nvidia-gpu-arch-checkThe GPU Architecture in the Attestation report is either AMPERE, or +HOPPER
10x-nvidia-attestation-warningThe Attestation warning message is populated when the certificate is +revoked with reason “CERT_HOLD”
11x-nvidia-gpu-measurements-matchThe runtime measurements from the Reference Integrity Measurements +(RIM) matches the runtime measurements in the Attestation report.
12x-nvidia-gpu-attestation-report-signature-verifiedThe signature on the Attestation report is verified.
13x-nvidia-gpu-vbios-rim-schema-validatedThe vBIOS RIM has been confirmed to be in accordance with the swid +schema
14x-nvidia-gpu-driver-rim-cert-validated

This claim indicates if the following checks completed +successfully for Driver RIM.

+
    +
  1. Certificate chain is valid.

  2. +
  3. Certificate Chain belongs to NVIDIA PKI

  4. +
  5. Certificate is not expired

  6. +
  7. Certificate is not revoked.

  8. +
15x-nvidia-gpu-vbios-rim-schema-fetchedThis field indicates if the verifier can fetch vBIOS RIM from RIM +service.
16x-nvidia-gpu-vbios-rim-measurements-availableThe VBIOS Reference Integrity Measurement (RIM) and the measurements +within it were successfully interpreted and understood.
17x-nvidia-gpu-driver-rim-driver-measurements-availableThe driver Reference Integrity Measurement (RIM) and the +measurements within it were successfully interpreted and +understood.
+ +# NVIDIA Remote Attestation Service – Error codes + +Below is a list of all the error codes returned by the Nvidia Remote +Attestation Service (NRAS). In the event of an error, NRAS returns one +of these error codes along with an empty claim. + +| CODE | ERROR_MESSAGE | DESCRIPTION | +|--------|-----------------------------|------------------------------------| +| 4001 | EMPTY_REQUEST | Attestation request is empty. | +| 4002 | INVALID_REQUEST | Attestation request is invalid because Attestation report length is less than expected. | +| 4003 | INVALID_NONCE | Nonce in the attestation report is either null or of length 0 | +| 4004 | INVALID_GPU_ARCH | GPU architecture in the attestation report is either null or of length 0 | +| 4005 | INVALID_EVIDENCE | GPU Evidence is either null or of length 0 | +| 4006 | INVALID_EVIDENCE_FORMAT | Attestation Evidence could not be parsed by NRAS. | +| 4007 | INVALID_CERTIFICATE_CHAIN | Certificate chain is invalid, and it does not belong to NVIDIA PKI. | +| 4008 | INVALID_GOLDEN_MEASUREMENT | RIM file data could not be parsed by NRAS. | +| 4009 | DRIVER_AND_RIM_MEASUREMENT_SAME_INDEX | Driver and VBIOS Golden Measurement has measurement at same index | +| 4010 | NONCE_NOT_MATCHING | Nonce from request is not matching with evidence nonce | +| 4011 | EVIDENCE_CERT_EXPIRED | Evidence certificate is expired | +| 4012 | GPU_ARCHITECTURE_NOT_SUPPORTED | GPU Architecture is not one of AMPERE or HOPPER | +| 4013 | INVALID_EVIDENCE_SIGNATURE | Attestation Report Signature is Invalid | +| 4014 | INVALID_ATTESTATION_CERTIFICATE_CHAIN | Attestation Certificate chain doesn’t belong to Nvidia PKI | +| 4015 | INVALID_RIM_CERTIFICATE_CHAIN | RIM Certificate chain doesn’t belong to Nvidia PKI | +| 4016 | FWID_NOT_MATCHING | FWID from the Attestation Report does not match the FWID in the Device Certificate. | +| 5000 | INTERNAL_SERVER_ERROR | Internal Server Error | +| 5001 | ERROR_DURING_OCSP_QUERY | Error creating OCSP request or communicating with OCSP service. | +| 5002 | CERTIFICATE_STATUS_REVOKED | OCSP Service returned a “REVOKED” status for the certificate | +| 5003 | CERTIFICATE_STATUS_UNKNOWN | OCSP Service returned a “UNKNOWN” status for the certificate | +| 5004 | ERROR_VALIDATING_SIGNATURE | Error during validating evidence signature | +| 5005 | ATTESTATION_TOKEN_FAILURE | Fail to generate Attestation Token, please retry | +| 5006 | GPU_DRIVER_VERSION_NOT_AVAILABLE | GPU Driver Version not available in evidence | +| 5007 | GPU_VBIOS_VERSION_NOT_AVAILABLE | GPU VBIOS Version not available in evidence | +| 5008 | ERROR_DURING_RIM_DOWNLOAD | NRAS is not able to download RIM file from RIM Service. | +| 5009 | RIM_BUNDLE_NOT_FOUND | RIM file is not found in the RIM Service. | +| 5010 | ERROR_PARSING_RIM_CERTIFICATE | RIM Certificate parsing failed. | +| 5011 | INVALID_RIM_CERTIFICATE | RIM Certificate chain is invalid. | +| 5012 | RIM_NOT_SIGNED | RIM is not signed. | +| 5013 | INVALID_RIM_SIGNATURE | RIM Signature is invalid. | +| 5014 | FAIL_TO_VALIDATE_RIM_SIGNATURE | Parsing error when trying to validate RIM Signature. | +| 5015 | ERROR_ATTESTING_EVIDENCE | Error talking to enclave to Attest the evidence. | +| 5016 | NITRO_ATTESTATION_DOCUMENT_FETCH_ERROR | Fail to download Nitro Attestation Document | + +# Reporting an issue to Nvidia + +If the remediations above do not help users fix the problems, they can +report their issues at . diff --git a/guest_tools/gpu_verifiers/local_gpu_verifier/README.md b/guest_tools/gpu_verifiers/local_gpu_verifier/README.md index 42e9d6f3af..e0262e4245 100644 --- a/guest_tools/gpu_verifiers/local_gpu_verifier/README.md +++ b/guest_tools/gpu_verifiers/local_gpu_verifier/README.md @@ -86,7 +86,7 @@ The RIM (Reference Integrity Manifest) is a manifest containing golden measureme ### attestation -The Attestation module is capable of extracting the measurements and the measurement signature. It then performs signature verification. DMTF's SPDM 1.1 MEASUREMENT response message is used as the attestation report for APM. You can find the SPDM 1.1 specification at the following link: [SPDM 1.1 Specification](https://www.dmtf.org/sites/default/files/standards/documents/DSP0274_1.1.0.pdf). +The Attestation module is capable of extracting the measurements and the measurement signature. It then performs signature verification. DMTF's SPDM 1.1 MEASUREMENT response message is used as the attestation report for APM. You can find the SPDM 1.1 specification at the following link: [SPDM 1.1 Specification](https://www.dmtf.org/sites/default/files/standards/documents/DSP0274_1.1.3.pdf). ### nvmlHandler The nvmlHandler module utilizes the NVML API calls to retrieve GPU information, including the driver version, GPU certificates, attestation report, and more. diff --git a/guest_tools/gpu_verifiers/local_gpu_verifier/pyproject.toml b/guest_tools/gpu_verifiers/local_gpu_verifier/pyproject.toml index e46352a08a..c4c10a687e 100644 --- a/guest_tools/gpu_verifiers/local_gpu_verifier/pyproject.toml +++ b/guest_tools/gpu_verifiers/local_gpu_verifier/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "verifier" -version = "1.2.0" +version = "1.3.0" description = "A Python-based tool that validates GPU measurements by comparing GPU runtime measurements with authenticated golden measurements" authors = [ {name = "NVIDIA"} diff --git a/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/__about__.py b/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/__about__.py index 6b2a605370..75c8a5e049 100644 --- a/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/__about__.py +++ b/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/__about__.py @@ -34,7 +34,7 @@ "__copyright__", ] -__version__ = "1.2.0" +__version__ = "1.3.0" __author__ = "NVIDIA CORPORATION" __copyright__ = f"Copyright (c) 2021-2023 {__author__}" diff --git a/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/attestation/spdm_msrt_resp_msg.py b/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/attestation/spdm_msrt_resp_msg.py index ce068080a4..d4b211c4e4 100755 --- a/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/attestation/spdm_msrt_resp_msg.py +++ b/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/attestation/spdm_msrt_resp_msg.py @@ -1,5 +1,5 @@ # -# SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-FileCopyrightText: Copyright (c) 2021-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: BSD-3-Clause # # Redistribution and use in source and binary forms, with or without @@ -284,6 +284,8 @@ class OpaqueData: 17 : 'OPAQUE_FIELD_ID_PROJECT', 18 : 'OPAQUE_FIELD_ID_PROJECT_SKU', 19 : 'OPAQUE_FIELD_ID_PROJECT_SKU_MOD', + 20 : 'OPAQUE_FIELD_ID_FWID', + 21 : 'OPAQUE_FIELD_ID_PROTECTED_PCIE_STATUS', 255 : 'OPAQUE_FIELD_ID_INVALID', } @@ -304,6 +306,10 @@ def get_data(self, field_name): [bytes] : the content of the given field name. """ assert type(field_name) is str + + if field_name == 'OPAQUE_FIELD_ID_FWID' and 'OPAQUE_FIELD_ID_FWID' not in self.OpaqueDataField: + return b'' + return self.OpaqueDataField[field_name] def parse_measurement_count(self, data): diff --git a/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/cc_admin.py b/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/cc_admin.py index c35a47365b..e8b540c16a 100644 --- a/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/cc_admin.py +++ b/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/cc_admin.py @@ -119,9 +119,13 @@ def main(): "--rim_service_url", help= "If the user wants to override the RIM service base url and provide their own url, then can do so by passing it as a command line argument.", ) + parser.add_argument( + "--ocsp_url", + help="If the user wants to override the OCSP service url and provide their own url, then can do so by passing it as a command line argument.", + ) args = parser.parse_args() arguments_as_dictionary = vars(args) - + result,_ = attest(arguments_as_dictionary) if not result: @@ -201,6 +205,9 @@ def attest(arguments_as_dictionary): if not arguments_as_dictionary['rim_service_url'] is None: BaseSettings.set_rim_service_base_url(arguments_as_dictionary['rim_service_url']) + if not arguments_as_dictionary['ocsp_url'] is None: + BaseSettings.set_ocsp_url(arguments_as_dictionary['ocsp_url']) + if arguments_as_dictionary['verbose']: info_log.setLevel(logging.DEBUG) @@ -276,6 +283,11 @@ def attest(arguments_as_dictionary): event_log.debug(f'GPU info fetched : \n\t\t{vars(gpu_info_obj)}') + # Parsing the attestation report. + attestation_report_data = gpu_info_obj.get_attestation_report() + attestation_report_obj = AttestationReport(attestation_report_data, settings) + settings.mark_attestation_report_parsed() + info_log.info("\tValidating GPU certificate chains.") gpu_attestation_cert_chain = gpu_info_obj.get_attestation_cert_chain() @@ -290,9 +302,8 @@ def attest(arguments_as_dictionary): gpu_leaf_cert = (gpu_attestation_cert_chain[0]) event_log.debug("\t\tverifying attestation certificate chain.") - cert_verification_status = CcAdminUtils.verify_certificate_chain(gpu_attestation_cert_chain, - settings, - BaseSettings.Certificate_Chain_Verification_Mode.GPU_ATTESTATION) + cert_verification_status = CcAdminUtils.verify_gpu_certificate_chain(gpu_attestation_cert_chain, settings, + attestation_report_obj.get_response_message().get_opaque_data().get_data("OPAQUE_FIELD_ID_FWID").hex()) if not cert_verification_status: err_msg = "\t\tGPU attestation report certificate chain validation failed." @@ -314,10 +325,7 @@ def attest(arguments_as_dictionary): settings.mark_gpu_cert_check_complete() info_log.info("\tAuthenticating attestation report") - attestation_report_data = gpu_info_obj.get_attestation_report() - attestation_report_obj = AttestationReport(attestation_report_data, settings) attestation_report_obj.print_obj(info_log) - settings.mark_attestation_report_parsed() attestation_report_verification_status = CcAdminUtils.verify_attestation_report(attestation_report_obj=attestation_report_obj, gpu_leaf_certificate=gpu_leaf_cert, nonce=nonce_for_attestation_report, diff --git a/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/cc_admin_utils.py b/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/cc_admin_utils.py index 04b11296a0..15c4b29225 100755 --- a/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/cc_admin_utils.py +++ b/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/cc_admin_utils.py @@ -1,5 +1,5 @@ # -# SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-FileCopyrightText: Copyright (c) 2021-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: BSD-3-Clause # # Redistribution and use in source and binary forms, with or without @@ -70,6 +70,54 @@ class CcAdminUtils: """ A class to provide the required functionalities for the CC ADMIN to perform the GPU attestation. """ + @staticmethod + def extract_fwid(cert): + """ A static function to extract the FWID data from the given certificate. + + Args: + cert (OpenSSL.crypto.X509): The certificate whose FWID data is needed to be fetched. + + Returns: + [str]: the FWID as a hex string extracted from the certificate if + it is present otherwise returns an empty string. + """ + result = '' + # The OID for the FWID extension. + TCG_DICE_FWID_OID = '2.23.133.5.4.1' + cryptography_cert = cert.to_cryptography() + + for i in range(len(cryptography_cert.extensions)): + oid_obj = (vars(cryptography_cert.extensions)['_extensions'][i]).oid + if getattr(oid_obj, 'dotted_string') == TCG_DICE_FWID_OID: + # The FWID data is the last 48 bytes. + result = vars((vars(cryptography_cert.extensions)['_extensions'][i]).value)['_value'][-48:].hex() + + return result + + @staticmethod + def verify_gpu_certificate_chain(cert_chain, settings, attestation_report_fwid): + """ A static function to perform the GPU device certificate chain verification. + + Args: + cert_chain (list): A list containing the certificate objects of the device certificate chain. + settings (config.HopperSettings): the object containing the various config info. + attestation_report_fwid (str): the hexadecimal string of the FWID in the attestation report. + + Returns: + [bool]: True if the verification is successful, otherwise False. + """ + # Skipping the comparision of FWID in the attestation certificate if the Attestation report does not contains the FWID. + if attestation_report_fwid != '': + + if attestation_report_fwid != CcAdminUtils.extract_fwid(cert_chain[0]): + info_log.error("\t\tThe firmware ID in the device certificate chain is not matching with the one in the attestation report.") + event_log.info(f"\t\tThe FWID read from the attestation report is : {attestation_report_fwid}") + return False + + info_log.info("\t\tThe firmware ID in the device certificate chain is matching with the one in the attestation report.") + + return CcAdminUtils.verify_certificate_chain(cert_chain, settings, BaseSettings.Certificate_Chain_Verification_Mode.GPU_ATTESTATION) + @staticmethod def verify_certificate_chain(cert_chain, settings, mode): """ Performs the certificate chain verification. diff --git a/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/config.py b/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/config.py index 9cc1ab3c3c..e0e1287c5d 100755 --- a/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/config.py +++ b/guest_tools/gpu_verifiers/local_gpu_verifier/src/verifier/config.py @@ -113,6 +113,12 @@ class BaseSettings: 'MEASUREMENT_MATCH' : 29, } + @classmethod + def set_ocsp_url(cls, url): + if not isinstance(url, str): + raise ValueError("Incorrect data type for the URL.") + cls.OCSP_URL = url + @classmethod def set_rim_service_base_url(cls, url): if not isinstance(url, str):