diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/attestation/verifications/verifyNone.ts | 55 | ||||
-rw-r--r-- | src/attestation/verifyAttestationResponse.test.ts | 24 | ||||
-rw-r--r-- | src/attestation/verifyAttestationResponse.ts | 9 |
3 files changed, 84 insertions, 4 deletions
diff --git a/src/attestation/verifications/verifyNone.ts b/src/attestation/verifications/verifyNone.ts new file mode 100644 index 0000000..294153f --- /dev/null +++ b/src/attestation/verifications/verifyNone.ts @@ -0,0 +1,55 @@ +import base64url from 'base64url'; + +import { AttestationObject, VerifiedAttestation } from "@types"; +import parseAttestationAuthData from "@helpers/parseAttestationAuthData"; +import convertCOSEECDHAtoPKCS from "@helpers/convertCOSEECDHAtoPKCS"; + + +export default function verifyAttestationNone( + attestationObject: AttestationObject, +): VerifiedAttestation { + const { fmt, authData } = attestationObject; + const authDataStruct = parseAttestationAuthData(authData); + + console.log('authDataStruct:', authDataStruct); + + const { + credentialID, + COSEPublicKey, + counter, + flags, + } = authDataStruct; + + if (!COSEPublicKey) { + throw new Error('No public key was provided by authenticator'); + } + + if (!credentialID) { + throw new Error('No credential ID was provided by authenticator'); + } + + // Make sure the (U)ser (P)resent for the attestation + if (!flags.up) { + console.error('User was not Present for attestation'); + console.debug('attestation\'s flags:', flags); + throw new Error('User presence could not be verified'); + } + + if (!flags.uv) { + console.warn('The authenticator could not uniquely Verify the user'); + } + + const publicKey = convertCOSEECDHAtoPKCS(COSEPublicKey); + + const toReturn: VerifiedAttestation = { + verified: true, + authenticatorInfo: { + fmt, + counter, + base64PublicKey: base64url.encode(publicKey), + base64CredentialID: base64url.encode(credentialID), + }, + }; + + return toReturn; +} diff --git a/src/attestation/verifyAttestationResponse.test.ts b/src/attestation/verifyAttestationResponse.test.ts index 2314f54..6a6cbd0 100644 --- a/src/attestation/verifyAttestationResponse.test.ts +++ b/src/attestation/verifyAttestationResponse.test.ts @@ -68,3 +68,27 @@ test('should verify Packed attestation', () => { ); }); +test('should verify None attestation', () => { + const verification = verifyAttestationResponse( + { + base64AttestationObject: 'o2NmbXRkbm9uZWdhdHRTdG10oGhhdXRoRGF0YVjFPdxHEOnAiLIp26idVjIguzn3I' + + 'pr_RlsKZWsa-5qK-KBFAAAAAAAAAAAAAAAAAAAAAAAAAAAAQQHSlyRHIdWleVqO24-6ix7JFWODqDWo_arvEz3Se5E' + + 'gIFHkcVjZ4F5XDSBreIHsWRilRnKmaaqlqK3V2_4XtYs2pQECAyYgASFYID5PQTZQQg6haZFQWFzqfAOyQ_ENsMH8x' + + 'xQ4GRiNPsqrIlggU8IVUOV8qpgk_Jh-OTaLuZL52KdX1fTht07X4DiQPow', + base64ClientDataJSON: 'eyJ0eXBlIjoid2ViYXV0aG4uY3JlYXRlIiwiY2hhbGxlbmdlIjoiYUVWalkxQlhkWHBw' + + 'VURBd1NEQndOV2Q0YURKZmRUVmZVRU0wVG1WWloyUSIsIm9yaWdpbiI6Imh0dHBzOlwvXC9kZXYuZG9udG5lZWRhLn' + + 'B3IiwiYW5kcm9pZFBhY2thZ2VOYW1lIjoib3JnLm1vemlsbGEuZmlyZWZveCJ9' + }, + 'https://dev.dontneeda.pw' + ) + + expect(verification.verified).toEqual(true); + expect(verification.authenticatorInfo?.fmt).toEqual('none'); + expect(verification.authenticatorInfo?.counter).toEqual(0); + expect(verification.authenticatorInfo?.base64PublicKey).toEqual( + 'BD5PQTZQQg6haZFQWFzqfAOyQ_ENsMH8xxQ4GRiNPsqrU8IVUOV8qpgk_Jh-OTaLuZL52KdX1fTht07X4DiQPow', + ); + expect(verification.authenticatorInfo?.base64CredentialID).toEqual( + 'AdKXJEch1aV5Wo7bj7qLHskVY4OoNaj9qu8TPdJ7kSAgUeRxWNngXlcNIGt4gexZGKVGcqZpqqWordXb_he1izY', + ); +}); diff --git a/src/attestation/verifyAttestationResponse.ts b/src/attestation/verifyAttestationResponse.ts index 8605dfb..d5b072d 100644 --- a/src/attestation/verifyAttestationResponse.ts +++ b/src/attestation/verifyAttestationResponse.ts @@ -4,6 +4,7 @@ import { ATTESTATION_FORMATS, EncodedAuthenticatorAttestationResponse, VerifiedA import verifyFIDOU2F from './verifications/verifyFIDOU2F'; import verifyPacked from './verifications/verifyPacked'; +import verifyNone from './verifications/verifyNone'; /** * Verify that the user has legitimately completed the registration process @@ -58,10 +59,10 @@ export default function verifyAttestationResponse( // return WebauthnService.verifyAttestationAndroidSafetynet(decodedAttestation, clientDataJSON); // } - // if (fmt === ATTESTATION_FORMATS.NONE) { - // console.log('Decoding None attestation'); - // return WebauthnService.verifyAttestationNone(decodedAttestation, decodedClientDataJSON); - // } + if (fmt === ATTESTATION_FORMATS.NONE) { + console.log('Decoding None attestation'); + return verifyNone(attestationObject); + } const reason = `Unsupported Attestation Format: ${fmt}`; console.error(reason); |