blob: f4ce85929054b19b832df335ce0b9649f21a74a2 [file] [log] [blame]
(async function(testRunner) {
const {page, session, dp} =
await testRunner.startURL(
"https://devtools.test:8443/inspector-protocol/webauthn/resources/webauthn-test.https.html",
"Check that WebAuthn large blob operations work");
// Create an authenticator.
await dp.WebAuthn.enable();
const authenticatorId = (await dp.WebAuthn.addVirtualAuthenticator({
options: {
protocol: "ctap2",
ctap2Version: "ctap2_1",
transport: "usb",
hasResidentKey: true,
hasUserVerification: true,
hasLargeBlob: true,
isUserVerified: true,
},
})).result.authenticatorId;
// Register a credential with a large blob through webauthn.
let result = await session.evaluateAsync(`registerCredential({
extensions: {
largeBlob: {
support: "preferred",
},
},
authenticatorSelection: {
requireResidentKey: true,
},
})`);
testRunner.log(`Create credential result: ${result.status}`);
testRunner.log(`Large blob support: ${result.largeBlobSupported}`);
// Register a credential with a large blob through devtools.
const credentialId = btoa("cred-1");
const largeBlob =
"I'm Commander Shepard, and this is my favorite blob on the Citadel!";
testRunner.log(await dp.WebAuthn.addCredential({
authenticatorId,
credential: {
credentialId,
userHandle: btoa("isabelle"),
rpId: "devtools.test",
privateKey: await session.evaluateAsync("generateBase64Key()"),
signCount: 0,
isResidentCredential: true,
largeBlob: btoa(largeBlob),
}
}));
// Read the large blob through the WebAuthn API.
result = await session.evaluateAsync(`getCredential({
type: "public-key",
id: new TextEncoder().encode("cred-1"),
transports: ["usb", "ble", "nfc"],
}, {
extensions: {
largeBlob: {
read: true,
},
},
})`);
testRunner.log(`Assertion result: ${result.status}`);
testRunner.log(`Got ${result.blob}`);
// Read the large blob through Devtools.
let credential =
(await dp.WebAuthn.getCredential({authenticatorId, credentialId})).result.credential;
testRunner.log(`Got ${atob(credential.largeBlob)}`);
testRunner.completeTest();
})