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.
- package/README.md +48 -1
- package/dist/index.d.ts +3 -1
- package/dist/keri/app/accountant.d.ts +10 -0
- package/dist/keri/app/apping.d.ts +1 -0
- package/dist/keri/app/client.d.ts +7 -0
- package/dist/keri/app/habery.d.ts +47 -0
- package/dist/keri/app/signify.d.ts +6 -0
- package/dist/keri/core/authing.d.ts +9 -0
- package/dist/keri/core/cigar.d.ts +3 -3
- package/dist/keri/core/core.d.ts +19 -34
- package/dist/keri/core/counter.d.ts +43 -0
- package/dist/keri/core/eventing.d.ts +21 -0
- package/dist/keri/core/httping.d.ts +34 -0
- package/dist/keri/core/manager.d.ts +38 -17
- package/dist/keri/core/matter.d.ts +23 -1
- package/dist/keri/core/number.d.ts +6 -0
- package/dist/keri/core/prefixer.d.ts +15 -0
- package/dist/keri/core/saider.d.ts +23 -0
- package/dist/keri/core/salter.d.ts +23 -0
- package/dist/keri/core/serder.d.ts +23 -0
- package/dist/keri/core/siger.d.ts +1 -1
- package/dist/keri/core/signer.d.ts +2 -2
- package/dist/keri/core/tholder.d.ts +14 -0
- package/dist/keri/core/utils.d.ts +2 -1
- package/dist/keri/core/verfer.d.ts +12 -0
- package/dist/keri/end/ending.d.ts +13 -0
- package/dist/signify-ts.cjs.development.js +3380 -5
- package/dist/signify-ts.cjs.development.js.map +1 -1
- package/dist/signify-ts.cjs.production.min.js +1 -1
- package/dist/signify-ts.cjs.production.min.js.map +1 -1
- package/dist/signify-ts.esm.js +3365 -5
- package/dist/signify-ts.esm.js.map +1 -1
- package/package.json +4 -2
- package/src/index.ts +5 -6
- package/src/keri/app/accountant.ts +35 -0
- package/src/keri/app/apping.ts +12 -0
- package/src/keri/app/client.ts +30 -0
- package/src/keri/app/habery.ts +152 -0
- package/src/keri/app/signify.ts +12 -0
- package/src/keri/app/tsconfig.json +100 -0
- package/src/keri/core/authing.ts +129 -0
- package/src/keri/core/cigar.ts +4 -4
- package/src/keri/core/core.ts +53 -43
- package/src/keri/core/counter.ts +207 -0
- package/src/keri/core/diger.ts +5 -5
- package/src/keri/core/eventing.ts +219 -0
- package/src/keri/core/httping.ts +163 -0
- package/src/keri/core/indexer.ts +2 -1
- package/src/keri/core/keeping.ts +0 -1
- package/src/keri/core/manager.ts +238 -90
- package/src/keri/core/matter.ts +46 -11
- package/src/keri/core/number.ts +21 -0
- package/src/keri/core/prefixer.ts +212 -0
- package/src/keri/core/saider.ts +158 -0
- package/src/keri/core/salter.ts +9 -5
- package/src/keri/core/serder.ts +99 -0
- package/src/keri/core/siger.ts +2 -2
- package/src/keri/core/signer.ts +4 -3
- package/src/keri/core/tholder.ts +52 -0
- package/src/keri/core/tsconfig.json +2 -2
- package/src/keri/core/utils.ts +10 -6
- package/src/keri/core/verfer.ts +6 -5
- package/src/keri/end/ending.ts +160 -0
- package/src/keri/end/tsconfig.json +100 -0
package/src/keri/core/manager.ts
CHANGED
|
@@ -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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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):
|
|
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
|
|
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,
|
|
107
|
-
temp: boolean = false):
|
|
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?:
|
|
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
|
|
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
|
|
263
|
+
this._seed = seed
|
|
210
264
|
this._encrypter = undefined
|
|
211
265
|
this._decrypter = undefined
|
|
212
266
|
|
|
213
|
-
aeid = aeid == undefined ?
|
|
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
|
-
|
|
282
|
-
|
|
283
|
-
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
392
|
-
let verfers = Array.from(
|
|
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
|
|
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(
|
|
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.
|
|
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(
|
|
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
|
-
|
|
447
|
-
|
|
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
|
-
|
|
557
|
-
|
|
558
|
-
|
|
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.
|
|
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
|
|
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
|
-
|
|
597
|
-
|
|
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.
|
|
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
|
-
|
|
627
|
-
if (
|
|
628
|
-
|
|
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
|
-
|
|
635
|
-
|
|
636
|
-
|
|
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)
|
|
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)
|
|
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
|
}
|