signify-ts 0.2.0 → 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 +191 -67
- 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 -7835
- 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 -7811
- 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 -820
- 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
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
import { b, concat, Protocols, Ilks, Serials, versify, Vrsn_1_0, } from "./core.js";
|
|
2
|
+
import { Tholder } from "./tholder.js";
|
|
3
|
+
import { CesrNumber } from "./number.js";
|
|
4
|
+
import { Prefixer } from "./prefixer.js";
|
|
5
|
+
import { Serder } from "./serder.js";
|
|
6
|
+
import { MtrDex, NonTransDex } from "./matter.js";
|
|
7
|
+
import { Saider } from "./saider.js";
|
|
8
|
+
import { Counter, CtrDex } from "./counter.js";
|
|
9
|
+
import { Seqner } from "./seqner.js";
|
|
10
|
+
const MaxIntThold = 2 ** 32 - 1;
|
|
11
|
+
export function rotate({ pre = undefined, keys, dig = undefined, ilk = Ilks.rot, sn = 1, isith = undefined, ndigs = undefined, nsith = undefined, wits = undefined, cuts = [], adds = [], toad = undefined, data = undefined, version = undefined, kind = undefined, intive = true, }) {
|
|
12
|
+
const vs = versify(Protocols.KERI, version, kind, 0);
|
|
13
|
+
const _ilk = ilk;
|
|
14
|
+
if (_ilk != Ilks.rot && _ilk != Ilks.drt) {
|
|
15
|
+
throw new Error(`Invalid ilk = ${ilk} for rot or drt.`);
|
|
16
|
+
}
|
|
17
|
+
const sner = new CesrNumber({}, sn);
|
|
18
|
+
if (sner.num < 1) {
|
|
19
|
+
throw new Error(`Invalid sn = 0x${sner.numh} for rot or drt.`);
|
|
20
|
+
}
|
|
21
|
+
let _isit;
|
|
22
|
+
if (isith == undefined) {
|
|
23
|
+
_isit = Math.max(1, Math.ceil(keys.length / 2));
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
_isit = isith; // TODO this type as number does not make sense when isith is a string containing weighted thresholds
|
|
27
|
+
}
|
|
28
|
+
const tholder = new Tholder({ sith: _isit });
|
|
29
|
+
if (tholder.num != undefined && tholder.num < 1) {
|
|
30
|
+
throw new Error(`Invalid sith = ${tholder.num} less than 1.`);
|
|
31
|
+
}
|
|
32
|
+
if (tholder.size > keys.length) {
|
|
33
|
+
// TODO this error should say that the threshold has not been met
|
|
34
|
+
throw new Error(`Invalid sith = ${tholder.num} for keys = ${keys}`);
|
|
35
|
+
}
|
|
36
|
+
let _ndigs;
|
|
37
|
+
if (ndigs === undefined) {
|
|
38
|
+
_ndigs = [];
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
_ndigs = ndigs;
|
|
42
|
+
}
|
|
43
|
+
let _nsith;
|
|
44
|
+
if (nsith === undefined) {
|
|
45
|
+
_nsith = Math.max(1, Math.ceil(_ndigs.length / 2));
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
_nsith = nsith;
|
|
49
|
+
}
|
|
50
|
+
const ntholder = new Tholder({ sith: _nsith });
|
|
51
|
+
if (ntholder.num != undefined && ntholder.num < 1) {
|
|
52
|
+
throw new Error(`Invalid sith = ${ntholder.num} less than 1.`);
|
|
53
|
+
}
|
|
54
|
+
if (ntholder.size > _ndigs.length) {
|
|
55
|
+
// TODO this error should say that the threshold has not been met
|
|
56
|
+
throw new Error(`Signing threshold failure: ${keys.length} number of signers not equal to or greater than sith = ${tholder.size} for keys = ${keys}`);
|
|
57
|
+
}
|
|
58
|
+
let _wits;
|
|
59
|
+
if (wits === undefined) {
|
|
60
|
+
_wits = [];
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
_wits = wits;
|
|
64
|
+
}
|
|
65
|
+
const witset = new Set(_wits);
|
|
66
|
+
if (witset.size != _wits.length) {
|
|
67
|
+
throw new Error(`Invalid wits = ${wits}, has duplicates.`);
|
|
68
|
+
}
|
|
69
|
+
const cutset = new Set(cuts);
|
|
70
|
+
if (cutset.size != cuts.length) {
|
|
71
|
+
throw new Error(`Invalid cuts = ${cuts}, has duplicates.`);
|
|
72
|
+
}
|
|
73
|
+
const addset = new Set(adds);
|
|
74
|
+
if (addset.size != adds.length) {
|
|
75
|
+
throw new Error(`Invalid adds = ${adds}, has duplicates.`);
|
|
76
|
+
}
|
|
77
|
+
//non empty intersection of witset and addset
|
|
78
|
+
const witaddset = new Set([...witset].filter((x) => addset.has(x)));
|
|
79
|
+
if (witaddset.size > 0) {
|
|
80
|
+
throw new Error(`Invalid member combination among wits = ${wits}, and adds = ${adds}.`);
|
|
81
|
+
}
|
|
82
|
+
// non empty intersection of cutset and addset
|
|
83
|
+
const cutaddset = new Set([...cutset].filter((x) => addset.has(x)));
|
|
84
|
+
if (cutaddset.size > 0) {
|
|
85
|
+
throw new Error(`Invalid member combination among cuts = ${cuts}, and adds = ${adds}.`);
|
|
86
|
+
}
|
|
87
|
+
const newitsetdiff = new Set(_wits);
|
|
88
|
+
cuts.forEach(function (v) {
|
|
89
|
+
newitsetdiff.delete(v);
|
|
90
|
+
});
|
|
91
|
+
const newitset = new Set((function* () {
|
|
92
|
+
yield* newitsetdiff;
|
|
93
|
+
yield* addset;
|
|
94
|
+
})());
|
|
95
|
+
if (newitset.size != witset.size - cutset.size + addset.size) {
|
|
96
|
+
throw new Error(`Invalid member combination among wits = ${wits}, cuts = ${cuts}, and adds = ${adds}.`);
|
|
97
|
+
}
|
|
98
|
+
let _toad;
|
|
99
|
+
if (toad === undefined) {
|
|
100
|
+
if (newitset.size == 0) {
|
|
101
|
+
_toad = 0;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
_toad = ample(newitset.size);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
_toad = toad;
|
|
109
|
+
}
|
|
110
|
+
if (newitset.size > 0) {
|
|
111
|
+
if (_toad < 1 || _toad > newitset.size) {
|
|
112
|
+
throw new Error(`Invalid toad = ${_toad} for wit = ${wits}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
if (_toad != 0) {
|
|
117
|
+
throw new Error(`Invalid toad = ${_toad} for wit = ${wits}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const _sad = {
|
|
121
|
+
v: vs,
|
|
122
|
+
t: _ilk,
|
|
123
|
+
d: '',
|
|
124
|
+
i: pre,
|
|
125
|
+
s: sner.numh,
|
|
126
|
+
p: dig,
|
|
127
|
+
kt: tholder.num &&
|
|
128
|
+
intive &&
|
|
129
|
+
tholder.num !== undefined &&
|
|
130
|
+
tholder.num <= MaxIntThold
|
|
131
|
+
? tholder.num.toString(16)
|
|
132
|
+
: tholder.sith,
|
|
133
|
+
k: keys,
|
|
134
|
+
nt: ntholder.num &&
|
|
135
|
+
intive &&
|
|
136
|
+
ntholder.num !== undefined &&
|
|
137
|
+
ntholder.num <= MaxIntThold
|
|
138
|
+
? ntholder.num.toString(16)
|
|
139
|
+
: ntholder.sith,
|
|
140
|
+
n: _ndigs,
|
|
141
|
+
bt: _toad && intive && _toad !== undefined && _toad <= MaxIntThold
|
|
142
|
+
? _toad
|
|
143
|
+
: _toad.toString(16),
|
|
144
|
+
br: cuts,
|
|
145
|
+
ba: adds,
|
|
146
|
+
a: data != undefined ? data : [],
|
|
147
|
+
};
|
|
148
|
+
const [, sad] = Saider.saidify(_sad);
|
|
149
|
+
return new Serder(sad);
|
|
150
|
+
}
|
|
151
|
+
export function ample(n, f, weak = true) {
|
|
152
|
+
n = Math.max(0, n); // no negatives
|
|
153
|
+
let f1;
|
|
154
|
+
if (f == undefined) {
|
|
155
|
+
f1 = Math.max(1, Math.floor(Math.max(0, n - 1) / 3)); // least floor f subject to n >= 3*f+1
|
|
156
|
+
const f2 = Math.max(1, Math.ceil(Math.max(0, n - 1) / 3)); // most Math.ceil f subject to n >= 3*f+1
|
|
157
|
+
if (weak) {
|
|
158
|
+
// try both fs to see which one has lowest m
|
|
159
|
+
return Math.min(n, Math.ceil((n + f1 + 1) / 2), Math.ceil((n + f2 + 1) / 2));
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
return Math.min(n, Math.max(0, n - f1, Math.ceil((n + f1 + 1) / 2)));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
f = Math.max(0, f);
|
|
167
|
+
const m1 = Math.ceil((n + f + 1) / 2);
|
|
168
|
+
const m2 = Math.max(0, n - f);
|
|
169
|
+
if (m2 < m1 && n > 0) {
|
|
170
|
+
throw new Error(`Invalid f=${f} is too big for n=${n}.`);
|
|
171
|
+
}
|
|
172
|
+
if (weak) {
|
|
173
|
+
return Math.min(n, m1, m2);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
return Math.min(n, Math.max(m1, m2));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
export function incept({ keys, isith, ndigs, nsith, toad, wits, cnfg, data, version = Vrsn_1_0, kind = Serials.JSON, code, intive = false, delpre, }) {
|
|
181
|
+
const vs = versify(Protocols.KERI, version, kind, 0);
|
|
182
|
+
const ilk = delpre == undefined ? Ilks.icp : Ilks.dip;
|
|
183
|
+
const sner = new CesrNumber({}, 0);
|
|
184
|
+
if (isith == undefined) {
|
|
185
|
+
isith = Math.max(1, Math.ceil(keys.length / 2));
|
|
186
|
+
}
|
|
187
|
+
const tholder = new Tholder({ sith: isith });
|
|
188
|
+
if (tholder.num != undefined && tholder.num < 1) {
|
|
189
|
+
throw new Error(`Invalid sith = ${tholder.num} less than 1.`);
|
|
190
|
+
}
|
|
191
|
+
if (tholder.size > keys.length) {
|
|
192
|
+
throw new Error(`Invalid sith = ${tholder.num} for keys ${keys}`);
|
|
193
|
+
}
|
|
194
|
+
if (ndigs == undefined) {
|
|
195
|
+
ndigs = new Array();
|
|
196
|
+
}
|
|
197
|
+
if (nsith == undefined) {
|
|
198
|
+
nsith = Math.max(0, Math.ceil(ndigs.length / 2));
|
|
199
|
+
}
|
|
200
|
+
const ntholder = new Tholder({ sith: nsith });
|
|
201
|
+
if (ntholder.num != undefined && ntholder.num < 0) {
|
|
202
|
+
throw new Error(`Invalid nsith = ${ntholder.num} less than 0.`);
|
|
203
|
+
}
|
|
204
|
+
if (ntholder.size > keys.length) {
|
|
205
|
+
throw new Error(`Invalid nsith = ${ntholder.num} for keys ${ndigs}`);
|
|
206
|
+
}
|
|
207
|
+
wits = wits == undefined ? [] : wits;
|
|
208
|
+
if (new Set(wits).size != wits.length) {
|
|
209
|
+
throw new Error(`Invalid wits = ${wits}, has duplicates.`);
|
|
210
|
+
}
|
|
211
|
+
if (toad == undefined) {
|
|
212
|
+
if (wits.length == 0) {
|
|
213
|
+
toad = 0;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
toad = ample(wits.length);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
const toader = new CesrNumber({}, toad);
|
|
220
|
+
if (wits.length > 0) {
|
|
221
|
+
if (toader.num < 1 || toader.num > wits.length) {
|
|
222
|
+
throw new Error(`Invalid toad = ${toader.num} for wits = ${wits}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
if (toader.num != 0) {
|
|
227
|
+
throw new Error(`Invalid toad = ${toader.num} for wits = ${wits}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
cnfg = cnfg == undefined ? new Array() : cnfg;
|
|
231
|
+
data = data == undefined ? new Array() : data;
|
|
232
|
+
let sad = {
|
|
233
|
+
v: vs,
|
|
234
|
+
t: ilk,
|
|
235
|
+
d: '',
|
|
236
|
+
i: '',
|
|
237
|
+
s: sner.numh,
|
|
238
|
+
kt: intive && tholder.num != undefined ? tholder.num : tholder.sith,
|
|
239
|
+
k: keys,
|
|
240
|
+
nt: intive && tholder.num != undefined ? ntholder.num : ntholder.sith,
|
|
241
|
+
n: ndigs,
|
|
242
|
+
bt: intive ? toader.num : toader.numh,
|
|
243
|
+
b: wits,
|
|
244
|
+
c: cnfg,
|
|
245
|
+
a: data,
|
|
246
|
+
};
|
|
247
|
+
if (delpre != undefined) {
|
|
248
|
+
sad['di'] = delpre;
|
|
249
|
+
if (code == undefined) {
|
|
250
|
+
code = MtrDex.Blake3_256;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
let prefixer;
|
|
254
|
+
if (delpre == undefined && code == undefined && keys.length == 1) {
|
|
255
|
+
prefixer = new Prefixer({ qb64: keys[0] });
|
|
256
|
+
if (prefixer.digestive) {
|
|
257
|
+
throw new Error(`Invalid code, digestive=${prefixer.code}, must be derived from ked.`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
prefixer = new Prefixer({ code: code }, sad);
|
|
262
|
+
if (delpre != undefined) {
|
|
263
|
+
if (!prefixer.digestive) {
|
|
264
|
+
throw new Error(`Invalid derivation code = ${prefixer.code} for delegation. Must be digestive`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
sad['i'] = prefixer.qb64;
|
|
269
|
+
if (prefixer.digestive) {
|
|
270
|
+
sad['d'] = prefixer.qb64;
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
[, sad] = Saider.saidify(sad);
|
|
274
|
+
}
|
|
275
|
+
return new Serder(sad);
|
|
276
|
+
}
|
|
277
|
+
export function messagize(serder, sigers, seal, wigers, cigars, pipelined = false) {
|
|
278
|
+
let msg = new Uint8Array(b(serder.raw));
|
|
279
|
+
let atc = new Uint8Array();
|
|
280
|
+
if (sigers == undefined && wigers == undefined && cigars == undefined) {
|
|
281
|
+
throw new Error(`Missing attached signatures on message = ${serder.sad}.`);
|
|
282
|
+
}
|
|
283
|
+
if (sigers != undefined) {
|
|
284
|
+
if (seal != undefined) {
|
|
285
|
+
if (seal[0] == 'SealEvent') {
|
|
286
|
+
atc = concat(atc, new Counter({ code: CtrDex.TransIdxSigGroups, count: 1 })
|
|
287
|
+
.qb64b);
|
|
288
|
+
atc = concat(atc, new TextEncoder().encode(seal[1].i));
|
|
289
|
+
atc = concat(atc, new Seqner({ sn: parseInt(seal[1].s) }).qb64b);
|
|
290
|
+
atc = concat(atc, new TextEncoder().encode(seal[1].d));
|
|
291
|
+
}
|
|
292
|
+
else if (seal[0] == 'SealLast') {
|
|
293
|
+
atc = concat(atc, new Counter({
|
|
294
|
+
code: CtrDex.TransLastIdxSigGroups,
|
|
295
|
+
count: 1,
|
|
296
|
+
}).qb64b);
|
|
297
|
+
atc = concat(atc, new TextEncoder().encode(seal[1].i));
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
atc = concat(atc, new Counter({
|
|
301
|
+
code: CtrDex.ControllerIdxSigs,
|
|
302
|
+
count: sigers.length,
|
|
303
|
+
}).qb64b);
|
|
304
|
+
sigers.forEach((siger) => {
|
|
305
|
+
atc = concat(atc, siger.qb64b);
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
if (wigers != undefined) {
|
|
309
|
+
atc = concat(atc, new Counter({
|
|
310
|
+
code: CtrDex.ControllerIdxSigs,
|
|
311
|
+
count: wigers.length,
|
|
312
|
+
}).qb64b);
|
|
313
|
+
wigers.forEach((wiger) => {
|
|
314
|
+
if (wiger.verfer && !(wiger.verfer.code in NonTransDex)) {
|
|
315
|
+
throw new Error(`Attempt to use tranferable prefix=${wiger.verfer.qb64} for receipt.`);
|
|
316
|
+
}
|
|
317
|
+
atc = concat(atc, wiger.qb64b);
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
if (cigars != undefined) {
|
|
321
|
+
atc = concat(atc, new Counter({
|
|
322
|
+
code: CtrDex.ControllerIdxSigs,
|
|
323
|
+
count: cigars.length,
|
|
324
|
+
}).qb64b);
|
|
325
|
+
cigars.forEach((cigar) => {
|
|
326
|
+
if (cigar.verfer && !(cigar.verfer.code in NonTransDex)) {
|
|
327
|
+
throw new Error(`Attempt to use tranferable prefix=${cigar.verfer.qb64} for receipt.`);
|
|
328
|
+
}
|
|
329
|
+
atc = concat(atc, cigar.qb64b);
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
if (pipelined) {
|
|
333
|
+
if (atc.length % 4 != 0) {
|
|
334
|
+
throw new Error(`Invalid attachments size=${atc.length}, nonintegral quadlets.`);
|
|
335
|
+
}
|
|
336
|
+
msg = concat(msg, new Counter({
|
|
337
|
+
code: CtrDex.AttachedMaterialQuadlets,
|
|
338
|
+
count: Math.floor(atc.length / 4),
|
|
339
|
+
}).qb64b);
|
|
340
|
+
}
|
|
341
|
+
msg = concat(msg, atc);
|
|
342
|
+
return msg;
|
|
343
|
+
}
|
|
344
|
+
export function interact(args) {
|
|
345
|
+
let { pre, dig, sn, data, version, kind } = args;
|
|
346
|
+
const vs = versify(Protocols.KERI, version, kind, 0);
|
|
347
|
+
const ilk = Ilks.ixn;
|
|
348
|
+
const sner = new CesrNumber({}, sn);
|
|
349
|
+
if (sner.num < 1) {
|
|
350
|
+
throw new Error(`Invalid sn = 0x${sner.numh} for ixn.`);
|
|
351
|
+
}
|
|
352
|
+
data = data == undefined ? new Array() : data;
|
|
353
|
+
let sad = {
|
|
354
|
+
v: vs,
|
|
355
|
+
t: ilk,
|
|
356
|
+
d: '',
|
|
357
|
+
i: pre,
|
|
358
|
+
s: sner.numh,
|
|
359
|
+
p: dig,
|
|
360
|
+
a: data,
|
|
361
|
+
};
|
|
362
|
+
[, sad] = Saider.saidify(sad);
|
|
363
|
+
return new Serder(sad);
|
|
364
|
+
}
|
|
365
|
+
export function reply(route = '', data, stamp, version, kind = Serials.JSON) {
|
|
366
|
+
const vs = versify(Protocols.KERI, version, kind, 0);
|
|
367
|
+
if (data == undefined) {
|
|
368
|
+
data = {};
|
|
369
|
+
}
|
|
370
|
+
const _sad = {
|
|
371
|
+
v: vs,
|
|
372
|
+
t: Ilks.rpy,
|
|
373
|
+
d: '',
|
|
374
|
+
dt: stamp !== null && stamp !== void 0 ? stamp : new Date().toISOString().replace('Z', '000+00:00'),
|
|
375
|
+
r: route,
|
|
376
|
+
a: data,
|
|
377
|
+
};
|
|
378
|
+
const [, sad] = Saider.saidify(_sad);
|
|
379
|
+
const saider = new Saider({ qb64: sad['d'] });
|
|
380
|
+
if (!saider.verify(sad, true, true, kind, 'd'))
|
|
381
|
+
throw new Error(`Invalid said = ${saider.qb64} for reply msg=${sad}.`);
|
|
382
|
+
return new Serder(sad);
|
|
383
|
+
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { Signer } from './signer';
|
|
2
|
-
import { Cigar } from './cigar';
|
|
3
|
-
import { Siger } from './siger';
|
|
1
|
+
import { Signer } from './signer.ts';
|
|
2
|
+
import { Cigar } from './cigar.ts';
|
|
3
|
+
import { Siger } from './siger.ts';
|
|
4
|
+
export declare const HEADER_SIG_INPUT: string;
|
|
5
|
+
export declare const HEADER_SIG_TIME: string;
|
|
4
6
|
export declare function normalize(header: string): string;
|
|
5
7
|
export interface SiginputArgs {
|
|
6
8
|
name: string;
|
|
@@ -14,7 +16,12 @@ export interface SiginputArgs {
|
|
|
14
16
|
keyid?: string;
|
|
15
17
|
context?: string;
|
|
16
18
|
}
|
|
17
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Generates, serializes, and signs a Signature-Input HTTP header value as a structured header
|
|
21
|
+
* @param signer
|
|
22
|
+
* @param sigInputArgs
|
|
23
|
+
*/
|
|
24
|
+
export declare function siginput(signer: Signer, sigInputArgs: SiginputArgs): [Map<string, string>, Siger | Cigar];
|
|
18
25
|
export declare class Unqualified {
|
|
19
26
|
private readonly _raw;
|
|
20
27
|
constructor(raw: Uint8Array);
|
|
@@ -1,53 +1,21 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import { Signer } from './signer';
|
|
9
|
-
import { b } from './core';
|
|
10
|
-
import { Cigar } from './cigar';
|
|
11
|
-
import { nowUTC } from './utils';
|
|
12
|
-
import { Siger } from './siger';
|
|
13
|
-
import Base64 from 'urlsafe-base64';
|
|
14
|
-
import { Buffer } from 'buffer';
|
|
15
|
-
|
|
16
|
-
export function normalize(header: string) {
|
|
1
|
+
import { serializeDictionary, parseDictionary, } from 'structured-headers';
|
|
2
|
+
import { b } from "./core.js";
|
|
3
|
+
import { nowUTC } from "./utils.js";
|
|
4
|
+
import { encodeBase64Url } from "./base64.js";
|
|
5
|
+
export const HEADER_SIG_INPUT = normalize('Signature-Input');
|
|
6
|
+
export const HEADER_SIG_TIME = normalize('Signify-Timestamp');
|
|
7
|
+
export function normalize(header) {
|
|
17
8
|
return header.trim();
|
|
18
9
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
fields
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
alg?: string;
|
|
29
|
-
keyid?: string;
|
|
30
|
-
context?: string;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export function siginput(
|
|
34
|
-
signer: Signer,
|
|
35
|
-
{
|
|
36
|
-
name,
|
|
37
|
-
method,
|
|
38
|
-
path,
|
|
39
|
-
headers,
|
|
40
|
-
fields,
|
|
41
|
-
expires,
|
|
42
|
-
nonce,
|
|
43
|
-
alg,
|
|
44
|
-
keyid,
|
|
45
|
-
context,
|
|
46
|
-
}: SiginputArgs
|
|
47
|
-
): [Map<string, string>, Siger | Cigar] {
|
|
48
|
-
const items = new Array<string>();
|
|
49
|
-
const ifields = new Array<[string, Map<string, string>]>();
|
|
50
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Generates, serializes, and signs a Signature-Input HTTP header value as a structured header
|
|
12
|
+
* @param signer
|
|
13
|
+
* @param sigInputArgs
|
|
14
|
+
*/
|
|
15
|
+
export function siginput(signer, sigInputArgs) {
|
|
16
|
+
const { name, method, path, headers, fields, expires, nonce, alg, keyid, context, } = sigInputArgs;
|
|
17
|
+
const items = new Array();
|
|
18
|
+
const ifields = new Array();
|
|
51
19
|
fields.forEach((field) => {
|
|
52
20
|
if (field.startsWith('@')) {
|
|
53
21
|
switch (field) {
|
|
@@ -60,19 +28,18 @@ export function siginput(
|
|
|
60
28
|
ifields.push([field, new Map()]);
|
|
61
29
|
break;
|
|
62
30
|
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
if (!headers.has(field))
|
|
34
|
+
return;
|
|
66
35
|
ifields.push([field, new Map()]);
|
|
67
|
-
const value = normalize(headers.get(field)
|
|
36
|
+
const value = normalize(headers.get(field));
|
|
68
37
|
items.push(`"${field}": ${value}`);
|
|
69
38
|
}
|
|
70
39
|
});
|
|
71
|
-
|
|
72
|
-
const nameParams = new Map<string, string | number>();
|
|
40
|
+
const nameParams = new Map();
|
|
73
41
|
const now = Math.floor(nowUTC().getTime() / 1000);
|
|
74
42
|
nameParams.set('created', now);
|
|
75
|
-
|
|
76
43
|
const values = [
|
|
77
44
|
`(${ifields.map((field) => field[0]).join(' ')})`,
|
|
78
45
|
`created=${now}`,
|
|
@@ -98,90 +65,61 @@ export function siginput(
|
|
|
98
65
|
nameParams.set('alg', alg);
|
|
99
66
|
}
|
|
100
67
|
const sid = new Map([[name, [ifields, nameParams]]]);
|
|
101
|
-
|
|
102
68
|
const params = values.join(';');
|
|
103
69
|
items.push(`"@signature-params: ${params}"`);
|
|
104
|
-
|
|
105
70
|
const ser = items.join('\n');
|
|
106
71
|
const sig = signer.sign(b(ser));
|
|
107
|
-
|
|
108
72
|
return [
|
|
109
|
-
new Map
|
|
110
|
-
[
|
|
73
|
+
new Map([
|
|
74
|
+
[HEADER_SIG_INPUT, `${serializeDictionary(sid)}`],
|
|
111
75
|
]),
|
|
112
76
|
sig,
|
|
113
77
|
];
|
|
114
78
|
}
|
|
115
|
-
|
|
116
79
|
export class Unqualified {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
constructor(raw: Uint8Array) {
|
|
80
|
+
constructor(raw) {
|
|
120
81
|
this._raw = raw;
|
|
121
82
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
return Base64.encode(Buffer.from(this._raw));
|
|
83
|
+
get qb64() {
|
|
84
|
+
return encodeBase64Url(this._raw);
|
|
125
85
|
}
|
|
126
|
-
|
|
127
|
-
get qb64b(): Uint8Array {
|
|
86
|
+
get qb64b() {
|
|
128
87
|
return b(this.qb64);
|
|
129
88
|
}
|
|
130
89
|
}
|
|
131
|
-
|
|
132
90
|
export class Inputage {
|
|
133
|
-
public name: any;
|
|
134
|
-
public fields: any;
|
|
135
|
-
public created: any;
|
|
136
|
-
public expires: any;
|
|
137
|
-
public nonce: any;
|
|
138
|
-
public alg: any;
|
|
139
|
-
public keyid: any;
|
|
140
|
-
public context: any;
|
|
141
91
|
}
|
|
142
|
-
|
|
143
|
-
export function desiginput(value: string): Array<Inputage> {
|
|
92
|
+
export function desiginput(value) {
|
|
144
93
|
const sid = parseDictionary(value);
|
|
145
|
-
const siginputs = new Array
|
|
146
|
-
|
|
94
|
+
const siginputs = new Array();
|
|
147
95
|
sid.forEach((value, key) => {
|
|
148
96
|
const siginput = new Inputage();
|
|
149
97
|
siginput.name = key;
|
|
150
|
-
let list
|
|
98
|
+
let list;
|
|
151
99
|
let params;
|
|
152
|
-
[list, params] = value
|
|
100
|
+
[list, params] = value;
|
|
153
101
|
siginput.fields = list.map((item) => item[0]);
|
|
154
|
-
|
|
155
102
|
if (!params.has('created')) {
|
|
156
|
-
throw new Error(
|
|
157
|
-
'missing required `created` field from signature input'
|
|
158
|
-
);
|
|
103
|
+
throw new Error('missing required `created` field from signature input');
|
|
159
104
|
}
|
|
160
105
|
siginput.created = params.get('created');
|
|
161
|
-
|
|
162
106
|
if (params.has('expires')) {
|
|
163
107
|
siginput.expires = params.get('expires');
|
|
164
108
|
}
|
|
165
|
-
|
|
166
109
|
if (params.has('nonce')) {
|
|
167
110
|
siginput.nonce = params.get('nonce');
|
|
168
111
|
}
|
|
169
|
-
|
|
170
112
|
if (params.has('alg')) {
|
|
171
113
|
siginput.alg = params.get('alg');
|
|
172
114
|
}
|
|
173
|
-
|
|
174
115
|
if (params.has('keyid')) {
|
|
175
116
|
siginput.keyid = params.get('keyid');
|
|
176
117
|
}
|
|
177
|
-
|
|
178
118
|
if (params.has('context')) {
|
|
179
119
|
siginput.context = params.get('context');
|
|
180
120
|
}
|
|
181
|
-
|
|
182
121
|
siginputs.push(siginput);
|
|
183
122
|
});
|
|
184
|
-
|
|
185
123
|
return siginputs;
|
|
186
124
|
}
|
|
187
125
|
/** Parse start, end and total from HTTP Content-Range header value
|
|
@@ -189,21 +127,18 @@ export function desiginput(value: string): Array<Inputage> {
|
|
|
189
127
|
* @param {string} typ - type of range, e.g. "aids"
|
|
190
128
|
* @returns {start: number, end: number, total: number} - object with start, end and total properties
|
|
191
129
|
*/
|
|
192
|
-
export function parseRangeHeaders(
|
|
193
|
-
header: string | null,
|
|
194
|
-
typ: string
|
|
195
|
-
): { start: number; end: number; total: number } {
|
|
130
|
+
export function parseRangeHeaders(header, typ) {
|
|
196
131
|
if (header !== null) {
|
|
197
132
|
const data = header.replace(`${typ} `, '');
|
|
198
133
|
const values = data.split('/');
|
|
199
134
|
const rng = values[0].split('-');
|
|
200
|
-
|
|
201
135
|
return {
|
|
202
136
|
start: parseInt(rng[0]),
|
|
203
137
|
end: parseInt(rng[1]),
|
|
204
138
|
total: parseInt(values[1]),
|
|
205
139
|
};
|
|
206
|
-
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
207
142
|
return { start: 0, end: 0, total: 0 };
|
|
208
143
|
}
|
|
209
144
|
}
|