41 lines
1.5 KiB
TypeScript
41 lines
1.5 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import {
|
|
authenticationExtensions,
|
|
extensionOutputToJson,
|
|
registrationExtensions,
|
|
} from "../../src/webauthn/extensions";
|
|
|
|
describe("WebAuthn extension inputs", () => {
|
|
it("builds registration inputs without silently changing binary values", () => {
|
|
const result = registrationExtensions({
|
|
credProps: true,
|
|
appidExclude: "https://legacy.example.test/app-id.json",
|
|
prf: { enabled: true, first: "base64url:AQID", second: "label" },
|
|
largeBlob: { registrationSupport: "required" },
|
|
}) as AuthenticationExtensionsClientInputs & { appidExclude: string };
|
|
expect(result.credProps).toBe(true);
|
|
expect(result.appidExclude).toBe("https://legacy.example.test/app-id.json");
|
|
expect(new Uint8Array(result.prf!.eval!.first as ArrayBuffer)).toEqual(
|
|
Uint8Array.of(1, 2, 3),
|
|
);
|
|
expect(result.largeBlob).toEqual({ support: "required" });
|
|
});
|
|
|
|
it("rejects invalid AppID and conflicting largeBlob operations", () => {
|
|
expect(() =>
|
|
registrationExtensions({ appidExclude: "http://unsafe" }),
|
|
).toThrow(/HTTPS/u);
|
|
expect(() =>
|
|
authenticationExtensions({
|
|
largeBlob: { read: true, write: "payload" },
|
|
}),
|
|
).toThrow(/cannot be requested together/u);
|
|
});
|
|
|
|
it("serializes extension buffers for inspection", () => {
|
|
expect(extensionOutputToJson({ result: Uint8Array.of(1, 2, 3) })).toEqual({
|
|
result: { base64url: "AQID", bytes: 3 },
|
|
});
|
|
});
|
|
});
|