UNPKG

2.14 kBJavaScriptView Raw
1/**
2 * ECDSA is an asymmetric key for signing
3 */
4
5import * as webcrypto from 'lib0/webcrypto'
6export { exportKeyJwk, exportKeyRaw } from './common.js'
7
8/**
9 * @typedef {Array<'sign'|'verify'>} Usages
10 */
11
12/**
13 * @type {Usages}
14 */
15const defaultUsages = ['sign', 'verify']
16
17const defaultSignAlgorithm = {
18 name: 'ECDSA',
19 hash: 'SHA-384'
20}
21
22/**
23 * @experimental The API is not final!
24 *
25 * Sign a message
26 *
27 * @param {CryptoKey} key
28 * @param {Uint8Array} data
29 * @return {PromiseLike<Uint8Array>} signature
30 */
31export const sign = (key, data) =>
32 webcrypto.subtle.sign(
33 defaultSignAlgorithm,
34 key,
35 data
36 ).then(signature => new Uint8Array(signature))
37
38/**
39 * @experimental The API is not final!
40 *
41 * Sign a message
42 *
43 * @param {CryptoKey} key
44 * @param {Uint8Array} signature
45 * @param {Uint8Array} data
46 * @return {PromiseLike<boolean>} signature
47 */
48export const verify = (key, signature, data) =>
49 webcrypto.subtle.verify(
50 defaultSignAlgorithm,
51 key,
52 signature,
53 data
54 )
55
56const defaultKeyAlgorithm = {
57 name: 'ECDSA',
58 namedCurve: 'P-384'
59}
60
61/* c8 ignore next */
62/**
63 * @param {Object} opts
64 * @param {boolean} [opts.extractable]
65 * @param {Usages} [opts.usages]
66 */
67export const generateKeyPair = ({ extractable = false, usages = defaultUsages } = {}) =>
68 webcrypto.subtle.generateKey(
69 defaultKeyAlgorithm,
70 extractable,
71 usages
72 )
73
74/**
75 * @param {any} jwk
76 * @param {Object} opts
77 * @param {boolean} [opts.extractable]
78 * @param {Usages} [opts.usages]
79 */
80export const importKeyJwk = (jwk, { extractable = false, usages } = {}) => {
81 if (usages == null) {
82 /* c8 ignore next 2 */
83 usages = jwk.key_ops || defaultUsages
84 }
85 return webcrypto.subtle.importKey('jwk', jwk, defaultKeyAlgorithm, extractable, /** @type {Usages} */ (usages))
86}
87
88/**
89 * Only suited for importing public keys.
90 *
91 * @param {any} raw
92 * @param {Object} opts
93 * @param {boolean} [opts.extractable]
94 * @param {Usages} [opts.usages]
95 */
96export const importKeyRaw = (raw, { extractable = false, usages = defaultUsages } = {}) =>
97 webcrypto.subtle.importKey('raw', raw, defaultKeyAlgorithm, extractable, usages)