Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- This WPT test may be referenced by the following Test IDs:
- /webauthn/public-key-credential-creation-options-from-json.https.window.html - WPT Dashboard Interop Dashboard
// 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.parseCreationOptionsFromJSON({
rp: {
id: "example.com",
name: "Example Inc",
},
user: {
id: test_b64,
name: "test@example.com",
displayName: "test user"
},
challenge: test_b64,
pubKeyCredParams: [
{
type: "public-key",
alg: -7,
},
],
});
let expected = {
rp: {
id: "example.com",
name: "Example Inc",
},
user: {
id: test_bytes,
name: "test@example.com",
displayName: "test user"
},
challenge: test_bytes,
pubKeyCredParams: [
{
type: "public-key",
alg: -7,
},
],
// The spec defaults the following fields:
attestation: "none",
hints: [],
};
assertJsonEquals(actual.rp, expected.rp);
assert_true(userEntityEquals(actual.user, expected.user));
assert_true(bytesEqual(actual.challenge, expected.challenge));
assertJsonEquals(actual.pubKeyCredParams, expected.pubKeyCredParams, "pk");
assert_equals(actual.attestation, expected.attestation);
if (actual.hasOwnProperty('hints')) {
// Not all implementations support hints yet.
assertJsonEquals(actual.hints, expected.hints);
}
}, "parseCreationOptionsFromJSON()");
test(() => {
assert_throws_dom("EncodingError", () => {
PublicKeyCredential.parseCreationOptionsFromJSON({
rp: {
id: "example.com",
name: "Example Inc",
},
user: {
id: "not valid base64url",
name: "test@example.com",
displayName: "test user"
},
challenge: "not valid base64url",
pubKeyCredParams: [
{
type: "public-key",
alg: -7,
},
],
});
});
}, "parseCreationOptionsFromJSON() throws EncodingError");
test(() => {
let actual = PublicKeyCredential.parseCreationOptionsFromJSON({
rp: {
id: "example.com",
name: "Example Inc",
},
user: {
id: test_b64,
name: "test@example.com",
displayName: "test user"
},
challenge: test_b64,
pubKeyCredParams: [
{
type: "public-key",
alg: -7,
},
],
extensions: {
hmacCreateSecret: true,
credentialProtectionPolicy: "userVerificationRequired",
enforceCredentialProtectionPolicy: true,
minPinLength: true,
credProps: true,
largeBlob: {
support: "required",
write: test_b64,
},
credBlob: test_b64,
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 = {
rp: {
id: "example.com",
name: "Example Inc",
},
user: {
id: test_bytes,
name: "test@example.com",
displayName: "test user"
},
challenge: test_bytes,
pubKeyCredParams: [
{
type: "public-key",
alg: -7,
},
],
extensions: {
hmacCreateSecret: true,
credentialProtectionPolicy: "userVerificationRequired",
enforceCredentialProtectionPolicy: true,
minPinLength: true,
credProps: true,
largeBlob: {
support: "required",
write: test_bytes,
},
credBlob: test_bytes,
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,
},
},
},
},
};
// Some implementations do not support all of these extensions.
if (actual.extensions.hasOwnProperty('appidExclude')) {
assert_equals(
actual.extensions.appidExclude, expected.extensions.appidExclude);
}
if (actual.extensions.hasOwnProperty('hmacCreateSecret')) {
assert_equals(
actual.extensions.hmacCreateSecret,
expected.extensions.hmacCreateSecret);
}
if (actual.extensions.hasOwnProperty('credentialProtectionPolicy')) {
assert_equals(
actual.extensions.credentialProtectionPolicy,
expected.extensions.credentialProtectionPolicy);
}
if (actual.extensions.hasOwnProperty('enforceCredentialProtectionPolicy')) {
assert_equals(
actual.extensions.enforceCredentialProtectionPolicy,
expected.extensions.enforceCredentialProtectionPolicy);
}
if (actual.extensions.hasOwnProperty('minPinLength')) {
assert_equals(
actual.extensions.minPinLength, expected.extensions.minPinLength);
}
if (actual.extensions.hasOwnProperty('credProps')) {
assert_equals(actual.extensions.credProps, expected.extensions.credProps);
}
if (actual.extensions.hasOwnProperty('largeBlob')) {
assert_equals(
actual.extensions.largeBlob.support,
expected.extensions.largeBlob.support);
assert_true(bytesEqual(
actual.extensions.largeBlob.write,
expected.extensions.largeBlob.write));
}
if (actual.extensions.hasOwnProperty('credBlob')) {
assert_true(
bytesEqual(actual.extensions.credBlob, expected.extensions.credBlob));
}
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');
}
}, "parseCreationOptionsFromJSON() with extensions");