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
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Matter, MatterArgs, NumDex } from './matter';
|
|
2
|
+
import { bytesToInt, intToBytes } from './utils';
|
|
3
|
+
|
|
4
|
+
export class CesrNumber extends Matter {
|
|
5
|
+
constructor(
|
|
6
|
+
{ raw, code, qb64b, qb64, qb2 }: MatterArgs,
|
|
7
|
+
num?: number | string,
|
|
8
|
+
numh?: string
|
|
9
|
+
) {
|
|
10
|
+
let _num;
|
|
11
|
+
if (
|
|
12
|
+
raw == undefined &&
|
|
13
|
+
qb64 == undefined &&
|
|
14
|
+
qb64b == undefined &&
|
|
15
|
+
qb2 == undefined
|
|
16
|
+
) {
|
|
17
|
+
if (typeof num == 'number') {
|
|
18
|
+
_num = num;
|
|
19
|
+
} else if (numh != undefined) {
|
|
20
|
+
_num = parseInt(numh, 16);
|
|
21
|
+
} else {
|
|
22
|
+
_num = 0;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (_num == undefined) {
|
|
27
|
+
throw new Error('Invalid whole number');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (_num <= 256 ** 2 - 1) {
|
|
31
|
+
// make short version of code
|
|
32
|
+
code = NumDex.Short;
|
|
33
|
+
} else if (_num <= 256 ** 4 - 1) {
|
|
34
|
+
// make long version of code
|
|
35
|
+
code = code = NumDex.Long;
|
|
36
|
+
} else if (_num <= 256 ** 8 - 1) {
|
|
37
|
+
// make big version of code
|
|
38
|
+
code = code = NumDex.Big;
|
|
39
|
+
} else if (_num <= 256 ** 16 - 1) {
|
|
40
|
+
// make huge version of code
|
|
41
|
+
code = code = NumDex.Huge;
|
|
42
|
+
} else {
|
|
43
|
+
throw new Error('Invalid num = {num}, too large to encode.');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
raw = intToBytes(_num, Matter._rawSize(code));
|
|
47
|
+
|
|
48
|
+
super({ raw, code, qb64b, qb64, qb2 });
|
|
49
|
+
|
|
50
|
+
if (!NumDex.has(this.code)) {
|
|
51
|
+
throw new Error('Invalid code ' + code + ' for Number');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
get num(): number {
|
|
56
|
+
return bytesToInt(this.raw);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
get numh(): string {
|
|
60
|
+
return this.num.toString(16);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
get positive(): boolean {
|
|
64
|
+
return this.num > 0;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { Bexter, Reb64 } from './bexter';
|
|
2
|
+
import { MatterArgs, MtrDex } from './matter';
|
|
3
|
+
import { EmptyMaterialError } from './kering';
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
Pather is a subclass of Bexter that provides SAD Path language specific functionality
|
|
7
|
+
for variable length strings that only contain Base64 URL safe characters. Pather allows
|
|
8
|
+
the specification of SAD Paths as a list of field components which will be converted to the
|
|
9
|
+
Base64 URL safe character representation.
|
|
10
|
+
|
|
11
|
+
Additionally, Pather provides .rawify for extracting and serializing the content targeted by
|
|
12
|
+
.path for a SAD, represented as an instance of Serder. Pather enforces Base64 URL character
|
|
13
|
+
safety by leveraging the fact that SADs must have static field ordering. Any field label can
|
|
14
|
+
be replaced by its field ordinal to allow for path specification and traversal for any field
|
|
15
|
+
labels that contain non-Base64 URL safe characters.
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
Examples: strings:
|
|
19
|
+
path = []
|
|
20
|
+
text = "-"
|
|
21
|
+
qb64 = '6AABAAA-'
|
|
22
|
+
|
|
23
|
+
path = ["A"]
|
|
24
|
+
text = "-A"
|
|
25
|
+
qb64 = '5AABAA-A'
|
|
26
|
+
|
|
27
|
+
path = ["A", "B"]
|
|
28
|
+
text = "-A-B"
|
|
29
|
+
qb64 = '4AAB-A-B'
|
|
30
|
+
|
|
31
|
+
path = ["A", 1, "B", 3]
|
|
32
|
+
text = "-A-1-B-3"
|
|
33
|
+
qb64 = '4AAC-A-1-B-3'
|
|
34
|
+
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
export class Pather extends Bexter {
|
|
38
|
+
constructor(
|
|
39
|
+
{ raw, code = MtrDex.StrB64_L0, qb64b, qb64, qb2 }: MatterArgs,
|
|
40
|
+
bext?: string,
|
|
41
|
+
path?: string[]
|
|
42
|
+
) {
|
|
43
|
+
if (
|
|
44
|
+
raw === undefined &&
|
|
45
|
+
bext === undefined &&
|
|
46
|
+
qb64b === undefined &&
|
|
47
|
+
qb64 === undefined &&
|
|
48
|
+
qb2 === undefined
|
|
49
|
+
) {
|
|
50
|
+
if (path === undefined)
|
|
51
|
+
throw new EmptyMaterialError('Missing bext string.');
|
|
52
|
+
|
|
53
|
+
bext = Pather._bextify(path);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
super({ raw, code, qb64b, qb64, qb2 }, bext);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// TODO: implement SAD access methods like resolve, root, strip, startswith and tail
|
|
60
|
+
|
|
61
|
+
get path(): string[] {
|
|
62
|
+
if (!this.bext.startsWith('-')) {
|
|
63
|
+
throw new Error('invalid SAD ptr');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
let path = this.bext;
|
|
67
|
+
while (path.charAt(0) === '-') {
|
|
68
|
+
path = path.substring(1);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const apath = path.split('-');
|
|
72
|
+
if (apath[0] !== '') {
|
|
73
|
+
return apath;
|
|
74
|
+
} else {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
static _bextify(path: any[]): string {
|
|
80
|
+
const vath = [];
|
|
81
|
+
for (const p of path) {
|
|
82
|
+
let sp = '';
|
|
83
|
+
if (typeof p === 'number') {
|
|
84
|
+
sp = p.toString();
|
|
85
|
+
} else {
|
|
86
|
+
sp = p;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const match = Reb64.exec(sp);
|
|
90
|
+
if (!match) {
|
|
91
|
+
throw new Error(`"Non Base64 path component = ${p}.`);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
vath.push(sp);
|
|
95
|
+
}
|
|
96
|
+
return '-' + vath.join('-');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { Matter, MatterArgs, MtrDex } from './matter';
|
|
2
|
+
import { EmptyMaterialError } from './kering';
|
|
3
|
+
import { Dict, Ilks } from './core';
|
|
4
|
+
import { sizeify } from './serder';
|
|
5
|
+
import { Verfer } from './verfer';
|
|
6
|
+
|
|
7
|
+
import { blake3 } from '@noble/hashes/blake3';
|
|
8
|
+
|
|
9
|
+
const Dummy: string = '#';
|
|
10
|
+
|
|
11
|
+
export class Prefixer extends Matter {
|
|
12
|
+
private readonly _derive: Function | undefined;
|
|
13
|
+
private readonly _verify: Function | undefined;
|
|
14
|
+
|
|
15
|
+
constructor({ raw, code, qb64b, qb64, qb2 }: MatterArgs, ked?: Dict<any>) {
|
|
16
|
+
try {
|
|
17
|
+
super({ raw, code, qb64b, qb64, qb2 });
|
|
18
|
+
} catch (e) {
|
|
19
|
+
if (e instanceof EmptyMaterialError) {
|
|
20
|
+
if (ked == undefined || (code == undefined && !('i' in ked))) {
|
|
21
|
+
throw e;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (code == undefined) {
|
|
25
|
+
super({ qb64: ked['i'], code: code });
|
|
26
|
+
code = this.code;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let _derive;
|
|
30
|
+
if (code == MtrDex.Ed25519N) {
|
|
31
|
+
_derive = Prefixer._derive_ed25519N;
|
|
32
|
+
} else if (code == MtrDex.Ed25519) {
|
|
33
|
+
_derive = Prefixer._derive_ed25519;
|
|
34
|
+
} else if (code == MtrDex.Blake3_256) {
|
|
35
|
+
_derive = Prefixer._derive_blake3_256;
|
|
36
|
+
} else {
|
|
37
|
+
throw new Error(`Unsupported code = ${code} for prefixer.`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
[raw, code] = _derive(ked);
|
|
41
|
+
super({ raw: raw, code: code });
|
|
42
|
+
this._derive = _derive;
|
|
43
|
+
} else {
|
|
44
|
+
throw e;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (this.code == MtrDex.Ed25519N) {
|
|
49
|
+
this._verify = this._verify_ed25519N;
|
|
50
|
+
} else if (this.code == MtrDex.Ed25519) {
|
|
51
|
+
this._verify = this._verify_ed25519;
|
|
52
|
+
} else if (this.code == MtrDex.Blake3_256) {
|
|
53
|
+
this._verify = this._verify_blake3_256;
|
|
54
|
+
} else {
|
|
55
|
+
throw new Error(`Unsupported code = ${code} for prefixer.`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
derive(ked: Dict<any>): [Uint8Array, string] {
|
|
60
|
+
if (ked['i'] != Ilks.icp) {
|
|
61
|
+
throw new Error(
|
|
62
|
+
`Non-incepting ilk ${ked['i']} for prefix derivation`
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
return this._derive!(ked);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
verify(ked: Dict<any>, prefixed: boolean = false): boolean {
|
|
69
|
+
if (ked['i'] != Ilks.icp) {
|
|
70
|
+
throw new Error(
|
|
71
|
+
`Non-incepting ilk ${ked['i']} for prefix derivation`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
return this._verify!(ked, this.qb64, prefixed);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
static _derive_ed25519N(ked: Dict<any>): [Uint8Array, string] {
|
|
78
|
+
let verfer;
|
|
79
|
+
const keys = ked['k'];
|
|
80
|
+
if (keys.length != 1) {
|
|
81
|
+
throw new Error(
|
|
82
|
+
`Basic derivation needs at most 1 key got ${keys.length} keys instead`
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
verfer = new Verfer({ qb64: keys[0] });
|
|
87
|
+
} catch (e) {
|
|
88
|
+
throw new Error(`Error extracting public key = ${e}`);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (!(verfer.code in [MtrDex.Ed25519N])) {
|
|
92
|
+
throw new Error(`Mismatch derivation code = ${verfer.code}`);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const next = 'n' in ked ? ked['n'] : [];
|
|
96
|
+
if (verfer.code == MtrDex.Ed25519N && next.length > 0) {
|
|
97
|
+
throw new Error(
|
|
98
|
+
`Non-empty nxt = ${next} for non-transferable code = ${verfer.code}`
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const backers = 'b' in ked ? ked['b'] : [];
|
|
103
|
+
if (verfer.code == MtrDex.Ed25519N && backers.length > 0) {
|
|
104
|
+
throw new Error(
|
|
105
|
+
`Non-empty b =${backers} for non-transferable code = ${verfer.code}`
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const anchor = 'a' in ked ? ked['a'] : [];
|
|
110
|
+
if (verfer.code == MtrDex.Ed25519N && anchor.length > 0) {
|
|
111
|
+
throw new Error(
|
|
112
|
+
`Non-empty a = ${verfer.code} for non-transferable code = ${verfer.code}`
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return [verfer.raw, verfer.code];
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
static _derive_ed25519(ked: Dict<any>): [Uint8Array, string] {
|
|
120
|
+
let verfer;
|
|
121
|
+
const keys = ked['k'];
|
|
122
|
+
if (keys.length != 1) {
|
|
123
|
+
throw new Error(
|
|
124
|
+
`Basic derivation needs at most 1 key got ${keys.length} keys instead`
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
try {
|
|
129
|
+
verfer = new Verfer({ qb64: keys[0] });
|
|
130
|
+
} catch (e) {
|
|
131
|
+
throw new Error(`Error extracting public key = ${e}`);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (verfer.code in [MtrDex.Ed25519]) {
|
|
135
|
+
throw new Error(`Mismatch derivation code = ${verfer.code}`);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return [verfer.raw, verfer.code];
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
static _derive_blake3_256(ked: Dict<any>): [Uint8Array, string] {
|
|
142
|
+
const kd = ked;
|
|
143
|
+
const ilk = ked['t'];
|
|
144
|
+
if (![Ilks.icp, Ilks.dip, Ilks.vcp, Ilks.dip].includes(ilk)) {
|
|
145
|
+
throw new Error(`Invalid ilk = ${ilk} to derive pre.`);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
kd['i'] = ''.padStart(Matter.Sizes.get(MtrDex.Blake3_256)!.fs!, Dummy);
|
|
149
|
+
kd['d'] = ked['i'];
|
|
150
|
+
const [raw] = sizeify(ked);
|
|
151
|
+
const dig = Buffer.from(
|
|
152
|
+
blake3.create({ dkLen: 32 }).update(raw).digest()
|
|
153
|
+
);
|
|
154
|
+
return [dig, MtrDex.Blake3_256];
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
_verify_ed25519N(
|
|
158
|
+
ked: Dict<any>,
|
|
159
|
+
pre: string,
|
|
160
|
+
prefixed: boolean = false
|
|
161
|
+
): boolean {
|
|
162
|
+
try {
|
|
163
|
+
const keys = ked['k'];
|
|
164
|
+
if (keys.length != 1) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (keys[0] != pre) {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (prefixed && ked['i'] != pre) {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const next = 'n' in ked ? ked['n'] : [];
|
|
177
|
+
if (next.length > 0) {
|
|
178
|
+
// must be empty
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
} catch (e) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
_verify_ed25519(
|
|
189
|
+
ked: Dict<any>,
|
|
190
|
+
pre: string,
|
|
191
|
+
prefixed: boolean = false
|
|
192
|
+
): boolean {
|
|
193
|
+
try {
|
|
194
|
+
const keys = ked['k'];
|
|
195
|
+
if (keys.length != 1) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (keys[0] != pre) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (prefixed && ked['i'] != pre) {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
} catch (e) {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
_verify_blake3_256(
|
|
214
|
+
ked: Dict<any>,
|
|
215
|
+
pre: string,
|
|
216
|
+
prefixed: boolean = false
|
|
217
|
+
): boolean {
|
|
218
|
+
try {
|
|
219
|
+
const [raw] = Prefixer._derive_blake3_256(ked);
|
|
220
|
+
const crymat = new Matter({ raw: raw, code: MtrDex.Blake3_256 });
|
|
221
|
+
if (crymat.qb64 != pre) {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (prefixed && ked['i'] != pre) {
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
} catch (e) {
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
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
|
+
|
|
6
|
+
import { blake3 } from '@noble/hashes/blake3';
|
|
7
|
+
|
|
8
|
+
const Dummy = '#';
|
|
9
|
+
|
|
10
|
+
export enum Ids {
|
|
11
|
+
d = 'd',
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
class Digestage {
|
|
15
|
+
public klas: any = undefined;
|
|
16
|
+
public size: number | undefined = 0;
|
|
17
|
+
public length: number | undefined = 0;
|
|
18
|
+
constructor(klas: any, size?: number, length?: number) {
|
|
19
|
+
this.klas = klas;
|
|
20
|
+
this.size = size;
|
|
21
|
+
this.length = length;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export class Saider extends Matter {
|
|
26
|
+
static Digests = new Map<string, Digestage>([
|
|
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
|
+
) {
|
|
39
|
+
try {
|
|
40
|
+
super({ raw, code, qb64b, qb64, qb2 });
|
|
41
|
+
} catch (e) {
|
|
42
|
+
if (e instanceof EmptyMaterialError) {
|
|
43
|
+
if (sad == undefined || !(label in sad)) {
|
|
44
|
+
throw e;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (code == undefined) {
|
|
48
|
+
if (sad[label] != '') {
|
|
49
|
+
super({ qb64: sad[label], code: code });
|
|
50
|
+
code = this.code;
|
|
51
|
+
} else {
|
|
52
|
+
code = MtrDex.Blake3_256;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (!DigiDex.has(code)) {
|
|
57
|
+
throw new Error(`Unsupported digest code = ${code}`);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
[raw] = Saider._derive({ ...sad }, code, kind, label);
|
|
61
|
+
super({ raw: raw, code: code });
|
|
62
|
+
} else {
|
|
63
|
+
throw e;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (!this.digestive) {
|
|
68
|
+
throw new Error(`Unsupported digest code = ${this.code}.`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
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());
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private static _derive(
|
|
81
|
+
sad: Dict<any>,
|
|
82
|
+
code: string,
|
|
83
|
+
kind: Serials | undefined,
|
|
84
|
+
label: string
|
|
85
|
+
): [Uint8Array, Dict<any>] {
|
|
86
|
+
if (!DigiDex.has(code) || !Saider.Digests.has(code)) {
|
|
87
|
+
throw new Error(`Unsupported digest code = ${code}.`);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
sad = { ...sad };
|
|
91
|
+
sad[label] = ''.padStart(Matter.Sizes.get(code)!.fs!, Dummy);
|
|
92
|
+
if ('v' in sad) {
|
|
93
|
+
[, , kind, sad] = sizeify(sad, kind);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const ser = { ...sad };
|
|
97
|
+
|
|
98
|
+
const digestage = Saider.Digests.get(code);
|
|
99
|
+
|
|
100
|
+
const cpa = Saider._serialze(ser, kind);
|
|
101
|
+
const args: any[] = [];
|
|
102
|
+
if (digestage!.size != undefined) {
|
|
103
|
+
args.push(digestage!.size);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (digestage!.length != undefined) {
|
|
107
|
+
args.push(digestage!.length);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return [digestage!.klas(cpa, ...args), sad];
|
|
111
|
+
}
|
|
112
|
+
|
|
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);
|
|
121
|
+
}
|
|
122
|
+
|
|
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 {
|
|
130
|
+
try {
|
|
131
|
+
const [raw, dsad] = Saider._derive(sad, this.code, kind, label);
|
|
132
|
+
const saider = new Saider({ raw: raw, code: this.code });
|
|
133
|
+
if (this.qb64 != saider.qb64) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if ('v' in sad && versioned) {
|
|
138
|
+
if (sad['v'] != dsad['v']) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (prefixed && sad[label] != this.qb64) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
} catch (e) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
private static _serialze(sad: Dict<any>, kind?: Serials): string {
|
|
154
|
+
let knd = Serials.JSON;
|
|
155
|
+
if ('v' in sad) {
|
|
156
|
+
[, knd] = deversify(sad['v']);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (kind == undefined) {
|
|
160
|
+
kind = knd;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return dumps(sad, kind);
|
|
164
|
+
}
|
|
165
|
+
|
|
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>] {
|
|
172
|
+
if (!(label in sad)) {
|
|
173
|
+
throw new Error(`Missing id field labeled=${label} in sad.`);
|
|
174
|
+
}
|
|
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];
|
|
185
|
+
}
|
|
186
|
+
}
|