signify-ts 0.1.0 → 0.1.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.
Files changed (64) hide show
  1. package/README.md +48 -1
  2. package/dist/index.d.ts +3 -1
  3. package/dist/keri/app/accountant.d.ts +10 -0
  4. package/dist/keri/app/apping.d.ts +1 -0
  5. package/dist/keri/app/client.d.ts +7 -0
  6. package/dist/keri/app/habery.d.ts +47 -0
  7. package/dist/keri/app/signify.d.ts +6 -0
  8. package/dist/keri/core/authing.d.ts +9 -0
  9. package/dist/keri/core/cigar.d.ts +3 -3
  10. package/dist/keri/core/core.d.ts +19 -34
  11. package/dist/keri/core/counter.d.ts +43 -0
  12. package/dist/keri/core/eventing.d.ts +21 -0
  13. package/dist/keri/core/httping.d.ts +34 -0
  14. package/dist/keri/core/manager.d.ts +38 -17
  15. package/dist/keri/core/matter.d.ts +23 -1
  16. package/dist/keri/core/number.d.ts +6 -0
  17. package/dist/keri/core/prefixer.d.ts +15 -0
  18. package/dist/keri/core/saider.d.ts +23 -0
  19. package/dist/keri/core/salter.d.ts +23 -0
  20. package/dist/keri/core/serder.d.ts +23 -0
  21. package/dist/keri/core/siger.d.ts +1 -1
  22. package/dist/keri/core/signer.d.ts +2 -2
  23. package/dist/keri/core/tholder.d.ts +14 -0
  24. package/dist/keri/core/utils.d.ts +2 -1
  25. package/dist/keri/core/verfer.d.ts +12 -0
  26. package/dist/keri/end/ending.d.ts +13 -0
  27. package/dist/signify-ts.cjs.development.js +3380 -5
  28. package/dist/signify-ts.cjs.development.js.map +1 -1
  29. package/dist/signify-ts.cjs.production.min.js +1 -1
  30. package/dist/signify-ts.cjs.production.min.js.map +1 -1
  31. package/dist/signify-ts.esm.js +3365 -5
  32. package/dist/signify-ts.esm.js.map +1 -1
  33. package/package.json +4 -2
  34. package/src/index.ts +5 -6
  35. package/src/keri/app/accountant.ts +35 -0
  36. package/src/keri/app/apping.ts +12 -0
  37. package/src/keri/app/client.ts +30 -0
  38. package/src/keri/app/habery.ts +152 -0
  39. package/src/keri/app/signify.ts +12 -0
  40. package/src/keri/app/tsconfig.json +100 -0
  41. package/src/keri/core/authing.ts +129 -0
  42. package/src/keri/core/cigar.ts +4 -4
  43. package/src/keri/core/core.ts +53 -43
  44. package/src/keri/core/counter.ts +207 -0
  45. package/src/keri/core/diger.ts +5 -5
  46. package/src/keri/core/eventing.ts +219 -0
  47. package/src/keri/core/httping.ts +163 -0
  48. package/src/keri/core/indexer.ts +2 -1
  49. package/src/keri/core/keeping.ts +0 -1
  50. package/src/keri/core/manager.ts +238 -90
  51. package/src/keri/core/matter.ts +46 -11
  52. package/src/keri/core/number.ts +21 -0
  53. package/src/keri/core/prefixer.ts +212 -0
  54. package/src/keri/core/saider.ts +158 -0
  55. package/src/keri/core/salter.ts +9 -5
  56. package/src/keri/core/serder.ts +99 -0
  57. package/src/keri/core/siger.ts +2 -2
  58. package/src/keri/core/signer.ts +4 -3
  59. package/src/keri/core/tholder.ts +52 -0
  60. package/src/keri/core/tsconfig.json +2 -2
  61. package/src/keri/core/utils.ts +10 -6
  62. package/src/keri/core/verfer.ts +6 -5
  63. package/src/keri/end/ending.ts +160 -0
  64. package/src/keri/end/tsconfig.json +100 -0
