signify-ts 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/README.md +101 -5
  2. package/dist/buffer-polyfill.d.ts +1 -0
  3. package/dist/exports.d.ts +40 -0
  4. package/dist/index.d.ts +4 -1
  5. package/dist/keri/app/aiding.d.ts +138 -0
  6. package/dist/keri/app/clienting.d.ts +182 -0
  7. package/dist/keri/app/contacting.d.ts +93 -0
  8. package/dist/keri/app/controller.d.ts +49 -0
  9. package/dist/keri/app/coring.d.ts +121 -0
  10. package/dist/keri/app/credentialing.d.ts +239 -0
  11. package/dist/keri/app/escrowing.d.ts +19 -0
  12. package/dist/keri/app/exchanging.d.ts +60 -0
  13. package/dist/keri/app/grouping.d.ts +44 -0
  14. package/dist/keri/app/habery.d.ts +48 -0
  15. package/dist/keri/app/notifying.d.ts +34 -0
  16. package/dist/keri/core/authing.d.ts +10 -0
  17. package/dist/keri/core/bexter.d.ts +7 -0
  18. package/dist/keri/core/cigar.d.ts +8 -8
  19. package/dist/keri/core/cipher.d.ts +5 -5
  20. package/dist/keri/core/core.d.ts +59 -68
  21. package/dist/keri/core/counter.d.ts +43 -0
  22. package/dist/keri/core/decrypter.d.ts +10 -10
  23. package/dist/keri/core/diger.d.ts +21 -21
  24. package/dist/keri/core/encrypter.d.ts +9 -9
  25. package/dist/keri/core/eventing.d.ts +54 -0
  26. package/dist/keri/core/httping.d.ts +44 -0
  27. package/dist/keri/core/indexer.d.ts +98 -88
  28. package/dist/keri/core/keeping.d.ts +103 -1
  29. package/dist/keri/core/kering.d.ts +5 -5
  30. package/dist/keri/core/manager.d.ts +174 -151
  31. package/dist/keri/core/matter.d.ts +116 -47
  32. package/dist/keri/core/number.d.ts +7 -0
  33. package/dist/keri/core/pather.d.ts +7 -0
  34. package/dist/keri/core/prefixer.d.ts +15 -0
  35. package/dist/keri/core/saider.d.ts +23 -0
  36. package/dist/keri/core/salter.d.ts +23 -0
  37. package/dist/keri/core/seqner.d.ts +15 -0
  38. package/dist/keri/core/serder.d.ts +31 -0
  39. package/dist/keri/core/siger.d.ts +18 -18
  40. package/dist/keri/core/signer.d.ts +34 -34
  41. package/dist/keri/core/tholder.d.ts +29 -0
  42. package/dist/keri/core/utils.d.ts +20 -14
  43. package/dist/keri/core/vdring.d.ts +16 -0
  44. package/dist/keri/core/verfer.d.ts +13 -0
  45. package/dist/keri/end/ending.d.ts +13 -0
  46. package/dist/math.d.ts +1 -0
  47. package/dist/ready.d.ts +1 -0
  48. package/dist/signify-ts.cjs +7835 -0
  49. package/dist/signify-ts.cjs.development.js +9493 -5
  50. package/dist/signify-ts.cjs.development.js.map +1 -1
  51. package/dist/signify-ts.cjs.map +7 -0
  52. package/dist/signify-ts.cjs.production.min.js +1 -1
  53. package/dist/signify-ts.cjs.production.min.js.map +1 -1
  54. package/dist/signify-ts.esm.js +9341 -5
  55. package/dist/signify-ts.esm.js.map +1 -1
  56. package/dist/signify-ts.mjs +7811 -0
  57. package/dist/signify-ts.mjs.map +7 -0
  58. package/package.json +51 -49
  59. package/src/buffer-polyfill.ts +5 -0
  60. package/src/exports.ts +44 -0
  61. package/src/index.ts +4 -6
  62. package/src/keri/app/aiding.ts +493 -0
  63. package/src/keri/app/clienting.ts +492 -0
  64. package/src/keri/app/contacting.ts +188 -0
  65. package/src/keri/app/controller.ts +372 -0
  66. package/src/keri/app/coring.ts +225 -0
  67. package/src/keri/app/credentialing.ts +820 -0
  68. package/src/keri/app/escrowing.ts +34 -0
  69. package/src/keri/app/exchanging.ts +220 -0
  70. package/src/keri/app/grouping.ts +90 -0
  71. package/src/keri/app/habery.ts +185 -0
  72. package/src/keri/app/notifying.ts +69 -0
  73. package/src/keri/core/authing.ts +117 -0
  74. package/src/keri/core/bexter.ts +138 -0
  75. package/src/keri/core/cigar.ts +11 -12
  76. package/src/keri/core/cipher.ts +23 -14
  77. package/src/keri/core/core.ts +249 -97
  78. package/src/keri/core/counter.ts +273 -0
  79. package/src/keri/core/decrypter.ts +48 -34
  80. package/src/keri/core/diger.ts +25 -24
  81. package/src/keri/core/encrypter.ts +37 -27
  82. package/src/keri/core/eventing.ts +581 -0
  83. package/src/keri/core/httping.ts +209 -0
  84. package/src/keri/core/indexer.ts +314 -211
  85. package/src/keri/core/keeping.ts +679 -4
  86. package/src/keri/core/kering.ts +4 -6
  87. package/src/keri/core/manager.ts +759 -450
  88. package/src/keri/core/matter.ts +404 -135
  89. package/src/keri/core/number.ts +66 -0
  90. package/src/keri/core/pather.ts +98 -0
  91. package/src/keri/core/prefixer.ts +233 -0
  92. package/src/keri/core/saider.ts +186 -0
  93. package/src/keri/core/salter.ts +76 -41
  94. package/src/keri/core/seqner.ts +46 -0
  95. package/src/keri/core/serder.ts +163 -0
  96. package/src/keri/core/siger.ts +19 -18
  97. package/src/keri/core/signer.ts +74 -53
  98. package/src/keri/core/tholder.ts +218 -0
  99. package/src/keri/core/utils.ts +120 -45
  100. package/src/keri/core/vdring.ts +94 -0
  101. package/src/keri/core/verfer.ts +25 -11
  102. package/src/keri/end/ending.ts +170 -0
  103. package/src/math.ts +3 -0
  104. package/src/ready.ts +5 -0
  105. package/src/keri/core/tsconfig.json +0 -100
