blob: a08b651a764c8ab3b41f5b8cf1e128f4ff1d96d3 [file] [log] [blame]
import {AuthenticatorAttachment, AuthenticatorTransport} from '/gen/third_party/blink/public/mojom/webauthn/authenticator.mojom.m.js';
import {ClientToAuthenticatorProtocol, VirtualAuthenticatorManager} from '/gen/third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom.m.js';
class VirtualAuthenticator {
constructor(virtualAuthenticator) {
this.virtualAuthenticator_ = virtualAuthenticator;
}
async uniqueId() {
const {id} = await this.virtualAuthenticator_.getUniqueId();
return id;
}
// Alias for uniqueId().
async id() {
return this.uniqueId();
}
async registeredKeys() {
const {keys} = await this.virtualAuthenticator_.getRegistrations();
return keys;
}
async generateAndRegisterKey(keyHandle, rpId) {
let ecKey = await window.crypto.subtle.generateKey(
{ name: "ECDSA", namedCurve: "P-256" }, true /* extractable */, ["sign", "verify"]);
let privateKeyPkcs8 = await window.crypto.subtle.exportKey("pkcs8", ecKey.privateKey);
let registration = {
privateKey: new Uint8Array(privateKeyPkcs8),
keyHandle: keyHandle,
rpId,
counter: 1,
};
const {added} =
await this.virtualAuthenticator_.addRegistration(registration);
return added;
}
async clearRegisteredKeys() {
const {keys} = await this.virtualAuthenticator_.clearRegistrations();
return keys;
}
async setLargeBlob(keyHandle, blob) {
const {set} =
await this.virtualAuthenticator_.setLargeBlob(keyHandle, blob);
return set;
}
async getLargeBlob(keyHandle) {
const {blob} = await this.virtualAuthenticator_.getLargeBlob(keyHandle);
return blob;
}
async setUserPresence(present) {
return this.virtualAuthenticator_.setUserPresence(present);
}
async userPresence() {
const {present} = await this.virtualAuthenticator_.getUserPresence();
return present;
}
}
export class TestAuthenticatorManager {
constructor() {
this.virtualAuthenticatorManager_ = VirtualAuthenticatorManager.getRemote();
}
async createAuthenticator(options = {}) {
options = Object.assign(
{
protocol: ClientToAuthenticatorProtocol.CTAP2,
ctap2Version: ClientToAuthenticatorProtocol.CTAP2_0,
transport: AuthenticatorTransport.USB,
attachment: AuthenticatorAttachment.CROSS_PLATFORM,
hasResidentKey: true,
hasUserVerification: true,
hasLargeBlob: false,
},
options);
const {authenticator} =
await this.virtualAuthenticatorManager_.createAuthenticator(options);
return new VirtualAuthenticator(authenticator);
}
async authenticators() {
const {authenticators} =
await this.virtualAuthenticatorManager_.getAuthenticators();
return authenticators.map(a => new VirtualAuthenticator(a));
}
async removeAuthenticator(id) {
const {removed} =
await this.virtualAuthenticatorManager_.removeAuthenticator(id);
return removed;
}
async clearAuthenticators(id) {
return this.virtualAuthenticatorManager_.clearAuthenticators();
}
}