// META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js // META: script=/resources/utils.js // META: script=helpers.js // The string "test" as ASCII bytes and base64url-encoded. const test_bytes = new Uint8Array([0x74, 0x65, 0x73, 0x74]); const test_b64 = "dGVzdA"; test(() => { let actual = PublicKeyCredential.parseRequestOptionsFromJSON({ challenge: test_b64, timeout: 60000, rpId: "example.com", allowCredentials: [ { type: "public-key", id: test_b64 }, ], userVerification: "required", hints: ["hybrid", "security-key"], }); let expected = { challenge: test_bytes, timeout: 60000, rpId: "example.com", allowCredentials: [ { type: "public-key", id: test_bytes }, ], userVerification: "required", hints: ["hybrid", "security-key"], }; assert_equals(actual.rpId, expected.rpId); assert_true(bytesEqual(actual.challenge, expected.challenge)); assert_equals(actual.timeout, expected.timeout); assert_equals(actual.allowCredentials.length, expected.allowCredentials.length); assert_equals(actual.allowCredentials[0].type, expected.allowCredentials[0].type); assert_true(bytesEqual(actual.allowCredentials[0].id, expected.allowCredentials[0].id)); assert_equals(actual.userVerification, expected.userVerification); if (actual.hasOwnProperty("hints")) { // Not all implementations support hints yet. assertJsonEquals(actual.hints, expected.hints); } }, "parseRequestOptionsFromJSON()"); test(() => { let actual = PublicKeyCredential.parseRequestOptionsFromJSON({ challenge: test_b64, extensions: { appid: "app id", largeBlob: { read: true, }, getCredBlob: true, supplementalPubKeys: { scopes: ["spk scope"], attestation: "directest", attestationFormats: ["asn2"], }, prf: { eval: { first: test_b64, second: test_b64, }, evalByCredential: { "test cred": { first: test_b64, second: test_b64, }, }, }, }, }); let expected = { challenge: test_b64, extensions: { appid: "app id", largeBlob: { read: true, }, getCredBlob: true, supplementalPubKeys: { scopes: ["spk scope"], attestation: "directest", attestationFormats: ["asn2"], }, prf: { eval: { first: test_bytes, second: test_bytes, }, evalByCredential: { "test cred": { first: test_bytes, second: test_bytes, }, }, }, }, }; assert_equals(actual.extensions.appid, expected.extensions.appid); // Some implementations do not support all of these extensions. if (actual.extensions.hasOwnProperty('largeBlob')) { assert_equals( actual.extensions.largeBlob.read, expected.extensions.largeBlob.read); } if (actual.extensions.hasOwnProperty('getCredBlob')) { assert_equals( actual.extensions.getCredBlob, expected.extensions.getCredBlob); } if (actual.extensions.hasOwnProperty('supplementalPubKeys')) { assertJsonEquals( actual.extensions.supplementalPubKeys, expected.extensions.supplementalPubKeys); } if (actual.extensions.hasOwnProperty('prf')) { let prfValuesEquals = (a, b) => { return bytesEqual(a.first, b.first) && bytesEqual(a.second, b.second); }; assert_true( prfValuesEquals( actual.extensions.prf.eval, expected.extensions.prf.eval), 'prf eval'); assert_true( prfValuesEquals( actual.extensions.prf.evalByCredential['test cred'], expected.extensions.prf.evalByCredential['test cred']), 'prf ebc'); } }, "parseRequestOptionsFromJSON() with extensions");