summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMatthew Miller <matthew@millerti.me>2022-08-14 11:18:52 -0700
committerMatthew Miller <matthew@millerti.me>2022-08-14 11:18:52 -0700
commitc39c2b35741262221c68a7b0d4ffa0020134ffb0 (patch)
treebd5108e4bed8d9e26deda38bf528585f5fe38f92
parentbee3aefe652cba5b6e46dc2af282ec4028e3eefa (diff)
Don't validate cert path when self-referenced
-rw-r--r--packages/server/src/metadata/verifyAttestationWithMetadata.ts36
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;