diff options
author | Matthew Miller <matthew@millerti.me> | 2022-08-14 11:18:52 -0700 |
---|---|---|
committer | Matthew Miller <matthew@millerti.me> | 2022-08-14 11:18:52 -0700 |
commit | c39c2b35741262221c68a7b0d4ffa0020134ffb0 (patch) | |
tree | bd5108e4bed8d9e26deda38bf528585f5fe38f92 | |
parent | bee3aefe652cba5b6e46dc2af282ec4028e3eefa (diff) |
Don't validate cert path when self-referenced
-rw-r--r-- | packages/server/src/metadata/verifyAttestationWithMetadata.ts | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/packages/server/src/metadata/verifyAttestationWithMetadata.ts b/packages/server/src/metadata/verifyAttestationWithMetadata.ts index 940b174..e068a05 100644 --- a/packages/server/src/metadata/verifyAttestationWithMetadata.ts +++ b/packages/server/src/metadata/verifyAttestationWithMetadata.ts @@ -92,16 +92,32 @@ export async function verifyAttestationWithMetadata( ); } - try { - await validateCertificatePath( - x5c.map(convertCertBufferToPEM), - statement.attestationRootCertificates.map(convertCertBufferToPEM), - ); - } catch (err) { - const _err = err as Error; - throw new Error( - `Could not validate certificate path with any metadata root certificates: ${_err.message}`, - ); + // Prepare to check the certificate chain + const authenticatorCerts = x5c.map(convertCertBufferToPEM); + const statementRootCerts = statement.attestationRootCertificates.map(convertCertBufferToPEM); + + /** + * If an authenticator returns exactly one certificate in its x5c, and that cert is found in the + * metadata statement then the authenticator is "self-referencing". In this case we forego + * certificate chain validation. + */ + let authenticatorIsSelfReferencing = false; + if ( + authenticatorCerts.length === 1 && + statementRootCerts.indexOf(authenticatorCerts[0]) >= 0 + ) { + authenticatorIsSelfReferencing = true; + } + + if (!authenticatorIsSelfReferencing) { + try { + await validateCertificatePath(authenticatorCerts, statementRootCerts); + } catch (err) { + const _err = err as Error; + throw new Error( + `Could not validate certificate path with any metadata root certificates: ${_err.message}`, + ); + } } return true; |