Skip to content

Commit d938d5a

Browse files
authored
Tests for extensions validator
- fixed extensions validator - added tests for extensions validation
1 parent c30a93c commit d938d5a

File tree

4 files changed

+46
-9
lines changed

4 files changed

+46
-9
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: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -615,16 +615,23 @@ async function validatePublicKey() {
615615

616616
function validateExtensions() {
617617
const extensions = this.authnrData.get("webAuthnExtensions");
618-
619-
if (extensions === undefined ||
620-
Array.isArray(extensions) &&
621-
extensions.every(item => typeof item === "object")
622-
) {
623-
this.audit.journal.add("webAuthnExtensions");
624-
return true;
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+
}
625632
}
626633

627-
throw new Error("unable to validate webAuthnExtensions");
634+
return true;
628635
}
629636

630637
async function validateUserHandle() {

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)