@libp2p/keychain 0.6.1

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.
@@ -0,0 +1,505 @@
1
+ /* eslint max-nested-callbacks: ["error", 5] */
2
+ import { logger } from '@libp2p/logger';
3
+ import sanitize from 'sanitize-filename';
4
+ import mergeOptions from 'merge-options';
5
+ import { Key } from 'interface-datastore/key';
6
+ import { CMS } from './cms.js';
7
+ import errCode from 'err-code';
8
+ import { codes } from './errors.js';
9
+ import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
10
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
11
+ import { generateKeyPair, importKey, unmarshalPrivateKey } from '@libp2p/crypto/keys';
12
+ import { pbkdf2, randomBytes } from '@libp2p/crypto';
13
+ import { peerIdFromKeys } from '@libp2p/peer-id';
14
+ const log = logger('libp2p:keychain');
15
+ const keyPrefix = '/pkcs8/';
16
+ const infoPrefix = '/info/';
17
+ const privates = new WeakMap();
18
+ // NIST SP 800-132
19
+ const NIST = {
20
+ minKeyLength: 112 / 8,
21
+ minSaltLength: 128 / 8,
22
+ minIterationCount: 1000
23
+ };
24
+ const defaultOptions = {
25
+ // See https://cryptosense.com/parametesr-choice-for-pbkdf2/
26
+ dek: {
27
+ keyLength: 512 / 8,
28
+ iterationCount: 10000,
29
+ salt: 'you should override this value with a crypto secure random number',
30
+ hash: 'sha2-512'
31
+ }
32
+ };
33
+ function validateKeyName(name) {
34
+ if (name == null) {
35
+ return false;
36
+ }
37
+ if (typeof name !== 'string') {
38
+ return false;
39
+ }
40
+ return name === sanitize(name.trim()) && name.length > 0;
41
+ }
42
+ /**
43
+ * Throws an error after a delay
44
+ *
45
+ * This assumes than an error indicates that the keychain is under attack. Delay returning an
46
+ * error to make brute force attacks harder.
47
+ */
48
+ async function randomDelay() {
49
+ const min = 200;
50
+ const max = 1000;
51
+ const delay = Math.random() * (max - min) + min;
52
+ await new Promise(resolve => setTimeout(resolve, delay));
53
+ }
54
+ /**
55
+ * Converts a key name into a datastore name
56
+ */
57
+ function DsName(name) {
58
+ return new Key(keyPrefix + name);
59
+ }
60
+ /**
61
+ * Converts a key name into a datastore info name
62
+ */
63
+ function DsInfoName(name) {
64
+ return new Key(infoPrefix + name);
65
+ }
66
+ /**
67
+ * Manages the lifecycle of a key. Keys are encrypted at rest using PKCS #8.
68
+ *
69
+ * A key in the store has two entries
70
+ * - '/info/*key-name*', contains the KeyInfo for the key
71
+ * - '/pkcs8/*key-name*', contains the PKCS #8 for the key
72
+ *
73
+ */
74
+ export class KeyChain {
75
+ /**
76
+ * Creates a new instance of a key chain
77
+ */
78
+ constructor(components, init) {
79
+ this.components = components;
80
+ this.init = mergeOptions(defaultOptions, init);
81
+ // Enforce NIST SP 800-132
82
+ if (this.init.pass != null && this.init.pass?.length < 20) {
83
+ throw new Error('pass must be least 20 characters');
84
+ }
85
+ if (this.init.dek?.keyLength != null && this.init.dek.keyLength < NIST.minKeyLength) {
86
+ throw new Error(`dek.keyLength must be least ${NIST.minKeyLength} bytes`);
87
+ }
88
+ if (this.init.dek?.salt?.length != null && this.init.dek.salt.length < NIST.minSaltLength) {
89
+ throw new Error(`dek.saltLength must be least ${NIST.minSaltLength} bytes`);
90
+ }
91
+ if (this.init.dek?.iterationCount != null && this.init.dek.iterationCount < NIST.minIterationCount) {
92
+ throw new Error(`dek.iterationCount must be least ${NIST.minIterationCount}`);
93
+ }
94
+ const dek = this.init.pass != null && this.init.dek?.salt != null
95
+ ? pbkdf2(this.init.pass, this.init.dek?.salt, this.init.dek?.iterationCount, this.init.dek?.keyLength, this.init.dek?.hash)
96
+ : '';
97
+ privates.set(this, { dek });
98
+ }
99
+ /**
100
+ * Gets an object that can encrypt/decrypt protected data
101
+ * using the Cryptographic Message Syntax (CMS).
102
+ *
103
+ * CMS describes an encapsulation syntax for data protection. It
104
+ * is used to digitally sign, digest, authenticate, or encrypt
105
+ * arbitrary message content
106
+ */
107
+ get cms() {
108
+ const cached = privates.get(this);
109
+ if (cached == null) {
110
+ throw errCode(new Error('dek missing'), codes.ERR_INVALID_PARAMETERS);
111
+ }
112
+ const dek = cached.dek;
113
+ return new CMS(this, dek);
114
+ }
115
+ /**
116
+ * Generates the options for a keychain. A random salt is produced.
117
+ *
118
+ * @returns {object}
119
+ */
120
+ static generateOptions() {
121
+ const options = Object.assign({}, defaultOptions);
122
+ const saltLength = Math.ceil(NIST.minSaltLength / 3) * 3; // no base64 padding
123
+ options.dek.salt = uint8ArrayToString(randomBytes(saltLength), 'base64');
124
+ return options;
125
+ }
126
+ /**
127
+ * Gets an object that can encrypt/decrypt protected data.
128
+ * The default options for a keychain.
129
+ *
130
+ * @returns {object}
131
+ */
132
+ static get options() {
133
+ return defaultOptions;
134
+ }
135
+ /**
136
+ * Create a new key.
137
+ *
138
+ * @param {string} name - The local key name; cannot already exist.
139
+ * @param {string} type - One of the key types; 'rsa'.
140
+ * @param {number} [size = 2048] - The key size in bits. Used for rsa keys only
141
+ */
142
+ async createKey(name, type, size = 2048) {
143
+ if (!validateKeyName(name) || name === 'self') {
144
+ await randomDelay();
145
+ throw errCode(new Error('Invalid key name'), codes.ERR_INVALID_KEY_NAME);
146
+ }
147
+ if (typeof type !== 'string') {
148
+ await randomDelay();
149
+ throw errCode(new Error('Invalid key type'), codes.ERR_INVALID_KEY_TYPE);
150
+ }
151
+ const dsname = DsName(name);
152
+ const exists = await this.components.datastore.has(dsname);
153
+ if (exists) {
154
+ await randomDelay();
155
+ throw errCode(new Error('Key name already exists'), codes.ERR_KEY_ALREADY_EXISTS);
156
+ }
157
+ switch (type.toLowerCase()) {
158
+ case 'rsa':
159
+ if (!Number.isSafeInteger(size) || size < 2048) {
160
+ await randomDelay();
161
+ throw errCode(new Error('Invalid RSA key size'), codes.ERR_INVALID_KEY_SIZE);
162
+ }
163
+ break;
164
+ default:
165
+ break;
166
+ }
167
+ let keyInfo;
168
+ try {
169
+ const keypair = await generateKeyPair(type, size);
170
+ const kid = await keypair.id();
171
+ const cached = privates.get(this);
172
+ if (cached == null) {
173
+ throw errCode(new Error('dek missing'), codes.ERR_INVALID_PARAMETERS);
174
+ }
175
+ const dek = cached.dek;
176
+ const pem = await keypair.export(dek);
177
+ keyInfo = {
178
+ name: name,
179
+ id: kid
180
+ };
181
+ const batch = this.components.datastore.batch();
182
+ batch.put(dsname, uint8ArrayFromString(pem));
183
+ batch.put(DsInfoName(name), uint8ArrayFromString(JSON.stringify(keyInfo)));
184
+ await batch.commit();
185
+ }
186
+ catch (err) {
187
+ await randomDelay();
188
+ throw err;
189
+ }
190
+ return keyInfo;
191
+ }
192
+ /**
193
+ * List all the keys.
194
+ *
195
+ * @returns {Promise<KeyInfo[]>}
196
+ */
197
+ async listKeys() {
198
+ const query = {
199
+ prefix: infoPrefix
200
+ };
201
+ const info = [];
202
+ for await (const value of this.components.datastore.query(query)) {
203
+ info.push(JSON.parse(uint8ArrayToString(value.value)));
204
+ }
205
+ return info;
206
+ }
207
+ /**
208
+ * Find a key by it's id
209
+ */
210
+ async findKeyById(id) {
211
+ try {
212
+ const keys = await this.listKeys();
213
+ return keys.find((k) => k.id === id);
214
+ }
215
+ catch (err) {
216
+ await randomDelay();
217
+ throw err;
218
+ }
219
+ }
220
+ /**
221
+ * Find a key by it's name.
222
+ *
223
+ * @param {string} name - The local key name.
224
+ * @returns {Promise<KeyInfo>}
225
+ */
226
+ async findKeyByName(name) {
227
+ if (!validateKeyName(name)) {
228
+ await randomDelay();
229
+ throw errCode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME);
230
+ }
231
+ const dsname = DsInfoName(name);
232
+ try {
233
+ const res = await this.components.datastore.get(dsname);
234
+ return JSON.parse(uint8ArrayToString(res));
235
+ }
236
+ catch (err) {
237
+ await randomDelay();
238
+ log.error(err);
239
+ throw errCode(new Error(`Key '${name}' does not exist.`), codes.ERR_KEY_NOT_FOUND);
240
+ }
241
+ }
242
+ /**
243
+ * Remove an existing key.
244
+ *
245
+ * @param {string} name - The local key name; must already exist.
246
+ * @returns {Promise<KeyInfo>}
247
+ */
248
+ async removeKey(name) {
249
+ if (!validateKeyName(name) || name === 'self') {
250
+ await randomDelay();
251
+ throw errCode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME);
252
+ }
253
+ const dsname = DsName(name);
254
+ const keyInfo = await this.findKeyByName(name);
255
+ const batch = this.components.datastore.batch();
256
+ batch.delete(dsname);
257
+ batch.delete(DsInfoName(name));
258
+ await batch.commit();
259
+ return keyInfo;
260
+ }
261
+ /**
262
+ * Rename a key
263
+ *
264
+ * @param {string} oldName - The old local key name; must already exist.
265
+ * @param {string} newName - The new local key name; must not already exist.
266
+ * @returns {Promise<KeyInfo>}
267
+ */
268
+ async renameKey(oldName, newName) {
269
+ if (!validateKeyName(oldName) || oldName === 'self') {
270
+ await randomDelay();
271
+ throw errCode(new Error(`Invalid old key name '${oldName}'`), codes.ERR_OLD_KEY_NAME_INVALID);
272
+ }
273
+ if (!validateKeyName(newName) || newName === 'self') {
274
+ await randomDelay();
275
+ throw errCode(new Error(`Invalid new key name '${newName}'`), codes.ERR_NEW_KEY_NAME_INVALID);
276
+ }
277
+ const oldDsname = DsName(oldName);
278
+ const newDsname = DsName(newName);
279
+ const oldInfoName = DsInfoName(oldName);
280
+ const newInfoName = DsInfoName(newName);
281
+ const exists = await this.components.datastore.has(newDsname);
282
+ if (exists) {
283
+ await randomDelay();
284
+ throw errCode(new Error(`Key '${newName}' already exists`), codes.ERR_KEY_ALREADY_EXISTS);
285
+ }
286
+ try {
287
+ const pem = await this.components.datastore.get(oldDsname);
288
+ const res = await this.components.datastore.get(oldInfoName);
289
+ const keyInfo = JSON.parse(uint8ArrayToString(res));
290
+ keyInfo.name = newName;
291
+ const batch = this.components.datastore.batch();
292
+ batch.put(newDsname, pem);
293
+ batch.put(newInfoName, uint8ArrayFromString(JSON.stringify(keyInfo)));
294
+ batch.delete(oldDsname);
295
+ batch.delete(oldInfoName);
296
+ await batch.commit();
297
+ return keyInfo;
298
+ }
299
+ catch (err) {
300
+ await randomDelay();
301
+ throw err;
302
+ }
303
+ }
304
+ /**
305
+ * Export an existing key as a PEM encrypted PKCS #8 string
306
+ */
307
+ async exportKey(name, password) {
308
+ if (!validateKeyName(name)) {
309
+ await randomDelay();
310
+ throw errCode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME);
311
+ }
312
+ if (password == null) {
313
+ await randomDelay();
314
+ throw errCode(new Error('Password is required'), codes.ERR_PASSWORD_REQUIRED);
315
+ }
316
+ const dsname = DsName(name);
317
+ try {
318
+ const res = await this.components.datastore.get(dsname);
319
+ const pem = uint8ArrayToString(res);
320
+ const cached = privates.get(this);
321
+ if (cached == null) {
322
+ throw errCode(new Error('dek missing'), codes.ERR_INVALID_PARAMETERS);
323
+ }
324
+ const dek = cached.dek;
325
+ const privateKey = await importKey(pem, dek);
326
+ return await privateKey.export(password);
327
+ }
328
+ catch (err) {
329
+ await randomDelay();
330
+ throw err;
331
+ }
332
+ }
333
+ /**
334
+ * Export an existing key as a PeerId
335
+ */
336
+ async exportPeerId(name) {
337
+ const password = 'temporary-password';
338
+ const pem = await this.exportKey(name, password);
339
+ const privateKey = await importKey(pem, password);
340
+ return await peerIdFromKeys(privateKey.public.bytes, privateKey.bytes);
341
+ }
342
+ /**
343
+ * Import a new key from a PEM encoded PKCS #8 string
344
+ *
345
+ * @param {string} name - The local key name; must not already exist.
346
+ * @param {string} pem - The PEM encoded PKCS #8 string
347
+ * @param {string} password - The password.
348
+ * @returns {Promise<KeyInfo>}
349
+ */
350
+ async importKey(name, pem, password) {
351
+ if (!validateKeyName(name) || name === 'self') {
352
+ await randomDelay();
353
+ throw errCode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME);
354
+ }
355
+ if (pem == null) {
356
+ await randomDelay();
357
+ throw errCode(new Error('PEM encoded key is required'), codes.ERR_PEM_REQUIRED);
358
+ }
359
+ const dsname = DsName(name);
360
+ const exists = await this.components.datastore.has(dsname);
361
+ if (exists) {
362
+ await randomDelay();
363
+ throw errCode(new Error(`Key '${name}' already exists`), codes.ERR_KEY_ALREADY_EXISTS);
364
+ }
365
+ let privateKey;
366
+ try {
367
+ privateKey = await importKey(pem, password);
368
+ }
369
+ catch (err) {
370
+ await randomDelay();
371
+ throw errCode(new Error('Cannot read the key, most likely the password is wrong'), codes.ERR_CANNOT_READ_KEY);
372
+ }
373
+ let kid;
374
+ try {
375
+ kid = await privateKey.id();
376
+ const cached = privates.get(this);
377
+ if (cached == null) {
378
+ throw errCode(new Error('dek missing'), codes.ERR_INVALID_PARAMETERS);
379
+ }
380
+ const dek = cached.dek;
381
+ pem = await privateKey.export(dek);
382
+ }
383
+ catch (err) {
384
+ await randomDelay();
385
+ throw err;
386
+ }
387
+ const keyInfo = {
388
+ name: name,
389
+ id: kid
390
+ };
391
+ const batch = this.components.datastore.batch();
392
+ batch.put(dsname, uint8ArrayFromString(pem));
393
+ batch.put(DsInfoName(name), uint8ArrayFromString(JSON.stringify(keyInfo)));
394
+ await batch.commit();
395
+ return keyInfo;
396
+ }
397
+ /**
398
+ * Import a peer key
399
+ */
400
+ async importPeer(name, peer) {
401
+ try {
402
+ if (!validateKeyName(name)) {
403
+ throw errCode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME);
404
+ }
405
+ if (peer == null) {
406
+ throw errCode(new Error('PeerId is required'), codes.ERR_MISSING_PRIVATE_KEY);
407
+ }
408
+ if (peer.privateKey == null) {
409
+ throw errCode(new Error('PeerId.privKey is required'), codes.ERR_MISSING_PRIVATE_KEY);
410
+ }
411
+ const privateKey = await unmarshalPrivateKey(peer.privateKey);
412
+ const dsname = DsName(name);
413
+ const exists = await this.components.datastore.has(dsname);
414
+ if (exists) {
415
+ await randomDelay();
416
+ throw errCode(new Error(`Key '${name}' already exists`), codes.ERR_KEY_ALREADY_EXISTS);
417
+ }
418
+ const cached = privates.get(this);
419
+ if (cached == null) {
420
+ throw errCode(new Error('dek missing'), codes.ERR_INVALID_PARAMETERS);
421
+ }
422
+ const dek = cached.dek;
423
+ const pem = await privateKey.export(dek);
424
+ const keyInfo = {
425
+ name: name,
426
+ id: peer.toString()
427
+ };
428
+ const batch = this.components.datastore.batch();
429
+ batch.put(dsname, uint8ArrayFromString(pem));
430
+ batch.put(DsInfoName(name), uint8ArrayFromString(JSON.stringify(keyInfo)));
431
+ await batch.commit();
432
+ return keyInfo;
433
+ }
434
+ catch (err) {
435
+ await randomDelay();
436
+ throw err;
437
+ }
438
+ }
439
+ /**
440
+ * Gets the private key as PEM encoded PKCS #8 string
441
+ */
442
+ async getPrivateKey(name) {
443
+ if (!validateKeyName(name)) {
444
+ await randomDelay();
445
+ throw errCode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME);
446
+ }
447
+ try {
448
+ const dsname = DsName(name);
449
+ const res = await this.components.datastore.get(dsname);
450
+ return uint8ArrayToString(res);
451
+ }
452
+ catch (err) {
453
+ await randomDelay();
454
+ log.error(err);
455
+ throw errCode(new Error(`Key '${name}' does not exist.`), codes.ERR_KEY_NOT_FOUND);
456
+ }
457
+ }
458
+ /**
459
+ * Rotate keychain password and re-encrypt all associated keys
460
+ */
461
+ async rotateKeychainPass(oldPass, newPass) {
462
+ if (typeof oldPass !== 'string') {
463
+ await randomDelay();
464
+ throw errCode(new Error(`Invalid old pass type '${typeof oldPass}'`), codes.ERR_INVALID_OLD_PASS_TYPE);
465
+ }
466
+ if (typeof newPass !== 'string') {
467
+ await randomDelay();
468
+ throw errCode(new Error(`Invalid new pass type '${typeof newPass}'`), codes.ERR_INVALID_NEW_PASS_TYPE);
469
+ }
470
+ if (newPass.length < 20) {
471
+ await randomDelay();
472
+ throw errCode(new Error(`Invalid pass length ${newPass.length}`), codes.ERR_INVALID_PASS_LENGTH);
473
+ }
474
+ log('recreating keychain');
475
+ const cached = privates.get(this);
476
+ if (cached == null) {
477
+ throw errCode(new Error('dek missing'), codes.ERR_INVALID_PARAMETERS);
478
+ }
479
+ const oldDek = cached.dek;
480
+ this.init.pass = newPass;
481
+ const newDek = newPass != null && this.init.dek?.salt != null
482
+ ? pbkdf2(newPass, this.init.dek.salt, this.init.dek?.iterationCount, this.init.dek?.keyLength, this.init.dek?.hash)
483
+ : '';
484
+ privates.set(this, { dek: newDek });
485
+ const keys = await this.listKeys();
486
+ for (const key of keys) {
487
+ const res = await this.components.datastore.get(DsName(key.name));
488
+ const pem = uint8ArrayToString(res);
489
+ const privateKey = await importKey(pem, oldDek);
490
+ const password = newDek.toString();
491
+ const keyAsPEM = await privateKey.export(password);
492
+ // Update stored key
493
+ const batch = this.components.datastore.batch();
494
+ const keyInfo = {
495
+ name: key.name,
496
+ id: key.id
497
+ };
498
+ batch.put(DsName(key.name), uint8ArrayFromString(keyAsPEM));
499
+ batch.put(DsInfoName(key.name), uint8ArrayFromString(JSON.stringify(keyInfo)));
500
+ await batch.commit();
501
+ }
502
+ log('keychain reconstructed');
503
+ }
504
+ }
505
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import 'node-forge/lib/x509.js';
2
+ /**
3
+ * Gets a self-signed X.509 certificate for the key.
4
+ *
5
+ * The output Uint8Array contains the PKCS #7 message in DER.
6
+ *
7
+ * TODO: move to libp2p-crypto package
8
+ */
9
+ export declare const certificateForKey: (key: any, privateKey: forge.pki.rsa.PrivateKey) => any;
10
+ /**
11
+ * Finds the first item in a collection that is matched in the
12
+ * `asyncCompare` function.
13
+ *
14
+ * `asyncCompare` is an async function that must
15
+ * resolve to either `true` or `false`.
16
+ *
17
+ * @param {Array} array
18
+ * @param {function(*)} asyncCompare - An async function that returns a boolean
19
+ */
20
+ export declare function findAsync<T>(array: T[], asyncCompare: (val: T) => Promise<any>): Promise<T>;
21
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,wBAAwB,CAAA;AAM/B;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,QAAS,GAAG,8CAmDzC,CAAA;AAED;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAE,CAAC,EAAG,KAAK,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,cAKtF"}
@@ -0,0 +1,79 @@
1
+ import 'node-forge/lib/x509.js';
2
+ // @ts-expect-error types are missing
3
+ import forge from 'node-forge/lib/forge.js';
4
+ const pki = forge.pki;
5
+ /**
6
+ * Gets a self-signed X.509 certificate for the key.
7
+ *
8
+ * The output Uint8Array contains the PKCS #7 message in DER.
9
+ *
10
+ * TODO: move to libp2p-crypto package
11
+ */
12
+ export const certificateForKey = (key, privateKey) => {
13
+ const publicKey = pki.rsa.setPublicKey(privateKey.n, privateKey.e);
14
+ const cert = pki.createCertificate();
15
+ cert.publicKey = publicKey;
16
+ cert.serialNumber = '01';
17
+ cert.validity.notBefore = new Date();
18
+ cert.validity.notAfter = new Date();
19
+ cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 10); // eslint-disable-line @typescript-eslint/restrict-plus-operands
20
+ const attrs = [{
21
+ name: 'organizationName',
22
+ value: 'ipfs'
23
+ }, {
24
+ shortName: 'OU',
25
+ value: 'keystore'
26
+ }, {
27
+ name: 'commonName',
28
+ value: key.id
29
+ }];
30
+ cert.setSubject(attrs);
31
+ cert.setIssuer(attrs);
32
+ cert.setExtensions([{
33
+ name: 'basicConstraints',
34
+ cA: true
35
+ }, {
36
+ name: 'keyUsage',
37
+ keyCertSign: true,
38
+ digitalSignature: true,
39
+ nonRepudiation: true,
40
+ keyEncipherment: true,
41
+ dataEncipherment: true
42
+ }, {
43
+ name: 'extKeyUsage',
44
+ serverAuth: true,
45
+ clientAuth: true,
46
+ codeSigning: true,
47
+ emailProtection: true,
48
+ timeStamping: true
49
+ }, {
50
+ name: 'nsCertType',
51
+ client: true,
52
+ server: true,
53
+ email: true,
54
+ objsign: true,
55
+ sslCA: true,
56
+ emailCA: true,
57
+ objCA: true
58
+ }]);
59
+ // self-sign certificate
60
+ cert.sign(privateKey);
61
+ return cert;
62
+ };
63
+ /**
64
+ * Finds the first item in a collection that is matched in the
65
+ * `asyncCompare` function.
66
+ *
67
+ * `asyncCompare` is an async function that must
68
+ * resolve to either `true` or `false`.
69
+ *
70
+ * @param {Array} array
71
+ * @param {function(*)} asyncCompare - An async function that returns a boolean
72
+ */
73
+ export async function findAsync(array, asyncCompare) {
74
+ const promises = array.map(asyncCompare);
75
+ const results = await Promise.all(promises);
76
+ const index = results.findIndex(result => result);
77
+ return array[index];
78
+ }
79
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,wBAAwB,CAAA;AAC/B,qCAAqC;AACrC,OAAO,KAAK,MAAM,yBAAyB,CAAA;AAE3C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAA;AAErB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAQ,EAAE,UAAoC,EAAE,EAAE;IAClF,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;IAClE,MAAM,IAAI,GAAG,GAAG,CAAC,iBAAiB,EAAE,CAAA;IACpC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;IACxB,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAA;IACpC,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAA;IACnC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAA,CAAC,gEAAgE;IAC/I,MAAM,KAAK,GAAG,CAAC;YACb,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,MAAM;SACd,EAAE;YACD,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,UAAU;SAClB,EAAE;YACD,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,GAAG,CAAC,EAAE;SACd,CAAC,CAAA;IACF,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;IACtB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IACrB,IAAI,CAAC,aAAa,CAAC,CAAC;YAClB,IAAI,EAAE,kBAAkB;YACxB,EAAE,EAAE,IAAI;SACT,EAAE;YACD,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,IAAI;YACjB,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,IAAI;YACpB,eAAe,EAAE,IAAI;YACrB,gBAAgB,EAAE,IAAI;SACvB,EAAE;YACD,IAAI,EAAE,aAAa;YACnB,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,IAAI;YACjB,eAAe,EAAE,IAAI;YACrB,YAAY,EAAE,IAAI;SACnB,EAAE;YACD,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC,CAAA;IACH,wBAAwB;IACxB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAErB,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAM,KAAU,EAAE,YAAsC;IACrF,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IACxC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAA;IACjD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAA;AACrB,CAAC"}