signify-ts 0.2.1 → 0.3.0-dev.e31e78d

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 (129) hide show
  1. package/README.md +104 -34
  2. package/dist/exports.d.ts +40 -40
  3. package/dist/exports.js +40 -0
  4. package/dist/index.d.ts +2 -3
  5. package/dist/index.js +3 -8
  6. package/dist/keri/app/aiding.d.ts +54 -18
  7. package/{src/keri/app/aiding.ts → dist/keri/app/aiding.js} +130 -236
  8. package/dist/keri/app/clienting.d.ts +59 -22
  9. package/{src/keri/app/clienting.ts → dist/keri/app/clienting.js} +146 -235
  10. package/dist/keri/app/contacting.d.ts +30 -23
  11. package/{src/keri/app/contacting.ts → dist/keri/app/contacting.js} +26 -63
  12. package/dist/keri/app/controller.d.ts +49 -6
  13. package/{src/keri/app/controller.ts → dist/keri/app/controller.js} +80 -186
  14. package/dist/keri/app/coring.d.ts +134 -25
  15. package/{src/keri/app/coring.ts → dist/keri/app/coring.js} +83 -56
  16. package/dist/keri/app/credentialing.d.ts +187 -69
  17. package/dist/keri/app/credentialing.js +540 -0
  18. package/dist/keri/app/delegating.d.ts +18 -0
  19. package/dist/keri/app/delegating.js +24 -0
  20. package/dist/keri/app/escrowing.d.ts +5 -3
  21. package/{src/keri/app/escrowing.ts → dist/keri/app/escrowing.js} +3 -9
  22. package/dist/keri/app/exchanging.d.ts +243 -11
  23. package/dist/keri/app/exchanging.js +242 -0
  24. package/dist/keri/app/grouping.d.ts +11 -9
  25. package/{src/keri/app/grouping.ts → dist/keri/app/grouping.js} +10 -29
  26. package/dist/keri/app/habery.d.ts +2 -2
  27. package/dist/keri/app/habery.js +117 -0
  28. package/dist/keri/app/notifying.d.ts +2 -2
  29. package/{src/keri/app/notifying.ts → dist/keri/app/notifying.js} +7 -17
  30. package/dist/keri/core/authing.d.ts +2 -2
  31. package/{src/keri/core/authing.ts → dist/keri/core/authing.js} +26 -42
  32. package/dist/keri/core/base64.d.ts +2 -0
  33. package/dist/keri/core/base64.js +16 -0
  34. package/dist/keri/core/bexter.d.ts +1 -1
  35. package/{src/keri/core/bexter.ts → dist/keri/core/bexter.js} +18 -32
  36. package/dist/keri/core/cigar.d.ts +2 -2
  37. package/dist/keri/core/cigar.js +13 -0
  38. package/dist/keri/core/cipher.d.ts +1 -1
  39. package/{src/keri/core/cipher.ts → dist/keri/core/cipher.js} +10 -19
  40. package/dist/keri/core/core.d.ts +117 -9
  41. package/dist/keri/core/core.js +385 -0
  42. package/dist/keri/core/counter.d.ts +2 -2
  43. package/dist/keri/core/counter.js +221 -0
  44. package/dist/keri/core/decrypter.d.ts +4 -4
  45. package/{src/keri/core/decrypter.ts → dist/keri/core/decrypter.js} +23 -40
  46. package/dist/keri/core/diger.d.ts +3 -3
  47. package/{src/keri/core/diger.ts → dist/keri/core/diger.js} +18 -33
  48. package/dist/keri/core/encrypter.d.ts +2 -2
  49. package/{src/keri/core/encrypter.ts → dist/keri/core/encrypter.js} +18 -38
  50. package/dist/keri/core/eventing.d.ts +6 -6
  51. package/dist/keri/core/eventing.js +383 -0
  52. package/dist/keri/core/httping.d.ts +11 -4
  53. package/{src/keri/core/httping.ts → dist/keri/core/httping.js} +36 -101
  54. package/dist/keri/core/indexer.d.ts +1 -1
  55. package/dist/keri/core/indexer.js +407 -0
  56. package/dist/keri/core/keeping.d.ts +113 -46
  57. package/dist/keri/core/keeping.js +347 -0
  58. package/{src/keri/core/kering.ts → dist/keri/core/kering.js} +1 -3
  59. package/dist/keri/core/keyState.d.ts +98 -0
  60. package/dist/keri/core/manager.d.ts +147 -12
  61. package/dist/keri/core/manager.js +880 -0
  62. package/dist/keri/core/matter.d.ts +1 -1
  63. package/dist/keri/core/matter.js +460 -0
  64. package/dist/keri/core/number.d.ts +2 -2
  65. package/{src/keri/core/number.ts → dist/keri/core/number.js} +26 -32
  66. package/dist/keri/core/pather.d.ts +2 -2
  67. package/{src/keri/core/pather.ts → dist/keri/core/pather.js} +12 -27
  68. package/dist/keri/core/prefixer.d.ts +10 -10
  69. package/dist/keri/core/prefixer.js +182 -0
  70. package/dist/keri/core/saider.d.ts +2 -12
  71. package/dist/keri/core/saider.js +107 -0
  72. package/dist/keri/core/salter.d.ts +44 -9
  73. package/dist/keri/core/salter.js +110 -0
  74. package/dist/keri/core/seqner.d.ts +1 -1
  75. package/{src/keri/core/seqner.ts → dist/keri/core/seqner.js} +20 -21
  76. package/dist/keri/core/serder.d.ts +25 -12
  77. package/dist/keri/core/serder.js +133 -0
  78. package/dist/keri/core/siger.d.ts +2 -2
  79. package/{src/keri/core/siger.ts → dist/keri/core/siger.js} +4 -14
  80. package/dist/keri/core/signer.d.ts +4 -4
  81. package/dist/keri/core/signer.js +84 -0
  82. package/{src/keri/core/tholder.ts → dist/keri/core/tholder.js} +69 -94
  83. package/dist/keri/core/utils.d.ts +1 -1
  84. package/{src/keri/core/utils.ts → dist/keri/core/utils.js} +30 -60
  85. package/dist/keri/core/vdring.d.ts +2 -2
  86. package/dist/keri/core/vdring.js +61 -0
  87. package/dist/keri/core/verfer.d.ts +2 -6
  88. package/dist/keri/core/verfer.js +37 -0
  89. package/dist/keri/end/ending.d.ts +10 -8
  90. package/dist/keri/end/ending.js +136 -0
  91. package/{src/ready.ts → dist/ready.js} +1 -2
  92. package/dist/types/keria-api-schema.d.ts +1158 -0
  93. package/dist/types/keria-api-schema.js +34 -0
  94. package/package.json +53 -52
  95. package/dist/math.d.ts +0 -1
  96. package/dist/signify-ts.cjs +0 -7842
  97. package/dist/signify-ts.cjs.development.js +0 -9501
  98. package/dist/signify-ts.cjs.development.js.map +0 -1
  99. package/dist/signify-ts.cjs.map +0 -7
  100. package/dist/signify-ts.cjs.production.min.js +0 -2
  101. package/dist/signify-ts.cjs.production.min.js.map +0 -1
  102. package/dist/signify-ts.esm.js +0 -9345
  103. package/dist/signify-ts.esm.js.map +0 -1
  104. package/dist/signify-ts.mjs +0 -7818
  105. package/dist/signify-ts.mjs.map +0 -7
  106. package/src/buffer-polyfill.ts +0 -5
  107. package/src/exports.ts +0 -44
  108. package/src/index.ts +0 -4
  109. package/src/keri/app/credentialing.ts +0 -841
  110. package/src/keri/app/exchanging.ts +0 -220
  111. package/src/keri/app/habery.ts +0 -185
  112. package/src/keri/core/cigar.ts +0 -18
  113. package/src/keri/core/core.ts +0 -326
  114. package/src/keri/core/counter.ts +0 -273
  115. package/src/keri/core/eventing.ts +0 -581
  116. package/src/keri/core/indexer.ts +0 -509
  117. package/src/keri/core/keeping.ts +0 -684
  118. package/src/keri/core/manager.ts +0 -1183
  119. package/src/keri/core/matter.ts +0 -521
  120. package/src/keri/core/prefixer.ts +0 -233
  121. package/src/keri/core/saider.ts +0 -186
  122. package/src/keri/core/salter.ts +0 -120
  123. package/src/keri/core/serder.ts +0 -163
  124. package/src/keri/core/signer.ts +0 -133
  125. package/src/keri/core/vdring.ts +0 -94
  126. package/src/keri/core/verfer.ts +0 -47
  127. package/src/keri/end/ending.ts +0 -170
  128. package/src/math.ts +0 -3
  129. /package/dist/{buffer-polyfill.d.ts → keri/core/keyState.js} +0 -0
