summaryrefslogtreecommitdiffhomepage
path: root/packages/server/src/helpers/parseAuthenticatorData.ts
diff options
context:
space:
mode:
authorMatthew Miller <matthew@millerti.me>2020-05-22 16:23:53 -0700
committerMatthew Miller <matthew@millerti.me>2020-05-22 16:23:53 -0700
commit46a1834e0bfa11e4546b11ae96b02d6a602ac3e2 (patch)
treeb4b9ca5f8108ae94eeb81ad2351cd3530f3fd22a /packages/server/src/helpers/parseAuthenticatorData.ts
parent025317106f256389e8c2de086b25276aa25573a0 (diff)
Convert parseAttestationAuthData to helper
Diffstat (limited to 'packages/server/src/helpers/parseAuthenticatorData.ts')
-rw-r--r--packages/server/src/helpers/parseAuthenticatorData.ts59
1 files changed, 59 insertions, 0 deletions
diff --git a/packages/server/src/helpers/parseAuthenticatorData.ts b/packages/server/src/helpers/parseAuthenticatorData.ts
new file mode 100644
index 0000000..a3dd868
--- /dev/null
+++ b/packages/server/src/helpers/parseAuthenticatorData.ts
@@ -0,0 +1,59 @@
+import { ParsedAuthenticatorData } from "@webauthntine/typescript-types";
+
+/**
+ * Make sense of the authData buffer contained in an Attestation
+ */
+export default function parseAuthenticatorData(authData: Buffer): ParsedAuthenticatorData {
+ let intBuffer = authData;
+
+ const rpIdHash = intBuffer.slice(0, 32);
+ intBuffer = intBuffer.slice(32);
+
+ const flagsBuf = intBuffer.slice(0, 1);
+ intBuffer = intBuffer.slice(1);
+
+ const flagsInt = flagsBuf[0];
+
+ const flags = {
+ up: !!(flagsInt & 0x01),
+ uv: !!(flagsInt & 0x04),
+ at: !!(flagsInt & 0x40),
+ ed: !!(flagsInt & 0x80),
+ flagsInt,
+ };
+
+ const counterBuf = intBuffer.slice(0, 4);
+ intBuffer = intBuffer.slice(4);
+
+ const counter = counterBuf.readUInt32BE(0);
+
+ let aaguid: Buffer | undefined = undefined;
+ let credentialID: Buffer | undefined = undefined;
+ let COSEPublicKey: Buffer | undefined = undefined;
+
+ if (flags.at) {
+ aaguid = intBuffer.slice(0, 16);
+ intBuffer = intBuffer.slice(16);
+
+ const credIDLenBuf = intBuffer.slice(0, 2);
+ intBuffer = intBuffer.slice(2);
+
+ const credIDLen = credIDLenBuf.readUInt16BE(0);
+
+ credentialID = intBuffer.slice(0, credIDLen);
+ intBuffer = intBuffer.slice(credIDLen);
+
+ COSEPublicKey = intBuffer;
+ }
+
+ return {
+ rpIdHash,
+ flagsBuf,
+ flags,
+ counter,
+ counterBuf,
+ aaguid,
+ credentialID,
+ COSEPublicKey,
+ };
+}