import {Result} from 'result' import logger from 'log' export type PrivKey = CryptoKey export type PubKey = CryptoKey export type KeyPair = [PrivKey, PubKey] const algorithm: EcdsaParams = { name: "ECDSA", hash: {name: "SHA-512"}, } const log = logger('crypto:signature') /** * 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 { log.trace('Generating keypair') log.debug('Extractable :', extractable ? 'yes' : 'no') 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> { log.trace('sign') try { return Result.ok(await window.crypto.subtle.sign( algorithm, privkey, message, )) } catch(e) { log.warn('Signature failed') log.debug(`Error : ${e}`) } return Result.error([]) } export async function verify(pubkey: PubKey, message: Uint8Array, signature: ArrayBuffer): Promise { log.trace('Verify signature') try { return await window.crypto.subtle.verify( algorithm, pubkey, signature, message ); } catch (e) { log.warn('Verification failed') log.debug(`Error : ${e}`) } return false; }