Skip to content

Commit 6fe8f54

Browse files
authored
Merge pull request #108 from HSMDBC/master
Validator for extensions
2 parents a1bd544 + d938d5a commit 6fe8f54

File tree

4 files changed

+53
-1
lines changed

4 files changed

+53
-1
lines changed

lib/response.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class Fido2Result {
4848
await this.validateRawAuthnrData();
4949
await this.validateRpIdHash();
5050
await this.validateFlags();
51+
await this.validateExtensions();
5152
}
5253

5354
async create(req, exp) {

lib/validator.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,27 @@ async function validatePublicKey() {
613613
return true;
614614
}
615615

616+
function validateExtensions() {
617+
const extensions = this.authnrData.get("webAuthnExtensions");
618+
const shouldHaveExtensions = this.authnrData.get("flags").has("ED");
619+
620+
if (shouldHaveExtensions) {
621+
if (Array.isArray(extensions) &&
622+
extensions.every(item => typeof item === "object")
623+
) {
624+
this.audit.journal.add("webAuthnExtensions");
625+
} else {
626+
throw new Error("webAuthnExtensions aren't valid");
627+
}
628+
} else {
629+
if (extensions !== undefined) {
630+
throw new Error("unexpected webAuthnExtensions found");
631+
}
632+
}
633+
634+
return true;
635+
}
636+
616637
async function validateUserHandle() {
617638
let userHandle = this.authnrData.get("userHandle");
618639

@@ -706,6 +727,7 @@ function attach(o) {
706727
validateAaguid,
707728
validateCredId,
708729
validatePublicKey,
730+
validateExtensions,
709731
validateFlags,
710732
validateUserHandle,
711733
validateCounter,

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "fido2-lib",
3-
"version": "3.3.1",
3+
"version": "3.3.2",
44
"description": "A library for performing FIDO 2.0 / WebAuthn functionality",
55
"type": "module",
66
"main": "dist/main.cjs",

test/validator.test.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -722,6 +722,34 @@ describe("attestation validation", function() {
722722
});
723723
});
724724

725+
describe("validateExtensions", function() {
726+
// original test data does not contain extensions
727+
it("returns true on validation without extensions", async function() {
728+
const ret = attResp.validateExtensions();
729+
assert.isTrue(ret);
730+
assert.isFalse(attResp.audit.journal.has("webAuthnExtensions"));
731+
});
732+
733+
it("returns true on validation with extensions", async function() {
734+
attResp.authnrData.get("flags").add("ED");
735+
attResp.authnrData.set("webAuthnExtensions", [{ credProtect: 1 }]);
736+
const ret = attResp.validateExtensions();
737+
assert.isTrue(ret);
738+
assert.isTrue(attResp.audit.journal.has("webAuthnExtensions"));
739+
});
740+
741+
it("throws on invalid extensions", async function() {
742+
attResp.authnrData.get("flags").add("ED");
743+
attResp.authnrData.set("webAuthnExtensions", [42]);
744+
assert.throws(() => attResp.validateExtensions(), Error, "webAuthnExtensions aren't valid");
745+
});
746+
747+
it("throws on unexpected extensions", async function() {
748+
attResp.authnrData.set("webAuthnExtensions", [{ credProtect: 1 }]);
749+
assert.throws(() => attResp.validateExtensions(), Error, "unexpected webAuthnExtensions found");
750+
});
751+
});
752+
725753
describe("validateTokenBinding", function() {
726754
it("returns true if tokenBinding is undefined", async function() {
727755
const ret = await attResp.validateTokenBinding();
@@ -828,6 +856,7 @@ describe("attestation validation", function() {
828856
await attResp.validateAaguid();
829857
await attResp.validateCredId();
830858
await attResp.validatePublicKey();
859+
await attResp.validateExtensions();
831860
await attResp.validateFlags();
832861
await attResp.validateInitialCounter();
833862

0 commit comments

Comments
 (0)