import {Result} from 'result' export type PrivKey = CryptoKey export type PubKey = CryptoKey export type KeyPair = [PrivKey, PubKey] const algorithm: EcdsaParams = { name: "ECDSA", hash: {name: "SHA-512"}, } /** * Create a new keypair for signing * @param extractable if the keys must be extractable or not * @return [privkey, pubkey] keys */ export async function gen_keypair(extractable: boolean = false) : Promise { let key = await window.crypto.subtle.generateKey( { name: "ECDSA", namedCurve: "P-521" } as EcKeyGenParams, extractable, ['sign', 'verify'] ) return [key.privateKey, key.publicKey] } export async function sign(privkey: PrivKey, message: Uint8Array) : Promise> { try { return Result.ok(await window.crypto.subtle.sign( algorithm, privkey, message, )) } catch(_) {} return Result.error([]) } export async function verify(pubkey: PubKey, message: Uint8Array, signature: ArrayBuffer): Promise { try { return await window.crypto.subtle.verify( algorithm, pubkey, signature, message ); } catch (_) {} return false; }