| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| <title>TestDriver virtual authenticator methods</title> |
| <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> |
| "use strict"; |
| |
| // Encodes |data| into a base64url string. There is no '=' padding, and the |
| // characters '-' and '_' must be used instead of '+' and '/', respectively. |
| function base64urlEncode(data) { |
| let result = btoa(data); |
| return result.replaceAll("=", "").replaceAll("+", "-").replaceAll("/", "_"); |
| } |
| |
| // The example attestation private key from the U2F spec at |
| // https://fidoalliance.org/specs/fido-u2f-v1.2-ps-20170411/fido-u2f-raw-message-formats-v1.2-ps-20170411.html#registration-example |
| // PKCS.8 encoded without encryption, as a base64url string. |
| const private_key = |
| "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg8_zMDQDYAxlU-Q" |
| + "hk1Dwkf0v18GZca1DMF3SaJ9HPdmShRANCAASNYX5lyVCOZLzFZzrIKmeZ2jwU" |
| + "RmgsJYxGP__fWN_S-j5sN4tT15XEpN_7QZnt14YvI6uvAgO0uJEboFaZlOEB"; |
| let credential_id = base64urlEncode("cred-1"); |
| let credential = { |
| credentialId: credential_id, |
| rpId: window.location.hostname, |
| privateKey: private_key, |
| signCount: 0, |
| isResidentCredential: false, |
| }; |
| |
| let authenticator_id = null; |
| |
| promise_test(async t => { |
| authenticator_id = await test_driver.add_virtual_authenticator({ |
| protocol: "ctap1/u2f", |
| transport: "usb", |
| }); |
| }, "Can create an authenticator"); |
| |
| promise_test(async t => { |
| return test_driver.add_credential(authenticator_id, credential); |
| }, "Can add a credential"); |
| |
| promise_test(async t => { |
| let credentials = await test_driver.get_credentials(authenticator_id); |
| assert_equals(credentials.length, 1); |
| // The U2F REGISTER operation stores the hash of the rpId, so the rpId |
| // itself may not be available on the returned credential. |
| assert_equals(credentials[0].credentialId, credential.credentialId); |
| assert_equals(credentials[0].privateKey, credential.privateKey); |
| assert_equals(credentials[0].signCount, credential.signCount); |
| assert_equals(credentials[0].isResidentCredential, |
| credential.isResidentCredential); |
| }, "Can get the credentials"); |
| |
| promise_test(async t => { |
| await test_driver.remove_credential(authenticator_id, credential_id); |
| let credentials = await test_driver.get_credentials(authenticator_id); |
| assert_equals(credentials.length, 0); |
| }, "Can remove a credential"); |
| |
| promise_test(async t => { |
| let credential1 = credential; |
| let credential2 = |
| Object.assign({}, credential, {credentialId: base64urlEncode("cred-2")}); |
| await test_driver.add_credential(authenticator_id, credential1); |
| await test_driver.add_credential(authenticator_id, credential2); |
| |
| let credentials = await test_driver.get_credentials(authenticator_id); |
| assert_equals(credentials.length, 2); |
| |
| await test_driver.remove_all_credentials(authenticator_id); |
| credentials = await test_driver.get_credentials(authenticator_id); |
| assert_equals(credentials.length, 0); |
| }, "Can remove all credentials"); |
| |
| promise_test(async t => { |
| await test_driver.set_user_verified(authenticator_id, {isUserVerified: true}); |
| await test_driver.set_user_verified(authenticator_id, {isUserVerified: false}); |
| }, "Can set user verified"); |
| |
| promise_test(async t => { |
| await test_driver.remove_virtual_authenticator(authenticator_id); |
| }, "Can remove a virtual authenticator"); |
| </script> |