| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| <title>credBlob extension tests</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> |
| <body></body> |
| <script> |
| "use strict"; |
| |
| const blobu8 = new Uint8Array(16); |
| window.crypto.getRandomValues(blobu8); |
| const blob = blobu8.buffer; |
| const authenticatorOptions = { |
| protocol: "ctap2_1", |
| extensions: ["credBlob"], |
| }; |
| |
| function compareBuffers(a, b) { |
| if (a.byteLength != b.byteLength) { |
| return false; |
| } |
| const a8 = new Uint8Array(a); |
| const b8 = new Uint8Array(b); |
| for (let i = 0; i < a8.length; i++) { |
| if (a8[i] != b8[i]) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| virtualAuthenticatorPromiseTest(async t => { |
| const cred = await createCredential({ |
| options: { |
| publicKey: {}, |
| }, |
| }); |
| |
| const createExtensions = cred.getClientExtensionResults(); |
| assert_not_own_property(createExtensions, "credBlob"); |
| |
| const assertion = await navigator.credentials.get({publicKey: { |
| challenge: new Uint8Array(), |
| allowCredentials: [{ |
| id: cred.rawId, |
| type: "public-key", |
| }], |
| extensions: { |
| getCredBlob: true, |
| }, |
| }}); |
| |
| const getExtensions = assertion.getClientExtensionResults(); |
| assert_own_property(getExtensions, "getCredBlob"); |
| const emptyBuffer = new Uint8Array(); |
| assert_true(compareBuffers(getExtensions.getCredBlob, emptyBuffer)); |
| }, authenticatorOptions, "assertion without credBlob"); |
| |
| virtualAuthenticatorPromiseTest(async t => { |
| const cred = await createCredential({ |
| options: { |
| publicKey: { |
| extensions: { |
| credBlob: blob, |
| }, |
| }, |
| }, |
| }); |
| |
| const createExtensions = cred.getClientExtensionResults(); |
| assert_own_property(createExtensions, "credBlob"); |
| assert_equals(createExtensions.credBlob, true, "extension supported at create time"); |
| |
| const assertion = await navigator.credentials.get({publicKey: { |
| challenge: new Uint8Array(), |
| allowCredentials: [{ |
| id: cred.rawId, |
| type: "public-key", |
| }], |
| extensions: { |
| getCredBlob: true, |
| }, |
| }}); |
| |
| const getExtensions = assertion.getClientExtensionResults(); |
| assert_own_property(getExtensions, "getCredBlob"); |
| assert_true(compareBuffers(getExtensions.getCredBlob, blob)); |
| }, authenticatorOptions, "assertion with credBlob"); |
| </script> |