summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/attestation/verifications/verifyNone.ts55
-rw-r--r--src/attestation/verifyAttestationResponse.test.ts24
-rw-r--r--src/attestation/verifyAttestationResponse.ts9
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);