forked from passwordless-id/webauthn
-
Notifications
You must be signed in to change notification settings - Fork 0
/
parsers.ts
47 lines (36 loc) · 1.65 KB
/
parsers.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import * as authenticators from './authenticators.js'
import * as utils from './utils.js'
import { AuthenticatorInfo, ClientInfo, RegistrationEncoded, RegistrationParsed, AuthenticationEncoded, AuthenticationParsed } from './types'
const utf8Decoder = new TextDecoder('utf-8')
export function parseClient(data :string|ArrayBuffer) :ClientInfo {
if(typeof data == 'string')
data = utils.parseBase64url(data)
return JSON.parse(utf8Decoder.decode(data))
}
export function parseAuthenticator(data :string|ArrayBuffer) :AuthenticatorInfo {
if(typeof data == 'string')
data = utils.parseBase64url(data)
return authenticators.parseAuthBuffer(data)
}
export function parseAttestation(data :string|ArrayBuffer) :unknown {
if(typeof data == 'string')
data = utils.parseBase64url(data)
return 'Really complex to parse. Good luck with that one!'
}
export function parseRegistration(registration :RegistrationEncoded) :RegistrationParsed {
return {
username: registration.username,
credential: registration.credential,
client: parseClient(registration.clientData),
authenticator: parseAuthenticator(registration.authenticatorData),
attestation: registration.attestationData ? parseAttestation(registration.attestationData) : null
}
}
export function parseAuthentication(authentication :AuthenticationEncoded) :AuthenticationParsed {
return {
credentialId: authentication.credentialId,
client: parseClient(authentication.clientData),
authenticator: parseAuthenticator(authentication.authenticatorData),
signature: authentication.signature
}
}