signify-ts 0.1.1 → 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 +96 -47
- package/dist/buffer-polyfill.d.ts +1 -0
- package/dist/exports.d.ts +40 -0
- package/dist/index.d.ts +4 -3
- 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 -47
- package/dist/keri/app/notifying.d.ts +34 -0
- package/dist/keri/core/authing.d.ts +10 -9
- 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 -53
- package/dist/keri/core/counter.d.ts +43 -43
- 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 -21
- package/dist/keri/core/httping.d.ts +44 -34
- 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 -172
- package/dist/keri/core/matter.d.ts +116 -69
- package/dist/keri/core/number.d.ts +7 -6
- package/dist/keri/core/pather.d.ts +7 -0
- package/dist/keri/core/prefixer.d.ts +15 -15
- package/dist/keri/core/saider.d.ts +23 -23
- package/dist/keri/core/salter.d.ts +23 -23
- package/dist/keri/core/seqner.d.ts +15 -0
- package/dist/keri/core/serder.d.ts +31 -23
- 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 -14
- package/dist/keri/core/utils.d.ts +20 -15
- package/dist/keri/core/vdring.d.ts +16 -0
- package/dist/keri/core/verfer.d.ts +13 -12
- package/dist/keri/end/ending.d.ts +13 -13
- 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 +6369 -256
- 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 +6205 -229
- 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 +49 -49
- package/src/buffer-polyfill.ts +5 -0
- package/src/exports.ts +44 -0
- package/src/index.ts +4 -5
- 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 +118 -85
- package/src/keri/app/notifying.ts +69 -0
- package/src/keri/core/authing.ts +73 -85
- package/src/keri/core/bexter.ts +138 -0
- package/src/keri/core/cigar.ts +10 -11
- package/src/keri/core/cipher.ts +23 -14
- package/src/keri/core/core.ts +223 -81
- package/src/keri/core/counter.ts +182 -116
- package/src/keri/core/decrypter.ts +48 -34
- package/src/keri/core/diger.ts +23 -22
- package/src/keri/core/encrypter.ts +37 -27
- package/src/keri/core/eventing.ts +468 -106
- package/src/keri/core/httping.ts +151 -105
- package/src/keri/core/indexer.ts +313 -211
- package/src/keri/core/keeping.ts +679 -3
- package/src/keri/core/kering.ts +4 -6
- package/src/keri/core/manager.ts +660 -499
- package/src/keri/core/matter.ts +382 -148
- package/src/keri/core/number.ts +56 -11
- package/src/keri/core/pather.ts +98 -0
- package/src/keri/core/prefixer.ts +122 -101
- package/src/keri/core/saider.ts +104 -76
- package/src/keri/core/salter.ts +71 -40
- package/src/keri/core/seqner.ts +46 -0
- package/src/keri/core/serder.ts +102 -38
- package/src/keri/core/siger.ts +19 -18
- package/src/keri/core/signer.ts +73 -53
- package/src/keri/core/tholder.ts +196 -30
- package/src/keri/core/utils.ts +121 -50
- package/src/keri/core/vdring.ts +94 -0
- package/src/keri/core/verfer.ts +22 -9
- package/src/keri/end/ending.ts +111 -101
- package/src/math.ts +3 -0
- package/src/ready.ts +5 -0
- package/dist/keri/app/accountant.d.ts +0 -10
- package/dist/keri/app/apping.d.ts +0 -1
- package/dist/keri/app/client.d.ts +0 -7
- package/dist/keri/app/signify.d.ts +0 -6
- package/src/keri/app/accountant.ts +0 -35
- package/src/keri/app/apping.ts +0 -12
- package/src/keri/app/client.ts +0 -30
- package/src/keri/app/signify.ts +0 -12
- package/src/keri/app/tsconfig.json +0 -100
- package/src/keri/core/tsconfig.json +0 -100
- package/src/keri/end/tsconfig.json +0 -100
package/src/keri/core/saider.ts
CHANGED
|
@@ -1,158 +1,186 @@
|
|
|
1
|
-
import {DigiDex, Matter, MatterArgs, MtrDex} from
|
|
2
|
-
import {deversify, Dict, Serials} from
|
|
3
|
-
import {EmptyMaterialError} from
|
|
4
|
-
import {dumps, sizeify} from
|
|
1
|
+
import { DigiDex, Matter, MatterArgs, MtrDex } from './matter';
|
|
2
|
+
import { deversify, Dict, Serials } from './core';
|
|
3
|
+
import { EmptyMaterialError } from './kering';
|
|
4
|
+
import { dumps, sizeify } from './serder';
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { blake3 } from '@noble/hashes/blake3';
|
|
7
7
|
|
|
8
|
-
const Dummy =
|
|
8
|
+
const Dummy = '#';
|
|
9
9
|
|
|
10
10
|
export enum Ids {
|
|
11
|
-
d =
|
|
11
|
+
d = 'd',
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
class Digestage {
|
|
15
|
-
public klas: any = undefined
|
|
16
|
-
public size: number | undefined = 0
|
|
17
|
-
public length: number | undefined = 0
|
|
15
|
+
public klas: any = undefined;
|
|
16
|
+
public size: number | undefined = 0;
|
|
17
|
+
public length: number | undefined = 0;
|
|
18
18
|
constructor(klas: any, size?: number, length?: number) {
|
|
19
|
-
this.klas = klas
|
|
20
|
-
this.size = size
|
|
21
|
-
this.length = length
|
|
19
|
+
this.klas = klas;
|
|
20
|
+
this.size = size;
|
|
21
|
+
this.length = length;
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
25
|
export class Saider extends Matter {
|
|
28
26
|
static Digests = new Map<string, Digestage>([
|
|
29
|
-
[
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
[
|
|
28
|
+
MtrDex.Blake3_256,
|
|
29
|
+
new Digestage(Saider._derive_blake3_256, undefined, undefined),
|
|
30
|
+
],
|
|
31
|
+
]);
|
|
32
|
+
|
|
33
|
+
constructor(
|
|
34
|
+
{ raw, code, qb64b, qb64, qb2 }: MatterArgs,
|
|
35
|
+
sad?: Dict<any>,
|
|
36
|
+
kind?: Serials,
|
|
37
|
+
label: string = Ids.d
|
|
38
|
+
) {
|
|
33
39
|
try {
|
|
34
|
-
super({raw, code, qb64b, qb64, qb2});
|
|
40
|
+
super({ raw, code, qb64b, qb64, qb2 });
|
|
35
41
|
} catch (e) {
|
|
36
42
|
if (e instanceof EmptyMaterialError) {
|
|
37
43
|
if (sad == undefined || !(label in sad)) {
|
|
38
|
-
throw e
|
|
44
|
+
throw e;
|
|
39
45
|
}
|
|
40
46
|
|
|
41
47
|
if (code == undefined) {
|
|
42
|
-
if (sad[label] !=
|
|
43
|
-
super({qb64: sad[label], code: code})
|
|
44
|
-
code = this.code
|
|
48
|
+
if (sad[label] != '') {
|
|
49
|
+
super({ qb64: sad[label], code: code });
|
|
50
|
+
code = this.code;
|
|
45
51
|
} else {
|
|
46
|
-
code = MtrDex.Blake3_256
|
|
52
|
+
code = MtrDex.Blake3_256;
|
|
47
53
|
}
|
|
48
54
|
}
|
|
49
55
|
|
|
50
56
|
if (!DigiDex.has(code)) {
|
|
51
|
-
throw new Error(`Unsupported digest code = ${code}`)
|
|
57
|
+
throw new Error(`Unsupported digest code = ${code}`);
|
|
52
58
|
}
|
|
53
59
|
|
|
54
|
-
[raw] = Saider._derive({...sad}, code, kind, label)
|
|
55
|
-
super({raw: raw, code: code})
|
|
60
|
+
[raw] = Saider._derive({ ...sad }, code, kind, label);
|
|
61
|
+
super({ raw: raw, code: code });
|
|
56
62
|
} else {
|
|
57
|
-
throw e
|
|
63
|
+
throw e;
|
|
58
64
|
}
|
|
59
65
|
}
|
|
60
66
|
|
|
61
67
|
if (!this.digestive) {
|
|
62
|
-
throw new Error(`Unsupported digest code = ${this.code}.`)
|
|
68
|
+
throw new Error(`Unsupported digest code = ${this.code}.`);
|
|
63
69
|
}
|
|
64
|
-
|
|
65
70
|
}
|
|
66
71
|
|
|
67
|
-
static _derive_blake3_256(
|
|
68
|
-
|
|
69
|
-
|
|
72
|
+
static _derive_blake3_256(
|
|
73
|
+
ser: Uint8Array,
|
|
74
|
+
_digest_size: number,
|
|
75
|
+
_length: number
|
|
76
|
+
) {
|
|
77
|
+
return Buffer.from(blake3.create({ dkLen: 32 }).update(ser).digest());
|
|
70
78
|
}
|
|
71
79
|
|
|
72
|
-
|
|
73
|
-
|
|
80
|
+
private static _derive(
|
|
81
|
+
sad: Dict<any>,
|
|
82
|
+
code: string,
|
|
83
|
+
kind: Serials | undefined,
|
|
84
|
+
label: string
|
|
85
|
+
): [Uint8Array, Dict<any>] {
|
|
74
86
|
if (!DigiDex.has(code) || !Saider.Digests.has(code)) {
|
|
75
|
-
throw new Error(`Unsupported digest code = ${code}.`)
|
|
87
|
+
throw new Error(`Unsupported digest code = ${code}.`);
|
|
76
88
|
}
|
|
77
89
|
|
|
78
|
-
sad = {...sad}
|
|
79
|
-
sad[label] =
|
|
90
|
+
sad = { ...sad };
|
|
91
|
+
sad[label] = ''.padStart(Matter.Sizes.get(code)!.fs!, Dummy);
|
|
80
92
|
if ('v' in sad) {
|
|
81
|
-
[, , kind, sad
|
|
93
|
+
[, , kind, sad] = sizeify(sad, kind);
|
|
82
94
|
}
|
|
83
95
|
|
|
84
|
-
|
|
96
|
+
const ser = { ...sad };
|
|
85
97
|
|
|
86
|
-
|
|
98
|
+
const digestage = Saider.Digests.get(code);
|
|
87
99
|
|
|
88
|
-
|
|
89
|
-
|
|
100
|
+
const cpa = Saider._serialze(ser, kind);
|
|
101
|
+
const args: any[] = [];
|
|
90
102
|
if (digestage!.size != undefined) {
|
|
91
|
-
args.push(digestage!.size)
|
|
103
|
+
args.push(digestage!.size);
|
|
92
104
|
}
|
|
93
105
|
|
|
94
106
|
if (digestage!.length != undefined) {
|
|
95
|
-
args.push(digestage!.length)
|
|
107
|
+
args.push(digestage!.length);
|
|
96
108
|
}
|
|
97
109
|
|
|
98
|
-
return [digestage!.klas(cpa, ...args), sad]
|
|
110
|
+
return [digestage!.klas(cpa, ...args), sad];
|
|
99
111
|
}
|
|
100
112
|
|
|
101
|
-
public derive(
|
|
102
|
-
|
|
103
|
-
|
|
113
|
+
public derive(
|
|
114
|
+
sad: Dict<any>,
|
|
115
|
+
code: string,
|
|
116
|
+
kind: Serials | undefined,
|
|
117
|
+
label: string
|
|
118
|
+
): [Uint8Array, Dict<any>] {
|
|
119
|
+
code = code != undefined ? code : this.code;
|
|
120
|
+
return Saider._derive(sad, code, kind, label);
|
|
104
121
|
}
|
|
105
122
|
|
|
106
|
-
public verify(
|
|
107
|
-
|
|
123
|
+
public verify(
|
|
124
|
+
sad: Dict<any>,
|
|
125
|
+
prefixed: boolean = false,
|
|
126
|
+
versioned: boolean = false,
|
|
127
|
+
kind?: Serials,
|
|
128
|
+
label: string = Ids.d
|
|
129
|
+
): boolean {
|
|
108
130
|
try {
|
|
109
|
-
|
|
110
|
-
|
|
131
|
+
const [raw, dsad] = Saider._derive(sad, this.code, kind, label);
|
|
132
|
+
const saider = new Saider({ raw: raw, code: this.code });
|
|
111
133
|
if (this.qb64 != saider.qb64) {
|
|
112
|
-
return false
|
|
134
|
+
return false;
|
|
113
135
|
}
|
|
114
136
|
|
|
115
|
-
if (
|
|
116
|
-
if (sad['v'] != dsad[
|
|
117
|
-
return false
|
|
137
|
+
if ('v' in sad && versioned) {
|
|
138
|
+
if (sad['v'] != dsad['v']) {
|
|
139
|
+
return false;
|
|
118
140
|
}
|
|
119
141
|
}
|
|
120
142
|
|
|
121
143
|
if (prefixed && sad[label] != this.qb64) {
|
|
122
|
-
return false
|
|
144
|
+
return false;
|
|
123
145
|
}
|
|
124
|
-
|
|
125
146
|
} catch (e) {
|
|
126
|
-
return false
|
|
147
|
+
return false;
|
|
127
148
|
}
|
|
128
149
|
|
|
129
|
-
return true
|
|
150
|
+
return true;
|
|
130
151
|
}
|
|
131
152
|
|
|
132
153
|
private static _serialze(sad: Dict<any>, kind?: Serials): string {
|
|
133
|
-
let knd = Serials.JSON
|
|
154
|
+
let knd = Serials.JSON;
|
|
134
155
|
if ('v' in sad) {
|
|
135
|
-
[knd] = deversify(sad['v'])
|
|
156
|
+
[, knd] = deversify(sad['v']);
|
|
136
157
|
}
|
|
137
158
|
|
|
138
159
|
if (kind == undefined) {
|
|
139
|
-
kind = knd
|
|
160
|
+
kind = knd;
|
|
140
161
|
}
|
|
141
162
|
|
|
142
|
-
return dumps(sad, kind)
|
|
163
|
+
return dumps(sad, kind);
|
|
143
164
|
}
|
|
144
165
|
|
|
145
|
-
public static saidify(
|
|
146
|
-
|
|
166
|
+
public static saidify(
|
|
167
|
+
sad: Dict<any>,
|
|
168
|
+
code: string = MtrDex.Blake3_256,
|
|
169
|
+
kind: Serials = Serials.JSON,
|
|
170
|
+
label: string = Ids.d
|
|
171
|
+
): [Saider, Dict<any>] {
|
|
147
172
|
if (!(label in sad)) {
|
|
148
|
-
throw new Error(`Missing id field labeled=${label} in sad.`)
|
|
173
|
+
throw new Error(`Missing id field labeled=${label} in sad.`);
|
|
149
174
|
}
|
|
150
|
-
let raw
|
|
151
|
-
[raw, sad]= Saider._derive(sad, code, kind, label)
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
175
|
+
let raw;
|
|
176
|
+
[raw, sad] = Saider._derive(sad, code, kind, label);
|
|
177
|
+
const saider = new Saider(
|
|
178
|
+
{ raw: raw, code: code },
|
|
179
|
+
undefined,
|
|
180
|
+
kind,
|
|
181
|
+
label
|
|
182
|
+
);
|
|
183
|
+
sad[label] = saider.qb64;
|
|
184
|
+
return [saider, sad];
|
|
155
185
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
186
|
}
|
package/src/keri/core/salter.ts
CHANGED
|
@@ -1,36 +1,47 @@
|
|
|
1
|
-
import {Signer} from
|
|
1
|
+
import { Signer } from './signer';
|
|
2
2
|
|
|
3
3
|
import { Matter, MtrDex } from './matter';
|
|
4
|
-
import { EmptyMaterialError } from './kering'
|
|
5
|
-
import libsodium
|
|
4
|
+
import { EmptyMaterialError } from './kering';
|
|
5
|
+
import libsodium from 'libsodium-wrappers-sumo';
|
|
6
6
|
|
|
7
|
-
export
|
|
8
|
-
low =
|
|
9
|
-
med =
|
|
10
|
-
high =
|
|
7
|
+
export enum Tier {
|
|
8
|
+
low = 'low',
|
|
9
|
+
med = 'med',
|
|
10
|
+
high = 'high',
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
interface SalterArgs {
|
|
14
|
-
raw?: Uint8Array | undefined
|
|
15
|
-
code
|
|
16
|
-
tier?:Tier
|
|
17
|
-
qb64b
|
|
18
|
-
qb64?: string
|
|
19
|
-
qb2?: Uint8Array | undefined
|
|
14
|
+
raw?: Uint8Array | undefined;
|
|
15
|
+
code?: string;
|
|
16
|
+
tier?: Tier;
|
|
17
|
+
qb64b?: Uint8Array | undefined;
|
|
18
|
+
qb64?: string;
|
|
19
|
+
qb2?: Uint8Array | undefined;
|
|
20
20
|
}
|
|
21
21
|
export class Salter extends Matter {
|
|
22
22
|
private readonly _tier: Tier | null;
|
|
23
23
|
|
|
24
|
-
constructor({
|
|
24
|
+
constructor({
|
|
25
|
+
raw,
|
|
26
|
+
code = MtrDex.Salt_128,
|
|
27
|
+
tier = Tier.low,
|
|
28
|
+
qb64,
|
|
29
|
+
qb64b,
|
|
30
|
+
qb2,
|
|
31
|
+
}: SalterArgs) {
|
|
25
32
|
try {
|
|
26
|
-
super({raw, code, qb64, qb64b, qb2});
|
|
33
|
+
super({ raw, code, qb64, qb64b, qb2 });
|
|
27
34
|
} catch (e) {
|
|
28
|
-
if(e instanceof EmptyMaterialError) {
|
|
35
|
+
if (e instanceof EmptyMaterialError) {
|
|
29
36
|
if (code == MtrDex.Salt_128) {
|
|
30
|
-
|
|
31
|
-
|
|
37
|
+
const salt = libsodium.randombytes_buf(
|
|
38
|
+
libsodium.crypto_pwhash_SALTBYTES
|
|
39
|
+
);
|
|
40
|
+
super({ raw: salt, code: code });
|
|
32
41
|
} else {
|
|
33
|
-
throw new Error(
|
|
42
|
+
throw new Error(
|
|
43
|
+
'invalid code for Salter, only Salt_128 accepted'
|
|
44
|
+
);
|
|
34
45
|
}
|
|
35
46
|
} else {
|
|
36
47
|
throw e;
|
|
@@ -38,52 +49,72 @@ export class Salter extends Matter {
|
|
|
38
49
|
}
|
|
39
50
|
|
|
40
51
|
if (this.code != MtrDex.Salt_128) {
|
|
41
|
-
throw new Error(
|
|
52
|
+
throw new Error('invalid code for Salter, only Salt_128 accepted');
|
|
42
53
|
}
|
|
43
54
|
|
|
44
|
-
this._tier = tier !== null ? tier : Tier.low
|
|
55
|
+
this._tier = tier !== null ? tier : Tier.low;
|
|
45
56
|
}
|
|
46
57
|
|
|
47
|
-
private stretch(
|
|
58
|
+
private stretch(
|
|
59
|
+
size: number = 32,
|
|
60
|
+
path: string = '',
|
|
61
|
+
tier: Tier | null = null,
|
|
62
|
+
temp: boolean = false
|
|
63
|
+
): Uint8Array {
|
|
48
64
|
tier = tier == null ? this.tier : tier;
|
|
49
65
|
|
|
50
|
-
let opslimit: number, memlimit: number
|
|
66
|
+
let opslimit: number, memlimit: number;
|
|
51
67
|
|
|
68
|
+
// Harcoded values based on keripy
|
|
52
69
|
if (temp) {
|
|
53
|
-
opslimit = libsodium.crypto_pwhash_OPSLIMIT_MIN
|
|
54
|
-
memlimit = libsodium.crypto_pwhash_MEMLIMIT_MIN
|
|
55
|
-
|
|
70
|
+
opslimit = 1; //libsodium.crypto_pwhash_OPSLIMIT_MIN
|
|
71
|
+
memlimit = 8192; //libsodium.crypto_pwhash_MEMLIMIT_MIN
|
|
56
72
|
} else {
|
|
57
73
|
switch (tier) {
|
|
58
74
|
case Tier.low:
|
|
59
|
-
opslimit = libsodium.crypto_pwhash_OPSLIMIT_INTERACTIVE
|
|
60
|
-
memlimit = libsodium.crypto_pwhash_MEMLIMIT_INTERACTIVE
|
|
75
|
+
opslimit = 2; //libsodium.crypto_pwhash_OPSLIMIT_INTERACTIVE
|
|
76
|
+
memlimit = 67108864; //libsodium.crypto_pwhash_MEMLIMIT_INTERACTIVE
|
|
61
77
|
break;
|
|
62
78
|
case Tier.med:
|
|
63
|
-
opslimit = libsodium.crypto_pwhash_OPSLIMIT_MODERATE
|
|
64
|
-
memlimit = libsodium.crypto_pwhash_MEMLIMIT_MODERATE
|
|
79
|
+
opslimit = 3; //libsodium.crypto_pwhash_OPSLIMIT_MODERATE
|
|
80
|
+
memlimit = 268435456; //libsodium.crypto_pwhash_MEMLIMIT_MODERATE
|
|
65
81
|
break;
|
|
66
82
|
case Tier.high:
|
|
67
|
-
opslimit = libsodium.crypto_pwhash_OPSLIMIT_SENSITIVE
|
|
68
|
-
memlimit = libsodium.crypto_pwhash_MEMLIMIT_SENSITIVE
|
|
83
|
+
opslimit = 4; //libsodium.crypto_pwhash_OPSLIMIT_SENSITIVE
|
|
84
|
+
memlimit = 1073741824; //libsodium.crypto_pwhash_MEMLIMIT_SENSITIVE
|
|
69
85
|
break;
|
|
70
86
|
default:
|
|
71
|
-
throw new Error(`Unsupported security tier = ${tier}.`)
|
|
87
|
+
throw new Error(`Unsupported security tier = ${tier}.`);
|
|
72
88
|
}
|
|
73
89
|
}
|
|
74
90
|
|
|
75
|
-
return libsodium.crypto_pwhash(
|
|
91
|
+
return libsodium.crypto_pwhash(
|
|
92
|
+
size,
|
|
93
|
+
path,
|
|
94
|
+
this.raw,
|
|
95
|
+
opslimit,
|
|
96
|
+
memlimit,
|
|
97
|
+
libsodium.crypto_pwhash_ALG_ARGON2ID13
|
|
98
|
+
);
|
|
76
99
|
}
|
|
77
100
|
|
|
78
|
-
signer(
|
|
79
|
-
|
|
80
|
-
|
|
101
|
+
signer(
|
|
102
|
+
code: string = MtrDex.Ed25519_Seed,
|
|
103
|
+
transferable: boolean = true,
|
|
104
|
+
path: string = '',
|
|
105
|
+
tier: Tier | null = null,
|
|
106
|
+
temp: boolean = false
|
|
107
|
+
): Signer {
|
|
108
|
+
const seed = this.stretch(Matter._rawSize(code), path, tier, temp);
|
|
81
109
|
|
|
82
|
-
return new Signer({
|
|
110
|
+
return new Signer({
|
|
111
|
+
raw: seed,
|
|
112
|
+
code: code,
|
|
113
|
+
transferable: transferable,
|
|
114
|
+
});
|
|
83
115
|
}
|
|
84
116
|
|
|
85
117
|
get tier(): Tier | null {
|
|
86
118
|
return this._tier;
|
|
87
119
|
}
|
|
88
|
-
|
|
89
|
-
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Matter, MatterArgs, MtrDex } from './matter';
|
|
2
|
+
import { intToBytes, bytesToInt } from './utils';
|
|
3
|
+
/**
|
|
4
|
+
* @description Seqner: subclass of Matter, cryptographic material, for ordinal numbers
|
|
5
|
+
* such as sequence numbers or first seen ordering numbers.
|
|
6
|
+
* Seqner provides fully qualified format for ordinals (sequence numbers etc)
|
|
7
|
+
* when provided as attached cryptographic material elements.
|
|
8
|
+
*/
|
|
9
|
+
export class Seqner extends Matter {
|
|
10
|
+
constructor({
|
|
11
|
+
raw,
|
|
12
|
+
code = MtrDex.Salt_128,
|
|
13
|
+
qb64,
|
|
14
|
+
qb64b,
|
|
15
|
+
qb2,
|
|
16
|
+
sn,
|
|
17
|
+
snh,
|
|
18
|
+
...kwa
|
|
19
|
+
}: MatterArgs & { sn?: number; snh?: string }) {
|
|
20
|
+
if (!raw && !qb64b && !qb64 && !qb2) {
|
|
21
|
+
if (sn === undefined) {
|
|
22
|
+
if (snh === undefined) {
|
|
23
|
+
sn = 0;
|
|
24
|
+
} else {
|
|
25
|
+
sn = parseInt(snh, 16);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
raw = intToBytes(sn, Matter._rawSize(MtrDex.Salt_128));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
super({ raw, code, qb64, qb64b, qb2, ...kwa });
|
|
33
|
+
|
|
34
|
+
if (this.code !== MtrDex.Salt_128) {
|
|
35
|
+
throw new Error(`Invalid code = ${this.code} for Seqner.`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
get sn(): number {
|
|
40
|
+
return bytesToInt(this.raw); //To check if other readUInt64 is needed
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
get snh(): string {
|
|
44
|
+
return this.sn.toString(16);
|
|
45
|
+
}
|
|
46
|
+
}
|
package/src/keri/core/serder.ts
CHANGED
|
@@ -1,34 +1,53 @@
|
|
|
1
|
-
import {MtrDex} from
|
|
2
|
-
import {
|
|
1
|
+
import { MtrDex } from './matter';
|
|
2
|
+
import {
|
|
3
|
+
deversify,
|
|
4
|
+
Dict,
|
|
5
|
+
Ident,
|
|
6
|
+
Serials,
|
|
7
|
+
versify,
|
|
8
|
+
Version,
|
|
9
|
+
Versionage,
|
|
10
|
+
} from './core';
|
|
11
|
+
import { Verfer } from './verfer';
|
|
12
|
+
import { Diger } from './diger';
|
|
13
|
+
import { CesrNumber } from './number';
|
|
3
14
|
|
|
4
15
|
export class Serder {
|
|
5
16
|
private _kind: Serials;
|
|
6
|
-
private _raw: string =
|
|
17
|
+
private _raw: string = '';
|
|
7
18
|
private _ked: Dict<any> = {};
|
|
8
19
|
private _ident: Ident = Ident.KERI;
|
|
9
20
|
private _size: number = 0;
|
|
10
21
|
private _version: Version = Versionage;
|
|
11
22
|
private readonly _code: string;
|
|
12
23
|
|
|
13
|
-
constructor(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
24
|
+
constructor(
|
|
25
|
+
ked: Dict<any>,
|
|
26
|
+
kind: Serials = Serials.JSON,
|
|
27
|
+
code: string = MtrDex.Blake3_256
|
|
28
|
+
) {
|
|
29
|
+
this._code = code;
|
|
30
|
+
this._kind = kind;
|
|
31
|
+
this.ked = ked;
|
|
17
32
|
}
|
|
18
33
|
|
|
19
34
|
set ked(ked: Dict<any>) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
this._raw = raw
|
|
23
|
-
this._ident = ident
|
|
24
|
-
this._ked = kd
|
|
25
|
-
this._kind = kind
|
|
26
|
-
this._size = size
|
|
27
|
-
this._version = version
|
|
35
|
+
const [raw, ident, kind, kd, version] = this._exhale(ked, this._kind);
|
|
36
|
+
const size = raw.length;
|
|
37
|
+
this._raw = raw;
|
|
38
|
+
this._ident = ident;
|
|
39
|
+
this._ked = kd;
|
|
40
|
+
this._kind = kind;
|
|
41
|
+
this._size = size;
|
|
42
|
+
this._version = version;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
get pre(): string {
|
|
46
|
+
return this._ked['i'];
|
|
28
47
|
}
|
|
29
48
|
|
|
30
49
|
get ked(): Dict<any> {
|
|
31
|
-
return this._ked
|
|
50
|
+
return this._ked;
|
|
32
51
|
}
|
|
33
52
|
|
|
34
53
|
get code(): string {
|
|
@@ -39,61 +58,106 @@ export class Serder {
|
|
|
39
58
|
return this._raw;
|
|
40
59
|
}
|
|
41
60
|
|
|
61
|
+
get sner(): CesrNumber {
|
|
62
|
+
return new CesrNumber({}, this.ked['s']);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
get sn(): number {
|
|
66
|
+
return this.sner.num;
|
|
67
|
+
}
|
|
68
|
+
|
|
42
69
|
get kind(): Serials {
|
|
43
|
-
return this._kind
|
|
70
|
+
return this._kind;
|
|
44
71
|
}
|
|
45
72
|
|
|
46
|
-
private _exhale(
|
|
47
|
-
|
|
73
|
+
private _exhale(
|
|
74
|
+
ked: Dict<any>,
|
|
75
|
+
kind: Serials
|
|
76
|
+
): [string, Ident, Serials, Dict<any>, Version] {
|
|
77
|
+
return sizeify(ked, kind);
|
|
48
78
|
}
|
|
49
79
|
|
|
50
80
|
get ident(): Ident {
|
|
51
|
-
return this._ident
|
|
81
|
+
return this._ident;
|
|
52
82
|
}
|
|
53
83
|
|
|
54
84
|
get size(): number {
|
|
55
|
-
return this._size
|
|
85
|
+
return this._size;
|
|
56
86
|
}
|
|
57
87
|
|
|
58
88
|
get version(): Version {
|
|
59
|
-
return this._version
|
|
89
|
+
return this._version;
|
|
90
|
+
}
|
|
91
|
+
get verfers(): Verfer[] {
|
|
92
|
+
let keys: any = [];
|
|
93
|
+
if ('k' in this._ked) {
|
|
94
|
+
// establishment event
|
|
95
|
+
keys = this._ked['k'];
|
|
96
|
+
} else {
|
|
97
|
+
// non-establishment event
|
|
98
|
+
keys = [];
|
|
99
|
+
}
|
|
100
|
+
// create a new Verfer for each key
|
|
101
|
+
const verfers = [];
|
|
102
|
+
for (const key of keys) {
|
|
103
|
+
verfers.push(new Verfer({ qb64: key }));
|
|
104
|
+
}
|
|
105
|
+
return verfers;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
get digers(): Diger[] {
|
|
109
|
+
let keys: any = [];
|
|
110
|
+
if ('n' in this._ked) {
|
|
111
|
+
// establishment event
|
|
112
|
+
keys = this._ked['n'];
|
|
113
|
+
} else {
|
|
114
|
+
// non-establishment event
|
|
115
|
+
keys = [];
|
|
116
|
+
}
|
|
117
|
+
// create a new Verfer for each key
|
|
118
|
+
const digers = [];
|
|
119
|
+
for (const key of keys) {
|
|
120
|
+
digers.push(new Diger({ qb64: key }));
|
|
121
|
+
}
|
|
122
|
+
return digers;
|
|
60
123
|
}
|
|
61
124
|
|
|
62
125
|
pretty() {
|
|
63
|
-
return JSON.stringify(this._ked, undefined, 2)
|
|
126
|
+
return JSON.stringify(this._ked, undefined, 2);
|
|
64
127
|
}
|
|
65
128
|
}
|
|
66
129
|
|
|
67
130
|
export function dumps(ked: Object, kind: Serials.JSON): string {
|
|
68
131
|
if (kind == Serials.JSON) {
|
|
69
|
-
return JSON.stringify(ked)
|
|
132
|
+
return JSON.stringify(ked);
|
|
70
133
|
} else {
|
|
71
|
-
throw new Error(
|
|
134
|
+
throw new Error('unsupported event encoding');
|
|
72
135
|
}
|
|
73
136
|
}
|
|
74
137
|
|
|
75
|
-
export function sizeify(
|
|
76
|
-
|
|
77
|
-
|
|
138
|
+
export function sizeify(
|
|
139
|
+
ked: Dict<any>,
|
|
140
|
+
kind?: Serials
|
|
141
|
+
): [string, Ident, Serials, Dict<any>, Version] {
|
|
142
|
+
if (!('v' in ked)) {
|
|
143
|
+
throw new Error('Missing or empty version string');
|
|
78
144
|
}
|
|
79
145
|
|
|
80
|
-
|
|
81
|
-
let [knd, version,] = deversify(ked["v"] as string)
|
|
146
|
+
const [ident, knd, version] = deversify(ked['v'] as string);
|
|
82
147
|
if (version != Versionage) {
|
|
83
|
-
throw new Error(`unsupported version ${version.toString()}`)
|
|
148
|
+
throw new Error(`unsupported version ${version.toString()}`);
|
|
84
149
|
}
|
|
85
150
|
|
|
86
151
|
if (kind == undefined) {
|
|
87
|
-
kind = knd
|
|
152
|
+
kind = knd;
|
|
88
153
|
}
|
|
89
154
|
|
|
90
|
-
let raw = dumps(ked, kind)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
ked['v'] = versify(ident, version, kind, size)
|
|
155
|
+
let raw = dumps(ked, kind);
|
|
156
|
+
const size = raw.length;
|
|
94
157
|
|
|
95
|
-
|
|
158
|
+
ked['v'] = versify(ident, version, kind, size);
|
|
96
159
|
|
|
97
|
-
|
|
160
|
+
raw = dumps(ked, kind);
|
|
98
161
|
|
|
162
|
+
return [raw, ident, kind, ked, version];
|
|
99
163
|
}
|