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.
- package/README.md +101 -5
- package/dist/buffer-polyfill.d.ts +1 -0
- package/dist/exports.d.ts +40 -0
- package/dist/index.d.ts +4 -1
- package/dist/keri/app/aiding.d.ts +138 -0
- package/dist/keri/app/clienting.d.ts +182 -0
- package/dist/keri/app/contacting.d.ts +93 -0
- package/dist/keri/app/controller.d.ts +49 -0
- package/dist/keri/app/coring.d.ts +121 -0
- package/dist/keri/app/credentialing.d.ts +239 -0
- package/dist/keri/app/escrowing.d.ts +19 -0
- package/dist/keri/app/exchanging.d.ts +60 -0
- package/dist/keri/app/grouping.d.ts +44 -0
- package/dist/keri/app/habery.d.ts +48 -0
- package/dist/keri/app/notifying.d.ts +34 -0
- package/dist/keri/core/authing.d.ts +10 -0
- package/dist/keri/core/bexter.d.ts +7 -0
- package/dist/keri/core/cigar.d.ts +8 -8
- package/dist/keri/core/cipher.d.ts +5 -5
- package/dist/keri/core/core.d.ts +59 -68
- package/dist/keri/core/counter.d.ts +43 -0
- package/dist/keri/core/decrypter.d.ts +10 -10
- package/dist/keri/core/diger.d.ts +21 -21
- package/dist/keri/core/encrypter.d.ts +9 -9
- package/dist/keri/core/eventing.d.ts +54 -0
- package/dist/keri/core/httping.d.ts +44 -0
- package/dist/keri/core/indexer.d.ts +98 -88
- package/dist/keri/core/keeping.d.ts +103 -1
- package/dist/keri/core/kering.d.ts +5 -5
- package/dist/keri/core/manager.d.ts +174 -151
- package/dist/keri/core/matter.d.ts +116 -47
- package/dist/keri/core/number.d.ts +7 -0
- package/dist/keri/core/pather.d.ts +7 -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/seqner.d.ts +15 -0
- package/dist/keri/core/serder.d.ts +31 -0
- package/dist/keri/core/siger.d.ts +18 -18
- package/dist/keri/core/signer.d.ts +34 -34
- package/dist/keri/core/tholder.d.ts +29 -0
- package/dist/keri/core/utils.d.ts +20 -14
- package/dist/keri/core/vdring.d.ts +16 -0
- package/dist/keri/core/verfer.d.ts +13 -0
- package/dist/keri/end/ending.d.ts +13 -0
- package/dist/math.d.ts +1 -0
- package/dist/ready.d.ts +1 -0
- package/dist/signify-ts.cjs +7835 -0
- package/dist/signify-ts.cjs.development.js +9493 -5
- package/dist/signify-ts.cjs.development.js.map +1 -1
- package/dist/signify-ts.cjs.map +7 -0
- 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 +9341 -5
- package/dist/signify-ts.esm.js.map +1 -1
- package/dist/signify-ts.mjs +7811 -0
- package/dist/signify-ts.mjs.map +7 -0
- package/package.json +51 -49
- package/src/buffer-polyfill.ts +5 -0
- package/src/exports.ts +44 -0
- package/src/index.ts +4 -6
- package/src/keri/app/aiding.ts +493 -0
- package/src/keri/app/clienting.ts +492 -0
- package/src/keri/app/contacting.ts +188 -0
- package/src/keri/app/controller.ts +372 -0
- package/src/keri/app/coring.ts +225 -0
- package/src/keri/app/credentialing.ts +820 -0
- package/src/keri/app/escrowing.ts +34 -0
- package/src/keri/app/exchanging.ts +220 -0
- package/src/keri/app/grouping.ts +90 -0
- package/src/keri/app/habery.ts +185 -0
- package/src/keri/app/notifying.ts +69 -0
- package/src/keri/core/authing.ts +117 -0
- package/src/keri/core/bexter.ts +138 -0
- package/src/keri/core/cigar.ts +11 -12
- package/src/keri/core/cipher.ts +23 -14
- package/src/keri/core/core.ts +249 -97
- package/src/keri/core/counter.ts +273 -0
- package/src/keri/core/decrypter.ts +48 -34
- package/src/keri/core/diger.ts +25 -24
- package/src/keri/core/encrypter.ts +37 -27
- package/src/keri/core/eventing.ts +581 -0
- package/src/keri/core/httping.ts +209 -0
- package/src/keri/core/indexer.ts +314 -211
- package/src/keri/core/keeping.ts +679 -4
- package/src/keri/core/kering.ts +4 -6
- package/src/keri/core/manager.ts +759 -450
- package/src/keri/core/matter.ts +404 -135
- package/src/keri/core/number.ts +66 -0
- package/src/keri/core/pather.ts +98 -0
- package/src/keri/core/prefixer.ts +233 -0
- package/src/keri/core/saider.ts +186 -0
- package/src/keri/core/salter.ts +76 -41
- package/src/keri/core/seqner.ts +46 -0
- package/src/keri/core/serder.ts +163 -0
- package/src/keri/core/siger.ts +19 -18
- package/src/keri/core/signer.ts +74 -53
- package/src/keri/core/tholder.ts +218 -0
- package/src/keri/core/utils.ts +120 -45
- package/src/keri/core/vdring.ts +94 -0
- package/src/keri/core/verfer.ts +25 -11
- package/src/keri/end/ending.ts +170 -0
- package/src/math.ts +3 -0
- package/src/ready.ts +5 -0
- package/src/keri/core/tsconfig.json +0 -100
package/src/keri/core/keeping.ts
CHANGED
|
@@ -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
|
-
|
|
5
|
-
|
|
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
|
-
|
|
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
|
+
}
|
package/src/keri/core/kering.ts
CHANGED
|
@@ -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
|
+
}
|