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.
- package/README.md +104 -34
- package/dist/exports.d.ts +40 -40
- package/dist/exports.js +40 -0
- package/dist/index.d.ts +2 -3
- package/dist/index.js +3 -8
- package/dist/keri/app/aiding.d.ts +54 -18
- package/{src/keri/app/aiding.ts → dist/keri/app/aiding.js} +130 -236
- package/dist/keri/app/clienting.d.ts +59 -22
- package/{src/keri/app/clienting.ts → dist/keri/app/clienting.js} +146 -235
- package/dist/keri/app/contacting.d.ts +30 -23
- package/{src/keri/app/contacting.ts → dist/keri/app/contacting.js} +26 -63
- package/dist/keri/app/controller.d.ts +49 -6
- package/{src/keri/app/controller.ts → dist/keri/app/controller.js} +80 -186
- package/dist/keri/app/coring.d.ts +134 -25
- package/{src/keri/app/coring.ts → dist/keri/app/coring.js} +83 -56
- package/dist/keri/app/credentialing.d.ts +187 -69
- package/dist/keri/app/credentialing.js +540 -0
- package/dist/keri/app/delegating.d.ts +18 -0
- package/dist/keri/app/delegating.js +24 -0
- package/dist/keri/app/escrowing.d.ts +5 -3
- package/{src/keri/app/escrowing.ts → dist/keri/app/escrowing.js} +3 -9
- package/dist/keri/app/exchanging.d.ts +243 -11
- package/dist/keri/app/exchanging.js +242 -0
- package/dist/keri/app/grouping.d.ts +11 -9
- package/{src/keri/app/grouping.ts → dist/keri/app/grouping.js} +10 -29
- package/dist/keri/app/habery.d.ts +2 -2
- package/dist/keri/app/habery.js +117 -0
- package/dist/keri/app/notifying.d.ts +2 -2
- package/{src/keri/app/notifying.ts → dist/keri/app/notifying.js} +7 -17
- package/dist/keri/core/authing.d.ts +2 -2
- package/{src/keri/core/authing.ts → dist/keri/core/authing.js} +26 -42
- package/dist/keri/core/base64.d.ts +2 -0
- package/dist/keri/core/base64.js +16 -0
- package/dist/keri/core/bexter.d.ts +1 -1
- package/{src/keri/core/bexter.ts → dist/keri/core/bexter.js} +18 -32
- package/dist/keri/core/cigar.d.ts +2 -2
- package/dist/keri/core/cigar.js +13 -0
- package/dist/keri/core/cipher.d.ts +1 -1
- package/{src/keri/core/cipher.ts → dist/keri/core/cipher.js} +10 -19
- package/dist/keri/core/core.d.ts +117 -9
- package/dist/keri/core/core.js +385 -0
- package/dist/keri/core/counter.d.ts +2 -2
- package/dist/keri/core/counter.js +221 -0
- package/dist/keri/core/decrypter.d.ts +4 -4
- package/{src/keri/core/decrypter.ts → dist/keri/core/decrypter.js} +23 -40
- package/dist/keri/core/diger.d.ts +3 -3
- package/{src/keri/core/diger.ts → dist/keri/core/diger.js} +18 -33
- package/dist/keri/core/encrypter.d.ts +2 -2
- package/{src/keri/core/encrypter.ts → dist/keri/core/encrypter.js} +18 -38
- package/dist/keri/core/eventing.d.ts +6 -6
- package/dist/keri/core/eventing.js +383 -0
- package/dist/keri/core/httping.d.ts +11 -4
- package/{src/keri/core/httping.ts → dist/keri/core/httping.js} +36 -101
- package/dist/keri/core/indexer.d.ts +1 -1
- package/dist/keri/core/indexer.js +407 -0
- package/dist/keri/core/keeping.d.ts +113 -46
- package/dist/keri/core/keeping.js +347 -0
- package/{src/keri/core/kering.ts → dist/keri/core/kering.js} +1 -3
- package/dist/keri/core/keyState.d.ts +98 -0
- package/dist/keri/core/manager.d.ts +147 -12
- package/dist/keri/core/manager.js +880 -0
- package/dist/keri/core/matter.d.ts +1 -1
- package/dist/keri/core/matter.js +460 -0
- package/dist/keri/core/number.d.ts +2 -2
- package/{src/keri/core/number.ts → dist/keri/core/number.js} +26 -32
- package/dist/keri/core/pather.d.ts +2 -2
- package/{src/keri/core/pather.ts → dist/keri/core/pather.js} +12 -27
- package/dist/keri/core/prefixer.d.ts +10 -10
- package/dist/keri/core/prefixer.js +182 -0
- package/dist/keri/core/saider.d.ts +2 -12
- package/dist/keri/core/saider.js +107 -0
- package/dist/keri/core/salter.d.ts +44 -9
- package/dist/keri/core/salter.js +110 -0
- package/dist/keri/core/seqner.d.ts +1 -1
- package/{src/keri/core/seqner.ts → dist/keri/core/seqner.js} +20 -21
- package/dist/keri/core/serder.d.ts +25 -12
- package/dist/keri/core/serder.js +133 -0
- package/dist/keri/core/siger.d.ts +2 -2
- package/{src/keri/core/siger.ts → dist/keri/core/siger.js} +4 -14
- package/dist/keri/core/signer.d.ts +4 -4
- package/dist/keri/core/signer.js +84 -0
- package/{src/keri/core/tholder.ts → dist/keri/core/tholder.js} +69 -94
- package/dist/keri/core/utils.d.ts +1 -1
- package/{src/keri/core/utils.ts → dist/keri/core/utils.js} +30 -60
- package/dist/keri/core/vdring.d.ts +2 -2
- package/dist/keri/core/vdring.js +61 -0
- package/dist/keri/core/verfer.d.ts +2 -6
- package/dist/keri/core/verfer.js +37 -0
- package/dist/keri/end/ending.d.ts +10 -8
- package/dist/keri/end/ending.js +136 -0
- package/{src/ready.ts → dist/ready.js} +1 -2
- package/dist/types/keria-api-schema.d.ts +1158 -0
- package/dist/types/keria-api-schema.js +34 -0
- package/package.json +53 -52
- package/dist/math.d.ts +0 -1
- package/dist/signify-ts.cjs +0 -7842
- package/dist/signify-ts.cjs.development.js +0 -9501
- package/dist/signify-ts.cjs.development.js.map +0 -1
- package/dist/signify-ts.cjs.map +0 -7
- package/dist/signify-ts.cjs.production.min.js +0 -2
- package/dist/signify-ts.cjs.production.min.js.map +0 -1
- package/dist/signify-ts.esm.js +0 -9345
- package/dist/signify-ts.esm.js.map +0 -1
- package/dist/signify-ts.mjs +0 -7818
- package/dist/signify-ts.mjs.map +0 -7
- package/src/buffer-polyfill.ts +0 -5
- package/src/exports.ts +0 -44
- package/src/index.ts +0 -4
- package/src/keri/app/credentialing.ts +0 -841
- package/src/keri/app/exchanging.ts +0 -220
- package/src/keri/app/habery.ts +0 -185
- package/src/keri/core/cigar.ts +0 -18
- package/src/keri/core/core.ts +0 -326
- package/src/keri/core/counter.ts +0 -273
- package/src/keri/core/eventing.ts +0 -581
- package/src/keri/core/indexer.ts +0 -509
- package/src/keri/core/keeping.ts +0 -684
- package/src/keri/core/manager.ts +0 -1183
- package/src/keri/core/matter.ts +0 -521
- package/src/keri/core/prefixer.ts +0 -233
- package/src/keri/core/saider.ts +0 -186
- package/src/keri/core/salter.ts +0 -120
- package/src/keri/core/serder.ts +0 -163
- package/src/keri/core/signer.ts +0 -133
- package/src/keri/core/vdring.ts +0 -94
- package/src/keri/core/verfer.ts +0 -47
- package/src/keri/end/ending.ts +0 -170
- package/src/math.ts +0 -3
- /package/dist/{buffer-polyfill.d.ts → keri/core/keyState.js} +0 -0
package/src/keri/core/manager.ts
DELETED
|
@@ -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
|
-
}
|