diff --git a/src/libs/crypto/vc/passkeyDidPeer.ts b/src/libs/crypto/vc/passkeyDidPeer.ts index b1eeb9b4..ec1ba0a1 100644 --- a/src/libs/crypto/vc/passkeyDidPeer.ts +++ b/src/libs/crypto/vc/passkeyDidPeer.ts @@ -2,6 +2,7 @@ import { Buffer } from "buffer/"; import { JWTPayload } from "did-jwt"; import { DIDResolutionResult } from "did-resolver"; import { sha256 } from "ethereum-cryptography/sha256.js"; +import { p256 } from "@noble/curves/p256"; import { startAuthentication, startRegistration, @@ -11,12 +12,13 @@ import { generateRegistrationOptions, verifyAuthenticationResponse, verifyRegistrationResponse, + VerifyAuthenticationResponseOpts, } from "@simplewebauthn/server"; -import { VerifyAuthenticationResponseOpts } from "@simplewebauthn/server/esm/authentication/verifyAuthenticationResponse"; import { Base64URLString, PublicKeyCredentialCreationOptionsJSON, PublicKeyCredentialRequestOptionsJSON, + AuthenticatorAssertionResponse, } from "@simplewebauthn/types"; import { AppString } from "../../../constants/app"; @@ -194,16 +196,17 @@ export class PeerSetup { }, }; - const credential = await navigator.credentials.get(options); + const credential = await navigator.credentials.get(options) as PublicKeyCredential; // console.log("nav credential get", credential); - this.authenticatorData = credential?.response.authenticatorData; + const response = credential?.response as AuthenticatorAssertionResponse; + this.authenticatorData = response?.authenticatorData; const authenticatorDataBase64Url = arrayBufferToBase64URLString( this.authenticatorData as ArrayBuffer, ); this.clientDataJsonBase64Url = arrayBufferToBase64URLString( - credential?.response.clientDataJSON, + response?.clientDataJSON, ); // Our custom type of JWANT means the signature is based on a concatenation of the two Webauthn properties @@ -228,7 +231,7 @@ export class PeerSetup { .replace(/\//g, "_") .replace(/=+$/, ""); - const origSignature = Buffer.from(credential?.response.signature).toString( + const origSignature = Buffer.from(response?.signature).toString( "base64", ); this.signature = origSignature @@ -403,102 +406,22 @@ export async function verifyJwtWebCrypto( return verifyPeerSignature(preimage, issuerDid, finalSigBuffer); } -// eslint-disable-next-line @typescript-eslint/no-unused-vars -async function peerDidToDidDocument(did: string): Promise { - if (!did.startsWith("did:peer:0z")) { - throw new Error( - "This only verifies a peer DID, method 0, encoded base58btc.", - ); - } - // this is basically hard-coded from https://www.w3.org/TR/did-core/#example-various-verification-method-types - // (another reference is the @aviarytech/did-peer resolver) - - /** - * Looks like JsonWebKey2020 isn't too difficult: - * - change context security/suites link to jws-2020/v1 - * - change publicKeyMultibase to publicKeyJwk generated with cborToKeys - * - change type to JsonWebKey2020 - */ - - const id = did.split(":")[2]; - const multibase = id.slice(1); - const encnumbasis = multibase.slice(1); - const didDocument = { - "@context": [ - "https://www.w3.org/ns/did/v1", - "https://w3id.org/security/suites/secp256k1-2019/v1", - ], - assertionMethod: [did + "#" + encnumbasis], - authentication: [did + "#" + encnumbasis], - capabilityDelegation: [did + "#" + encnumbasis], - capabilityInvocation: [did + "#" + encnumbasis], - id: did, - keyAgreement: undefined, - service: undefined, - verificationMethod: [ - { - controller: did, - id: did + "#" + encnumbasis, - publicKeyMultibase: multibase, - type: "EcdsaSecp256k1VerificationKey2019", - }, - ], - }; - return { - didDocument, - didDocumentMetadata: {}, - didResolutionMetadata: { contentType: "application/did+ld+json" }, - }; -} - -// convert COSE public key to PEM format -// eslint-disable-next-line @typescript-eslint/no-unused-vars -function COSEtoPEM(cose: Buffer) { - // const alg = cose.get(3); // Algorithm - const x = cose[-2]; // x-coordinate - const y = cose[-3]; // y-coordinate - - // Ensure the coordinates are in the correct format - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error because it complains about the type of x and y - const pubKeyBuffer = Buffer.concat([Buffer.from([0x04]), x, y]); - - // Convert to PEM format - const pem = `-----BEGIN PUBLIC KEY----- -${pubKeyBuffer.toString("base64")} ------END PUBLIC KEY-----`; - - return pem; -} +// Remove unused functions: +// - peerDidToDidDocument +// - COSEtoPEM +// - base64urlDecodeArrayBuffer +// - base64urlEncodeArrayBuffer +// - pemToCryptoKey -// tried the base64url library but got an error using their Buffer +// Keep only the used functions: export function base64urlDecodeString(input: string) { return atob(input.replace(/-/g, "+").replace(/_/g, "/")); } -// tried the base64url library but got an error using their Buffer export function base64urlEncodeString(input: string) { return btoa(input).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); } -// eslint-disable-next-line @typescript-eslint/no-unused-vars -function base64urlDecodeArrayBuffer(input: string) { - input = input.replace(/-/g, "+").replace(/_/g, "/"); - const pad = input.length % 4 === 0 ? "" : "====".slice(input.length % 4); - const str = atob(input + pad); - const bytes = new Uint8Array(str.length); - for (let i = 0; i < str.length; i++) { - bytes[i] = str.charCodeAt(i); - } - return bytes.buffer; -} - -// eslint-disable-next-line @typescript-eslint/no-unused-vars -function base64urlEncodeArrayBuffer(buffer: ArrayBuffer) { - const str = String.fromCharCode(...new Uint8Array(buffer)); - return base64urlEncodeString(str); -} - // from @simplewebauthn/browser function arrayBufferToBase64URLString(buffer: ArrayBuffer) { const bytes = new Uint8Array(buffer); @@ -523,28 +446,3 @@ function base64URLStringToArrayBuffer(base64URLString: string) { } return buffer; } - -// eslint-disable-next-line @typescript-eslint/no-unused-vars -async function pemToCryptoKey(pem: string) { - const binaryDerString = atob( - pem - .split("\n") - .filter((x) => !x.includes("-----")) - .join(""), - ); - const binaryDer = new Uint8Array(binaryDerString.length); - for (let i = 0; i < binaryDerString.length; i++) { - binaryDer[i] = binaryDerString.charCodeAt(i); - } - // console.log("binaryDer", binaryDer.buffer); - return await window.crypto.subtle.importKey( - "spki", - binaryDer.buffer, - { - name: "RSASSA-PKCS1-v1_5", - hash: "SHA-256", - }, - true, - ["verify"], - ); -}