| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <title>navigator.credentials.create() test with residentKey and credProps</title> | |
| <meta name="timeout" content="long"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="/resources/testdriver.js"></script> | |
| <script src="/resources/testdriver-vendor.js"></script> | |
| <script src=helpers.js></script> | |
| <script> | |
| "use strict"; | |
| const credPropsTests = [ | |
| { | |
| name: "U2F", | |
| authenticatorArgs: { | |
| protocol: "ctap1/u2f", | |
| }, | |
| expected: { | |
| discouraged: { | |
| success: true, | |
| hasRk: true, | |
| rk: false, | |
| }, | |
| preferred: { | |
| success: true, | |
| hasRk: true, | |
| rk: false, | |
| }, | |
| required: { | |
| success: false, | |
| }, | |
| }, | |
| }, | |
| { | |
| name: "CTAP 2.0 without resident key support", | |
| authenticatorArgs: { | |
| protocol: "ctap2", | |
| hasResidentKey: false, | |
| hasUserVerification: true, | |
| isUserVerified: true, | |
| }, | |
| expected: { | |
| discouraged: { | |
| success: true, | |
| hasRk: true, | |
| rk: false, | |
| }, | |
| preferred: { | |
| success: true, | |
| hasRk: true, | |
| rk: false, | |
| }, | |
| required: { | |
| success: false, | |
| }, | |
| }, | |
| }, | |
| { | |
| name: "CTAP 2.0 with resident key support", | |
| authenticatorArgs: { | |
| protocol: "ctap2", | |
| hasResidentKey: true, | |
| hasUserVerification: true, | |
| isUserVerified: true, | |
| }, | |
| expected: { | |
| discouraged: { | |
| success: true, | |
| // CTAP2.0 authenticators may treat all credentials as discoverable, | |
| // thus Chrome omits 'rk' in this case. | |
| hasRk: false, | |
| }, | |
| preferred: { | |
| success: true, | |
| hasRk: true, | |
| rk: true, | |
| }, | |
| required: { | |
| success: true, | |
| hasRk: true, | |
| rk: true, | |
| }, | |
| }, | |
| }, | |
| { | |
| name: "CTAP 2.1 without resident key support", | |
| authenticatorArgs: { | |
| protocol: "ctap2_1", | |
| hasResidentKey: false, | |
| hasUserVerification: true, | |
| isUserVerified: true, | |
| }, | |
| expected: { | |
| discouraged: { | |
| success: true, | |
| hasRk: true, | |
| rk: false, | |
| }, | |
| preferred: { | |
| success: true, | |
| hasRk: true, | |
| rk: false, | |
| }, | |
| required: { | |
| success: false, | |
| }, | |
| }, | |
| }, | |
| { | |
| name: "CTAP 2.1 with resident key support", | |
| authenticatorArgs: { | |
| protocol: "ctap2_1", | |
| hasResidentKey: true, | |
| hasUserVerification: true, | |
| isUserVerified: true, | |
| }, | |
| expected: { | |
| discouraged: { | |
| success: true, | |
| hasRk: true, | |
| rk: false, | |
| }, | |
| preferred: { | |
| success: true, | |
| hasRk: true, | |
| rk: true, | |
| }, | |
| required: { | |
| success: true, | |
| hasRk: true, | |
| rk: true, | |
| }, | |
| }, | |
| }, | |
| ]; | |
| for (const fixture of credPropsTests) { | |
| for (const rkRequirement of ["discouraged", "preferred", "required"]) { | |
| virtualAuthenticatorPromiseTest(async t => { | |
| const promise = createCredential({ | |
| options: { | |
| publicKey: { | |
| authenticatorSelection: { | |
| residentKey: rkRequirement, | |
| }, | |
| extensions: { | |
| credProps: true, | |
| }, | |
| }, | |
| }, | |
| }); | |
| assert_true(rkRequirement in fixture.expected); | |
| const expected = fixture.expected[rkRequirement]; | |
| assert_true('success' in expected); | |
| if (!expected.success) { | |
| return promise_rejects_dom(t, "NotAllowedError", promise); | |
| } | |
| const cred = await promise; | |
| assert_true('credProps' in cred.getClientExtensionResults()); | |
| const credProps = cred.getClientExtensionResults().credProps; | |
| assert_equals('rk' in credProps, expected.hasRk, "hasRk"); | |
| if (expected.hasRk) { | |
| assert_equals(credProps.rk, expected.rk, "rk"); | |
| } | |
| }, fixture.authenticatorArgs, fixture.name | |
| + ": navigator.credentials.create() with credProps extension, rk=" | |
| + rkRequirement); | |
| } | |
| } | |
| </script> | |
| </head> | |
| <body></body> | |
| </html> |