@@ -1,1183 +0,0 @@
1
- import { Encrypter } from './encrypter';
2
- import { Decrypter } from './decrypter';
3
- import { Salter, Tier } from './salter';
4
- import { Signer } from './signer';
5
- import { Verfer } from './verfer';
6
- import { MtrDex } from './matter';
7
- import { Diger } from './diger';
8
- import { Cigar } from './cigar';
9
- import { Siger } from './siger';
10
- import { b } from './core';
11
-
12
- export enum Algos {
13
- randy = 'randy',
14
- salty = 'salty',
15
- group = 'group',
16
- extern = 'extern',
17
- }
18
-
19
- class PubLot {
20
- public pubs: Array<string> = new Array<string>(); // list qb64 public keys.
21
- public ridx: number = 0; // index of rotation (est event) that uses public key set
22
- public kidx: number = 0; // index of key in sequence of public keys
23
- public dt: string = ''; // datetime ISO8601 when key set created
24
- }
25
-
26
- class PreSit {
27
- public old: PubLot = new PubLot(); //previous publot
28
- public new: PubLot = new PubLot(); //newly current publot
29
- public nxt: PubLot = new PubLot(); //next public publot
30
- }
31
-
32
- class PrePrm {
33
- public pidx: number = 0; // prefix index for this keypair sequence
34
- public algo: Algos = Algos.salty; // salty default uses indices and salt to create new key pairs
35
- public salt: string = ''; // empty salt used for salty algo.
36
- public stem: string = ''; // default unique path stem for salty algo
37
- public tier: string = ''; // security tier for stretch index salty algo
38
- }
39
-
40
- class PubSet {
41
- pubs: Array<string> = new Array<string>(); // list qb64 public keys.
42
- }
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(
60
- 'If paths are provided, they must be the same length as signers'
61
- );
62
- }
63
- }
64
- this._paths = paths;
65
- }
66
-
67
- get paths(): Array<string> | undefined {
68
- return this._paths;
69
- }
70
-
71
- get signers(): Array<Signer> {
72
- return this._signers;
73
- }
74
- }
75
-
76
- export interface Creator {
77
- create(
78
- codes: Array<string> | undefined,
79
- count: number,
80
- code: string,
81
- transferable: boolean,
82
- pidx: number,
83
- ridx: number,
84
- kidx: number,
85
- temp: boolean
86
- ): Keys;
87
- salt: string;
88
- stem: string;
89
- tier: Tier;
90
- }
91
-
92
- export class RandyCreator implements Creator {
93
- create(
94
- codes: Array<string> | undefined = undefined,
95
- count: number = 1,
96
- code: string = MtrDex.Ed25519_Seed,
97
- transferable: boolean = true
98
- ): Keys {
99
- const signers = new Array<Signer>();
100
- if (codes == undefined) {
101
- codes = new Array(count).fill(code);
102
- }
103
-
104
- codes.forEach(function (code) {
105
- signers.push(
106
- new Signer({ code: code, transferable: transferable })
107
- );
108
- });
109
-
110
- return new Keys(signers);
111
- }
112
-
113
- get salt(): string {
114
- return '';
115
- }
116
-
117
- get stem(): string {
118
- return '';
119
- }
120
-
121
- get tier(): Tier {
122
- return '' as Tier;
123
- }
124
- }
125
-
126
- export class SaltyCreator implements Creator {
127
- public salter: Salter;
128
- private readonly _stem: string;
129
- constructor(
130
- salt: string | undefined = undefined,
131
- tier: Tier | undefined = undefined,
132
- stem: string | undefined = undefined
133
- ) {
134
- this.salter = new Salter({ qb64: salt, tier: tier });
135
- this._stem = stem == undefined ? '' : stem;
136
- }
137
-
138
- get salt(): string {
139
- return this.salter.qb64;
140
- }
141
-
142
- get stem(): string {
143
- return this._stem;
144
- }
145
-
146
- get tier(): Tier {
147
- return this.salter.tier!;
148
- }
149
-
150
- create(
151
- codes: Array<string> | undefined = undefined,
152
- count: number = 1,
153
- code: string = MtrDex.Ed25519_Seed,
154
- transferable: boolean = true,
155
- pidx: number = 0,
156
- ridx: number = 0,
157
- kidx: number = 0,
158
- temp: boolean = false
159
- ): Keys {
160
- const signers = new Array<Signer>();
161
- const paths = new Array<string>();
162
-
163
- if (codes == undefined) {
164
- codes = new Array<string>(count).fill(code);
165
- }
166
-
167
- codes.forEach((code, idx) => {
168
- // Previuos definition of path
169
- // let path = this.stem + pidx.toString(16) + ridx.toString(16) + (kidx+idx).toString(16)
170
- const path =
171
- this.stem == ''
172
- ? pidx.toString(16)
173
- : this.stem + ridx.toString(16) + (kidx + idx).toString(16);
174
-
175
- signers.push(
176
- this.salter.signer(code, transferable, path, this.tier, temp)
177
- );
178
- paths.push(path);
179
- });
180
-
181
- return new Keys(signers, paths);
182
- }
183
- }
184
-
185
- export class Creatory {
186
- private readonly _make: any;
187
- constructor(algo: Algos = Algos.salty) {
188
- switch (algo) {
189
- case Algos.randy:
190
- this._make = this._makeRandy;
191
- break;
192
- case Algos.salty:
193
- this._make = this._makeSalty;
194
- break;
195
- default:
196
- throw new Error(`unsupported algo=${algo}`);
197
- }
198
- }
199
-
200
- make(...args: any[]): Creator {
201
- return this._make(...args);
202
- }
203
-
204
- _makeRandy(): Creator {
205
- return new RandyCreator();
206
- }
207
-
208
- _makeSalty(...args: any[]): Creator {
209
- return new SaltyCreator(...args);
210
- }
211
- }
212
-
213
- export function openManager(passcode: string, salt?: string) {
214
- if (passcode.length < 21) {
215
- throw new Error('Bran (passcode seed material) too short.');
216
- }
217
-
218
- const bran = MtrDex.Salt_128 + 'A' + passcode.substring(0, 21); // qb64 salt for seed
219
- const signer = new Salter({ qb64: bran }).signer(
220
- MtrDex.Ed25519_Seed,
221
- false
222
- );
223
- const seed = signer.qb64;
224
- const aeid = signer.verfer.qb64; // lest it remove encryption
225
-
226
- let algo;
227
-
228
- const salter = salt != undefined ? new Salter({ qb64: salt }) : undefined;
229
- if (salt != undefined) {
230
- algo = Algos.salty;
231
- } else {
232
- algo = Algos.randy;
233
- }
234
-
235
- return new Manager({ seed: seed, aeid: aeid, algo: algo, salter: salter });
236
- }
237
-
238
- export interface ManagerArgs {
239
- ks?: KeyStore | undefined;
240
- seed?: string | undefined;
241
- aeid?: string | undefined;
242
- pidx?: number | undefined;
243
- algo?: Algos | undefined;
244
- salter?: Salter | undefined;
245
- tier?: string | undefined;
246
- }
247
-
248
- export interface ManagerInceptArgs {
249
- icodes?: any | undefined;
250
- icount?: number;
251
- icode?: string;
252
- ncodes?: any | undefined;
253
- ncount?: number;
254
- ncode?: string;
255
- dcode?: string;
256
- algo?: Algos | undefined;
257
- salt?: string | undefined;
258
- stem?: string | undefined;
259
- tier?: string | undefined;
260
- rooted?: boolean;
261
- transferable?: boolean;
262
- temp?: boolean;
263
- }
264
-
265
- interface RotateArgs {
266
- pre: string;
267
- ncodes?: any | undefined;
268
- ncount?: number;
269
- ncode?: string;
270
- dcode?: string;
271
- transferable?: boolean;
272
- temp?: boolean;
273
- erase?: boolean;
274
- }
275
-
276
- interface SignArgs {
277
- ser: Uint8Array;
278
- pubs?: Array<string> | undefined;
279
- verfers?: Array<Verfer> | undefined;
280
- indexed?: boolean;
281
- indices?: Array<number> | undefined;
282
- ondices?: Array<number> | undefined;
283
- }
284
-
285
- export class Manager {
286
- private _seed?: string;
287
- private _salt?: string;
288
- private _encrypter: Encrypter | undefined;
289
- private _decrypter: Decrypter | undefined;
290
- private readonly _ks: KeyStore;
291
-
292
- constructor({ ks, seed, aeid, pidx, algo, salter, tier }: ManagerArgs) {
293
- this._ks = ks == undefined ? new Keeper() : ks;
294
- this._seed = seed;
295
- this._encrypter = undefined;
296
- this._decrypter = undefined;
297
-
298
- aeid = aeid == undefined ? undefined : aeid;
299
- pidx = pidx == undefined ? 0 : pidx;
300
- algo = algo == undefined ? Algos.salty : algo;
301
-
302
- const salt = salter?.qb64;
303
-
304
- tier = tier == undefined ? Tier.low : tier;
305
-
306
- if (this.pidx == undefined) {
307
- this.pidx = pidx;
308
- }
309
-
310
- if (this.algo == undefined) {
311
- this.algo = algo;
312
- }
313
-
314
- if (this.salt == undefined) {
315
- this.salt = salt;
316
- }
317
-
318
- if (this.tier == undefined) {
319
- this.tier = tier;
320
- }
321
-
322
- if (this.aeid == undefined) {
323
- this.updateAeid(aeid, this._seed);
324
- }
325
- }
326
-
327
- get ks(): KeyStore {
328
- return this._ks;
329
- }
330
-
331
- get encrypter(): Encrypter | undefined {
332
- return this._encrypter;
333
- }
334
-
335
- get decrypter(): Decrypter | undefined {
336
- return this._decrypter;
337
- }
338
-
339
- get seed(): string | undefined {
340
- return this._seed;
341
- }
342
-
343
- get aeid(): string | undefined {
344
- return this.ks.getGbls('aeid');
345
- }
346
-
347
- get pidx(): number | undefined {
348
- const pidx = this.ks.getGbls('pidx');
349
- if (pidx != undefined) {
350
- return parseInt(pidx, 16);
351
- }
352
- return undefined;
353
- }
354
-
355
- set pidx(pidx: number | undefined) {
356
- this.ks.pinGbls('pidx', pidx!.toString(16));
357
- }
358
-
359
- get salt(): string | undefined {
360
- if (this._decrypter == undefined) {
361
- return this._salt;
362
- } else {
363
- const salt = this.ks.getGbls('salt');
364
- return this._decrypter.decrypt(b(salt)).qb64;
365
- }
366
- }
367
-
368
- set salt(salt: string | undefined) {
369
- if (this._encrypter == undefined) {
370
- this._salt = salt;
371
- } else {
372
- salt = this._encrypter.encrypt(b(salt)).qb64;
373
- this.ks.pinGbls('salt', salt!);
374
- }
375
- }
376
-
377
- get tier(): string | undefined {
378
- return this.ks.getGbls('tier');
379
- }
380
-
381
- set tier(tier: string | undefined) {
382
- this.ks.pinGbls('tier', tier!);
383
- }
384
-
385
- get algo(): Algos | undefined {
386
- const a = this.ks.getGbls('algo');
387
- const ta = a as keyof typeof Algos;
388
- return Algos[ta];
389
- }
390
-
391
- set algo(algo: Algos | undefined) {
392
- this.ks.pinGbls('algo', algo! as string);
393
- }
394
-
395
- private updateAeid(aeid: string | undefined, seed?: string) {
396
- if (this.aeid != undefined) {
397
- const seed = b(this._seed);
398
- if (this._seed == undefined || !this._encrypter?.verifySeed(seed)) {
399
- throw new Error(`Last seed missing or provided last seed "
400
- "not associated with last aeid=${this.aeid}.`);
401
- }
402
- }
403
-
404
- if (aeid != '' && aeid != undefined) {
405
- if (aeid != this.aeid) {
406
- this._encrypter = new Encrypter({}, b(aeid));
407
- if (seed == undefined || !this._encrypter.verifySeed(b(seed))) {
408
- throw new Error(`Seed missing or provided seed not associated"
409
- " with provided aeid=${aeid}.`);
410
- }
411
- }
412
- } else if (this.algo == Algos.randy) {
413
- // Unlike KERIpy, we don't support unencrypted secrets
414
- throw new Error(
415
- 'Invalid Manager configuration, encryption must be used with Randy key creation.'
416
- );
417
- } else {
418
- this._encrypter = undefined;
419
- }
420
-
421
- const salt = this.salt;
422
- if (salt != undefined) {
423
- this.salt = salt;
424
- }
425
-
426
- if (this._decrypter != undefined) {
427
- for (const [keys, data] of this.ks.prmsElements()) {
428
- if (data.salt != undefined) {
429
- const salter = this._decrypter.decrypt(b(data.salt));
430
- data.salt =
431
- this._encrypter == undefined
432
- ? salter.qb64
433
- : this._encrypter.encrypt(null, salter);
434
- this.ks.pinPrms(keys, data);
435
- }
436
- }
437
-
438
- for (const [pubKey, signer] of this.ks.prisElements(
439
- this._decrypter
440
- )) {
441
- this.ks.pinPris(pubKey, signer, this._encrypter!);
442
- }
443
- }
444
-
445
- this.ks.pinGbls('aeid', aeid!); // set aeid in db
446
- this._seed = seed; // set .seed in memory
447
-
448
- // update .decrypter
449
- this._decrypter =
450
- seed != undefined ? new Decrypter({}, b(seed)) : undefined;
451
- }
452
-
453
- incept({
454
- icodes = undefined,
455
- icount = 1,
456
- icode = MtrDex.Ed25519_Seed,
457
- ncodes = undefined,
458
- ncount = 1,
459
- ncode = MtrDex.Ed25519_Seed,
460
- dcode = MtrDex.Blake3_256,
461
- algo = undefined,
462
- salt = undefined,
463
- stem = undefined,
464
- tier = undefined,
465
- rooted = true,
466
- transferable = true,
467
- temp = false,
468
- }: ManagerInceptArgs): [Array<Verfer>, Array<Diger>] {
469
- if (rooted && algo == undefined) {
470
- algo = this.algo;
471
- }
472
- if (rooted && salt == undefined) {
473
- salt = this.salt;
474
- }
475
- if (rooted && tier == undefined) {
476
- tier = this.tier;
477
- }
478
-
479
- const pidx = this.pidx!;
480
- const ridx = 0;
481
- const kidx = 0;
482
-
483
- const creator = new Creatory(algo).make(salt, tier, stem);
484
-
485
- if (icodes == undefined) {
486
- if (icount < 0) {
487
- throw new Error(`Invalid icount=${icount} must be >= 0.`);
488
- }
489
-
490
- icodes = new Array<string>(icount).fill(icode);
491
- }
492
-
493
- const ikeys = creator.create(
494
- icodes,
495
- 0,
496
- MtrDex.Ed25519_Seed,
497
- transferable,
498
- pidx,
499
- ridx,
500
- kidx,
501
- temp
502
- );
503
- const verfers = Array.from(
504
- ikeys.signers,
505
- (signer: Signer) => signer.verfer
506
- );
507
-
508
- if (ncodes == undefined) {
509
- if (ncount < 0) {
510
- throw new Error(`Invalid ncount=${ncount} must be >= 0.`);
511
- }
512
-
513
- ncodes = new Array<string>(ncount).fill(ncode);
514
- }
515
-
516
- const nkeys = creator.create(
517
- ncodes,
518
- 0,
519
- MtrDex.Ed25519_Seed,
520
- transferable,
521
- pidx,
522
- ridx + 1,
523
- kidx + icodes.length,
524
- temp
525
- );
526
-
527
- const digers = Array.from(
528
- nkeys.signers,
529
- (signer: Signer) => new Diger({ code: dcode }, signer.verfer.qb64b)
530
- );
531
-
532
- const pp = new PrePrm();
533
- pp.pidx = pidx!;
534
- pp.algo = algo!;
535
- pp.salt =
536
- creator.salt.length == 0 || this.encrypter == undefined
537
- ? ''
538
- : this.encrypter.encrypt(b(creator.salt)).qb64;
539
- pp.stem = creator.stem;
540
- pp.tier = creator.tier;
541
-
542
- const dt = new Date().toString();
543
- const nw = new PubLot();
544
- nw.pubs = Array.from(verfers, (verfer: Verfer) => verfer.qb64);
545
- nw.ridx = ridx;
546
- nw.kidx = kidx;
547
- nw.dt = dt;
548
-
549
- const nt = new PubLot();
550
- nt.pubs = Array.from(
551
- nkeys.signers,
552
- (signer: Signer) => signer.verfer.qb64
553
- );
554
- nt.ridx = ridx + 1;
555
- nt.kidx = kidx + icodes.length;
556
- nt.dt = dt;
557
-
558
- const ps = new PreSit();
559
- ps.new = nw;
560
- ps.nxt = nt;
561
-
562
- const pre = verfers[0].qb64;
563
- if (!this.ks.putPres(pre, verfers[0].qb64b)) {
564
- throw new Error(`Already incepted pre=${pre}.`);
565
- }
566
-
567
- if (!this.ks.putPrms(pre, pp)) {
568
- throw new Error(`Already incepted prm for pre=${pre}.`);
569
- }
570
-
571
- this.pidx = pidx! + 1;
572
-
573
- if (!this.ks.putSits(pre, ps)) {
574
- throw new Error(`Already incepted sit for pre=${pre}.`);
575
- }
576
-
577
- if (this.encrypter != undefined) {
578
- // Only store encrypted keys if we have an encrypter, otherwise regenerate
579
- ikeys.signers.forEach((signer: Signer) => {
580
- this.ks.putPris(signer.verfer.qb64, signer, this.encrypter!);
581
- });
582
-
583
- nkeys.signers.forEach((signer: Signer) => {
584
- this.ks.putPris(signer.verfer.qb64, signer, this.encrypter!);
585
- });
586
- } else if (
587
- this._encrypter == undefined &&
588
- ikeys.paths != undefined &&
589
- nkeys.paths != undefined
590
- ) {
591
- ikeys.paths.forEach((path: string, idx: number) => {
592
- const signer = ikeys.signers[idx];
593
- const ppt = new PubPath();
594
- ppt.path = path;
595
- ppt.code = icodes[idx];
596
- ppt.tier = pp.tier;
597
- ppt.temp = temp;
598
- this.ks.putPths(signer.verfer.qb64, ppt);
599
- });
600
- nkeys.paths.forEach((path: string, idx: number) => {
601
- const signer = nkeys.signers[idx];
602
- const ppt = new PubPath();
603
- ppt.path = path;
604
- ppt.code = ncodes[idx];
605
- ppt.tier = pp.tier;
606
- ppt.temp = temp;
607
- this.ks.putPths(signer.verfer.qb64, ppt);
608
- });
609
- } else {
610
- throw new Error(
611
- 'invalid configuration, randy keys without encryption'
612
- );
613
- }
614
-
615
- const pubSet = new PubSet();
616
- pubSet.pubs = ps.new.pubs;
617
- this.ks.putPubs(riKey(pre, ridx), pubSet);
618
-
619
- const nxtPubSet = new PubSet();
620
- nxtPubSet.pubs = ps.nxt.pubs;
621
- this.ks.putPubs(riKey(pre, ridx + 1), nxtPubSet);
622
-
623
- return [verfers, digers];
624
- }
625
-
626
- move(old: string, gnu: string) {
627
- if (old == gnu) {
628
- return;
629
- }
630
-
631
- if (this.ks.getPres(old) == undefined) {
632
- throw new Error(`Nonexistent old pre=${old}, nothing to assign.`);
633
- }
634
-
635
- if (this.ks.getPres(gnu) != undefined) {
636
- throw new Error(`Preexistent new pre=${gnu} may not clobber.`);
637
- }
638
-
639
- const oldprm = this.ks.getPrms(old);
640
- if (oldprm == undefined) {
641
- throw new Error(
642
- `Nonexistent old prm for pre=${old}, nothing to move.`
643
- );
644
- }
645
-
646
- if (this.ks.getPrms(gnu) != undefined) {
647
- throw new Error(
648
- `Preexistent new prm for pre=${gnu} may not clobber.`
649
- );
650
- }
651
-
652
- const oldsit = this.ks.getSits(old);
653
- if (oldsit == undefined) {
654
- throw new Error(
655
- `Nonexistent old sit for pre=${old}, nothing to move.`
656
- );
657
- }
658
-
659
- if (this.ks.getSits(gnu) != undefined) {
660
- throw new Error(
661
- `Preexistent new sit for pre=${gnu} may not clobber.`
662
- );
663
- }
664
-
665
- if (!this.ks.putPrms(gnu, oldprm)) {
666
- throw new Error(
667
- `Failed moving prm from old pre=${old} to new pre=${gnu}.`
668
- );
669
- } else {
670
- this.ks.remPrms(old);
671
- }
672
-
673
- if (!this.ks.putSits(gnu, oldsit)) {
674
- throw new Error(
675
- `Failed moving sit from old pre=${old} to new pre=${gnu}.`
676
- );
677
- } else {
678
- this.ks.remSits(old);
679
- }
680
-
681
- let i = 0;
682
- while (true) {
683
- const pl = this.ks.getPubs(riKey(old, i));
684
- if (pl == undefined) {
685
- break;
686
- }
687
-
688
- if (!this.ks.putPubs(riKey(gnu, i), pl)) {
689
- throw new Error(
690
- `Failed moving pubs at pre=${old} ri=${i} to new pre=${gnu}`
691
- );
692
- }
693
- i = i + 1;
694
- }
695
-
696
- if (!this.ks.pinPres(old, b(gnu))) {
697
- throw new Error(
698
- `Failed assiging new pre=${gnu} to old pre=${old}.`
699
- );
700
- }
701
-
702
- if (!this.ks.putPres(gnu, b(gnu))) {
703
- throw new Error(`Failed assiging new pre=${gnu}.`);
704
- }
705
- }
706
-
707
- rotate({
708
- pre,
709
- ncodes = undefined,
710
- ncount = 1,
711
- ncode = MtrDex.Ed25519_Seed,
712
- dcode = MtrDex.Blake3_256,
713
- transferable = true,
714
- temp = false,
715
- erase = true,
716
- }: RotateArgs): [Array<Verfer>, Array<Diger>] {
717
- const pp = this.ks.getPrms(pre);
718
- if (pp == undefined) {
719
- throw new Error(`Attempt to rotate nonexistent pre=${pre}.`);
720
- }
721
-
722
- const ps = this.ks.getSits(pre);
723
- if (ps == undefined) {
724
- throw new Error(`Attempt to rotate nonexistent pre=${pre}.`);
725
- }
726
-
727
- if (ps.nxt.pubs == undefined || ps.nxt.pubs.length == 0) {
728
- throw new Error(`Attempt to rotate nontransferable pre=${pre}.`);
729
- }
730
-
731
- const old = ps.old;
732
- ps.old = ps.new;
733
- ps.new = ps.nxt;
734
-
735
- if (this.aeid != undefined && this.decrypter == undefined) {
736
- throw new Error(
737
- 'Unauthorized decryption attempt. Aeid but no decrypter.'
738
- );
739
- }
740
-
741
- const verfers = new Array<Verfer>();
742
- ps.new.pubs.forEach((pub) => {
743
- if (this.decrypter != undefined) {
744
- const signer = this.ks.getPris(pub, this.decrypter);
745
- if (signer == undefined) {
746
- throw new Error(`Missing prikey in db for pubkey=${pub}`);
747
- }
748
- verfers.push(signer.verfer);
749
- } else {
750
- // Should we regenerate from salt here since this.decryptor is undefined
751
- verfers.push(new Verfer({ qb64: pub }));
752
- }
753
- });
754
-
755
- let salt = pp.salt;
756
- if (salt != undefined && salt != '') {
757
- // If you provded a Salt for an AID but don't have encryption, pitch a fit
758
- if (this.decrypter == undefined) {
759
- throw new Error(
760
- 'Invalid configuration: AID salt with no encryption'
761
- );
762
- }
763
- salt = this.decrypter.decrypt(b(salt)).qb64;
764
- } else {
765
- salt = this.salt!;
766
- }
767
-
768
- const creator = new Creatory(pp.algo).make(salt, pp.tier, pp.stem);
769
-
770
- if (ncodes == undefined) {
771
- if (ncount < 0) {
772
- throw new Error(`Invalid count=${ncount} must be >= 0`);
773
- }
774
- ncodes = new Array<string>(ncount).fill(ncode);
775
- }
776
-
777
- const pidx = pp.pidx;
778
- const ridx = ps.new.ridx + 1;
779
- const kidx = ps.nxt.kidx + ps.new.pubs.length;
780
-
781
- const keys = creator.create(
782
- ncodes,
783
- 0,
784
- '',
785
- transferable,
786
- pidx,
787
- ridx,
788
- kidx,
789
- temp
790
- );
791
- const digers = Array.from(
792
- keys.signers,
793
- (signer: Signer) => new Diger({ code: dcode }, signer.verfer.qb64b)
794
- );
795
-
796
- const dt = new Date().toString();
797
- ps.nxt = new PubLot();
798
- ps.nxt.pubs = Array.from(
799
- keys.signers,
800
- (signer: Signer) => signer.verfer.qb64
801
- );
802
- ps.nxt.ridx = ridx;
803
- ps.nxt.kidx = kidx;
804
- ps.nxt.dt = dt;
805
-
806
- if (!this.ks.pinSits(pre, ps)) {
807
- throw new Error(`Problem updating pubsit db for pre=${pre}.`);
808
- }
809
-
810
- if (this.encrypter != undefined) {
811
- // Only store encrypted keys if we have an encrypter, otherwise regenerate
812
- keys.signers.forEach((signer: Signer) => {
813
- this.ks.putPris(signer.verfer.qb64, signer, this.encrypter!);
814
- });
815
- } else if (this._encrypter == undefined && keys.paths != undefined) {
816
- keys.paths.forEach((path: string, idx: number) => {
817
- const signer = keys.signers[idx];
818
- const ppt = new PubPath();
819
- ppt.path = path;
820
- ppt.tier = pp!.tier;
821
- ppt.temp = temp;
822
- this.ks.putPths(signer.verfer.qb64, ppt);
823
- });
824
- } else {
825
- throw new Error(
826
- 'invalid configuration, randy keys without encryption'
827
- );
828
- }
829
-
830
- const newPs = new PubSet();
831
- newPs.pubs = ps.nxt.pubs;
832
- this.ks.putPubs(riKey(pre, ps.nxt.ridx), newPs);
833
-
834
- if (erase) {
835
- old.pubs.forEach((pub) => {
836
- this.ks.remPris(pub);
837
- });
838
- }
839
-
840
- return [verfers, digers];
841
- }
842
-
843
- sign({
844
- ser,
845
- pubs = undefined,
846
- verfers = undefined,
847
- indexed = true,
848
- indices = undefined,
849
- ondices = undefined,
850
- }: SignArgs) {
851
- const signers = new Array<Signer>();
852
-
853
- if (pubs == undefined && verfers == undefined) {
854
- throw new Error('pubs or verfers required');
855
- }
856
-
857
- if (pubs != undefined) {
858
- if (this.aeid != undefined && this.decrypter == undefined) {
859
- throw new Error(
860
- 'Unauthorized decryption attempt. Aeid but no decrypter.'
861
- );
862
- }
863
-
864
- pubs.forEach((pub) => {
865
- //If no decrypter then get SaltyState and regenerate prikey
866
- if (this.decrypter != undefined) {
867
- const signer = this.ks.getPris(pub, this.decrypter);
868
- if (signer == undefined) {
869
- throw new Error(
870
- `Missing prikey in db for pubkey=${pub}`
871
- );
872
- }
873
- signers.push(signer);
874
- } else {
875
- const verfer = new Verfer({ qb64: pub });
876
- const ppt = this.ks.getPths(pub);
877
- if (ppt == undefined) {
878
- throw new Error(
879
- `Missing prikey in db for pubkey=${pub}`
880
- );
881
- }
882
- const salter = new Salter({ qb64: this.salt });
883
- signers.push(
884
- salter.signer(
885
- ppt.code,
886
- verfer.transferable,
887
- ppt.path,
888
- ppt.tier as Tier,
889
- ppt.temp
890
- )
891
- );
892
- }
893
- });
894
- } else {
895
- verfers!.forEach((verfer: Verfer) => {
896
- if (this.decrypter != undefined) {
897
- const signer = this.ks.getPris(verfer.qb64, this.decrypter);
898
- if (signer == undefined) {
899
- throw new Error(
900
- `Missing prikey in db for pubkey=${verfer.qb64}`
901
- );
902
- }
903
- signers.push(signer);
904
- } else {
905
- const ppt = this.ks.getPths(verfer.qb64);
906
- if (ppt == undefined) {
907
- throw new Error(
908
- `Missing prikey in db for pubkey=${verfer.qb64}`
909
- );
910
- }
911
- const salter = new Salter({ qb64: this.salt });
912
- signers.push(
913
- salter.signer(
914
- ppt.code,
915
- verfer.transferable,
916
- ppt.path,
917
- ppt.tier as Tier,
918
- ppt.temp
919
- )
920
- );
921
- }
922
- });
923
- }
924
-
925
- if (indices != undefined && indices.length != signers.length) {
926
- throw new Error(
927
- `Mismatch indices length=${indices.length} and resultant signers length=${signers.length}`
928
- );
929
- }
930
-
931
- if (ondices != undefined && ondices.length != signers.length) {
932
- throw new Error(
933
- `Mismatch ondices length=${ondices.length} and resultant signers length=${signers.length}`
934
- );
935
- }
936
-
937
- if (indexed) {
938
- const sigers = new Array<Siger>();
939
- signers.forEach((signer, idx) => {
940
- let i;
941
- if (indices != undefined) {
942
- i = indices[idx];
943
- if (i < 0) {
944
- throw new Error(
945
- `Invalid signing index = ${i}, not whole number.`
946
- );
947
- }
948
- } else {
949
- i = idx;
950
- }
951
-
952
- let o;
953
- if (ondices != undefined) {
954
- o = ondices[idx];
955
- if (o <= 0) {
956
- throw new Error(
957
- `Invalid other signing index = {o}, not None or not whole number.`
958
- );
959
- }
960
- } else {
961
- o = i;
962
- }
963
-
964
- const only = o == undefined;
965
- sigers.push(signer.sign(ser, i, only, o) as Siger);
966
- });
967
- return sigers;
968
- } else {
969
- const cigars = new Array<Cigar>();
970
- signers.forEach((signer: Signer) => {
971
- cigars.push(signer.sign(ser) as Cigar);
972
- });
973
-
974
- return cigars;
975
- }
976
- }
977
- }
978
-
979
- export function riKey(pre: string, ridx: number) {
980
- return pre + '.' + ridx.toString(16).padStart(32, '0');
981
- }
982
-
983
- export interface KeyStore {
984
- getGbls(key: string): string | undefined;
985
- pinGbls(key: string, val: string): void;
986
-
987
- prmsElements(): Array<[string, PrePrm]>;
988
- getPrms(keys: string): PrePrm | undefined;
989
- pinPrms(keys: string, data: PrePrm): void;
990
- putPrms(keys: string, data: PrePrm): boolean;
991
- remPrms(keys: string): boolean;
992
-
993
- prisElements(decrypter: Decrypter): Array<[string, Signer]>;
994
- getPris(keys: string, decrypter: Decrypter): Signer | undefined;
995
- pinPris(keys: string, data: Signer, encrypter: Encrypter): void;
996
- putPris(pubKey: string, signer: Signer, encrypter: Encrypter): boolean;
997
- remPris(pubKey: string): void;
998
-
999
- getPths(pubKey: string): PubPath | undefined;
1000
- putPths(pubKey: string, val: PubPath): boolean;
1001
- pinPths(pubKey: string, val: PubPath): boolean;
1002
-
1003
- getPres(pre: string): Uint8Array | undefined;
1004
- putPres(pre: string, val: Uint8Array): boolean;
1005
- pinPres(pre: string, val: Uint8Array): boolean;
1006
-
1007
- getSits(keys: string): PreSit | undefined;
1008
- putSits(pre: string, val: PreSit): boolean;
1009
- pinSits(pre: string, val: PreSit): boolean;
1010
- remSits(keys: string): boolean;
1011
-
1012
- getPubs(keys: string): PubSet | undefined;
1013
- putPubs(keys: string, data: PubSet): boolean;
1014
- }
1015
-
1016
- /*
1017
- In memory test implementation of Keeper key store
1018
- */
1019
-
1020
- class Keeper implements KeyStore {
1021
- private readonly _gbls: Map<string, string>;
1022
- private readonly _pris: Map<string, Uint8Array>;
1023
- private readonly _pths: Map<string, PubPath>;
1024
- private readonly _pres: Map<string, Uint8Array>;
1025
- private readonly _prms: Map<string, PrePrm>;
1026
- private readonly _sits: Map<string, PreSit>;
1027
- private readonly _pubs: Map<string, PubSet>;
1028
-
1029
- constructor() {
1030
- this._gbls = new Map<string, string>();
1031
- this._pris = new Map<string, Uint8Array>();
1032
- this._pths = new Map<string, PubPath>();
1033
- this._pres = new Map<string, Uint8Array>();
1034
- this._prms = new Map<string, PrePrm>();
1035
- this._sits = new Map<string, PreSit>();
1036
- this._pubs = new Map<string, PubSet>();
1037
- }
1038
-
1039
- getGbls(key: string): string | undefined {
1040
- return this._gbls.get(key);
1041
- }
1042
-
1043
- pinGbls(key: string, val: string): void {
1044
- this._gbls.set(key, val);
1045
- }
1046
-
1047
- prmsElements(): Array<[string, PrePrm]> {
1048
- const out = new Array<[string, PrePrm]>();
1049
- this._prms.forEach((value, key) => {
1050
- out.push([key, value]);
1051
- });
1052
-
1053
- return out;
1054
- }
1055
-
1056
- getPrms(keys: string): PrePrm | undefined {
1057
- return this._prms.get(keys);
1058
- }
1059
-
1060
- pinPrms(keys: string, data: PrePrm): void {
1061
- this._prms.set(keys, data);
1062
- }
1063
-
1064
- putPrms(keys: string, data: PrePrm): boolean {
1065
- if (this._prms.has(keys)) {
1066
- return false;
1067
- }
1068
- this._prms.set(keys, data);
1069
- return true;
1070
- }
1071
-
1072
- remPrms(keys: string): boolean {
1073
- return this._prms.delete(keys);
1074
- }
1075
-
1076
- prisElements(decrypter: Decrypter): Array<[string, Signer]> {
1077
- const out = new Array<[string, Signer]>();
1078
- this._pris.forEach(function (val, pubKey) {
1079
- const verfer = new Verfer({ qb64: pubKey });
1080
- const signer = decrypter.decrypt(val, null, verfer.transferable);
1081
- out.push([pubKey, signer]);
1082
- });
1083
- return out;
1084
- }
1085
-
1086
- pinPris(pubKey: string, signer: Signer, encrypter: Encrypter): void {
1087
- const cipher = encrypter.encrypt(null, signer);
1088
- this._pris.set(pubKey, cipher.qb64b);
1089
- }
1090
-
1091
- putPris(pubKey: string, signer: Signer, encrypter: Encrypter): boolean {
1092
- if (this._pris.has(pubKey)) {
1093
- return false;
1094
- }
1095
- const cipher = encrypter.encrypt(null, signer);
1096
- this._pris.set(pubKey, cipher.qb64b);
1097
- return true;
1098
- }
1099
-
1100
- getPris(pubKey: string, decrypter: Decrypter): Signer | undefined {
1101
- const val = this._pris.get(pubKey);
1102
- if (val == undefined) {
1103
- return undefined;
1104
- }
1105
- const verfer = new Verfer({ qb64: pubKey });
1106
-
1107
- return decrypter.decrypt(val, null, verfer.transferable);
1108
- }
1109
-
1110
- pinPths(pubKey: string, val: PubPath): boolean {
1111
- this._pths.set(pubKey, val);
1112
- return true;
1113
- }
1114
-
1115
- putPths(pubKey: string, val: PubPath): boolean {
1116
- if (this._pths.has(pubKey)) {
1117
- return false;
1118
- }
1119
-
1120
- this._pths.set(pubKey, val);
1121
- return true;
1122
- }
1123
-
1124
- getPths(pubKey: string): PubPath | undefined {
1125
- return this._pths.get(pubKey);
1126
- }
1127
-
1128
- remPris(pubKey: string): void {
1129
- this._pris.delete(pubKey);
1130
- }
1131
-
1132
- getPres(pre: string): Uint8Array | undefined {
1133
- return this._pres.get(pre);
1134
- }
1135
-
1136
- pinPres(pre: string, val: Uint8Array): boolean {
1137
- this._pres.set(pre, val);
1138
- return true;
1139
- }
1140
-
1141
- putPres(pre: string, val: Uint8Array): boolean {
1142
- if (this._pres.has(pre)) {
1143
- return false;
1144
- }
1145
-
1146
- this._pres.set(pre, val);
1147
- return true;
1148
- }
1149
-
1150
- getSits(keys: string): PreSit | undefined {
1151
- return this._sits.get(keys);
1152
- }
1153
-
1154
- putSits(pre: string, val: PreSit): boolean {
1155
- if (this._sits.has(pre)) {
1156
- return false;
1157
- }
1158
-
1159
- this._sits.set(pre, val);
1160
- return true;
1161
- }
1162
-
1163
- pinSits(pre: string, val: PreSit): boolean {
1164
- this._sits.set(pre, val);
1165
- return true;
1166
- }
1167
-
1168
- remSits(keys: string): boolean {
1169
- return this._sits.delete(keys);
1170
- }
1171
-
1172
- getPubs(keys: string): PubSet | undefined {
1173
- return this._pubs.get(keys);
1174
- }
1175
-
1176
- putPubs(keys: string, data: PubSet): boolean {
1177
- if (this._pubs.has(keys)) {
1178
- return false;
1179
- }
1180
- this._pubs.set(keys, data);
1181
- return true;
1182
- }
1183
- }