@@ -41,18 +41,48 @@ class PubSet {
41
41
  pubs: Array<string> = new Array<string>() // list qb64 public keys.
42
42
  }
43
43
 
44
+ class PubPath {
45
+ path: string = ""
46
+ code: string = ""
47
+ tier: string = Tier.high
48
+ temp: boolean = false
49
+ }
50
+
51
+ class Keys {
52
+ private readonly _signers: Array<Signer>
53
+ private readonly _paths?: Array<string>
54
+
55
+ constructor(signers: Array<Signer>, paths?: Array<string>) {
56
+ this._signers = signers
57
+ if (paths != undefined) {
58
+ if (signers.length != paths.length) {
59
+ throw new Error("If paths are provided, they must be the same length as signers")
60
+ }
61
+ }
62
+ this._paths = paths
63
+ }
64
+
65
+ get paths(): Array<string> | undefined {
66
+ return this._paths;
67
+ }
68
+
69
+ get signers(): Array<Signer> {
70
+ return this._signers;
71
+ }
72
+ }
73
+
44
74
  export interface Creator {
45
- create(codes: Array<string> | undefined, count: number, code: string, transferable: boolean,
46
- pidx: number, ridx: number, kidx: number, temp: boolean): Array<Signer>
47
- get salt(): string
48
- get stem(): string
49
- get tier(): Tier
75
+ create(codes: Array<string> | undefined, count: number, code: string, transferable: boolean, pidx: number,
76
+ ridx: number, kidx: number, temp: boolean): Keys
77
+ salt: string
78
+ stem: string
79
+ tier: Tier
50
80
  }
51
81
 
52
82
  export class RandyCreator implements Creator {
53
83
 
54
84
  create(codes: Array<string> | undefined = undefined, count: number = 1, code: string = MtrDex.Ed25519_Seed,
55
- transferable: boolean = true): Array<Signer> {
85
+ transferable: boolean = true): Keys {
56
86
  let signers = new Array<Signer>()
57
87
  if (codes == undefined) {
58
88
  codes = new Array(count).fill(code)
@@ -62,7 +92,7 @@ export class RandyCreator implements Creator {
62
92
  signers.push(new Signer({code: code, transferable: transferable}))
63
93
  })
64
94
 
65
- return signers
95
+ return new Keys(signers)
66
96
  }
67
97
 
68
98
  get salt(): string {
@@ -74,7 +104,7 @@ export class RandyCreator implements Creator {
74
104
  }
75
105
 
76
106
  get tier(): Tier {
77
- return Tier.low;
107
+ return "" as Tier;
78
108
  }
79
109
  }
80
110
 
@@ -99,31 +129,32 @@ export class SaltyCreator implements Creator {
99
129
  }
100
130
 
101
131
  get tier(): Tier {
102
- return this.salter.tier;
132
+ return this.salter.tier!;
103
133
  }
104
134
 
105
135
  create(codes: Array<string> | undefined = undefined, count: number = 1, code: string = MtrDex.Ed25519_Seed,
106
- transferable: boolean = true, pidx: number = 0, ridx: number = 0, kidx: number = 0,
107
- temp: boolean = false): Array<Signer> {
136
+ transferable: boolean = true, pidx: number = 0, ridx: number = 0, kidx: number = 0,
137
+ temp: boolean = false): Keys {
138
+
108
139
  let signers = new Array<Signer>()
140
+ let paths = new Array<string>()
141
+
109
142
  if (codes == undefined) {
110
- codes = new Array(count).fill(code)
143
+ codes = new Array<string>(count).fill(code)
111
144
  }
112
145
 
113
- let stem = this.stem == "" ? pidx.toString(16) : this.stem
114
-
115
146
  codes.forEach((code, idx) => {
116
- let path = stem + ridx.toString(16) + (kidx+idx).toString(16)
147
+ let path = this.stem + pidx.toString(16) + ridx.toString(16) + (kidx+idx).toString(16)
117
148
  signers.push(this.salter.signer(code, transferable, path, this.tier, temp))
149
+ paths.push(path)
118
150
  })
119
151
 
120
- return signers
152
+ return new Keys(signers, paths)
121
153
  }
122
-
123
154
  }
