@interop/ecdsa-multikey 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +146 -0
  2. package/LICENSE +29 -0
  3. package/README.md +163 -0
  4. package/dist/baseX.d.ts +7 -0
  5. package/dist/baseX.d.ts.map +1 -0
  6. package/dist/baseX.js +11 -0
  7. package/dist/baseX.js.map +1 -0
  8. package/dist/constants.d.ts +29 -0
  9. package/dist/constants.d.ts.map +1 -0
  10. package/dist/constants.js +43 -0
  11. package/dist/constants.js.map +1 -0
  12. package/dist/crypto-browser.d.ts +9 -0
  13. package/dist/crypto-browser.d.ts.map +1 -0
  14. package/dist/crypto-browser.js +7 -0
  15. package/dist/crypto-browser.js.map +1 -0
  16. package/dist/crypto.d.ts +7 -0
  17. package/dist/crypto.d.ts.map +1 -0
  18. package/dist/crypto.js +12 -0
  19. package/dist/crypto.js.map +1 -0
  20. package/dist/factory.d.ts +10 -0
  21. package/dist/factory.d.ts.map +1 -0
  22. package/dist/factory.js +55 -0
  23. package/dist/factory.js.map +1 -0
  24. package/dist/helpers.d.ts +18 -0
  25. package/dist/helpers.d.ts.map +1 -0
  26. package/dist/helpers.js +82 -0
  27. package/dist/helpers.js.map +1 -0
  28. package/dist/index.d.ts +29 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +221 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/serialize.d.ts +44 -0
  33. package/dist/serialize.d.ts.map +1 -0
  34. package/dist/serialize.js +302 -0
  35. package/dist/serialize.js.map +1 -0
  36. package/dist/translators.d.ts +5 -0
  37. package/dist/translators.d.ts.map +1 -0
  38. package/dist/translators.js +40 -0
  39. package/dist/translators.js.map +1 -0
  40. package/dist/types.d.ts +69 -0
  41. package/dist/types.d.ts.map +1 -0
  42. package/dist/types.js +5 -0
  43. package/dist/types.js.map +1 -0
  44. package/package.json +72 -0
