53 lines
1.3 KiB
TypeScript
53 lines
1.3 KiB
TypeScript
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<KeyPair> {
|
|
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<Result<ArrayBuffer>> {
|
|
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<boolean> {
|
|
try {
|
|
return await window.crypto.subtle.verify(
|
|
algorithm,
|
|
pubkey,
|
|
signature,
|
|
message
|
|
);
|
|
} catch (_) {}
|
|
|
|
return false;
|
|
}
|