@forwardemail/passport-fido2-webauthn
Version:
WebAuthn authentication strategy for Passport.
52 lines (40 loc) • 1.43 kB
JavaScript
var cbor = require('cbor');
exports.USER_PRESENT = 0x01;
exports.USER_VERIFIED = 0x04;
exports.ATTESTED_CREDENTIAL_DATA_INCLUDED = 0x40;
exports.EXTENSIONS_INCLUDED = 0x80;
exports.parse = function(buffer, parseACD, parseCPK) {
parseACD = parseACD !== undefined ? parseACD : true;
parseCPK = parseCPK !== undefined ? parseCPK : true;
var rpIdHash = buffer.slice(0, 32);
var flags = buffer.slice(32, 33);
var signCount = buffer.slice(33, 37);
var pos, len;
// TODO: attested credential data
// TODO: extensions
var authData = {
rpIdHash: rpIdHash,
flags: flags[0],
signCount: signCount.readUInt32BE(0)
};
if ((authData.flags & exports.ATTESTED_CREDENTIAL_DATA_INCLUDED) && parseACD) {
authData.attestedCredentialData = {
aaguid: buffer.slice(37, 53)
};
len = buffer.slice(53, 55);
len = len.readUInt16BE(0);
authData.attestedCredentialData.credentialId = buffer.slice(55, 55 + len);
pos = 55 + len;
// TODO: Determine length of key, so extensions can be parsed, if any
if (parseCPK) {
var publicKey = cbor.decodeFirstSync(buffer.slice(pos));
authData.attestedCredentialData.credentialPublicKey = publicKey;
} else {
authData.attestedCredentialData.credentialPublicKey = buffer.slice(pos);
}
}
if (authData.flags & exports.EXTENSIONS_INCLUDED) {
authData.extensions = {}
}
return authData;
};