@@ -1,9 +1,684 @@
1
+ import { Salter } from './salter';
2
+ import { Algos, SaltyCreator, RandyCreator } from './manager';
3
+ import { MtrDex } from './matter';
4
+ import { Tier } from './salter';
5
+ import { Encrypter } from '../core/encrypter';
6
+ import { Decrypter } from './decrypter';
7
+ import { b } from './core';
8
+ import { Cipher } from './cipher';
9
+ import { Diger } from './diger';
10
+ import { Prefixer } from './prefixer';
11
+ import { Signer } from './signer';
12
+ import { Siger } from './siger';
13
+ import { Cigar } from './cigar';
14
+
1
15
  export {};
2
- const { SigMat } = require('./sigmat');
3
16
 
4
- class Keeper {
5
- constructor() {
17
+ /** External module definition */
18
+ export interface ExternalModule {
19
+ type: string;
20
+ name: string;
21
+ module: any;
22
+ }
23
+
24
+ export class KeyManager {
25
+ private salter?: Salter;
26
+ private modules?: any;
27
+
28
+ constructor(salter: Salter, externalModules: ExternalModule[] = []) {
29
+ this.salter = salter;
30
+ this.modules = [];
31
+ externalModules.forEach((mod) => {
32
+ this.modules[mod.type] = mod.module;
33
+ });
34
+ }
35
+
36
+ new(algo: Algos, pidx: number, kargs: any) {
37
+ switch (algo) {
38
+ case Algos.salty:
39
+ return new SaltyKeeper(
40
+ this.salter!,
41
+ pidx,
42
+ kargs['kidx'],
43
+ kargs['tier'],
44
+ kargs['transferable'],
45
+ kargs['stem'],
46
+ kargs['code'],
47
+ kargs['count'],
48
+ kargs['icodes'],
49
+ kargs['ncode'],
50
+ kargs['ncount'],
51
+ kargs['ncodes'],
52
+ kargs['dcode'],
53
+ kargs['bran'],
54
+ kargs['sxlt']
55
+ );
56
+ case Algos.randy:
57
+ return new RandyKeeper(
58
+ this.salter!,
59
+ kargs['code'],
60
+ kargs['count'],
61
+ kargs['icodes'],
62
+ kargs['transferable'],
63
+ kargs['ncode'],
64
+ kargs['ncount'],
65
+ kargs['ncodes'],
66
+ kargs['dcode'],
67
+ kargs['prxs'],
68
+ kargs['nxts']
69
+ );
70
+ case Algos.group:
71
+ return new GroupKeeper(
72
+ this,
73
+ kargs['mhab'],
74
+ kargs['states'],
75
+ kargs['rstates'],
76
+ kargs['keys'],
77
+ kargs['ndigs']
78
+ );
79
+ case Algos.extern:
80
+ const typ = kargs.extern_type;
81
+ if (typ in this.modules) {
82
+ const mod = new this.modules[typ](pidx, kargs);
83
+ return mod;
84
+ } else {
85
+ throw new Error(`unsupported external module type ${typ}`);
86
+ }
87
+ default:
88
+ throw new Error('Unknown algo');
89
+ }
90
+ }
91
+
92
+ get(aid: any) {
93
+ const pre = new Prefixer({ qb64: aid['prefix'] });
94
+ if (Algos.salty in aid) {
95
+ const kargs = aid[Algos.salty];
96
+ return new SaltyKeeper(
97
+ this.salter!,
98
+ kargs['pidx'],
99
+ kargs['kidx'],
100
+ kargs['tier'],
101
+ kargs['transferable'],
102
+ kargs['stem'],
103
+ kargs['code'],
104
+ kargs['count'],
105
+ kargs['icodes'],
106
+ kargs['ncode'],
107
+ kargs['ncount'],
108
+ kargs['ncodes'],
109
+ kargs['dcode'],
110
+ kargs['bran'],
111
+ kargs['sxlt']
112
+ );
113
+ } else if (Algos.randy in aid) {
114
+ const kargs = aid[Algos.randy];
115
+ return new RandyKeeper(
116
+ this.salter!,
117
+ kargs['code'],
118
+ kargs['count'],
119
+ kargs['icodes'],
120
+ pre.transferable,
121
+ kargs['ncode'],
122
+ kargs['ncount'],
123
+ kargs['ncodes'],
124
+ kargs['dcode'],
125
+ kargs['prxs'],
126
+ kargs['nxts']
127
+ );
128
+ } else if (Algos.group in aid) {
129
+ const kargs = aid[Algos.group];
130
+ return new GroupKeeper(
131
+ this,
132
+ kargs['mhab'],
133
+ kargs['states'],
134
+ kargs['rstates'],
135
+ kargs['keys'],
136
+ kargs['ndigs']
137
+ );
138
+ } else if (Algos.extern in aid) {
139
+ const kargs = aid[Algos.randy];
140
+ const typ = kargs.extern_type;
141
+ if (typ in this.modules) {
142
+ const mod = new this.modules[typ](kargs['pidx'], kargs);
143
+ return mod;
144
+ } else {
145
+ throw new Error(`unsupported external module type ${typ}`);
146
+ }
147
+ } else {
148
+ throw new Error(`Algo not allowed yet`);
149
+ }
6
150
  }
7
151
  }
8
152
 
9
- module.exports = { Keeper }
153
+ export class SaltyKeeper {
154
+ private aeid: string;
155
+ private encrypter: Encrypter;
156
+ private decrypter: Decrypter;
157
+ private salter: Salter;
158
+ private pidx: number;
159
+ private kidx: number;
160
+ private tier: Tier;
161
+ private transferable: boolean;
162
+ private stem: string | undefined;
163
+ private code: string;
164
+ private count: number;
165
+ private icodes: string[] | undefined;
166
+ private ncode: string;
167
+ private ncount: number;
168
+ private ncodes: string[] | undefined;
169
+ private dcode: string | undefined;
170
+ private sxlt: string | undefined;
171
+ private bran: string | undefined;
172
+ private creator: SaltyCreator;
173
+ public algo: Algos = Algos.salty;
174
+ public signers: Signer[];
175
+
176
+ constructor(
177
+ salter: Salter,
178
+ pidx: number,
179
+ kidx: number = 0,
180
+ tier = Tier.low,
181
+ transferable = false,
182
+ stem = undefined,
183
+ code = MtrDex.Ed25519_Seed,
184
+ count = 1,
185
+ icodes: string[] | undefined = undefined,
186
+ ncode = MtrDex.Ed25519_Seed,
187
+ ncount = 1,
188
+ ncodes: string[] | undefined = undefined,
189
+ dcode = MtrDex.Blake3_256,
190
+ bran: string | undefined = undefined,
191
+ sxlt = undefined
192
+ ) {
193
+ // # Salter is the entered passcode and used for enc/dec of salts for each AID
194
+ this.salter = salter;
195
+ const signer = this.salter.signer(undefined, (transferable = false));
196
+
197
+ this.aeid = signer.verfer.qb64;
198
+
199
+ this.encrypter = new Encrypter({}, b(this.aeid));
200
+ this.decrypter = new Decrypter({}, signer.qb64b);
201
+
202
+ this.code = code;
203
+ this.ncode = ncode;
204
+ this.tier = tier;
205
+ this.icodes =
206
+ icodes == undefined ? new Array<string>(count).fill(code) : icodes;
207
+ this.ncodes =
208
+ ncodes == undefined
209
+ ? new Array<string>(ncount).fill(ncode)
210
+ : ncodes;
211
+ this.dcode = dcode;
212
+ this.pidx = pidx;
213
+ this.kidx = kidx;
214
+ this.transferable = transferable;
215
+ this.count = count;
216
+ this.ncount = ncount;
217
+ this.stem = stem == undefined ? 'signify:aid' : stem;
218
+
219
+ if (bran != undefined) {
220
+ this.bran = MtrDex.Salt_128 + 'A' + bran!.slice(0, 21);
221
+ this.creator = new SaltyCreator(this.bran, this.tier, this.stem);
222
+ this.sxlt = this.encrypter.encrypt(b(this.creator.salt)).qb64;
223
+ } else if (sxlt == undefined) {
224
+ this.creator = new SaltyCreator(undefined, this.tier, this.stem);
225
+ this.sxlt = this.encrypter.encrypt(b(this.creator.salt)).qb64;
226
+ } else {
227
+ this.sxlt = sxlt;
228
+ const ciph = new Cipher({ qb64: this.sxlt });
229
+ this.creator = new SaltyCreator(
230
+ this.decrypter.decrypt(null, ciph).qb64,
231
+ (tier = tier),
232
+ this.stem
233
+ );
234
+ }
235
+
236
+ this.signers = this.creator.create(
237
+ this.icodes,
238
+ this.ncount,
239
+ this.ncode,
240
+ this.transferable,
241
+ this.pidx,
242
+ 0,
243
+ this.kidx,
244
+ false
245
+ ).signers;
246
+ }
247
+
248
+ params() {
249
+ // Get AID parameters to store externally
250
+
251
+ return {
252
+ sxlt: this.sxlt,
253
+ pidx: this.pidx,
254
+ kidx: this.kidx,
255
+ stem: this.stem,
256
+ tier: this.tier,
257
+ icodes: this.icodes,
258
+ ncodes: this.ncodes,
259
+ dcode: this.dcode,
260
+ transferable: this.transferable,
261
+ };
262
+ }
263
+
264
+ incept(transferable: boolean) {
265
+ // Create verfers and digers for inception event for AID represented by this Keeper
266
+
267
+ // Args:
268
+ // transferable (bool): True if the AID for this keeper can establish new keys
269
+
270
+ // Returns:
271
+ // verfers(list): qualified base64 of signing public keys
272
+ // digers(list): qualified base64 of hash of rotation public keys
273
+
274
+ this.transferable = transferable;
275
+ this.kidx = 0;
276
+
277
+ const signers = this.creator.create(
278
+ this.icodes,
279
+ this.count,
280
+ this.code,
281
+ this.transferable,
282
+ this.pidx,
283
+ 0,
284
+ this.kidx,
285
+ false
286
+ );
287
+ const verfers = signers.signers.map((signer) => signer.verfer.qb64);
288
+
289
+ const nsigners = this.creator.create(
290
+ this.ncodes,
291
+ this.ncount,
292
+ this.ncode,
293
+ this.transferable,
294
+ this.pidx,
295
+ 0,
296
+ this.icodes?.length,
297
+ false
298
+ );
299
+ const digers = nsigners.signers.map(
300
+ (nsigner) =>
301
+ new Diger({ code: this.dcode }, nsigner.verfer.qb64b).qb64
302
+ );
303
+
304
+ return [verfers, digers];
305
+ }
306
+
307
+ rotate(ncodes: string[], transferable: boolean, ..._: any[]) {
308
+ // Rotate and return verfers and digers for next rotation event for AID represented by this Keeper
309
+
310
+ // Args:
311
+ // ncodes (list):
312
+ // transferable (bool): derivation codes for rotation key creation
313
+
314
+ // Returns:
315
+ // verfers(list): qualified base64 of signing public keys
316
+ // digers(list): qualified base64 of hash of rotation public keys
317
+
318
+ this.ncodes = ncodes;
319
+ this.transferable = transferable;
320
+ const signers = this.creator.create(
321
+ this.ncodes,
322
+ this.ncount,
323
+ this.ncode,
324
+ this.transferable,
325
+ this.pidx,
326
+ 0,
327
+ this.kidx + this.icodes!.length,
328
+ false
329
+ );
330
+ const verfers = signers.signers.map((signer) => signer.verfer.qb64);
331
+
332
+ this.kidx = this.kidx! + this.icodes!.length;
333
+ const nsigners = this.creator.create(
334
+ this.ncodes,
335
+ this.ncount,
336
+ this.ncode,
337
+ this.transferable,
338
+ this.pidx,
339
+ 0,
340
+ this.kidx + this.icodes!.length,
341
+ false
342
+ );
343
+ const digers = nsigners.signers.map(
344
+ (nsigner) =>
345
+ new Diger({ code: this.dcode }, nsigner.verfer.qb64b).qb64
346
+ );
347
+
348
+ return [verfers, digers];
349
+ }
350
+
351
+ sign(
352
+ ser: Uint8Array,
353
+ indexed = true,
354
+ indices: number[] | undefined = undefined,
355
+ ondices: number[] | undefined = undefined
356
+ ) {
357
+ const signers = this.creator.create(
358
+ this.icodes,
359
+ this.ncount,
360
+ this.ncode,
361
+ this.transferable,
362
+ this.pidx,
363
+ 0,
364
+ this.kidx,
365
+ false
366
+ );
367
+
368
+ if (indexed) {
369
+ const sigers = [];
370
+ let i = 0;
371
+ for (const [j, signer] of signers.signers.entries()) {
372
+ if (indices != undefined) {
373
+ i = indices![j];
374
+ if (typeof i != 'number' || i < 0) {
375
+ throw new Error(
376
+ `Invalid signing index = ${i}, not whole number.`
377
+ );
378
+ }
379
+ } else {
380
+ i = j;
381
+ }
382
+ let o = 0;
383
+ if (ondices != undefined) {
384
+ o = ondices![j];
385
+ if (
386
+ (o == undefined ||
387
+ (typeof o == 'number' &&
388
+ typeof o != 'number' &&
389
+ o >= 0))!
390
+ ) {
391
+ throw new Error(
392
+ `Invalid ondex = ${o}, not whole number.`
393
+ );
394
+ }
395
+ } else {
396
+ o = i;
397
+ }
398
+ sigers.push(
399
+ signer.sign(ser, i, o == undefined ? true : false, o)
400
+ );
401
+ }
402
+ return sigers.map((siger) => siger.qb64);
403
+ } else {
404
+ const cigars = [];
405
+ for (const [_, signer] of signers.signers.entries()) {
406
+ cigars.push(signer.sign(ser));
407
+ }
408
+ return cigars.map((cigar) => cigar.qb64);
409
+ }
410
+ }
411
+ }
412
+
413
+ export class RandyKeeper {
414
+ private salter: Salter;
415
+ private code: string;
416
+ private count: number;
417
+ private icodes: string[] | undefined;
418
+ private transferable: boolean;
419
+ private ncount: number;
420
+ private ncodes: string[] | undefined;
421
+ private ncode: string;
422
+ private dcode: string | undefined;
423
+ private prxs: string[] | undefined;
424
+ private nxts: string[] | undefined;
425
+ private aeid: string;
426
+ private encrypter: Encrypter;
427
+ private decrypter: Decrypter;
428
+ private creator: RandyCreator;
429
+ public algo: Algos = Algos.randy;
430
+ public signers: Signer[];
431
+
432
+ constructor(
433
+ salter: Salter,
434
+ code = MtrDex.Ed25519_Seed,
435
+ count = 1,
436
+ icodes: string[] | undefined = undefined,
437
+ transferable = false,
438
+ ncode = MtrDex.Ed25519_Seed,
439
+ ncount = 1,
440
+ ncodes: string[],
441
+ dcode = MtrDex.Blake3_256,
442
+ prxs: string[] | undefined = undefined,
443
+ nxts: string[] | undefined = undefined
444
+ ) {
445
+ this.salter = salter;
446
+ this.icodes =
447
+ icodes == undefined ? new Array<string>(count).fill(code) : icodes;
448
+ this.ncodes =
449
+ ncodes == undefined
450
+ ? new Array<string>(ncount).fill(ncode)
451
+ : ncodes;
452
+
453
+ this.code = code;
454
+ this.ncode = ncode;
455
+ this.count = count;
456
+ this.ncount = ncount;
457
+
458
+ const signer = this.salter.signer(undefined, (transferable = false));
459
+ this.aeid = signer.verfer.qb64;
460
+
461
+ this.encrypter = new Encrypter({}, b(this.aeid));
462
+ this.decrypter = new Decrypter({}, signer.qb64b);
463
+
464
+ this.nxts = nxts ?? [];
465
+ this.prxs = prxs ?? [];
466
+ this.transferable = transferable;
467
+
468
+ this.icodes = icodes;
469
+ this.ncodes = ncodes;
470
+ this.dcode = dcode;
471
+
472
+ this.creator = new RandyCreator();
473
+
474
+ this.signers = this.prxs.map((prx) =>
475
+ this.decrypter.decrypt(
476
+ new Cipher({ qb64: prx }).qb64b,
477
+ undefined,
478
+ this.transferable
479
+ )
480
+ );
481
+ }
482
+
483
+ params() {
484
+ return {
485
+ nxts: this.nxts,
486
+ prxs: this.prxs,
487
+ transferable: this.transferable,
488
+ };
489
+ }
490
+
491
+ incept(transferable: boolean) {
492
+ this.transferable = transferable;
493
+
494
+ const signers = this.creator.create(
495
+ this.icodes,
496
+ this.count,
497
+ this.code,
498
+ this.transferable
499
+ );
500
+ this.prxs = signers.signers.map(
501
+ (signer) => this.encrypter.encrypt(undefined, signer).qb64
502
+ );
503
+
504
+ const verfers = signers.signers.map((signer) => signer.verfer.qb64);
505
+
506
+ const nsigners = this.creator.create(
507
+ this.ncodes,
508
+ this.ncount,
509
+ this.ncode,
510
+ this.transferable
511
+ );
512
+
513
+ this.nxts = nsigners.signers.map(
514
+ (signer) => this.encrypter.encrypt(undefined, signer).qb64
515
+ );
516
+
517
+ const digers = nsigners.signers.map(
518
+ (nsigner) =>
519
+ new Diger({ code: this.dcode }, nsigner.verfer.qb64b).qb64
520
+ );
521
+
522
+ return [verfers, digers];
523
+ }
524
+
525
+ rotate(ncodes: string[], transferable: boolean, ..._: any[]) {
526
+ this.ncodes = ncodes;
527
+ this.transferable = transferable;
528
+ this.prxs = this.nxts;
529
+
530
+ const signers = this.nxts!.map((nxt) =>
531
+ this.decrypter.decrypt(
532
+ undefined,
533
+ new Cipher({ qb64: nxt }),
534
+ this.transferable
535
+ )
536
+ );
537
+ const verfers = signers.map((signer) => signer.verfer.qb64);
538
+ const nsigners = this.creator.create(
539
+ this.ncodes,
540
+ this.ncount,
541
+ this.ncode,
542
+ this.transferable
543
+ );
544
+
545
+ this.nxts = nsigners.signers.map(
546
+ (signer) => this.encrypter.encrypt(undefined, signer).qb64
547
+ );
548
+
549
+ const digers = nsigners.signers.map(
550
+ (nsigner) =>
551
+ new Diger({ code: this.dcode }, nsigner.verfer.qb64b).qb64
552
+ );
553
+
554
+ return [verfers, digers];
555
+ }
556
+
557
+ sign(
558
+ ser: Uint8Array,
559
+ indexed = true,
560
+ indices: number[] | undefined = undefined,
561
+ ondices: number[] | undefined = undefined
562
+ ) {
563
+ const signers = this.prxs!.map((prx) =>
564
+ this.decrypter.decrypt(
565
+ new Cipher({ qb64: prx }).qb64b,
566
+ undefined,
567
+ this.transferable
568
+ )
569
+ );
570
+
571
+ if (indexed) {
572
+ const sigers = [];
573
+ let i = 0;
574
+ for (const [j, signer] of signers.entries()) {
575
+ if (indices != undefined) {
576
+ i = indices![j];
577
+ if (typeof i != 'number' || i < 0) {
578
+ throw new Error(
579
+ `Invalid signing index = ${i}, not whole number.`
580
+ );
581
+ }
582
+ } else {
583
+ i = j;
584
+ }
585
+ let o = 0;
586
+ if (ondices != undefined) {
587
+ o = ondices![j];
588
+ if (
589
+ (o == undefined ||
590
+ (typeof o == 'number' &&
591
+ typeof o != 'number' &&
592
+ o >= 0))!
593
+ ) {
594
+ throw new Error(
595
+ `Invalid ondex = ${o}, not whole number.`
596
+ );
597
+ }
598
+ } else {
599
+ o = i;
600
+ }
601
+ sigers.push(
602
+ signer.sign(ser, i, o == undefined ? true : false, o)
603
+ );
604
+ }
605
+ return sigers.map((siger) => siger.qb64);
606
+ } else {
607
+ const cigars = [];
608
+ for (const [_, signer] of signers.entries()) {
609
+ cigars.push(signer.sign(ser));
610
+ }
611
+ return cigars.map((cigar) => cigar.qb64);
612
+ }
613
+ }
614
+ }
615
+ export class GroupKeeper {
616
+ private manager: KeyManager;
617
+ private mhab: any;
618
+ private gkeys: string[] | undefined;
619
+ private gdigs: string[] | undefined;
620
+ public algo: Algos = Algos.group;
621
+ public signers: Signer[];
622
+
623
+ constructor(
624
+ manager: KeyManager,
625
+ mhab = undefined,
626
+ states: any[] | undefined = undefined,
627
+ rstates: any[] | undefined = undefined,
628
+ keys: any[] | undefined = undefined,
629
+ ndigs: any[] | undefined = undefined
630
+ ) {
631
+ this.manager = manager;
632
+ if (states != undefined) {
633
+ keys = states.map((state) => state['k'][0]);
634
+ }
635
+
636
+ if (rstates != undefined) {
637
+ ndigs = rstates.map((state) => state['n'][0]);
638
+ }
639
+
640
+ this.gkeys = keys;
641
+ this.gdigs = ndigs;
642
+ this.mhab = mhab;
643
+ this.signers = [];
644
+ }
645
+ incept(..._: any) {
646
+ return [this.gkeys, this.gdigs];
647
+ }
648
+
649
+ rotate(
650
+ _ncodes: string[],
651
+ _transferable: boolean,
652
+ states: any[],
653
+ rstates: any[],
654
+ ..._: any
655
+ ) {
656
+ this.gkeys = states.map((state) => state['k'][0]);
657
+ this.gdigs = rstates.map((state) => state['n'][0]);
658
+ return [this.gkeys, this.gdigs];
659
+ }
660
+
661
+ async sign(
662
+ ser: Uint8Array,
663
+ indexed: boolean = true,
664
+ _indices: number[] | undefined = undefined,
665
+ _ondices: number[] | undefined = undefined
666
+ ): Promise<Siger[] | Cigar[]> {
667
+ const key = this.mhab['state']['k'][0];
668
+ const ndig = this.mhab['state']['n'][0];
669
+
670
+ const csi = this.gkeys!.indexOf(key);
671
+ const pni = this.gdigs!.indexOf(ndig);
672
+ const mkeeper = this.manager.get(this.mhab);
673
+
674
+ return await mkeeper.sign(ser, indexed, [csi], [pni]);
675
+ }
676
+
677
+ params() {
678
+ return {
679
+ mhab: this.mhab,
680
+ keys: this.gkeys,
681
+ ndigs: this.gdigs,
682
+ };
683
+ }
684
+ }
@@ -1,12 +1,10 @@
1
-
2
-
3
1
  export class EmptyMaterialError {
4
- private readonly _err: Error
2
+ private readonly _err: Error;
5
3
  constructor(err: string) {
6
- this._err = new Error(err)
4
+ this._err = new Error(err);
7
5
  }
8
6
 
9
7
  get err() {
10
- return this._err
8
+ return this._err;
11
9
  }
12
- }
10
+ }