124
155
 
125
156
  export class Creatory {
126
- private _make: any
157
+ private readonly _make: any
127
158
  constructor(algo: Algos = Algos.salty) {
128
159
  switch(algo) {
129
160
  case Algos.randy:
@@ -137,30 +168,52 @@ export class Creatory {
137
168
  }
138
169
  }
139
170
 
140
- make(...args: any[]) {
171
+ make(...args: any[]): Creator {
141
172
  return this._make(...args)
142
173
  }
143
174
 
144
- _makeRandy() {
175
+ _makeRandy(): Creator {
145
176
  return new RandyCreator()
146
177
  }
147
178
 
148
- _makeSalty(...args: any[]) {
179
+ _makeSalty(...args: any[]): Creator {
149
180
  return new SaltyCreator(...args)
150
181
  }
151
182
  }
152
183
 
184
+ export function openManager(passcode: string, salt?: string) {
185
+ if (passcode.length < 21) {
186
+ throw new Error("Bran (passcode seed material) too short.")
187
+ }
188
+
189
+ let bran = MtrDex.Salt_128 + 'A' + passcode.substring(0, 21) // qb64 salt for seed
190
+ let signer = new Salter({qb64: bran}).signer(MtrDex.Ed25519_Seed, false)
191
+ let seed = signer.qb64
192
+ let aeid = signer.verfer.qb64 // lest it remove encryption
193
+
194
+ let algo;
195
+
196
+ if (salt != undefined) {
197
+ algo = Algos.salty
198
+ salt = new Salter({qb64: salt}).qb64
199
+ } else {
200
+ algo = Algos.randy
201
+ }
202
+
203
+ return new Manager({seed: seed, aeid: aeid, algo: algo, salt: salt})
204
+ }
205
+
153
206
  export interface ManagerArgs {
154
207
  ks?: KeyStore | undefined
155
208
  seed?: string | undefined
156
209
  aeid?: string | undefined
157
210
  pidx?: number | undefined
158
- algo?: string | undefined
211
+ algo?: Algos | undefined
159
212
  salt?: string | undefined
160
213
  tier?: string | undefined
161
214
  }
162
215
 
163
- interface InceptArgs {
216
+ export interface InceptArgs {
164
217
  icodes?: any | undefined
165
218
  icount?: number
166
219
  icode?: string
@@ -198,19 +251,20 @@ interface SignArgs {
198
251
  }
199
252
 
200
253
  export class Manager {
201
- private _seed: string
254
+ private _seed?: string
255
+ private _salt?: string
202
256
  private _encrypter: Encrypter | undefined
203
257
  private _decrypter: Decrypter | undefined
204
- private _ks: KeyStore
258
+ private readonly _ks: KeyStore
205
259
 
206
260
  constructor({ks, seed, aeid, pidx, algo, salt, tier}: ManagerArgs) {
207
261
 
208
262
  this._ks = ks == undefined ? new Keeper() : ks
209
- this._seed = seed == undefined ? "" : seed
263
+ this._seed = seed
210
264
  this._encrypter = undefined
211
265
  this._decrypter = undefined
212
266
 
213
- aeid = aeid == undefined ? "" : aeid
267
+ aeid = aeid == undefined ? undefined : aeid
214
268
  pidx = pidx == undefined ? 0 : pidx
215
269
  algo = algo == undefined ? Algos.salty : algo
216
270
 
@@ -249,15 +303,15 @@ export class Manager {
249
303
  return this._ks
250
304
  }
251
305
 
252
- get encrypter(): Encrypter {
253
- return this._encrypter!
306
+ get encrypter(): Encrypter | undefined {
307
+ return this._encrypter
254
308
  }
255
309
 
256
- get decrypter(): Decrypter {
257
- return this._decrypter!
310
+ get decrypter(): Decrypter | undefined {
311
+ return this._decrypter
258
312
  }
259
313
 
260
- get seed(): string {
314
+ get seed(): string | undefined {
261
315
  return this._seed
262
316
  }
263
317
 
@@ -277,19 +331,22 @@ export class Manager {
277
331
  this.ks.pinGbls('pidx', pidx!.toString(16))
278
332
  }
279
333
 
280
- get salt(): string | undefined{
281
- let salt = this.ks.getGbls('salt')
282
- if (this._decrypter != undefined) {
283
- return this._decrypter?.decrypt(b(salt)).qb64
334
+ get salt(): string | undefined {
335
+ if (this._decrypter == undefined) {
336
+ return this._salt
337
+ } else {
338
+ let salt = this.ks.getGbls('salt')
339
+ return this._decrypter.decrypt(b(salt)).qb64
284
340
  }
285
- return salt
286
341
  }
287
342
 
288
343
  set salt(salt: string | undefined) {
289
- if(this._encrypter != undefined) {
344
+ if(this._encrypter == undefined) {
345
+ this._salt = salt
346
+ } else {
290
347
  salt = this._encrypter.encrypt(b(salt)).qb64
348
+ this.ks.pinGbls('salt', salt!)
291
349
  }
292
- this.ks.pinGbls('salt', salt!)
293
350
  }
294
351
 
295
352
  get tier(): string | undefined {
@@ -306,11 +363,11 @@ export class Manager {
306
363
  return Algos[ta]
307
364
  }
308
365
 
309
- set algo(algo: string | undefined) {
310
- this.ks.pinGbls('algo', algo!)
366
+ set algo(algo: Algos | undefined) {
367
+ this.ks.pinGbls('algo', algo! as string)
311
368
  }
312
369
 
313
- private updateAeid(aeid: string | undefined, seed: string) {
370
+ private updateAeid(aeid: string | undefined, seed?: string) {
314
371
  if (this.aeid != undefined) {
315
372
  let seed = b(this._seed)
316
373
  if (this._seed == undefined || !this._encrypter?.verifySeed(seed)) {
@@ -327,9 +384,11 @@ export class Manager {
327
384
  " with provided aeid=${aeid}.`)
328
385
  }
329
386
  }
330
- } else {
387
+ } else if (this.algo == Algos.randy) {
331
388
  // Unlike KERIpy, we don't support unencrypted secrets
332
- throw new Error("Invalid use of Manager, unencrypted keystore not supported")
389
+ throw new Error("Invalid Manager configuration, encryption must be used with Randy key creation.")
390
+ } else {
391
+ this._encrypter = undefined
333
392
  }
334
393
 
335
394
  let salt = this.salt
@@ -352,7 +411,7 @@ export class Manager {
352
411
 
353
412
  }
354
413
 
355
- this.ks.pinGbls("aeid", aeid) // set aeid in db
414
+ this.ks.pinGbls("aeid", aeid!) // set aeid in db
356
415
  this._seed = seed // set .seed in memory
357
416
 
358
417
  // update .decrypter
@@ -374,7 +433,7 @@ export class Manager {
374
433
  tier = this.tier
375
434
  }
376
435
 
377
- let pidx = this.pidx
436
+ let pidx = this.pidx!
378
437
  let ridx = 0
379
438
  let kidx = 0
380
439
 
@@ -388,8 +447,8 @@ export class Manager {
388
447
  icodes = new Array<string>(icount).fill(icode)
389
448
  }
390
449
 
391
- let isigners = creator.create(icodes, 0, MtrDex.Ed25519_Seed, transferable, pidx, ridx, kidx, temp)
392
- let verfers = Array.from(isigners, (signer: Signer) => signer.verfer)
450
+ let ikeys = creator.create(icodes, 0, MtrDex.Ed25519_Seed, transferable, pidx, ridx, kidx, temp)
451
+ let verfers = Array.from(ikeys.signers, (signer: Signer) => signer.verfer)
393
452
 
394
453
  if (ncodes == undefined) {
395
454
  if (ncount < 0) {
@@ -399,15 +458,15 @@ export class Manager {
399
458
  ncodes = new Array<string>(ncount).fill(ncode)
400
459
  }
401
460
 
402
- let nsigners = creator.create(ncodes, 0, MtrDex.Ed25519_Seed, transferable, pidx, ridx+1, kidx+icodes.length,
461
+ let nkeys = creator.create(ncodes, 0, MtrDex.Ed25519_Seed, transferable, pidx, ridx+1, kidx+icodes.length,
403
462
  temp)
404
463
 
405
- let digers = Array.from(nsigners, (signer: Signer) => new Diger({code: dcode}, signer.verfer.qb64b))
464
+ let digers = Array.from(nkeys.signers, (signer: Signer) => new Diger({code: dcode}, signer.verfer.qb64b))
406
465
 
407
466
  let pp = new PrePrm()
408
467
  pp.pidx = pidx!
409
468
  pp.algo = algo!
410
- pp.salt = this._encrypter?.encrypt(b(creator.salt)).qb64
469
+ pp.salt = creator.salt.length == 0 || this.encrypter == undefined ? "" : this.encrypter.encrypt(b(creator.salt)).qb64
411
470
  pp.stem = creator.stem
412
471
  pp.tier = creator.tier
413
472
 
@@ -419,7 +478,7 @@ export class Manager {
419
478
  nw.dt = dt
420
479
 
421
480
  let nt = new PubLot()
422
- nt.pubs = Array.from(nsigners, (signer: Signer) => signer.verfer.qb64)
481
+ nt.pubs = Array.from(nkeys.signers, (signer: Signer) => signer.verfer.qb64)
423
482
  nt.ridx = ridx + 1
424
483
  nt.kidx = kidx + icodes.length
425
484
  nt.dt = dt
@@ -443,18 +502,41 @@ export class Manager {
443
502
  throw new Error(`Already incepted sit for pre=${pre}.`)
444
503
  }
445
504
 
446
- isigners.forEach((signer: Signer) => {
447
- this.ks.putPris(signer.verfer.qb64, signer, this._encrypter!)
448
- })
505
+ if (this.encrypter != undefined) { // Only store encrypted keys if we have an encrypter, otherwise regenerate
506
+ ikeys.signers.forEach((signer: Signer) => {
507
+ this.ks.putPris(signer.verfer.qb64, signer, this.encrypter!)
508
+ })
509
+
510
+ nkeys.signers.forEach((signer: Signer) => {
511
+ this.ks.putPris(signer.verfer.qb64, signer, this.encrypter!)
512
+ })
513
+ } else if (this._encrypter == undefined && ikeys.paths != undefined && nkeys.paths != undefined) {
514
+ ikeys.paths.forEach((path: string, idx: number) => {
515
+ let signer = ikeys.signers[idx]
516
+ let ppt = new PubPath()
517
+ ppt.path = path
518
+ ppt.code = icodes[idx]
519
+ ppt.tier = pp.tier
520
+ ppt.temp = temp
521
+ this.ks.putPths(signer.verfer.qb64, ppt)
522
+ })
523
+ nkeys.paths.forEach((path: string, idx: number) => {
524
+ let signer = nkeys.signers[idx]
525
+ let ppt = new PubPath()
526
+ ppt.path = path
527
+ ppt.code = ncodes[idx]
528
+ ppt.tier = pp.tier
529
+ ppt.temp = temp
530
+ this.ks.putPths(signer.verfer.qb64, ppt)
531
+ })
532
+ } else {
533
+ throw new Error("invalid configuration, randy keys without encryption")
534
+ }
449
535
 
450
536
  let pubSet = new PubSet()
451
537
  pubSet.pubs = ps.new.pubs
452
538
  this.ks.putPubs(riKey(pre, ridx), pubSet)
453
539
 
454
- nsigners.forEach((signer: Signer) => {
455
- this.ks.putPris(signer.verfer.qb64, signer, this._encrypter!)
456
- })
457
-
458
540
  let nxtPubSet = new PubSet()
459
541
  nxtPubSet.pubs = ps.nxt.pubs
460
542
  this.ks.putPubs(riKey(pre, ridx+1), nxtPubSet)
@@ -528,7 +610,7 @@ export class Manager {
528
610
  }
529
611
 
530
612
  rotate({pre, ncodes=undefined, ncount=1, ncode=MtrDex.Ed25519_Seed, dcode=MtrDex.Blake3_256,
531
- transferable=true, temp=false, erase=true}:RotateArgs) {
613
+ transferable=true, temp=false, erase=true}:RotateArgs): [Array<Verfer>, Array<Diger>] {
532
614
  let pp = this.ks.getPrms(pre)
533
615
  if (pp == undefined) {
534
616
  throw new Error(`Attempt to rotate nonexistent pre=${pre}.`)
@@ -539,7 +621,7 @@ export class Manager {
539
621
  throw new Error(`Attempt to rotate nonexistent pre=${pre}.`)
540
622
  }
541
623
 
542
- if (ps.nxt.pubs == undefined) {
624
+ if (ps.nxt.pubs == undefined || ps.nxt.pubs.length == 0) {
543
625
  throw new Error(`Attempt to rotate nontransferable pre=${pre}.`)
544
626
  }
545
627
 
@@ -553,20 +635,30 @@ export class Manager {
553
635
 
554
636
  let verfers = new Array<Verfer>()
555
637
  ps.new.pubs.forEach((pub) => {
556
- let signer = this.ks.getPris(pub, this.decrypter)
557
- if (signer == undefined) {
558
- throw new Error(`Missing prikey in db for pubkey=${pub}`)
638
+ if (this.decrypter != undefined) {
639
+ let signer = this.ks.getPris(pub, this.decrypter)
640
+ if (signer == undefined) {
641
+ throw new Error(`Missing prikey in db for pubkey=${pub}`)
642
+ }
643
+ verfers.push(signer.verfer)
644
+ } else {
645
+ // Should we regenerate from salt here since this.decryptor is undefined
646
+ verfers.push(new Verfer({qb64: pub}))
559
647
  }
560
648
 
561
- verfers.push(signer.verfer)
562
649
  })
563
650
 
564
651
  let salt = pp.salt
565
- if (salt != undefined && salt != "") {
652
+ if (salt != undefined && salt != "") { // If you provded a Salt for an AID but don't have encryption, pitch a fit
653
+ if (this.decrypter == undefined) {
654
+ throw new Error("Invalid configuration: AID salt with no encryption")
655
+ }
566
656
  salt = this.decrypter.decrypt(b(salt)).qb64
657
+ } else {
658
+ salt = this.salt!
567
659
  }
568
660
 
569
- let creator = new Creatory(pp.algo).make(salt, pp.stem, pp.tier)
661
+ let creator = new Creatory(pp.algo).make(salt, pp.tier, pp.stem)
570
662
 
571
663
  if (ncodes == undefined) {
572
664
  if (ncount < 0) {
@@ -579,12 +671,12 @@ export class Manager {
579
671
  let ridx = ps.new.ridx + 1
580
672
  let kidx = ps.nxt.kidx + ps.new.pubs.length
581
673
 
582
- let signers = creator.create(ncodes, 0, undefined, transferable, pidx, ridx, kidx, temp)
583
- let digers = Array.from(signers, (signer: Signer) => new Diger({code: dcode}, signer.verfer.qb64b))
674
+ let keys = creator.create(ncodes, 0, "", transferable, pidx, ridx, kidx, temp)
675
+ let digers = Array.from(keys.signers, (signer: Signer) => new Diger({code: dcode}, signer.verfer.qb64b))
584
676
 
585
677
  let dt = new Date().toString()
586
678
  ps.nxt = new PubLot()
587
- ps.nxt.pubs = Array.from(signers, (signer: Signer) => signer.verfer.qb64)
679
+ ps.nxt.pubs = Array.from(keys.signers, (signer: Signer) => signer.verfer.qb64)
588
680
  ps.nxt.ridx = ridx
589
681
  ps.nxt.kidx = kidx
590
682
  ps.nxt.dt = dt
@@ -593,9 +685,22 @@ export class Manager {
593
685
  throw new Error(`Problem updating pubsit db for pre=${pre}.`)
594
686
  }
595
687
 
596
- signers.forEach((signer: Signer) => {
597
- this.ks.putPris(signer.verfer.qb64, signer, this.encrypter)
598
- })
688
+ if (this.encrypter != undefined) { // Only store encrypted keys if we have an encrypter, otherwise regenerate
689
+ keys.signers.forEach((signer: Signer) => {
690
+ this.ks.putPris(signer.verfer.qb64, signer, this.encrypter!)
691
+ })
692
+ } else if (this._encrypter == undefined && keys.paths != undefined) {
693
+ keys.paths.forEach((path: string, idx: number) => {
694
+ let signer = keys.signers[idx]
695
+ let ppt = new PubPath()
696
+ ppt.path = path
697
+ ppt.tier = pp!.tier
698
+ ppt.temp = temp
699
+ this.ks.putPths(signer.verfer.qb64, ppt)
700
+ })
701
+ } else {
702
+ throw new Error("invalid configuration, randy keys without encryption")
703
+ }
599
704
 
600
705
  let newPs = new PubSet()
601
706
  newPs.pubs = ps.nxt.pubs
@@ -603,7 +708,7 @@ export class Manager {
603
708
 
604
709
  if (erase) {
605
710
  old.pubs.forEach((pub) => {
606
- this.ks.remPubs(pub)
711
+ this.ks.remPris(pub)
607
712
  })
608
713
  }
609
714
 
@@ -623,19 +728,39 @@ export class Manager {
623
728
  }
624
729
 
625
730
  pubs.forEach((pub) => {
626
- let signer = this.ks.getPris(pub, this.decrypter)
627
- if (signer == undefined) {
628
- throw new Error(`Missing prikey in db for pubkey=${pub}`)
731
+ //If no decrypter then get SaltyState and regenerate prikey
732
+ if (this.decrypter != undefined) {
733
+ let signer = this.ks.getPris(pub, this.decrypter)
734
+ if (signer == undefined) {
735
+ throw new Error(`Missing prikey in db for pubkey=${pub}`)
736
+ }
737
+ signers.push(signer)
738
+ } else {
739
+ let verfer = new Verfer({qb64: pub})
740
+ let ppt = this.ks.getPths(pub)
741
+ if (ppt == undefined) {
742
+ throw new Error(`Missing prikey in db for pubkey=${pub}`)
743
+ }
744
+ let salter = new Salter({qb64: this.salt})
745
+ signers.push(salter.signer(ppt.code, verfer.transferable, ppt.path, ppt.tier as Tier, ppt.temp))
629
746
  }
630
- signers.push(signer)
631
747
  })
632
748
  } else {
633
749
  verfers!.forEach((verfer: Verfer) => {
634
- let signer = this.ks.getPris(verfer.qb64, this.decrypter)
635
- if (signer == undefined) {
636
- throw new Error(`Missing prikey in db for pubkey=${verfer.qb64}`)
750
+ if (this.decrypter != undefined) {
751
+ let signer = this.ks.getPris(verfer.qb64, this.decrypter)
752
+ if (signer == undefined) {
753
+ throw new Error(`Missing prikey in db for pubkey=${verfer.qb64}`)
754
+ }
755
+ signers.push(signer)
756
+ } else {
757
+ let ppt = this.ks.getPths(verfer.qb64)
758
+ if (ppt == undefined) {
759
+ throw new Error(`Missing prikey in db for pubkey=${verfer.qb64}`)
760
+ }
761
+ let salter = new Salter({qb64: this.salt})
762
+ signers.push(salter.signer(ppt.code, verfer.transferable, ppt.path, ppt.tier as Tier, ppt.temp))
637
763
  }
638
- signers.push(signer)
639
764
  })
640
765
  }
641
766
 
@@ -690,6 +815,7 @@ export function riKey(pre: string, ridx: number) {
690
815
 
691
816
  }
692
817
 
818
+
693
819
  export interface KeyStore {
694
820
  getGbls(key: string): string | undefined
695
821
  pinGbls(key: string, val: string): void
@@ -704,6 +830,11 @@ export interface KeyStore {
704
830
  getPris(keys: string, decrypter: Decrypter): Signer | undefined
705
831
  pinPris(keys: string, data: Signer, encrypter: Encrypter): void
706
832
  putPris(pubKey: string, signer: Signer, encrypter: Encrypter): boolean
833
+ remPris(pubKey: string): void
834
+
835
+ getPths(pubKey: string): PubPath | undefined
836
+ putPths(pubKey: string, val: PubPath): boolean
837
+ pinPths(pubKey: string, val: PubPath): boolean
707
838
 
708
839
  getPres(pre: string): Uint8Array | undefined
709
840
  putPres(pre: string, val: Uint8Array): boolean
@@ -716,15 +847,16 @@ export interface KeyStore {
716
847
 
717
848
  getPubs(keys: string): PubSet | undefined
718
849
  putPubs(keys: string, data: PubSet): boolean
719
- remPubs(keys: string): boolean
720
850
  }
721
851
 
722
852
  /*
723
853
  In memory test implementation of Keeper key store
724
854
  */
855
+
725
856
  class Keeper implements KeyStore {
726
857
  private readonly _gbls: Map<string, string>
727
858
  private readonly _pris: Map<string, Uint8Array>
859
+ private readonly _pths: Map<string, PubPath>
728
860
  private readonly _pres: Map<string, Uint8Array>
729
861
  private readonly _prms: Map<string, PrePrm>
730
862
  private readonly _sits: Map<string, PreSit>
@@ -733,6 +865,7 @@ class Keeper implements KeyStore {
733
865
  constructor() {
734
866
  this._gbls = new Map<string, string>()
735
867
  this._pris = new Map<string, Uint8Array>()
868
+ this._pths = new Map<string, PubPath>()
736
869
  this._pres = new Map<string, Uint8Array>()
737
870
  this._prms = new Map<string, PrePrm>()
738
871
  this._sits = new Map<string, PreSit>()
@@ -757,7 +890,7 @@ class Keeper implements KeyStore {
757
890
  return out
758
891
  }
759
892
 
760
- getPrms(keys: string) :PrePrm | undefined {
893
+ getPrms(keys: string): PrePrm | undefined {
761
894
  return this._prms.get(keys)
762
895
  }
763
896
 
@@ -779,7 +912,7 @@ class Keeper implements KeyStore {
779
912
 
780
913
  prisElements(decrypter: Decrypter): Array<[string, Signer]> {
781
914
  let out = new Array<[string, Signer]>()
782
- this._pris.forEach(function(val, pubKey) {
915
+ this._pris.forEach(function (val, pubKey) {
783
916
  let verfer = new Verfer({qb64: pubKey})
784
917
  let signer = decrypter.decrypt(val, null, verfer.transferable)
785
918
  out.push([pubKey, signer])
@@ -812,6 +945,25 @@ class Keeper implements KeyStore {
812
945
  return decrypter.decrypt(val, null, verfer.transferable)
813
946
  }
814
947
 
948
+ pinPths(pubKey: string, val: PubPath): boolean {
949
+ this._pths.set(pubKey, val)
950
+ return true
951
+ }
952
+
953
+ putPths(pubKey: string, val: PubPath): boolean {
954
+ if (this._pths.has(pubKey)) {
955
+ return false
956
+ }
957
+
958
+ this._pths.set(pubKey, val)
959
+ return true
960
+
961
+ }
962
+
963
+ getPths(pubKey: string): PubPath | undefined {
964
+ return this._pths.get(pubKey)
965
+ }
966
+
815
967
  remPris(pubKey: string): void {
816
968
  this._pris.delete(pubKey)
817
969
  }
@@ -834,7 +986,7 @@ class Keeper implements KeyStore {
834
986
  return true
835
987
  }
836
988
 
837
- getSits(keys: string) :PreSit | undefined {
989
+ getSits(keys: string): PreSit | undefined {
838
990
  return this._sits.get(keys)
839
991
  }
840
992
 
@@ -867,8 +1019,4 @@ class Keeper implements KeyStore {
867
1019
  this._pubs.set(keys, data)
868
1020
  return true
869
1021
  }
870
-
871
- remPubs(keys: string): boolean {
872
- return this._pubs.delete(keys)
873
- }
874
1022
  }