@@ -0,0 +1,302 @@
1
+ /*!
2
+ * Copyright (c) 2022-2023 Digital Bazaar, Inc. All rights reserved.
3
+ */
4
+ import { base58btc as base58, base64url } from './baseX.js';
5
+ import { ALGORITHM, ECDSA_CURVE, EXTRACTABLE, MULTIBASE_BASE58_HEADER, MULTIKEY_CONTEXT_V1_URL } from './constants.js';
6
+ import { webcrypto } from './crypto.js';
7
+ import { getNamedCurveFromPublicMultikey, getNamedCurveFromSecretMultikey, getSecretKeySize, setPublicKeyHeader, setSecretKeyHeader } from './helpers.js';
8
+ // FIXME: may need to move any leading zeros for bitstring compression; needs
9
+ // testing with various browsers
10
+ const PKCS8_PREFIXES = new Map([
11
+ [
12
+ ECDSA_CURVE.P256,
13
+ {
14
+ secret: new Uint8Array([
15
+ 48, 103, 2, 1, 0, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42,
16
+ 134, 72, 206, 61, 3, 1, 7, 4, 77, 48, 75, 2, 1, 1, 4, 32
17
+ ]),
18
+ public: new Uint8Array([161, 36, 3, 34, 0])
19
+ }
20
+ ],
21
+ [
22
+ ECDSA_CURVE.P384,
23
+ {
24
+ secret: new Uint8Array([
25
+ 48, 129, 132, 2, 1, 0, 48, 16, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 5,
26
+ 43, 129, 4, 0, 34, 4, 109, 48, 107, 2, 1, 1, 4, 48
27
+ ]),
28
+ public: new Uint8Array([161, 52, 3, 50, 0])
29
+ }
30
+ ],
31
+ [
32
+ ECDSA_CURVE.P521,
33
+ {
34
+ secret: new Uint8Array([
35
+ 48, 129, 170, 2, 1, 0, 48, 16, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 5,
36
+ 43, 129, 4, 0, 35, 4, 129, 146, 48, 129, 143, 2, 1, 1, 4, 66
37
+ ]),
38
+ public: new Uint8Array([161, 70, 3, 68, 0])
39
+ }
40
+ ]
41
+ ]);
42
+ const SPKI_PREFIXES = new Map([
43
+ [
44
+ ECDSA_CURVE.P256,
45
+ new Uint8Array([
46
+ 48, 57, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42, 134, 72, 206,
47
+ 61, 3, 1, 7, 3, 34, 0
48
+ ])
49
+ ],
50
+ [
51
+ ECDSA_CURVE.P384,
52
+ new Uint8Array([
53
+ 48, 70, 48, 16, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 5, 43, 129, 4, 0, 34,
54
+ 3, 50, 0
55
+ ])
56
+ ],
57
+ [
58
+ ECDSA_CURVE.P521,
59
+ new Uint8Array([
60
+ 48, 88, 48, 16, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 5, 43, 129, 4, 0, 35,
61
+ 3, 68, 0
62
+ ])
63
+ ]
64
+ ]);
65
+ // converts key pair to PKCS #8 format
66
+ export async function cryptoKeyfromRaw({ curve, secretKey, publicKey, keyAgreement }) {
67
+ const algorithm = {
68
+ name: keyAgreement ? 'ECDH' : ALGORITHM,
69
+ namedCurve: curve
70
+ };
71
+ let cryptoKey;
72
+ if (secretKey) {
73
+ const pkcs8 = _rawToPkcs8({ curve, secretKey, publicKey });
74
+ const secretUsage = keyAgreement ? ['deriveBits'] : ['sign'];
75
+ cryptoKey = await webcrypto.subtle.importKey('pkcs8', pkcs8, algorithm, EXTRACTABLE, secretUsage);
76
+ }
77
+ else {
78
+ const spki = _rawToSpki({ curve, publicKey });
79
+ // must be empty usage for importing a public key
80
+ const publicUsage = keyAgreement ? [] : ['verify'];
81
+ cryptoKey = await webcrypto.subtle.importKey('spki', spki, algorithm, EXTRACTABLE, publicUsage);
82
+ }
83
+ return cryptoKey;
84
+ }
85
+ // exports key pair
86
+ export async function exportKeyPair({ keyPair, secretKey, publicKey, includeContext }) {
87
+ if (!(publicKey || secretKey)) {
88
+ throw new TypeError('Export requires specifying either "publicKey" or "secretKey".');
89
+ }
90
+ // get JWK
91
+ const useSecretKey = secretKey && !!keyPair.secretKey;
92
+ const cryptoKey = useSecretKey ? keyPair.secretKey : keyPair.publicKey;
93
+ const jwk = (await webcrypto.subtle.exportKey('jwk', cryptoKey));
94
+ // export as Multikey
95
+ const exported = {};
96
+ if (includeContext) {
97
+ exported['@context'] = MULTIKEY_CONTEXT_V1_URL;
98
+ }
99
+ exported.id = keyPair.id;
100
+ exported.type = 'Multikey';
101
+ exported.controller = keyPair.controller;
102
+ if (publicKey) {
103
+ exported.publicKeyMultibase = toPublicKeyMultibase({ jwk });
104
+ }
105
+ if (useSecretKey) {
106
+ exported.secretKeyMultibase = toSecretKeyMultibase({ jwk });
107
+ }
108
+ return exported;
109
+ }
110
+ // imports key pair
111
+ export async function importKeyPair({ id, controller, secretKeyMultibase, publicKeyMultibase, keyAgreement = false }) {
112
+ if (!publicKeyMultibase) {
113
+ throw new TypeError('The "publicKeyMultibase" property is required.');
114
+ }
115
+ // import public key
116
+ if (!(publicKeyMultibase &&
117
+ typeof publicKeyMultibase === 'string' &&
118
+ publicKeyMultibase[0] === MULTIBASE_BASE58_HEADER)) {
119
+ throw new TypeError('"publicKeyMultibase" must be a multibase, base58-encoded string.');
120
+ }
121
+ const publicMultikey = base58.decode(publicKeyMultibase.slice(1));
122
+ // set named curved based on multikey header
123
+ const algorithm = {
124
+ name: keyAgreement ? 'ECDH' : ALGORITHM,
125
+ namedCurve: getNamedCurveFromPublicMultikey({ publicMultikey })
126
+ };
127
+ // import public key; convert to `spki` format because `jwk` doesn't handle
128
+ // compressed public keys
129
+ const spki = _multikeyToSpki({ publicMultikey });
130
+ // must be empty usage for importing a public key
131
+ const publicUsage = keyAgreement ? [] : ['verify'];
132
+ const importedPublicKey = await webcrypto.subtle.importKey('spki', spki, algorithm, EXTRACTABLE, publicUsage);
133
+ const keyPair = {
134
+ id,
135
+ controller,
136
+ publicKey: importedPublicKey
137
+ };
138
+ // import secret key if given
139
+ if (secretKeyMultibase) {
140
+ if (!(typeof secretKeyMultibase === 'string' &&
141
+ secretKeyMultibase[0] === MULTIBASE_BASE58_HEADER)) {
142
+ throw new TypeError('"secretKeyMultibase" must be a multibase, base58-encoded string.');
143
+ }
144
+ const secretMultikey = base58.decode(secretKeyMultibase.slice(1));
145
+ // ensure secret key multikey header appropriately matches the
146
+ // public key multikey header
147
+ _ensureMultikeyHeadersMatch({ secretMultikey, publicMultikey });
148
+ // convert to `pkcs8` format for import because `jwk` doesn't support
149
+ // compressed keys
150
+ const pkcs8 = _multikeyToPkcs8({ secretMultikey, publicMultikey });
151
+ const secretUsage = keyAgreement ? ['deriveBits'] : ['sign'];
152
+ keyPair.secretKey = await webcrypto.subtle.importKey('pkcs8', pkcs8, algorithm, EXTRACTABLE, secretUsage);
153
+ }
154
+ return keyPair;
155
+ }
156
+ export function toPublicKeyBytes({ jwk }) {
157
+ if (jwk?.kty !== 'EC') {
158
+ throw new TypeError('"jwk.kty" must be "EC".');
159
+ }
160
+ const { crv: curve } = jwk;
161
+ const secretKeySize = getSecretKeySize({ curve: curve });
162
+ // convert `x` coordinate to compressed public key
163
+ const x = base64url.decode(jwk.x);
164
+ const y = base64url.decode(jwk.y);
165
+ // public key size is always secret key size + 1
166
+ const publicKeySize = secretKeySize + 1;
167
+ const publicKey = new Uint8Array(publicKeySize);
168
+ // use even / odd status of `y` coordinate for compressed header
169
+ // (`y` is a decoded EC coordinate, so its last byte is always present)
170
+ const even = y[y.length - 1] % 2 === 0;
171
+ publicKey[0] = even ? 2 : 3;
172
+ // write `x` coordinate at end of multikey buffer to zero-fill it
173
+ publicKey.set(x, publicKey.length - x.length);
174
+ return publicKey;
175
+ }
176
+ export function toPublicKeyMultibase({ jwk }) {
177
+ if (jwk?.kty !== 'EC') {
178
+ throw new TypeError('"jwk.kty" must be "EC".');
179
+ }
180
+ const { crv: curve } = jwk;
181
+ const secretKeySize = getSecretKeySize({ curve: curve });
182
+ // convert `x` coordinate to compressed public key
183
+ const x = base64url.decode(jwk.x);
184
+ const y = base64url.decode(jwk.y);
185
+ // public key size is always secret key size + 1
186
+ const publicKeySize = secretKeySize + 1;
187
+ // leave room for multicodec header (2 bytes)
188
+ const multikey = new Uint8Array(2 + publicKeySize);
189
+ setPublicKeyHeader({ curve: curve, buffer: multikey });
190
+ // use even / odd status of `y` coordinate for compressed header
191
+ // (`y` is a decoded EC coordinate, so its last byte is always present)
192
+ const even = y[y.length - 1] % 2 === 0;
193
+ multikey[2] = even ? 2 : 3;
194
+ // write `x` coordinate at end of multikey buffer to zero-fill it
195
+ multikey.set(x, multikey.length - x.length);
196
+ const publicKeyMultibase = MULTIBASE_BASE58_HEADER + base58.encode(multikey);
197
+ return publicKeyMultibase;
198
+ }
199
+ export function toSecretKeyBytes({ jwk }) {
200
+ if (jwk?.kty !== 'EC') {
201
+ throw new TypeError('"jwk.kty" must be "EC".');
202
+ }
203
+ const { crv: curve } = jwk;
204
+ const secretKeySize = getSecretKeySize({ curve: curve });
205
+ const d = base64url.decode(jwk.d);
206
+ const secretKey = new Uint8Array(secretKeySize);
207
+ // write `d` at end of multikey buffer to zero-fill it
208
+ secretKey.set(d, secretKey.length - d.length);
209
+ return secretKey;
210
+ }
211
+ export function toSecretKeyMultibase({ jwk }) {
212
+ if (jwk?.kty !== 'EC') {
213
+ throw new TypeError('"jwk.kty" must be "EC".');
214
+ }
215
+ const { crv: curve } = jwk;
216
+ const secretKeySize = getSecretKeySize({ curve: curve });
217
+ const d = base64url.decode(jwk.d);
218
+ // leave room for multicodec header (2 bytes)
219
+ const multikey = new Uint8Array(2 + secretKeySize);
220
+ setSecretKeyHeader({ curve: jwk.crv, buffer: multikey });
221
+ // write `d` at end of multikey buffer to zero-fill it
222
+ multikey.set(d, multikey.length - d.length);
223
+ const secretKeyMultibase = MULTIBASE_BASE58_HEADER + base58.encode(multikey);
224
+ return secretKeyMultibase;
225
+ }
226
+ // ensures that public key header matches secret key header
227
+ function _ensureMultikeyHeadersMatch({ secretMultikey, publicMultikey }) {
228
+ const publicCurve = getNamedCurveFromPublicMultikey({ publicMultikey });
229
+ const secretCurve = getNamedCurveFromSecretMultikey({ secretMultikey });
230
+ if (publicCurve !== secretCurve) {
231
+ throw new Error(`Public key curve ('${publicCurve}') does not match ` +
232
+ `secret key curve ('${secretCurve}').`);
233
+ }
234
+ }
235
+ // converts key pair to PKCS #8 format
236
+ function _multikeyToPkcs8({ secretMultikey, publicMultikey }) {
237
+ const curve = getNamedCurveFromSecretMultikey({ secretMultikey });
238
+ // omit multikey headers
239
+ const secretKey = secretMultikey.subarray(2);
240
+ const publicKey = publicMultikey.subarray(2);
241
+ return _rawToPkcs8({ curve, secretKey, publicKey });
242
+ }
243
+ function _multikeyToSpki({ publicMultikey }) {
244
+ const curve = getNamedCurveFromPublicMultikey({ publicMultikey });
245
+ // omit multikey header
246
+ const publicKey = publicMultikey.subarray(2);
247
+ return _rawToSpki({ curve, publicKey });
248
+ }
249
+ // converts key pair to PKCS #8 format
250
+ export function _rawToPkcs8({ curve, secretKey, publicKey }) {
251
+ /* Format:
252
+ SEQUENCE (3 elem)
253
+ INTEGER 0
254
+ SEQUENCE (2 elem)
255
+ OBJECT IDENTIFIER 1.2.840.10045.2.1 ecPublicKey
256
+ // curve-specific, e.g. P-256:
257
+ OBJECT IDENTIFIER 1.2.840.10045.3.1.7 prime256v1
258
+ OCTET STRING
259
+ SEQUENCE (3 elem)
260
+ INTEGER 1
261
+ OCTET STRING (32 byte) (RAW SECRET KEY BYTES)
262
+ [1] (1 elem)
263
+ BIT STRING (COMPRESSED/UNCOMPRESSED PUBLIC KEY BYTES)
264
+
265
+ This translates to:
266
+
267
+ PKCS #8 DER SECRET KEY HEADER (w/algorithm OID for specific key type)
268
+ RAW SECRET KEY BYTES
269
+ PKCS #8 DER PUBLIC KEY HEADER
270
+ COMPRESSED / UNCOMPRESSED PUBLIC KEY BYTES */
271
+ const headers = PKCS8_PREFIXES.get(curve);
272
+ if (!headers) {
273
+ throw new Error(`Unsupported curve "${curve}".`);
274
+ }
275
+ const pkcs8 = new Uint8Array(headers.secret.length +
276
+ secretKey.length +
277
+ headers.public.length +
278
+ publicKey.length);
279
+ let offset = 0;
280
+ pkcs8.set(headers.secret, offset);
281
+ offset += headers.secret.length;
282
+ pkcs8.set(secretKey, offset);
283
+ offset += secretKey.length;
284
+ pkcs8.set(headers.public, offset);
285
+ offset += headers.public.length;
286
+ pkcs8.set(publicKey, offset);
287
+ return pkcs8;
288
+ }
289
+ // converts public key to SubjectPublicKeyInfo format
290
+ function _rawToSpki({ curve, publicKey }) {
291
+ /* Format:
292
+ SPKI DER PUBLIC KEY HEADER (w/algorithm OID for specific key type)
293
+ COMPRESSED / UNCOMPRESSED PUBLIC KEY BYTES */
294
+ const header = SPKI_PREFIXES.get(curve);
295
+ const spki = new Uint8Array(header.length + publicKey.length);
296
+ let offset = 0;
297
+ spki.set(header, offset);
298
+ offset += header.length;
299
+ spki.set(publicKey, offset);
300
+ return spki;
301
+ }
302
+ //# sourceMappingURL=serialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize.js","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Multikey } from './types.js';
2
+ export declare function toMultikey({ keyPair }: {
3
+ keyPair: Multikey;
4
+ }): Promise<Multikey>;
5
+ //# sourceMappingURL=translators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translators.d.ts","sourceRoot":"","sources":["../src/translators.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,YAAY,CAAA;AAUzD,wBAAsB,UAAU,CAAC,EAC/B,OAAO,EACR,EAAE;IACD,OAAO,EAAE,QAAQ,CAAA;CAClB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyBpB"}
@@ -0,0 +1,40 @@
1
+ /*!
2
+ * Copyright (c) 2023 Digital Bazaar, Inc. All rights reserved.
3
+ */
4
+ import { ECDSA_2019_SECP_256_KEY_TYPE, ECDSA_2019_SECP_384_KEY_TYPE, ECDSA_2019_SECP_521_KEY_TYPE, ECDSA_2019_SUITE_CONTEXT_V1_URL, MULTIKEY_CONTEXT_V1_URL } from './constants.js';
5
+ // valid ECDSA types
6
+ const VALID_ECDSA_TYPES = new Set([
7
+ ECDSA_2019_SECP_256_KEY_TYPE,
8
+ ECDSA_2019_SECP_384_KEY_TYPE,
9
+ ECDSA_2019_SECP_521_KEY_TYPE
10
+ ]);
11
+ // converts key pair to Multikey format
12
+ export async function toMultikey({ keyPair }) {
13
+ if (!VALID_ECDSA_TYPES.has(keyPair.type)) {
14
+ throw new TypeError(`Unsupported key type "${keyPair.type}".`);
15
+ }
16
+ if (!keyPair['@context']) {
17
+ keyPair['@context'] = ECDSA_2019_SUITE_CONTEXT_V1_URL;
18
+ }
19
+ if (!_includesContext({
20
+ document: keyPair,
21
+ contextUrl: ECDSA_2019_SUITE_CONTEXT_V1_URL
22
+ })) {
23
+ throw new TypeError(`Context not supported "${keyPair['@context']}".`);
24
+ }
25
+ return {
26
+ '@context': MULTIKEY_CONTEXT_V1_URL,
27
+ id: keyPair.id,
28
+ type: 'Multikey',
29
+ controller: keyPair.controller,
30
+ publicKeyMultibase: keyPair.publicKeyMultibase,
31
+ secretKeyMultibase: keyPair.secretKeyMultibase
32
+ };
33
+ }
34
+ // checks if context was properly included in document
35
+ function _includesContext({ document, contextUrl }) {
36
+ const context = document['@context'];
37
+ return (context === contextUrl ||
38
+ (Array.isArray(context) && context.includes(contextUrl)));
39
+ }
40
+ //# sourceMappingURL=translators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translators.js","sourceRoot":"","sources":["../src/translators.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAC5B,4BAA4B,EAC5B,+BAA+B,EAC/B,uBAAuB,EACxB,MAAM,gBAAgB,CAAA;AAGvB,oBAAoB;AACpB,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAS;IACxC,4BAA4B;IAC5B,4BAA4B;IAC5B,4BAA4B;CAC7B,CAAC,CAAA;AAEF,uCAAuC;AACvC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAC/B,OAAO,EAGR;IACC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAc,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,SAAS,CAAC,yBAAyB,OAAO,CAAC,IAAI,IAAI,CAAC,CAAA;IAChE,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,UAAU,CAAC,GAAG,+BAA+B,CAAA;IACvD,CAAC;IACD,IACE,CAAC,gBAAgB,CAAC;QAChB,QAAQ,EAAE,OAAO;QACjB,UAAU,EAAE,+BAA+B;KAC5C,CAAC,EACF,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,0BAA0B,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IACxE,CAAC;IAED,OAAO;QACL,UAAU,EAAE,uBAAuB;QACnC,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;KAC/C,CAAA;AACH,CAAC;AAED,sDAAsD;AACtD,SAAS,gBAAgB,CAAC,EACxB,QAAQ,EACR,UAAU,EAIX;IACC,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAA;IACpC,OAAO,CACL,OAAO,KAAK,UAAU;QACtB,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CACzD,CAAA;AACH,CAAC"}
@@ -0,0 +1,69 @@
1
+ /*!
2
+ * Copyright (c) 2022-2023 Digital Bazaar, Inc. All rights reserved.
3
+ */
4
+ export type WebCryptoKey = CryptoKey;
5
+ export interface Jwk {
6
+ kty?: string;
7
+ crv?: string;
8
+ x?: string;
9
+ y?: string;
10
+ d?: string;
11
+ key_ops?: string[];
12
+ ext?: boolean;
13
+ [key: string]: unknown;
14
+ }
15
+ export type JsonLdContext = string | Array<string | Record<string, unknown>>;
16
+ export interface Multikey {
17
+ '@context'?: JsonLdContext;
18
+ id?: string;
19
+ type?: string;
20
+ controller?: string;
21
+ publicKeyMultibase?: string;
22
+ secretKeyMultibase?: string;
23
+ publicKeyJwk?: Jwk;
24
+ }
25
+ export interface Signer {
26
+ algorithm: string;
27
+ id?: string;
28
+ sign(options: {
29
+ data: Uint8Array;
30
+ }): Promise<Uint8Array>;
31
+ }
32
+ export interface Verifier {
33
+ algorithm: string;
34
+ id?: string;
35
+ verify(options: {
36
+ data: Uint8Array;
37
+ signature: Uint8Array;
38
+ }): Promise<boolean>;
39
+ }
40
+ export interface ExportOptions {
41
+ publicKey?: boolean;
42
+ secretKey?: boolean;
43
+ includeContext?: boolean;
44
+ raw?: boolean;
45
+ }
46
+ export type ExportedKeyPair = Multikey & {
47
+ publicKey?: Uint8Array;
48
+ secretKey?: Uint8Array;
49
+ };
50
+ export interface DeriveSecretOptions {
51
+ publicKey?: KeyPairInterface;
52
+ remotePublicKey?: KeyPairInterface;
53
+ }
54
+ export interface KeyPairInterface {
55
+ '@context'?: JsonLdContext;
56
+ id?: string;
57
+ controller?: string;
58
+ type?: string;
59
+ publicKey?: WebCryptoKey;
60
+ secretKey?: WebCryptoKey;
61
+ publicKeyMultibase?: string;
62
+ secretKeyMultibase?: string;
63
+ keyAgreement?: boolean;
64
+ export(options?: ExportOptions): Promise<ExportedKeyPair>;
65
+ signer(): Signer;
66
+ verifier(): Verifier;
67
+ deriveSecret(options?: DeriveSecretOptions): Promise<Uint8Array>;
68
+ }
69
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,MAAM,MAAM,YAAY,GAAG,SAAS,CAAA;AAGpC,MAAM,WAAW,GAAG;IAClB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAGD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAG5E,MAAM,WAAW,QAAQ;IACvB,UAAU,CAAC,EAAE,aAAa,CAAA;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAE3B,YAAY,CAAC,EAAE,GAAG,CAAA;CACnB;AAGD,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;CACzD;AAGD,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC/E;AAGD,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAGD,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG;IACvC,SAAS,CAAC,EAAE,UAAU,CAAA;IACtB,SAAS,CAAC,EAAE,UAAU,CAAA;CACvB,CAAA;AAGD,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,gBAAgB,CAAA;IAC5B,eAAe,CAAC,EAAE,gBAAgB,CAAA;CACnC;AAGD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,aAAa,CAAA;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,YAAY,CAAA;IACxB,SAAS,CAAC,EAAE,YAAY,CAAA;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,MAAM,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;IACzD,MAAM,IAAI,MAAM,CAAA;IAChB,QAAQ,IAAI,QAAQ,CAAA;IACpB,YAAY,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;CACjE"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /*!
2
+ * Copyright (c) 2022-2023 Digital Bazaar, Inc. All rights reserved.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@interop/ecdsa-multikey",
3
+ "version": "2.0.0",
4
+ "description": "TypeScript/JavaScript library for generating and working with EcdsaMultikey key pairs.",
5
+ "homepage": "https://github.com/interop-alliance/ecdsa-multikey",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/interop-alliance/ecdsa-multikey.git"
9
+ },
10
+ "license": "BSD-3-Clause",
11
+ "type": "module",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "react-native": "./dist/index.js",
16
+ "import": "./dist/index.js",
17
+ "default": "./dist/index.js"
18
+ }
19
+ },
20
+ "module": "./dist/index.js",
21
+ "types": "./dist/index.d.ts",
22
+ "browser": {
23
+ "./dist/crypto.js": "./dist/crypto-browser.js"
24
+ },
25
+ "sideEffects": false,
26
+ "files": [
27
+ "dist",
28
+ "CHANGELOG.md",
29
+ "README.md",
30
+ "LICENSE"
31
+ ],
32
+ "dependencies": {
33
+ "@scure/base": "^2.2.0"
34
+ },
35
+ "devDependencies": {
36
+ "@eslint/js": "^10.0.1",
37
+ "@playwright/test": "^1.60.0",
38
+ "@types/node": "^25.9.1",
39
+ "@vitest/coverage-v8": "^4.1.7",
40
+ "eslint": "^10.4.0",
41
+ "eslint-config-prettier": "^10.1.8",
42
+ "globals": "^17.6.0",
43
+ "prettier": "^3.8.3",
44
+ "rimraf": "^6.1.3",
45
+ "typescript": "^5.9.3",
46
+ "typescript-eslint": "^8.59.4",
47
+ "varint": "^6.0.0",
48
+ "vite": "^8.0.14",
49
+ "vitest": "^4.1.7"
50
+ },
51
+ "engines": {
52
+ "node": ">=24.0"
53
+ },
54
+ "packageManager": "pnpm@11.5.0",
55
+ "scripts": {
56
+ "build": "pnpm run clear && tsc",
57
+ "clear": "rimraf dist/*",
58
+ "dev": "vite",
59
+ "fix": "eslint --fix src test && pnpm run format",
60
+ "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\" \"*.md\"",
61
+ "lint": "eslint src test",
62
+ "prepare": "pnpm run build",
63
+ "rebuild": "pnpm run clear && pnpm run build",
64
+ "test": "pnpm run fix && pnpm run lint && pnpm run test:node && pnpm run test:browser",
65
+ "test:browser": "playwright test",
66
+ "test:node": "vitest run",
67
+ "test:coverage": "vitest run --coverage"
68
+ },
69
+ "publishConfig": {
70
+ "access": "public"
71
+ }
72
+ }