in src/local_gpu_verifier/src/verifier/cc_admin_utils.py [0:0]
def verify_certificate_chain(cert_chain, settings, mode):
""" Performs the certificate chain verification.
Args:
cert_chain (list): the certificate chain as a list with the root
cert at the end of the list.
settings (config.HopperSettings): the object containing the various config info.
mode (<enum 'CERT CHAIN VERIFICATION MODE'>): Used to determine if the certificate chain
verification is for the GPU attestation certificate chain or RIM certificate chain
or the ocsp response certificate chain.
Raises:
NoCertificateError: it is raised if the cert_chain list is empty.
IncorrectNumberOfCertificatesError: it is raised if the number of
certificates in cert_chain list is unexpected.
Returns:
[bool]: True if the verification is successful, otherwise False.
"""
assert isinstance(cert_chain, list)
number_of_certificates = len(cert_chain)
event_log.debug(f"verify_certificate_chain() called for {str(mode)}")
event_log.debug(f'Number of certificates : {number_of_certificates}')
if number_of_certificates < 1:
event_log.error("\t\tNo certificates found in certificate chain.")
raise NoCertificateError("\t\tNo certificates found in certificate chain.")
if number_of_certificates != settings.MAX_CERT_CHAIN_LENGTH and mode == BaseSettings.Certificate_Chain_Verification_Mode.GPU_ATTESTATION:
event_log.error("\t\tThe number of certificates fetched from the GPU is unexpected.")
raise IncorrectNumberOfCertificatesError("\t\tThe number of certificates fetched from the GPU is unexpected.")
store = crypto.X509Store()
index = number_of_certificates - 1
while index > -1:
if index == number_of_certificates - 1:
# The root CA certificate is stored at the end in the cert chain.
store.add_cert(cert_chain[index])
index = index - 1
else:
store_context = crypto.X509StoreContext(store, cert_chain[index])
try:
store_context.verify_certificate()
store.add_cert(cert_chain[index])
index = index - 1
except crypto.X509StoreContextError as e:
event_log.info(f'Cert chain verification is failing at index : {index}')
event_log.error(e)
return False
return True