@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.
- package/CHANGELOG.md +146 -0
- package/LICENSE +29 -0
- package/README.md +163 -0
- package/dist/baseX.d.ts +7 -0
- package/dist/baseX.d.ts.map +1 -0
- package/dist/baseX.js +11 -0
- package/dist/baseX.js.map +1 -0
- package/dist/constants.d.ts +29 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +43 -0
- package/dist/constants.js.map +1 -0
- package/dist/crypto-browser.d.ts +9 -0
- package/dist/crypto-browser.d.ts.map +1 -0
- package/dist/crypto-browser.js +7 -0
- package/dist/crypto-browser.js.map +1 -0
- package/dist/crypto.d.ts +7 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +12 -0
- package/dist/crypto.js.map +1 -0
- package/dist/factory.d.ts +10 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +55 -0
- package/dist/factory.js.map +1 -0
- package/dist/helpers.d.ts +18 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +82 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +221 -0
- package/dist/index.js.map +1 -0
- package/dist/serialize.d.ts +44 -0
- package/dist/serialize.d.ts.map +1 -0
- package/dist/serialize.js +302 -0
- package/dist/serialize.js.map +1 -0
- package/dist/translators.d.ts +5 -0
- package/dist/translators.d.ts.map +1 -0
- package/dist/translators.js +40 -0
- package/dist/translators.js.map +1 -0
- package/dist/types.d.ts +69 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- 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 @@
|
|
|
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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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
|
+
}
|