@libp2p/keychain 3.0.8 → 4.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/dist/src/index.js CHANGED
@@ -22,7 +22,7 @@
22
22
  *
23
23
  * The **key id** is the SHA-256 [multihash](https://github.com/multiformats/multihash) of its public key.
24
24
  *
25
- * The *public key* is a [protobuf encoding](https://github.com/libp2p/js-libp2p-crypto/blob/master/src/keys/keys.proto.js) containing a type and the [DER encoding](https://en.wikipedia.org/wiki/X.690) of the PKCS [SubjectPublicKeyInfo](https://www.ietf.org/rfc/rfc3279.txt).
25
+ * The *public key* is a [protobuf encoding](https://github.com/libp2p/js-libp2p/blob/main/packages/crypto/src/keys/keys.proto.js) containing a type and the [DER encoding](https://en.wikipedia.org/wiki/X.690) of the PKCS [SubjectPublicKeyInfo](https://www.ietf.org/rfc/rfc3279.txt).
26
26
  *
27
27
  * ## Private key storage
28
28
  *
@@ -49,498 +49,10 @@
49
49
  *
50
50
  * A key benefit is that now the key chain can be used in browser with the [js-datastore-level](https://github.com/ipfs/js-datastore-level) implementation.
51
51
  */
52
- /* eslint max-nested-callbacks: ["error", 5] */
53
- import { pbkdf2, randomBytes } from '@libp2p/crypto';
54
- import { generateKeyPair, importKey, unmarshalPrivateKey } from '@libp2p/crypto/keys';
55
- import { CodeError } from '@libp2p/interface/errors';
56
- import { logger } from '@libp2p/logger';
57
- import { peerIdFromKeys } from '@libp2p/peer-id';
58
- import { Key } from 'interface-datastore/key';
59
- import mergeOptions from 'merge-options';
60
- import sanitize from 'sanitize-filename';
61
- import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
62
- import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
63
- import { codes } from './errors.js';
64
- const log = logger('libp2p:keychain');
65
- const keyPrefix = '/pkcs8/';
66
- const infoPrefix = '/info/';
67
- const privates = new WeakMap();
68
- // NIST SP 800-132
69
- const NIST = {
70
- minKeyLength: 112 / 8,
71
- minSaltLength: 128 / 8,
72
- minIterationCount: 1000
73
- };
74
- const defaultOptions = {
75
- // See https://cryptosense.com/parametesr-choice-for-pbkdf2/
76
- dek: {
77
- keyLength: 512 / 8,
78
- iterationCount: 10000,
79
- salt: 'you should override this value with a crypto secure random number',
80
- hash: 'sha2-512'
81
- }
82
- };
83
- function validateKeyName(name) {
84
- if (name == null) {
85
- return false;
86
- }
87
- if (typeof name !== 'string') {
88
- return false;
89
- }
90
- return name === sanitize(name.trim()) && name.length > 0;
91
- }
92
- /**
93
- * Throws an error after a delay
94
- *
95
- * This assumes than an error indicates that the keychain is under attack. Delay returning an
96
- * error to make brute force attacks harder.
97
- */
98
- async function randomDelay() {
99
- const min = 200;
100
- const max = 1000;
101
- const delay = Math.random() * (max - min) + min;
102
- await new Promise(resolve => setTimeout(resolve, delay));
103
- }
104
- /**
105
- * Converts a key name into a datastore name
106
- */
107
- function DsName(name) {
108
- return new Key(keyPrefix + name);
109
- }
110
- /**
111
- * Converts a key name into a datastore info name
112
- */
113
- function DsInfoName(name) {
114
- return new Key(infoPrefix + name);
115
- }
116
- /**
117
- * Manages the lifecycle of a key. Keys are encrypted at rest using PKCS #8.
118
- *
119
- * A key in the store has two entries
120
- * - '/info/*key-name*', contains the KeyInfo for the key
121
- * - '/pkcs8/*key-name*', contains the PKCS #8 for the key
122
- *
123
- */
124
- export class DefaultKeyChain {
125
- components;
126
- init;
127
- /**
128
- * Creates a new instance of a key chain
129
- */
130
- constructor(components, init) {
131
- this.components = components;
132
- this.init = mergeOptions(defaultOptions, init);
133
- // Enforce NIST SP 800-132
134
- if (this.init.pass != null && this.init.pass?.length < 20) {
135
- throw new Error('pass must be least 20 characters');
136
- }
137
- if (this.init.dek?.keyLength != null && this.init.dek.keyLength < NIST.minKeyLength) {
138
- throw new Error(`dek.keyLength must be least ${NIST.minKeyLength} bytes`);
139
- }
140
- if (this.init.dek?.salt?.length != null && this.init.dek.salt.length < NIST.minSaltLength) {
141
- throw new Error(`dek.saltLength must be least ${NIST.minSaltLength} bytes`);
142
- }
143
- if (this.init.dek?.iterationCount != null && this.init.dek.iterationCount < NIST.minIterationCount) {
144
- throw new Error(`dek.iterationCount must be least ${NIST.minIterationCount}`);
145
- }
146
- const dek = this.init.pass != null && this.init.dek?.salt != null
147
- ? pbkdf2(this.init.pass, this.init.dek?.salt, this.init.dek?.iterationCount, this.init.dek?.keyLength, this.init.dek?.hash)
148
- : '';
149
- privates.set(this, { dek });
150
- }
151
- /**
152
- * Generates the options for a keychain. A random salt is produced.
153
- *
154
- * @returns {object}
155
- */
156
- static generateOptions() {
157
- const options = Object.assign({}, defaultOptions);
158
- const saltLength = Math.ceil(NIST.minSaltLength / 3) * 3; // no base64 padding
159
- options.dek.salt = uint8ArrayToString(randomBytes(saltLength), 'base64');
160
- return options;
161
- }
162
- /**
163
- * Gets an object that can encrypt/decrypt protected data.
164
- * The default options for a keychain.
165
- *
166
- * @returns {object}
167
- */
168
- static get options() {
169
- return defaultOptions;
170
- }
171
- /**
172
- * Create a new key.
173
- *
174
- * @param {string} name - The local key name; cannot already exist.
175
- * @param {string} type - One of the key types; 'rsa'.
176
- * @param {number} [size = 2048] - The key size in bits. Used for rsa keys only
177
- */
178
- async createKey(name, type, size = 2048) {
179
- if (!validateKeyName(name) || name === 'self') {
180
- await randomDelay();
181
- throw new CodeError('Invalid key name', codes.ERR_INVALID_KEY_NAME);
182
- }
183
- if (typeof type !== 'string') {
184
- await randomDelay();
185
- throw new CodeError('Invalid key type', codes.ERR_INVALID_KEY_TYPE);
186
- }
187
- const dsname = DsName(name);
188
- const exists = await this.components.datastore.has(dsname);
189
- if (exists) {
190
- await randomDelay();
191
- throw new CodeError('Key name already exists', codes.ERR_KEY_ALREADY_EXISTS);
192
- }
193
- switch (type.toLowerCase()) {
194
- case 'rsa':
195
- if (!Number.isSafeInteger(size) || size < 2048) {
196
- await randomDelay();
197
- throw new CodeError('Invalid RSA key size', codes.ERR_INVALID_KEY_SIZE);
198
- }
199
- break;
200
- default:
201
- break;
202
- }
203
- let keyInfo;
204
- try {
205
- const keypair = await generateKeyPair(type, size);
206
- const kid = await keypair.id();
207
- const cached = privates.get(this);
208
- if (cached == null) {
209
- throw new CodeError('dek missing', codes.ERR_INVALID_PARAMETERS);
210
- }
211
- const dek = cached.dek;
212
- const pem = await keypair.export(dek);
213
- keyInfo = {
214
- name,
215
- id: kid
216
- };
217
- const batch = this.components.datastore.batch();
218
- batch.put(dsname, uint8ArrayFromString(pem));
219
- batch.put(DsInfoName(name), uint8ArrayFromString(JSON.stringify(keyInfo)));
220
- await batch.commit();
221
- }
222
- catch (err) {
223
- await randomDelay();
224
- throw err;
225
- }
226
- return keyInfo;
227
- }
228
- /**
229
- * List all the keys.
230
- *
231
- * @returns {Promise<KeyInfo[]>}
232
- */
233
- async listKeys() {
234
- const query = {
235
- prefix: infoPrefix
236
- };
237
- const info = [];
238
- for await (const value of this.components.datastore.query(query)) {
239
- info.push(JSON.parse(uint8ArrayToString(value.value)));
240
- }
241
- return info;
242
- }
243
- /**
244
- * Find a key by it's id
245
- */
246
- async findKeyById(id) {
247
- try {
248
- const keys = await this.listKeys();
249
- const key = keys.find((k) => k.id === id);
250
- if (key == null) {
251
- throw new CodeError(`Key with id '${id}' does not exist.`, codes.ERR_KEY_NOT_FOUND);
252
- }
253
- return key;
254
- }
255
- catch (err) {
256
- await randomDelay();
257
- throw err;
258
- }
259
- }
260
- /**
261
- * Find a key by it's name.
262
- *
263
- * @param {string} name - The local key name.
264
- * @returns {Promise<KeyInfo>}
265
- */
266
- async findKeyByName(name) {
267
- if (!validateKeyName(name)) {
268
- await randomDelay();
269
- throw new CodeError(`Invalid key name '${name}'`, codes.ERR_INVALID_KEY_NAME);
270
- }
271
- const dsname = DsInfoName(name);
272
- try {
273
- const res = await this.components.datastore.get(dsname);
274
- return JSON.parse(uint8ArrayToString(res));
275
- }
276
- catch (err) {
277
- await randomDelay();
278
- log.error(err);
279
- throw new CodeError(`Key '${name}' does not exist.`, codes.ERR_KEY_NOT_FOUND);
280
- }
281
- }
282
- /**
283
- * Remove an existing key.
284
- *
285
- * @param {string} name - The local key name; must already exist.
286
- * @returns {Promise<KeyInfo>}
287
- */
288
- async removeKey(name) {
289
- if (!validateKeyName(name) || name === 'self') {
290
- await randomDelay();
291
- throw new CodeError(`Invalid key name '${name}'`, codes.ERR_INVALID_KEY_NAME);
292
- }
293
- const dsname = DsName(name);
294
- const keyInfo = await this.findKeyByName(name);
295
- const batch = this.components.datastore.batch();
296
- batch.delete(dsname);
297
- batch.delete(DsInfoName(name));
298
- await batch.commit();
299
- return keyInfo;
300
- }
301
- /**
302
- * Rename a key
303
- *
304
- * @param {string} oldName - The old local key name; must already exist.
305
- * @param {string} newName - The new local key name; must not already exist.
306
- * @returns {Promise<KeyInfo>}
307
- */
308
- async renameKey(oldName, newName) {
309
- if (!validateKeyName(oldName) || oldName === 'self') {
310
- await randomDelay();
311
- throw new CodeError(`Invalid old key name '${oldName}'`, codes.ERR_OLD_KEY_NAME_INVALID);
312
- }
313
- if (!validateKeyName(newName) || newName === 'self') {
314
- await randomDelay();
315
- throw new CodeError(`Invalid new key name '${newName}'`, codes.ERR_NEW_KEY_NAME_INVALID);
316
- }
317
- const oldDsname = DsName(oldName);
318
- const newDsname = DsName(newName);
319
- const oldInfoName = DsInfoName(oldName);
320
- const newInfoName = DsInfoName(newName);
321
- const exists = await this.components.datastore.has(newDsname);
322
- if (exists) {
323
- await randomDelay();
324
- throw new CodeError(`Key '${newName}' already exists`, codes.ERR_KEY_ALREADY_EXISTS);
325
- }
326
- try {
327
- const pem = await this.components.datastore.get(oldDsname);
328
- const res = await this.components.datastore.get(oldInfoName);
329
- const keyInfo = JSON.parse(uint8ArrayToString(res));
330
- keyInfo.name = newName;
331
- const batch = this.components.datastore.batch();
332
- batch.put(newDsname, pem);
333
- batch.put(newInfoName, uint8ArrayFromString(JSON.stringify(keyInfo)));
334
- batch.delete(oldDsname);
335
- batch.delete(oldInfoName);
336
- await batch.commit();
337
- return keyInfo;
338
- }
339
- catch (err) {
340
- await randomDelay();
341
- throw err;
342
- }
343
- }
344
- /**
345
- * Export an existing key as a PEM encrypted PKCS #8 string
346
- */
347
- async exportKey(name, password) {
348
- if (!validateKeyName(name)) {
349
- await randomDelay();
350
- throw new CodeError(`Invalid key name '${name}'`, codes.ERR_INVALID_KEY_NAME);
351
- }
352
- if (password == null) {
353
- await randomDelay();
354
- throw new CodeError('Password is required', codes.ERR_PASSWORD_REQUIRED);
355
- }
356
- const dsname = DsName(name);
357
- try {
358
- const res = await this.components.datastore.get(dsname);
359
- const pem = uint8ArrayToString(res);
360
- const cached = privates.get(this);
361
- if (cached == null) {
362
- throw new CodeError('dek missing', codes.ERR_INVALID_PARAMETERS);
363
- }
364
- const dek = cached.dek;
365
- const privateKey = await importKey(pem, dek);
366
- const keyString = await privateKey.export(password);
367
- return keyString;
368
- }
369
- catch (err) {
370
- await randomDelay();
371
- throw err;
372
- }
373
- }
374
- /**
375
- * Export an existing key as a PeerId
376
- */
377
- async exportPeerId(name) {
378
- const password = 'temporary-password';
379
- const pem = await this.exportKey(name, password);
380
- const privateKey = await importKey(pem, password);
381
- return peerIdFromKeys(privateKey.public.bytes, privateKey.bytes);
382
- }
383
- /**
384
- * Import a new key from a PEM encoded PKCS #8 string
385
- *
386
- * @param {string} name - The local key name; must not already exist.
387
- * @param {string} pem - The PEM encoded PKCS #8 string
388
- * @param {string} password - The password.
389
- * @returns {Promise<KeyInfo>}
390
- */
391
- async importKey(name, pem, password) {
392
- if (!validateKeyName(name) || name === 'self') {
393
- await randomDelay();
394
- throw new CodeError(`Invalid key name '${name}'`, codes.ERR_INVALID_KEY_NAME);
395
- }
396
- if (pem == null) {
397
- await randomDelay();
398
- throw new CodeError('PEM encoded key is required', codes.ERR_PEM_REQUIRED);
399
- }
400
- const dsname = DsName(name);
401
- const exists = await this.components.datastore.has(dsname);
402
- if (exists) {
403
- await randomDelay();
404
- throw new CodeError(`Key '${name}' already exists`, codes.ERR_KEY_ALREADY_EXISTS);
405
- }
406
- let privateKey;
407
- try {
408
- privateKey = await importKey(pem, password);
409
- }
410
- catch (err) {
411
- await randomDelay();
412
- throw new CodeError('Cannot read the key, most likely the password is wrong', codes.ERR_CANNOT_READ_KEY);
413
- }
414
- let kid;
415
- try {
416
- kid = await privateKey.id();
417
- const cached = privates.get(this);
418
- if (cached == null) {
419
- throw new CodeError('dek missing', codes.ERR_INVALID_PARAMETERS);
420
- }
421
- const dek = cached.dek;
422
- pem = await privateKey.export(dek);
423
- }
424
- catch (err) {
425
- await randomDelay();
426
- throw err;
427
- }
428
- const keyInfo = {
429
- name,
430
- id: kid
431
- };
432
- const batch = this.components.datastore.batch();
433
- batch.put(dsname, uint8ArrayFromString(pem));
434
- batch.put(DsInfoName(name), uint8ArrayFromString(JSON.stringify(keyInfo)));
435
- await batch.commit();
436
- return keyInfo;
437
- }
438
- /**
439
- * Import a peer key
440
- */
441
- async importPeer(name, peer) {
442
- try {
443
- if (!validateKeyName(name)) {
444
- throw new CodeError(`Invalid key name '${name}'`, codes.ERR_INVALID_KEY_NAME);
445
- }
446
- if (peer == null) {
447
- throw new CodeError('PeerId is required', codes.ERR_MISSING_PRIVATE_KEY);
448
- }
449
- if (peer.privateKey == null) {
450
- throw new CodeError('PeerId.privKey is required', codes.ERR_MISSING_PRIVATE_KEY);
451
- }
452
- const privateKey = await unmarshalPrivateKey(peer.privateKey);
453
- const dsname = DsName(name);
454
- const exists = await this.components.datastore.has(dsname);
455
- if (exists) {
456
- await randomDelay();
457
- throw new CodeError(`Key '${name}' already exists`, codes.ERR_KEY_ALREADY_EXISTS);
458
- }
459
- const cached = privates.get(this);
460
- if (cached == null) {
461
- throw new CodeError('dek missing', codes.ERR_INVALID_PARAMETERS);
462
- }
463
- const dek = cached.dek;
464
- const pem = await privateKey.export(dek);
465
- const keyInfo = {
466
- name,
467
- id: peer.toString()
468
- };
469
- const batch = this.components.datastore.batch();
470
- batch.put(dsname, uint8ArrayFromString(pem));
471
- batch.put(DsInfoName(name), uint8ArrayFromString(JSON.stringify(keyInfo)));
472
- await batch.commit();
473
- return keyInfo;
474
- }
475
- catch (err) {
476
- await randomDelay();
477
- throw err;
478
- }
479
- }
480
- /**
481
- * Gets the private key as PEM encoded PKCS #8 string
482
- */
483
- async getPrivateKey(name) {
484
- if (!validateKeyName(name)) {
485
- await randomDelay();
486
- throw new CodeError(`Invalid key name '${name}'`, codes.ERR_INVALID_KEY_NAME);
487
- }
488
- try {
489
- const dsname = DsName(name);
490
- const res = await this.components.datastore.get(dsname);
491
- return uint8ArrayToString(res);
492
- }
493
- catch (err) {
494
- await randomDelay();
495
- log.error(err);
496
- throw new CodeError(`Key '${name}' does not exist.`, codes.ERR_KEY_NOT_FOUND);
497
- }
498
- }
499
- /**
500
- * Rotate keychain password and re-encrypt all associated keys
501
- */
502
- async rotateKeychainPass(oldPass, newPass) {
503
- if (typeof oldPass !== 'string') {
504
- await randomDelay();
505
- throw new CodeError(`Invalid old pass type '${typeof oldPass}'`, codes.ERR_INVALID_OLD_PASS_TYPE);
506
- }
507
- if (typeof newPass !== 'string') {
508
- await randomDelay();
509
- throw new CodeError(`Invalid new pass type '${typeof newPass}'`, codes.ERR_INVALID_NEW_PASS_TYPE);
510
- }
511
- if (newPass.length < 20) {
512
- await randomDelay();
513
- throw new CodeError(`Invalid pass length ${newPass.length}`, codes.ERR_INVALID_PASS_LENGTH);
514
- }
515
- log('recreating keychain');
516
- const cached = privates.get(this);
517
- if (cached == null) {
518
- throw new CodeError('dek missing', codes.ERR_INVALID_PARAMETERS);
519
- }
520
- const oldDek = cached.dek;
521
- this.init.pass = newPass;
522
- const newDek = newPass != null && this.init.dek?.salt != null
523
- ? pbkdf2(newPass, this.init.dek.salt, this.init.dek?.iterationCount, this.init.dek?.keyLength, this.init.dek?.hash)
524
- : '';
525
- privates.set(this, { dek: newDek });
526
- const keys = await this.listKeys();
527
- for (const key of keys) {
528
- const res = await this.components.datastore.get(DsName(key.name));
529
- const pem = uint8ArrayToString(res);
530
- const privateKey = await importKey(pem, oldDek);
531
- const password = newDek.toString();
532
- const keyAsPEM = await privateKey.export(password);
533
- // Update stored key
534
- const batch = this.components.datastore.batch();
535
- const keyInfo = {
536
- name: key.name,
537
- id: key.id
538
- };
539
- batch.put(DsName(key.name), uint8ArrayFromString(keyAsPEM));
540
- batch.put(DsInfoName(key.name), uint8ArrayFromString(JSON.stringify(keyInfo)));
541
- await batch.commit();
542
- }
543
- log('keychain reconstructed');
544
- }
52
+ import { DefaultKeychain } from './keychain.js';
53
+ export function keychain(init = {}) {
54
+ return (components) => {
55
+ return new DefaultKeychain(components, init);
56
+ };
545
57
  }
546
58
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAoK/C,MAAM,UAAU,QAAQ,CAAE,OAAqB,EAAE;IAC/C,OAAO,CAAC,UAA8B,EAAE,EAAE;QACxC,OAAO,IAAI,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;IAC9C,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,111 @@
1
+ import type { KeychainComponents, KeychainInit, Keychain, KeyInfo } from './index.js';
2
+ import type { KeyType, PeerId } from '@libp2p/interface';
3
+ declare const defaultOptions: {
4
+ dek: {
5
+ keyLength: number;
6
+ iterationCount: number;
7
+ salt: string;
8
+ hash: string;
9
+ };
10
+ };
11
+ /**
12
+ * Manages the lifecycle of a key. Keys are encrypted at rest using PKCS #8.
13
+ *
14
+ * A key in the store has two entries
15
+ * - '/info/*key-name*', contains the KeyInfo for the key
16
+ * - '/pkcs8/*key-name*', contains the PKCS #8 for the key
17
+ *
18
+ */
19
+ export declare class DefaultKeychain implements Keychain {
20
+ private readonly components;
21
+ private readonly init;
22
+ private readonly log;
23
+ /**
24
+ * Creates a new instance of a key chain
25
+ */
26
+ constructor(components: KeychainComponents, init: KeychainInit);
27
+ /**
28
+ * Generates the options for a keychain. A random salt is produced.
29
+ *
30
+ * @returns {object}
31
+ */
32
+ static generateOptions(): KeychainInit;
33
+ /**
34
+ * Gets an object that can encrypt/decrypt protected data.
35
+ * The default options for a keychain.
36
+ *
37
+ * @returns {object}
38
+ */
39
+ static get options(): typeof defaultOptions;
40
+ /**
41
+ * Create a new key.
42
+ *
43
+ * @param {string} name - The local key name; cannot already exist.
44
+ * @param {string} type - One of the key types; 'rsa'.
45
+ * @param {number} [size = 2048] - The key size in bits. Used for rsa keys only
46
+ */
47
+ createKey(name: string, type: KeyType, size?: number): Promise<KeyInfo>;
48
+ /**
49
+ * List all the keys.
50
+ *
51
+ * @returns {Promise<KeyInfo[]>}
52
+ */
53
+ listKeys(): Promise<KeyInfo[]>;
54
+ /**
55
+ * Find a key by it's id
56
+ */
57
+ findKeyById(id: string): Promise<KeyInfo>;
58
+ /**
59
+ * Find a key by it's name.
60
+ *
61
+ * @param {string} name - The local key name.
62
+ * @returns {Promise<KeyInfo>}
63
+ */
64
+ findKeyByName(name: string): Promise<KeyInfo>;
65
+ /**
66
+ * Remove an existing key.
67
+ *
68
+ * @param {string} name - The local key name; must already exist.
69
+ * @returns {Promise<KeyInfo>}
70
+ */
71
+ removeKey(name: string): Promise<KeyInfo>;
72
+ /**
73
+ * Rename a key
74
+ *
75
+ * @param {string} oldName - The old local key name; must already exist.
76
+ * @param {string} newName - The new local key name; must not already exist.
77
+ * @returns {Promise<KeyInfo>}
78
+ */
79
+ renameKey(oldName: string, newName: string): Promise<KeyInfo>;
80
+ /**
81
+ * Export an existing key as a PEM encrypted PKCS #8 string
82
+ */
83
+ exportKey(name: string, password: string): Promise<string>;
84
+ /**
85
+ * Export an existing key as a PeerId
86
+ */
87
+ exportPeerId(name: string): Promise<PeerId>;
88
+ /**
89
+ * Import a new key from a PEM encoded PKCS #8 string
90
+ *
91
+ * @param {string} name - The local key name; must not already exist.
92
+ * @param {string} pem - The PEM encoded PKCS #8 string
93
+ * @param {string} password - The password.
94
+ * @returns {Promise<KeyInfo>}
95
+ */
96
+ importKey(name: string, pem: string, password: string): Promise<KeyInfo>;
97
+ /**
98
+ * Import a peer key
99
+ */
100
+ importPeer(name: string, peer: PeerId): Promise<KeyInfo>;
101
+ /**
102
+ * Gets the private key as PEM encoded PKCS #8 string
103
+ */
104
+ getPrivateKey(name: string): Promise<string>;
105
+ /**
106
+ * Rotate keychain password and re-encrypt all associated keys
107
+ */
108
+ rotateKeychainPass(oldPass: string, newPass: string): Promise<void>;
109
+ }
110
+ export {};
111
+ //# sourceMappingURL=keychain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../../src/keychain.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACrF,OAAO,KAAK,EAAU,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAahE,QAAA,MAAM,cAAc;;;;;;;CAQnB,CAAA;AAwCD;;;;;;;GAOG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAE5B;;OAEG;gBACU,UAAU,EAAE,kBAAkB,EAAE,IAAI,EAAE,YAAY;IA+B/D;;;;OAIG;IACH,MAAM,CAAC,eAAe,IAAK,YAAY;IAOvC;;;;;OAKG;IACH,MAAM,KAAK,OAAO,IAAK,OAAO,cAAc,CAE3C;IAED;;;;;;OAMG;IACG,SAAS,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,SAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IA0D5E;;;;OAIG;IACG,QAAQ,IAAK,OAAO,CAAC,OAAO,EAAE,CAAC;IAarC;;OAEG;IACG,WAAW,CAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBhD;;;;;OAKG;IACG,aAAa,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBpD;;;;;OAKG;IACG,SAAS,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAchD;;;;;;OAMG;IACG,SAAS,CAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuCpE;;OAEG;IACG,SAAS,CAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+BjE;;OAEG;IACG,YAAY,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQlD;;;;;;;OAOG;IACG,SAAS,CAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoD/E;;OAEG;IACG,UAAU,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4C/D;;OAEG;IACG,aAAa,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBnD;;OAEG;IACG,kBAAkB,CAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAmD3E"}