@pezkuwi/wasm-crypto 7.5.12 → 7.5.15
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/Cargo.toml +50 -0
- package/Xargo.toml +2 -0
- package/build/README.md +29 -0
- package/build/bundle-pezkuwi-wasm-crypto.js +2092 -0
- package/build/bundle.d.ts +40 -0
- package/build/bundle.js +505 -0
- package/build/cjs/bundle.d.ts +40 -0
- package/build/cjs/bundle.js +544 -0
- package/{index.d.ts → build/cjs/index.d.ts} +0 -1
- package/build/cjs/index.js +4 -0
- package/build/cjs/init.js +21 -0
- package/build/cjs/initNone.js +20 -0
- package/build/cjs/initOnlyAsm.js +20 -0
- package/build/cjs/initOnlyWasm.js +20 -0
- package/build/cjs/initWasmAsm.js +20 -0
- package/build/cjs/packageInfo.js +4 -0
- package/build/index.d.ts +1 -0
- package/build/index.js +1 -0
- package/build/init.d.ts +16 -0
- package/build/init.js +17 -0
- package/build/initNone.d.ts +10 -0
- package/build/initNone.js +17 -0
- package/build/initOnlyAsm.d.ts +10 -0
- package/build/initOnlyAsm.js +17 -0
- package/build/initOnlyWasm.d.ts +10 -0
- package/build/initOnlyWasm.js +17 -0
- package/build/initWasmAsm.d.ts +10 -0
- package/build/initWasmAsm.js +17 -0
- package/build/package.json +208 -0
- package/build/packageDetect.d.ts +1 -0
- package/build/packageDetect.js +8 -0
- package/build/packageInfo.d.ts +6 -0
- package/build/packageInfo.js +1 -0
- package/build-deno/README.md +25 -0
- package/build-deno/bundle.ts +597 -0
- package/build-deno/index.ts +2 -0
- package/build-deno/init.ts +23 -0
- package/build-deno/initNone.ts +21 -0
- package/build-deno/initOnlyAsm.ts +21 -0
- package/build-deno/initOnlyWasm.ts +21 -0
- package/build-deno/initWasmAsm.ts +21 -0
- package/build-deno/mod.ts +2 -0
- package/build-deno/packageDetect.ts +12 -0
- package/build-deno/packageInfo.ts +3 -0
- package/build-deno/rs/.editorconfig +10 -0
- package/build-tsc/bundle.d.ts +40 -0
- package/{cjs → build-tsc}/index.d.ts +0 -1
- package/build-tsc-cjs/bundle.js +544 -0
- package/{cjs → build-tsc-cjs}/index.js +0 -1
- package/build-tsc-cjs/packageDetect.js +10 -0
- package/{cjs → build-tsc-cjs}/packageInfo.js +1 -1
- package/build-tsc-esm/bundle.js +505 -0
- package/{index.js → build-tsc-esm/index.js} +0 -1
- package/{packageInfo.js → build-tsc-esm/packageInfo.js} +1 -1
- package/package.json +89 -87
- package/src/bundle.ts +613 -0
- package/src/index.ts +5 -0
- package/src/init.ts +25 -0
- package/src/initNone.ts +23 -0
- package/src/initOnlyAsm.ts +23 -0
- package/src/initOnlyWasm.ts +23 -0
- package/src/initWasmAsm.ts +23 -0
- package/src/lib.rs +24 -0
- package/src/mod.ts +4 -0
- package/src/packageDetect.ts +16 -0
- package/src/packageInfo.ts +6 -0
- package/src/rs/.editorconfig +10 -0
- package/src/rs/bip39.rs +139 -0
- package/src/rs/ed25519.rs +142 -0
- package/src/rs/hashing.rs +322 -0
- package/src/rs/secp256k1.rs +150 -0
- package/src/rs/sr25519.rs +331 -0
- package/src/rs/vrf.rs +144 -0
- package/test/all/bip39.js +86 -0
- package/test/all/ed25519.js +84 -0
- package/test/all/hashing.js +138 -0
- package/test/all/index.js +126 -0
- package/test/all/secp256k1.js +105 -0
- package/test/all/sr25519.js +211 -0
- package/test/all/vrf.js +74 -0
- package/test/asm.js +10 -0
- package/test/deno.ts +38 -0
- package/test/jest.spec.ts +25 -0
- package/test/loader-build.js +39 -0
- package/test/wasm.js +8 -0
- package/tsconfig.build.json +19 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.spec.json +16 -0
- package/tsconfig.spec.tsbuildinfo +1 -0
- package/bundle-pezkuwi-wasm-crypto.js +0 -777
- package/bundle.d.ts +0 -37
- package/bundle.js +0 -165
- package/cjs/bundle.d.ts +0 -37
- package/cjs/bundle.js +0 -171
- /package/{LICENSE → build/LICENSE} +0 -0
- /package/{init.d.ts → build/cjs/init.d.ts} +0 -0
- /package/{initNone.d.ts → build/cjs/initNone.d.ts} +0 -0
- /package/{initOnlyAsm.d.ts → build/cjs/initOnlyAsm.d.ts} +0 -0
- /package/{initOnlyWasm.d.ts → build/cjs/initOnlyWasm.d.ts} +0 -0
- /package/{initWasmAsm.d.ts → build/cjs/initWasmAsm.d.ts} +0 -0
- /package/{cjs → build/cjs}/package.json +0 -0
- /package/{packageDetect.d.ts → build/cjs/packageDetect.d.ts} +0 -0
- /package/{cjs → build/cjs}/packageDetect.js +0 -0
- /package/{packageInfo.d.ts → build/cjs/packageInfo.d.ts} +0 -0
- /package/{cjs → build-tsc}/init.d.ts +0 -0
- /package/{cjs → build-tsc}/initNone.d.ts +0 -0
- /package/{cjs → build-tsc}/initOnlyAsm.d.ts +0 -0
- /package/{cjs → build-tsc}/initOnlyWasm.d.ts +0 -0
- /package/{cjs → build-tsc}/initWasmAsm.d.ts +0 -0
- /package/{cjs → build-tsc}/packageDetect.d.ts +0 -0
- /package/{cjs → build-tsc}/packageInfo.d.ts +0 -0
- /package/{cjs → build-tsc-cjs}/init.js +0 -0
- /package/{cjs → build-tsc-cjs}/initNone.js +0 -0
- /package/{cjs → build-tsc-cjs}/initOnlyAsm.js +0 -0
- /package/{cjs → build-tsc-cjs}/initOnlyWasm.js +0 -0
- /package/{cjs → build-tsc-cjs}/initWasmAsm.js +0 -0
- /package/{init.js → build-tsc-esm/init.js} +0 -0
- /package/{initNone.js → build-tsc-esm/initNone.js} +0 -0
- /package/{initOnlyAsm.js → build-tsc-esm/initOnlyAsm.js} +0 -0
- /package/{initOnlyWasm.js → build-tsc-esm/initOnlyWasm.js} +0 -0
- /package/{initWasmAsm.js → build-tsc-esm/initWasmAsm.js} +0 -0
- /package/{packageDetect.js → build-tsc-esm/packageDetect.js} +0 -0
|
@@ -0,0 +1,2092 @@
|
|
|
1
|
+
(function (global, factory) {
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.pezkuwiWasmCrypto = {}));
|
|
5
|
+
})(this, (function (exports) { 'use strict';
|
|
6
|
+
|
|
7
|
+
const global = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : window;
|
|
8
|
+
|
|
9
|
+
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
10
|
+
const CHR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
11
|
+
const map = new Array(256);
|
|
12
|
+
for (let i = 0, count = CHR.length; i < count; i++) {
|
|
13
|
+
map[CHR.charCodeAt(i)] = i;
|
|
14
|
+
}
|
|
15
|
+
function base64Decode(data, out) {
|
|
16
|
+
let byte = 0;
|
|
17
|
+
let bits = 0;
|
|
18
|
+
let pos = -1;
|
|
19
|
+
for (let i = 0, last = out.length - 1; pos !== last; i++) {
|
|
20
|
+
byte = (byte << 6) | map[data.charCodeAt(i)];
|
|
21
|
+
if ((bits += 6) >= 8) {
|
|
22
|
+
out[++pos] = (byte >>> (bits -= 8)) & 0xff;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const u8 = Uint8Array, u16 = Uint16Array, u32$1 = Uint32Array;
|
|
29
|
+
const clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
|
|
30
|
+
const fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0, 0]);
|
|
31
|
+
const fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 0, 0]);
|
|
32
|
+
const freb = (eb, start) => {
|
|
33
|
+
const b = new u16(31);
|
|
34
|
+
for (let i = 0; i < 31; ++i) {
|
|
35
|
+
b[i] = start += 1 << eb[i - 1];
|
|
36
|
+
}
|
|
37
|
+
const r = new u32$1(b[30]);
|
|
38
|
+
for (let i = 1; i < 30; ++i) {
|
|
39
|
+
for (let j = b[i]; j < b[i + 1]; ++j) {
|
|
40
|
+
r[j] = ((j - b[i]) << 5) | i;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return [b, r];
|
|
44
|
+
};
|
|
45
|
+
const [fl, revfl] = freb(fleb, 2);
|
|
46
|
+
fl[28] = 258, revfl[258] = 28;
|
|
47
|
+
const [fd] = freb(fdeb, 0);
|
|
48
|
+
const rev = new u16(32768);
|
|
49
|
+
for (let i = 0; i < 32768; ++i) {
|
|
50
|
+
let x = ((i & 0xAAAA) >>> 1) | ((i & 0x5555) << 1);
|
|
51
|
+
x = ((x & 0xCCCC) >>> 2) | ((x & 0x3333) << 2);
|
|
52
|
+
x = ((x & 0xF0F0) >>> 4) | ((x & 0x0F0F) << 4);
|
|
53
|
+
rev[i] = (((x & 0xFF00) >>> 8) | ((x & 0x00FF) << 8)) >>> 1;
|
|
54
|
+
}
|
|
55
|
+
const hMap = ((cd, mb, r) => {
|
|
56
|
+
const s = cd.length;
|
|
57
|
+
let i = 0;
|
|
58
|
+
const l = new u16(mb);
|
|
59
|
+
for (; i < s; ++i) {
|
|
60
|
+
if (cd[i])
|
|
61
|
+
++l[cd[i] - 1];
|
|
62
|
+
}
|
|
63
|
+
const le = new u16(mb);
|
|
64
|
+
for (i = 1; i < mb; ++i) {
|
|
65
|
+
le[i] = (le[i - 1] + l[i - 1]) << 1;
|
|
66
|
+
}
|
|
67
|
+
let co;
|
|
68
|
+
{
|
|
69
|
+
co = new u16(1 << mb);
|
|
70
|
+
const rvb = 15 - mb;
|
|
71
|
+
for (i = 0; i < s; ++i) {
|
|
72
|
+
if (cd[i]) {
|
|
73
|
+
const sv = (i << 4) | cd[i];
|
|
74
|
+
const r = mb - cd[i];
|
|
75
|
+
let v = le[cd[i] - 1]++ << r;
|
|
76
|
+
for (const m = v | ((1 << r) - 1); v <= m; ++v) {
|
|
77
|
+
co[rev[v] >> rvb] = sv;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return co;
|
|
83
|
+
});
|
|
84
|
+
const flt = new u8(288);
|
|
85
|
+
for (let i = 0; i < 144; ++i)
|
|
86
|
+
flt[i] = 8;
|
|
87
|
+
for (let i = 144; i < 256; ++i)
|
|
88
|
+
flt[i] = 9;
|
|
89
|
+
for (let i = 256; i < 280; ++i)
|
|
90
|
+
flt[i] = 7;
|
|
91
|
+
for (let i = 280; i < 288; ++i)
|
|
92
|
+
flt[i] = 8;
|
|
93
|
+
const fdt = new u8(32);
|
|
94
|
+
for (let i = 0; i < 32; ++i)
|
|
95
|
+
fdt[i] = 5;
|
|
96
|
+
const flrm = hMap(flt, 9);
|
|
97
|
+
const fdrm = hMap(fdt, 5);
|
|
98
|
+
const bits = (d, p, m) => {
|
|
99
|
+
const o = p >>> 3;
|
|
100
|
+
return ((d[o] | (d[o + 1] << 8)) >>> (p & 7)) & m;
|
|
101
|
+
};
|
|
102
|
+
const bits16 = (d, p) => {
|
|
103
|
+
const o = p >>> 3;
|
|
104
|
+
return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >>> (p & 7));
|
|
105
|
+
};
|
|
106
|
+
const shft = (p) => (p >>> 3) + (p & 7 && 1);
|
|
107
|
+
const slc = (v, s, e) => {
|
|
108
|
+
if (e == null || e > v.length)
|
|
109
|
+
e = v.length;
|
|
110
|
+
const n = new (v instanceof u16 ? u16 : v instanceof u32$1 ? u32$1 : u8)(e - s);
|
|
111
|
+
n.set(v.subarray(s, e));
|
|
112
|
+
return n;
|
|
113
|
+
};
|
|
114
|
+
const max = (a) => {
|
|
115
|
+
let m = a[0];
|
|
116
|
+
for (let i = 1, count = a.length; i < count; ++i) {
|
|
117
|
+
if (a[i] > m)
|
|
118
|
+
m = a[i];
|
|
119
|
+
}
|
|
120
|
+
return m;
|
|
121
|
+
};
|
|
122
|
+
const inflt = (dat, buf, st) => {
|
|
123
|
+
const noSt = !st || st.i;
|
|
124
|
+
if (!st)
|
|
125
|
+
st = {};
|
|
126
|
+
const sl = dat.length;
|
|
127
|
+
const noBuf = !buf || !noSt;
|
|
128
|
+
if (!buf)
|
|
129
|
+
buf = new u8(sl * 3);
|
|
130
|
+
const cbuf = (l) => {
|
|
131
|
+
let bl = buf.length;
|
|
132
|
+
if (l > bl) {
|
|
133
|
+
const nbuf = new u8(Math.max(bl << 1, l));
|
|
134
|
+
nbuf.set(buf);
|
|
135
|
+
buf = nbuf;
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
let final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;
|
|
139
|
+
if (final && !lm)
|
|
140
|
+
return buf;
|
|
141
|
+
const tbts = sl << 3;
|
|
142
|
+
do {
|
|
143
|
+
if (!lm) {
|
|
144
|
+
st.f = final = bits(dat, pos, 1);
|
|
145
|
+
const type = bits(dat, pos + 1, 3);
|
|
146
|
+
pos += 3;
|
|
147
|
+
if (!type) {
|
|
148
|
+
const s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;
|
|
149
|
+
if (t > sl) {
|
|
150
|
+
if (noSt)
|
|
151
|
+
throw 'unexpected EOF';
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
if (noBuf)
|
|
155
|
+
cbuf(bt + l);
|
|
156
|
+
buf.set(dat.subarray(s, t), bt);
|
|
157
|
+
st.b = bt += l, st.p = pos = t << 3;
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
else if (type == 1)
|
|
161
|
+
lm = flrm, dm = fdrm, lbt = 9, dbt = 5;
|
|
162
|
+
else if (type == 2) {
|
|
163
|
+
const hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;
|
|
164
|
+
const tl = hLit + bits(dat, pos + 5, 31) + 1;
|
|
165
|
+
pos += 14;
|
|
166
|
+
const ldt = new u8(tl);
|
|
167
|
+
const clt = new u8(19);
|
|
168
|
+
for (let i = 0; i < hcLen; ++i) {
|
|
169
|
+
clt[clim[i]] = bits(dat, pos + i * 3, 7);
|
|
170
|
+
}
|
|
171
|
+
pos += hcLen * 3;
|
|
172
|
+
const clb = max(clt), clbmsk = (1 << clb) - 1;
|
|
173
|
+
if (!noSt && pos + tl * (clb + 7) > tbts)
|
|
174
|
+
break;
|
|
175
|
+
const clm = hMap(clt, clb);
|
|
176
|
+
for (let i = 0; i < tl;) {
|
|
177
|
+
const r = clm[bits(dat, pos, clbmsk)];
|
|
178
|
+
pos += r & 15;
|
|
179
|
+
const s = r >>> 4;
|
|
180
|
+
if (s < 16) {
|
|
181
|
+
ldt[i++] = s;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
let c = 0, n = 0;
|
|
185
|
+
if (s == 16)
|
|
186
|
+
n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];
|
|
187
|
+
else if (s == 17)
|
|
188
|
+
n = 3 + bits(dat, pos, 7), pos += 3;
|
|
189
|
+
else if (s == 18)
|
|
190
|
+
n = 11 + bits(dat, pos, 127), pos += 7;
|
|
191
|
+
while (n--)
|
|
192
|
+
ldt[i++] = c;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);
|
|
196
|
+
lbt = max(lt);
|
|
197
|
+
dbt = max(dt);
|
|
198
|
+
lm = hMap(lt, lbt);
|
|
199
|
+
dm = hMap(dt, dbt);
|
|
200
|
+
}
|
|
201
|
+
else
|
|
202
|
+
throw 'invalid block type';
|
|
203
|
+
if (pos > tbts)
|
|
204
|
+
throw 'unexpected EOF';
|
|
205
|
+
}
|
|
206
|
+
if (noBuf)
|
|
207
|
+
cbuf(bt + 131072);
|
|
208
|
+
const lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;
|
|
209
|
+
const mxa = lbt + dbt + 18;
|
|
210
|
+
while (noSt || pos + mxa < tbts) {
|
|
211
|
+
const c = lm[bits16(dat, pos) & lms], sym = c >>> 4;
|
|
212
|
+
pos += c & 15;
|
|
213
|
+
if (pos > tbts)
|
|
214
|
+
throw 'unexpected EOF';
|
|
215
|
+
if (!c)
|
|
216
|
+
throw 'invalid length/literal';
|
|
217
|
+
if (sym < 256)
|
|
218
|
+
buf[bt++] = sym;
|
|
219
|
+
else if (sym == 256) {
|
|
220
|
+
lm = undefined;
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
let add = sym - 254;
|
|
225
|
+
if (sym > 264) {
|
|
226
|
+
const i = sym - 257, b = fleb[i];
|
|
227
|
+
add = bits(dat, pos, (1 << b) - 1) + fl[i];
|
|
228
|
+
pos += b;
|
|
229
|
+
}
|
|
230
|
+
const d = dm[bits16(dat, pos) & dms], dsym = d >>> 4;
|
|
231
|
+
if (!d)
|
|
232
|
+
throw 'invalid distance';
|
|
233
|
+
pos += d & 15;
|
|
234
|
+
let dt = fd[dsym];
|
|
235
|
+
if (dsym > 3) {
|
|
236
|
+
const b = fdeb[dsym];
|
|
237
|
+
dt += bits16(dat, pos) & ((1 << b) - 1), pos += b;
|
|
238
|
+
}
|
|
239
|
+
if (pos > tbts)
|
|
240
|
+
throw 'unexpected EOF';
|
|
241
|
+
if (noBuf)
|
|
242
|
+
cbuf(bt + 131072);
|
|
243
|
+
const end = bt + add;
|
|
244
|
+
for (; bt < end; bt += 4) {
|
|
245
|
+
buf[bt] = buf[bt - dt];
|
|
246
|
+
buf[bt + 1] = buf[bt + 1 - dt];
|
|
247
|
+
buf[bt + 2] = buf[bt + 2 - dt];
|
|
248
|
+
buf[bt + 3] = buf[bt + 3 - dt];
|
|
249
|
+
}
|
|
250
|
+
bt = end;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
st.l = lm, st.p = pos, st.b = bt;
|
|
254
|
+
if (lm)
|
|
255
|
+
final = 1, st.m = lbt, st.d = dm, st.n = dbt;
|
|
256
|
+
} while (!final);
|
|
257
|
+
return bt == buf.length ? buf : slc(buf, 0, bt);
|
|
258
|
+
};
|
|
259
|
+
const zlv = (d) => {
|
|
260
|
+
if ((d[0] & 15) != 8 || (d[0] >>> 4) > 7 || ((d[0] << 8 | d[1]) % 31))
|
|
261
|
+
throw 'invalid zlib data';
|
|
262
|
+
if (d[1] & 32)
|
|
263
|
+
throw 'invalid zlib data: preset dictionaries not supported';
|
|
264
|
+
};
|
|
265
|
+
function unzlibSync(data, out) {
|
|
266
|
+
return inflt((zlv(data), data.subarray(2, -4)), out);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
var lenIn = 69227;
|
|
270
|
+
var lenOut = 111597;
|
|
271
|
+
var bytes_1 = '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';
|
|
272
|
+
|
|
273
|
+
const wasmBytes = unzlibSync(base64Decode(bytes_1, new Uint8Array(lenIn)), new Uint8Array(lenOut));
|
|
274
|
+
|
|
275
|
+
const packageInfo = { name: '@pezkuwi/wasm-crypto', path: (({ url: (typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('bundle-pezkuwi-wasm-crypto.js', document.baseURI).href)) }) && (typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('bundle-pezkuwi-wasm-crypto.js', document.baseURI).href))) ? new URL((typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('bundle-pezkuwi-wasm-crypto.js', document.baseURI).href))).pathname.substring(0, new URL((typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('bundle-pezkuwi-wasm-crypto.js', document.baseURI).href))).pathname.lastIndexOf('/') + 1) : 'auto', type: 'esm', version: '7.5.15' };
|
|
276
|
+
|
|
277
|
+
/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
278
|
+
function isBytes(a) {
|
|
279
|
+
return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');
|
|
280
|
+
}
|
|
281
|
+
function anumber(n) {
|
|
282
|
+
if (!Number.isSafeInteger(n) || n < 0)
|
|
283
|
+
throw new Error('positive integer expected, got ' + n);
|
|
284
|
+
}
|
|
285
|
+
function abytes(b, ...lengths) {
|
|
286
|
+
if (!isBytes(b))
|
|
287
|
+
throw new Error('Uint8Array expected');
|
|
288
|
+
if (lengths.length > 0 && !lengths.includes(b.length))
|
|
289
|
+
throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);
|
|
290
|
+
}
|
|
291
|
+
function ahash(h) {
|
|
292
|
+
if (typeof h !== 'function' || typeof h.create !== 'function')
|
|
293
|
+
throw new Error('Hash should be wrapped by utils.createHasher');
|
|
294
|
+
anumber(h.outputLen);
|
|
295
|
+
anumber(h.blockLen);
|
|
296
|
+
}
|
|
297
|
+
function aexists(instance, checkFinished = true) {
|
|
298
|
+
if (instance.destroyed)
|
|
299
|
+
throw new Error('Hash instance has been destroyed');
|
|
300
|
+
if (checkFinished && instance.finished)
|
|
301
|
+
throw new Error('Hash#digest() has already been called');
|
|
302
|
+
}
|
|
303
|
+
function aoutput(out, instance) {
|
|
304
|
+
abytes(out);
|
|
305
|
+
const min = instance.outputLen;
|
|
306
|
+
if (out.length < min) {
|
|
307
|
+
throw new Error('digestInto() expects output buffer of length at least ' + min);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
function u32(arr) {
|
|
311
|
+
return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));
|
|
312
|
+
}
|
|
313
|
+
function clean(...arrays) {
|
|
314
|
+
for (let i = 0; i < arrays.length; i++) {
|
|
315
|
+
arrays[i].fill(0);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
function createView(arr) {
|
|
319
|
+
return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);
|
|
320
|
+
}
|
|
321
|
+
function rotr(word, shift) {
|
|
322
|
+
return (word << (32 - shift)) | (word >>> shift);
|
|
323
|
+
}
|
|
324
|
+
const isLE = (() => new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();
|
|
325
|
+
function byteSwap(word) {
|
|
326
|
+
return (((word << 24) & 0xff000000) |
|
|
327
|
+
((word << 8) & 0xff0000) |
|
|
328
|
+
((word >>> 8) & 0xff00) |
|
|
329
|
+
((word >>> 24) & 0xff));
|
|
330
|
+
}
|
|
331
|
+
const swap8IfBE = isLE
|
|
332
|
+
? (n) => n
|
|
333
|
+
: (n) => byteSwap(n);
|
|
334
|
+
function byteSwap32(arr) {
|
|
335
|
+
for (let i = 0; i < arr.length; i++) {
|
|
336
|
+
arr[i] = byteSwap(arr[i]);
|
|
337
|
+
}
|
|
338
|
+
return arr;
|
|
339
|
+
}
|
|
340
|
+
const swap32IfBE = isLE
|
|
341
|
+
? (u) => u
|
|
342
|
+
: byteSwap32;
|
|
343
|
+
(() =>
|
|
344
|
+
typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();
|
|
345
|
+
Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));
|
|
346
|
+
function utf8ToBytes(str) {
|
|
347
|
+
if (typeof str !== 'string')
|
|
348
|
+
throw new Error('string expected');
|
|
349
|
+
return new Uint8Array(new TextEncoder().encode(str));
|
|
350
|
+
}
|
|
351
|
+
function toBytes(data) {
|
|
352
|
+
if (typeof data === 'string')
|
|
353
|
+
data = utf8ToBytes(data);
|
|
354
|
+
abytes(data);
|
|
355
|
+
return data;
|
|
356
|
+
}
|
|
357
|
+
function kdfInputToBytes(data) {
|
|
358
|
+
if (typeof data === 'string')
|
|
359
|
+
data = utf8ToBytes(data);
|
|
360
|
+
abytes(data);
|
|
361
|
+
return data;
|
|
362
|
+
}
|
|
363
|
+
function checkOpts(defaults, opts) {
|
|
364
|
+
if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')
|
|
365
|
+
throw new Error('options should be object or undefined');
|
|
366
|
+
const merged = Object.assign(defaults, opts);
|
|
367
|
+
return merged;
|
|
368
|
+
}
|
|
369
|
+
class Hash {
|
|
370
|
+
}
|
|
371
|
+
function createHasher(hashCons) {
|
|
372
|
+
const hashC = (msg) => hashCons().update(toBytes(msg)).digest();
|
|
373
|
+
const tmp = hashCons();
|
|
374
|
+
hashC.outputLen = tmp.outputLen;
|
|
375
|
+
hashC.blockLen = tmp.blockLen;
|
|
376
|
+
hashC.create = () => hashCons();
|
|
377
|
+
return hashC;
|
|
378
|
+
}
|
|
379
|
+
function createOptHasher(hashCons) {
|
|
380
|
+
const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();
|
|
381
|
+
const tmp = hashCons({});
|
|
382
|
+
hashC.outputLen = tmp.outputLen;
|
|
383
|
+
hashC.blockLen = tmp.blockLen;
|
|
384
|
+
hashC.create = (opts) => hashCons(opts);
|
|
385
|
+
return hashC;
|
|
386
|
+
}
|
|
387
|
+
function createXOFer(hashCons) {
|
|
388
|
+
const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();
|
|
389
|
+
const tmp = hashCons({});
|
|
390
|
+
hashC.outputLen = tmp.outputLen;
|
|
391
|
+
hashC.blockLen = tmp.blockLen;
|
|
392
|
+
hashC.create = (opts) => hashCons(opts);
|
|
393
|
+
return hashC;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
function setBigUint64(view, byteOffset, value, isLE) {
|
|
397
|
+
if (typeof view.setBigUint64 === 'function')
|
|
398
|
+
return view.setBigUint64(byteOffset, value, isLE);
|
|
399
|
+
const _32n = BigInt(32);
|
|
400
|
+
const _u32_max = BigInt(0xffffffff);
|
|
401
|
+
const wh = Number((value >> _32n) & _u32_max);
|
|
402
|
+
const wl = Number(value & _u32_max);
|
|
403
|
+
const h = isLE ? 4 : 0;
|
|
404
|
+
const l = isLE ? 0 : 4;
|
|
405
|
+
view.setUint32(byteOffset + h, wh, isLE);
|
|
406
|
+
view.setUint32(byteOffset + l, wl, isLE);
|
|
407
|
+
}
|
|
408
|
+
function Chi(a, b, c) {
|
|
409
|
+
return (a & b) ^ (~a & c);
|
|
410
|
+
}
|
|
411
|
+
function Maj(a, b, c) {
|
|
412
|
+
return (a & b) ^ (a & c) ^ (b & c);
|
|
413
|
+
}
|
|
414
|
+
class HashMD extends Hash {
|
|
415
|
+
constructor(blockLen, outputLen, padOffset, isLE) {
|
|
416
|
+
super();
|
|
417
|
+
this.finished = false;
|
|
418
|
+
this.length = 0;
|
|
419
|
+
this.pos = 0;
|
|
420
|
+
this.destroyed = false;
|
|
421
|
+
this.blockLen = blockLen;
|
|
422
|
+
this.outputLen = outputLen;
|
|
423
|
+
this.padOffset = padOffset;
|
|
424
|
+
this.isLE = isLE;
|
|
425
|
+
this.buffer = new Uint8Array(blockLen);
|
|
426
|
+
this.view = createView(this.buffer);
|
|
427
|
+
}
|
|
428
|
+
update(data) {
|
|
429
|
+
aexists(this);
|
|
430
|
+
data = toBytes(data);
|
|
431
|
+
abytes(data);
|
|
432
|
+
const { view, buffer, blockLen } = this;
|
|
433
|
+
const len = data.length;
|
|
434
|
+
for (let pos = 0; pos < len;) {
|
|
435
|
+
const take = Math.min(blockLen - this.pos, len - pos);
|
|
436
|
+
if (take === blockLen) {
|
|
437
|
+
const dataView = createView(data);
|
|
438
|
+
for (; blockLen <= len - pos; pos += blockLen)
|
|
439
|
+
this.process(dataView, pos);
|
|
440
|
+
continue;
|
|
441
|
+
}
|
|
442
|
+
buffer.set(data.subarray(pos, pos + take), this.pos);
|
|
443
|
+
this.pos += take;
|
|
444
|
+
pos += take;
|
|
445
|
+
if (this.pos === blockLen) {
|
|
446
|
+
this.process(view, 0);
|
|
447
|
+
this.pos = 0;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
this.length += data.length;
|
|
451
|
+
this.roundClean();
|
|
452
|
+
return this;
|
|
453
|
+
}
|
|
454
|
+
digestInto(out) {
|
|
455
|
+
aexists(this);
|
|
456
|
+
aoutput(out, this);
|
|
457
|
+
this.finished = true;
|
|
458
|
+
const { buffer, view, blockLen, isLE } = this;
|
|
459
|
+
let { pos } = this;
|
|
460
|
+
buffer[pos++] = 0b10000000;
|
|
461
|
+
clean(this.buffer.subarray(pos));
|
|
462
|
+
if (this.padOffset > blockLen - pos) {
|
|
463
|
+
this.process(view, 0);
|
|
464
|
+
pos = 0;
|
|
465
|
+
}
|
|
466
|
+
for (let i = pos; i < blockLen; i++)
|
|
467
|
+
buffer[i] = 0;
|
|
468
|
+
setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);
|
|
469
|
+
this.process(view, 0);
|
|
470
|
+
const oview = createView(out);
|
|
471
|
+
const len = this.outputLen;
|
|
472
|
+
if (len % 4)
|
|
473
|
+
throw new Error('_sha2: outputLen should be aligned to 32bit');
|
|
474
|
+
const outLen = len / 4;
|
|
475
|
+
const state = this.get();
|
|
476
|
+
if (outLen > state.length)
|
|
477
|
+
throw new Error('_sha2: outputLen bigger than state');
|
|
478
|
+
for (let i = 0; i < outLen; i++)
|
|
479
|
+
oview.setUint32(4 * i, state[i], isLE);
|
|
480
|
+
}
|
|
481
|
+
digest() {
|
|
482
|
+
const { buffer, outputLen } = this;
|
|
483
|
+
this.digestInto(buffer);
|
|
484
|
+
const res = buffer.slice(0, outputLen);
|
|
485
|
+
this.destroy();
|
|
486
|
+
return res;
|
|
487
|
+
}
|
|
488
|
+
_cloneInto(to) {
|
|
489
|
+
to || (to = new this.constructor());
|
|
490
|
+
to.set(...this.get());
|
|
491
|
+
const { blockLen, buffer, length, finished, destroyed, pos } = this;
|
|
492
|
+
to.destroyed = destroyed;
|
|
493
|
+
to.finished = finished;
|
|
494
|
+
to.length = length;
|
|
495
|
+
to.pos = pos;
|
|
496
|
+
if (length % blockLen)
|
|
497
|
+
to.buffer.set(buffer);
|
|
498
|
+
return to;
|
|
499
|
+
}
|
|
500
|
+
clone() {
|
|
501
|
+
return this._cloneInto();
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
const SHA256_IV = Uint32Array.from([
|
|
505
|
+
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
|
|
506
|
+
]);
|
|
507
|
+
const SHA224_IV = Uint32Array.from([
|
|
508
|
+
0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,
|
|
509
|
+
]);
|
|
510
|
+
const SHA384_IV = Uint32Array.from([
|
|
511
|
+
0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,
|
|
512
|
+
0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,
|
|
513
|
+
]);
|
|
514
|
+
const SHA512_IV = Uint32Array.from([
|
|
515
|
+
0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,
|
|
516
|
+
0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,
|
|
517
|
+
]);
|
|
518
|
+
|
|
519
|
+
const U32_MASK64 = BigInt(2 ** 32 - 1);
|
|
520
|
+
const _32n$1 = BigInt(32);
|
|
521
|
+
function fromBig(n, le = false) {
|
|
522
|
+
if (le)
|
|
523
|
+
return { h: Number(n & U32_MASK64), l: Number((n >> _32n$1) & U32_MASK64) };
|
|
524
|
+
return { h: Number((n >> _32n$1) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };
|
|
525
|
+
}
|
|
526
|
+
function split(lst, le = false) {
|
|
527
|
+
const len = lst.length;
|
|
528
|
+
let Ah = new Uint32Array(len);
|
|
529
|
+
let Al = new Uint32Array(len);
|
|
530
|
+
for (let i = 0; i < len; i++) {
|
|
531
|
+
const { h, l } = fromBig(lst[i], le);
|
|
532
|
+
[Ah[i], Al[i]] = [h, l];
|
|
533
|
+
}
|
|
534
|
+
return [Ah, Al];
|
|
535
|
+
}
|
|
536
|
+
const shrSH = (h, _l, s) => h >>> s;
|
|
537
|
+
const shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);
|
|
538
|
+
const rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));
|
|
539
|
+
const rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);
|
|
540
|
+
const rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));
|
|
541
|
+
const rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));
|
|
542
|
+
const rotr32H = (_h, l) => l;
|
|
543
|
+
const rotr32L = (h, _l) => h;
|
|
544
|
+
const rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s));
|
|
545
|
+
const rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s));
|
|
546
|
+
const rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));
|
|
547
|
+
const rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));
|
|
548
|
+
function add(Ah, Al, Bh, Bl) {
|
|
549
|
+
const l = (Al >>> 0) + (Bl >>> 0);
|
|
550
|
+
return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };
|
|
551
|
+
}
|
|
552
|
+
const add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);
|
|
553
|
+
const add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;
|
|
554
|
+
const add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);
|
|
555
|
+
const add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;
|
|
556
|
+
const add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);
|
|
557
|
+
const add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;
|
|
558
|
+
|
|
559
|
+
const SHA256_K = Uint32Array.from([
|
|
560
|
+
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
|
561
|
+
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
|
562
|
+
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
|
563
|
+
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
|
564
|
+
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
|
565
|
+
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
|
566
|
+
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
567
|
+
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
|
|
568
|
+
]);
|
|
569
|
+
const SHA256_W = new Uint32Array(64);
|
|
570
|
+
class SHA256 extends HashMD {
|
|
571
|
+
constructor(outputLen = 32) {
|
|
572
|
+
super(64, outputLen, 8, false);
|
|
573
|
+
this.A = SHA256_IV[0] | 0;
|
|
574
|
+
this.B = SHA256_IV[1] | 0;
|
|
575
|
+
this.C = SHA256_IV[2] | 0;
|
|
576
|
+
this.D = SHA256_IV[3] | 0;
|
|
577
|
+
this.E = SHA256_IV[4] | 0;
|
|
578
|
+
this.F = SHA256_IV[5] | 0;
|
|
579
|
+
this.G = SHA256_IV[6] | 0;
|
|
580
|
+
this.H = SHA256_IV[7] | 0;
|
|
581
|
+
}
|
|
582
|
+
get() {
|
|
583
|
+
const { A, B, C, D, E, F, G, H } = this;
|
|
584
|
+
return [A, B, C, D, E, F, G, H];
|
|
585
|
+
}
|
|
586
|
+
set(A, B, C, D, E, F, G, H) {
|
|
587
|
+
this.A = A | 0;
|
|
588
|
+
this.B = B | 0;
|
|
589
|
+
this.C = C | 0;
|
|
590
|
+
this.D = D | 0;
|
|
591
|
+
this.E = E | 0;
|
|
592
|
+
this.F = F | 0;
|
|
593
|
+
this.G = G | 0;
|
|
594
|
+
this.H = H | 0;
|
|
595
|
+
}
|
|
596
|
+
process(view, offset) {
|
|
597
|
+
for (let i = 0; i < 16; i++, offset += 4)
|
|
598
|
+
SHA256_W[i] = view.getUint32(offset, false);
|
|
599
|
+
for (let i = 16; i < 64; i++) {
|
|
600
|
+
const W15 = SHA256_W[i - 15];
|
|
601
|
+
const W2 = SHA256_W[i - 2];
|
|
602
|
+
const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);
|
|
603
|
+
const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);
|
|
604
|
+
SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;
|
|
605
|
+
}
|
|
606
|
+
let { A, B, C, D, E, F, G, H } = this;
|
|
607
|
+
for (let i = 0; i < 64; i++) {
|
|
608
|
+
const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);
|
|
609
|
+
const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;
|
|
610
|
+
const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);
|
|
611
|
+
const T2 = (sigma0 + Maj(A, B, C)) | 0;
|
|
612
|
+
H = G;
|
|
613
|
+
G = F;
|
|
614
|
+
F = E;
|
|
615
|
+
E = (D + T1) | 0;
|
|
616
|
+
D = C;
|
|
617
|
+
C = B;
|
|
618
|
+
B = A;
|
|
619
|
+
A = (T1 + T2) | 0;
|
|
620
|
+
}
|
|
621
|
+
A = (A + this.A) | 0;
|
|
622
|
+
B = (B + this.B) | 0;
|
|
623
|
+
C = (C + this.C) | 0;
|
|
624
|
+
D = (D + this.D) | 0;
|
|
625
|
+
E = (E + this.E) | 0;
|
|
626
|
+
F = (F + this.F) | 0;
|
|
627
|
+
G = (G + this.G) | 0;
|
|
628
|
+
H = (H + this.H) | 0;
|
|
629
|
+
this.set(A, B, C, D, E, F, G, H);
|
|
630
|
+
}
|
|
631
|
+
roundClean() {
|
|
632
|
+
clean(SHA256_W);
|
|
633
|
+
}
|
|
634
|
+
destroy() {
|
|
635
|
+
this.set(0, 0, 0, 0, 0, 0, 0, 0);
|
|
636
|
+
clean(this.buffer);
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
class SHA224 extends SHA256 {
|
|
640
|
+
constructor() {
|
|
641
|
+
super(28);
|
|
642
|
+
this.A = SHA224_IV[0] | 0;
|
|
643
|
+
this.B = SHA224_IV[1] | 0;
|
|
644
|
+
this.C = SHA224_IV[2] | 0;
|
|
645
|
+
this.D = SHA224_IV[3] | 0;
|
|
646
|
+
this.E = SHA224_IV[4] | 0;
|
|
647
|
+
this.F = SHA224_IV[5] | 0;
|
|
648
|
+
this.G = SHA224_IV[6] | 0;
|
|
649
|
+
this.H = SHA224_IV[7] | 0;
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
const K512 = (() => split([
|
|
653
|
+
'0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',
|
|
654
|
+
'0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',
|
|
655
|
+
'0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',
|
|
656
|
+
'0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',
|
|
657
|
+
'0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',
|
|
658
|
+
'0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',
|
|
659
|
+
'0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',
|
|
660
|
+
'0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',
|
|
661
|
+
'0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',
|
|
662
|
+
'0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',
|
|
663
|
+
'0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',
|
|
664
|
+
'0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',
|
|
665
|
+
'0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',
|
|
666
|
+
'0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',
|
|
667
|
+
'0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',
|
|
668
|
+
'0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',
|
|
669
|
+
'0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',
|
|
670
|
+
'0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',
|
|
671
|
+
'0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',
|
|
672
|
+
'0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'
|
|
673
|
+
].map(n => BigInt(n))))();
|
|
674
|
+
const SHA512_Kh = (() => K512[0])();
|
|
675
|
+
const SHA512_Kl = (() => K512[1])();
|
|
676
|
+
const SHA512_W_H = new Uint32Array(80);
|
|
677
|
+
const SHA512_W_L = new Uint32Array(80);
|
|
678
|
+
class SHA512 extends HashMD {
|
|
679
|
+
constructor(outputLen = 64) {
|
|
680
|
+
super(128, outputLen, 16, false);
|
|
681
|
+
this.Ah = SHA512_IV[0] | 0;
|
|
682
|
+
this.Al = SHA512_IV[1] | 0;
|
|
683
|
+
this.Bh = SHA512_IV[2] | 0;
|
|
684
|
+
this.Bl = SHA512_IV[3] | 0;
|
|
685
|
+
this.Ch = SHA512_IV[4] | 0;
|
|
686
|
+
this.Cl = SHA512_IV[5] | 0;
|
|
687
|
+
this.Dh = SHA512_IV[6] | 0;
|
|
688
|
+
this.Dl = SHA512_IV[7] | 0;
|
|
689
|
+
this.Eh = SHA512_IV[8] | 0;
|
|
690
|
+
this.El = SHA512_IV[9] | 0;
|
|
691
|
+
this.Fh = SHA512_IV[10] | 0;
|
|
692
|
+
this.Fl = SHA512_IV[11] | 0;
|
|
693
|
+
this.Gh = SHA512_IV[12] | 0;
|
|
694
|
+
this.Gl = SHA512_IV[13] | 0;
|
|
695
|
+
this.Hh = SHA512_IV[14] | 0;
|
|
696
|
+
this.Hl = SHA512_IV[15] | 0;
|
|
697
|
+
}
|
|
698
|
+
get() {
|
|
699
|
+
const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;
|
|
700
|
+
return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];
|
|
701
|
+
}
|
|
702
|
+
set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) {
|
|
703
|
+
this.Ah = Ah | 0;
|
|
704
|
+
this.Al = Al | 0;
|
|
705
|
+
this.Bh = Bh | 0;
|
|
706
|
+
this.Bl = Bl | 0;
|
|
707
|
+
this.Ch = Ch | 0;
|
|
708
|
+
this.Cl = Cl | 0;
|
|
709
|
+
this.Dh = Dh | 0;
|
|
710
|
+
this.Dl = Dl | 0;
|
|
711
|
+
this.Eh = Eh | 0;
|
|
712
|
+
this.El = El | 0;
|
|
713
|
+
this.Fh = Fh | 0;
|
|
714
|
+
this.Fl = Fl | 0;
|
|
715
|
+
this.Gh = Gh | 0;
|
|
716
|
+
this.Gl = Gl | 0;
|
|
717
|
+
this.Hh = Hh | 0;
|
|
718
|
+
this.Hl = Hl | 0;
|
|
719
|
+
}
|
|
720
|
+
process(view, offset) {
|
|
721
|
+
for (let i = 0; i < 16; i++, offset += 4) {
|
|
722
|
+
SHA512_W_H[i] = view.getUint32(offset);
|
|
723
|
+
SHA512_W_L[i] = view.getUint32((offset += 4));
|
|
724
|
+
}
|
|
725
|
+
for (let i = 16; i < 80; i++) {
|
|
726
|
+
const W15h = SHA512_W_H[i - 15] | 0;
|
|
727
|
+
const W15l = SHA512_W_L[i - 15] | 0;
|
|
728
|
+
const s0h = rotrSH(W15h, W15l, 1) ^ rotrSH(W15h, W15l, 8) ^ shrSH(W15h, W15l, 7);
|
|
729
|
+
const s0l = rotrSL(W15h, W15l, 1) ^ rotrSL(W15h, W15l, 8) ^ shrSL(W15h, W15l, 7);
|
|
730
|
+
const W2h = SHA512_W_H[i - 2] | 0;
|
|
731
|
+
const W2l = SHA512_W_L[i - 2] | 0;
|
|
732
|
+
const s1h = rotrSH(W2h, W2l, 19) ^ rotrBH(W2h, W2l, 61) ^ shrSH(W2h, W2l, 6);
|
|
733
|
+
const s1l = rotrSL(W2h, W2l, 19) ^ rotrBL(W2h, W2l, 61) ^ shrSL(W2h, W2l, 6);
|
|
734
|
+
const SUMl = add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);
|
|
735
|
+
const SUMh = add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);
|
|
736
|
+
SHA512_W_H[i] = SUMh | 0;
|
|
737
|
+
SHA512_W_L[i] = SUMl | 0;
|
|
738
|
+
}
|
|
739
|
+
let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;
|
|
740
|
+
for (let i = 0; i < 80; i++) {
|
|
741
|
+
const sigma1h = rotrSH(Eh, El, 14) ^ rotrSH(Eh, El, 18) ^ rotrBH(Eh, El, 41);
|
|
742
|
+
const sigma1l = rotrSL(Eh, El, 14) ^ rotrSL(Eh, El, 18) ^ rotrBL(Eh, El, 41);
|
|
743
|
+
const CHIh = (Eh & Fh) ^ (~Eh & Gh);
|
|
744
|
+
const CHIl = (El & Fl) ^ (~El & Gl);
|
|
745
|
+
const T1ll = add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);
|
|
746
|
+
const T1h = add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);
|
|
747
|
+
const T1l = T1ll | 0;
|
|
748
|
+
const sigma0h = rotrSH(Ah, Al, 28) ^ rotrBH(Ah, Al, 34) ^ rotrBH(Ah, Al, 39);
|
|
749
|
+
const sigma0l = rotrSL(Ah, Al, 28) ^ rotrBL(Ah, Al, 34) ^ rotrBL(Ah, Al, 39);
|
|
750
|
+
const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);
|
|
751
|
+
const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);
|
|
752
|
+
Hh = Gh | 0;
|
|
753
|
+
Hl = Gl | 0;
|
|
754
|
+
Gh = Fh | 0;
|
|
755
|
+
Gl = Fl | 0;
|
|
756
|
+
Fh = Eh | 0;
|
|
757
|
+
Fl = El | 0;
|
|
758
|
+
({ h: Eh, l: El } = add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));
|
|
759
|
+
Dh = Ch | 0;
|
|
760
|
+
Dl = Cl | 0;
|
|
761
|
+
Ch = Bh | 0;
|
|
762
|
+
Cl = Bl | 0;
|
|
763
|
+
Bh = Ah | 0;
|
|
764
|
+
Bl = Al | 0;
|
|
765
|
+
const All = add3L(T1l, sigma0l, MAJl);
|
|
766
|
+
Ah = add3H(All, T1h, sigma0h, MAJh);
|
|
767
|
+
Al = All | 0;
|
|
768
|
+
}
|
|
769
|
+
({ h: Ah, l: Al } = add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));
|
|
770
|
+
({ h: Bh, l: Bl } = add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));
|
|
771
|
+
({ h: Ch, l: Cl } = add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));
|
|
772
|
+
({ h: Dh, l: Dl } = add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));
|
|
773
|
+
({ h: Eh, l: El } = add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));
|
|
774
|
+
({ h: Fh, l: Fl } = add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));
|
|
775
|
+
({ h: Gh, l: Gl } = add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));
|
|
776
|
+
({ h: Hh, l: Hl } = add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));
|
|
777
|
+
this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);
|
|
778
|
+
}
|
|
779
|
+
roundClean() {
|
|
780
|
+
clean(SHA512_W_H, SHA512_W_L);
|
|
781
|
+
}
|
|
782
|
+
destroy() {
|
|
783
|
+
clean(this.buffer);
|
|
784
|
+
this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
class SHA384 extends SHA512 {
|
|
788
|
+
constructor() {
|
|
789
|
+
super(48);
|
|
790
|
+
this.Ah = SHA384_IV[0] | 0;
|
|
791
|
+
this.Al = SHA384_IV[1] | 0;
|
|
792
|
+
this.Bh = SHA384_IV[2] | 0;
|
|
793
|
+
this.Bl = SHA384_IV[3] | 0;
|
|
794
|
+
this.Ch = SHA384_IV[4] | 0;
|
|
795
|
+
this.Cl = SHA384_IV[5] | 0;
|
|
796
|
+
this.Dh = SHA384_IV[6] | 0;
|
|
797
|
+
this.Dl = SHA384_IV[7] | 0;
|
|
798
|
+
this.Eh = SHA384_IV[8] | 0;
|
|
799
|
+
this.El = SHA384_IV[9] | 0;
|
|
800
|
+
this.Fh = SHA384_IV[10] | 0;
|
|
801
|
+
this.Fl = SHA384_IV[11] | 0;
|
|
802
|
+
this.Gh = SHA384_IV[12] | 0;
|
|
803
|
+
this.Gl = SHA384_IV[13] | 0;
|
|
804
|
+
this.Hh = SHA384_IV[14] | 0;
|
|
805
|
+
this.Hl = SHA384_IV[15] | 0;
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
const T224_IV = Uint32Array.from([
|
|
809
|
+
0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,
|
|
810
|
+
0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,
|
|
811
|
+
]);
|
|
812
|
+
const T256_IV = Uint32Array.from([
|
|
813
|
+
0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,
|
|
814
|
+
0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,
|
|
815
|
+
]);
|
|
816
|
+
class SHA512_224 extends SHA512 {
|
|
817
|
+
constructor() {
|
|
818
|
+
super(28);
|
|
819
|
+
this.Ah = T224_IV[0] | 0;
|
|
820
|
+
this.Al = T224_IV[1] | 0;
|
|
821
|
+
this.Bh = T224_IV[2] | 0;
|
|
822
|
+
this.Bl = T224_IV[3] | 0;
|
|
823
|
+
this.Ch = T224_IV[4] | 0;
|
|
824
|
+
this.Cl = T224_IV[5] | 0;
|
|
825
|
+
this.Dh = T224_IV[6] | 0;
|
|
826
|
+
this.Dl = T224_IV[7] | 0;
|
|
827
|
+
this.Eh = T224_IV[8] | 0;
|
|
828
|
+
this.El = T224_IV[9] | 0;
|
|
829
|
+
this.Fh = T224_IV[10] | 0;
|
|
830
|
+
this.Fl = T224_IV[11] | 0;
|
|
831
|
+
this.Gh = T224_IV[12] | 0;
|
|
832
|
+
this.Gl = T224_IV[13] | 0;
|
|
833
|
+
this.Hh = T224_IV[14] | 0;
|
|
834
|
+
this.Hl = T224_IV[15] | 0;
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
class SHA512_256 extends SHA512 {
|
|
838
|
+
constructor() {
|
|
839
|
+
super(32);
|
|
840
|
+
this.Ah = T256_IV[0] | 0;
|
|
841
|
+
this.Al = T256_IV[1] | 0;
|
|
842
|
+
this.Bh = T256_IV[2] | 0;
|
|
843
|
+
this.Bl = T256_IV[3] | 0;
|
|
844
|
+
this.Ch = T256_IV[4] | 0;
|
|
845
|
+
this.Cl = T256_IV[5] | 0;
|
|
846
|
+
this.Dh = T256_IV[6] | 0;
|
|
847
|
+
this.Dl = T256_IV[7] | 0;
|
|
848
|
+
this.Eh = T256_IV[8] | 0;
|
|
849
|
+
this.El = T256_IV[9] | 0;
|
|
850
|
+
this.Fh = T256_IV[10] | 0;
|
|
851
|
+
this.Fl = T256_IV[11] | 0;
|
|
852
|
+
this.Gh = T256_IV[12] | 0;
|
|
853
|
+
this.Gl = T256_IV[13] | 0;
|
|
854
|
+
this.Hh = T256_IV[14] | 0;
|
|
855
|
+
this.Hl = T256_IV[15] | 0;
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
const sha256$2 = createHasher(() => new SHA256());
|
|
859
|
+
createHasher(() => new SHA224());
|
|
860
|
+
const sha512$2 = createHasher(() => new SHA512());
|
|
861
|
+
createHasher(() => new SHA384());
|
|
862
|
+
createHasher(() => new SHA512_256());
|
|
863
|
+
createHasher(() => new SHA512_224());
|
|
864
|
+
|
|
865
|
+
const sha256$1 = sha256$2;
|
|
866
|
+
|
|
867
|
+
const sha512$1 = sha512$2;
|
|
868
|
+
|
|
869
|
+
class HMAC extends Hash {
|
|
870
|
+
constructor(hash, _key) {
|
|
871
|
+
super();
|
|
872
|
+
this.finished = false;
|
|
873
|
+
this.destroyed = false;
|
|
874
|
+
ahash(hash);
|
|
875
|
+
const key = toBytes(_key);
|
|
876
|
+
this.iHash = hash.create();
|
|
877
|
+
if (typeof this.iHash.update !== 'function')
|
|
878
|
+
throw new Error('Expected instance of class which extends utils.Hash');
|
|
879
|
+
this.blockLen = this.iHash.blockLen;
|
|
880
|
+
this.outputLen = this.iHash.outputLen;
|
|
881
|
+
const blockLen = this.blockLen;
|
|
882
|
+
const pad = new Uint8Array(blockLen);
|
|
883
|
+
pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);
|
|
884
|
+
for (let i = 0; i < pad.length; i++)
|
|
885
|
+
pad[i] ^= 0x36;
|
|
886
|
+
this.iHash.update(pad);
|
|
887
|
+
this.oHash = hash.create();
|
|
888
|
+
for (let i = 0; i < pad.length; i++)
|
|
889
|
+
pad[i] ^= 0x36 ^ 0x5c;
|
|
890
|
+
this.oHash.update(pad);
|
|
891
|
+
clean(pad);
|
|
892
|
+
}
|
|
893
|
+
update(buf) {
|
|
894
|
+
aexists(this);
|
|
895
|
+
this.iHash.update(buf);
|
|
896
|
+
return this;
|
|
897
|
+
}
|
|
898
|
+
digestInto(out) {
|
|
899
|
+
aexists(this);
|
|
900
|
+
abytes(out, this.outputLen);
|
|
901
|
+
this.finished = true;
|
|
902
|
+
this.iHash.digestInto(out);
|
|
903
|
+
this.oHash.update(out);
|
|
904
|
+
this.oHash.digestInto(out);
|
|
905
|
+
this.destroy();
|
|
906
|
+
}
|
|
907
|
+
digest() {
|
|
908
|
+
const out = new Uint8Array(this.oHash.outputLen);
|
|
909
|
+
this.digestInto(out);
|
|
910
|
+
return out;
|
|
911
|
+
}
|
|
912
|
+
_cloneInto(to) {
|
|
913
|
+
to || (to = Object.create(Object.getPrototypeOf(this), {}));
|
|
914
|
+
const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;
|
|
915
|
+
to = to;
|
|
916
|
+
to.finished = finished;
|
|
917
|
+
to.destroyed = destroyed;
|
|
918
|
+
to.blockLen = blockLen;
|
|
919
|
+
to.outputLen = outputLen;
|
|
920
|
+
to.oHash = oHash._cloneInto(to.oHash);
|
|
921
|
+
to.iHash = iHash._cloneInto(to.iHash);
|
|
922
|
+
return to;
|
|
923
|
+
}
|
|
924
|
+
clone() {
|
|
925
|
+
return this._cloneInto();
|
|
926
|
+
}
|
|
927
|
+
destroy() {
|
|
928
|
+
this.destroyed = true;
|
|
929
|
+
this.oHash.destroy();
|
|
930
|
+
this.iHash.destroy();
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
const hmac = (hash, key, message) => new HMAC(hash, key).update(message).digest();
|
|
934
|
+
hmac.create = (hash, key) => new HMAC(hash, key);
|
|
935
|
+
|
|
936
|
+
function pbkdf2Init(hash, _password, _salt, _opts) {
|
|
937
|
+
ahash(hash);
|
|
938
|
+
const opts = checkOpts({ dkLen: 32, asyncTick: 10 }, _opts);
|
|
939
|
+
const { c, dkLen, asyncTick } = opts;
|
|
940
|
+
anumber(c);
|
|
941
|
+
anumber(dkLen);
|
|
942
|
+
anumber(asyncTick);
|
|
943
|
+
if (c < 1)
|
|
944
|
+
throw new Error('iterations (c) should be >= 1');
|
|
945
|
+
const password = kdfInputToBytes(_password);
|
|
946
|
+
const salt = kdfInputToBytes(_salt);
|
|
947
|
+
const DK = new Uint8Array(dkLen);
|
|
948
|
+
const PRF = hmac.create(hash, password);
|
|
949
|
+
const PRFSalt = PRF._cloneInto().update(salt);
|
|
950
|
+
return { c, dkLen, asyncTick, DK, PRF, PRFSalt };
|
|
951
|
+
}
|
|
952
|
+
function pbkdf2Output(PRF, PRFSalt, DK, prfW, u) {
|
|
953
|
+
PRF.destroy();
|
|
954
|
+
PRFSalt.destroy();
|
|
955
|
+
if (prfW)
|
|
956
|
+
prfW.destroy();
|
|
957
|
+
clean(u);
|
|
958
|
+
return DK;
|
|
959
|
+
}
|
|
960
|
+
function pbkdf2$1(hash, password, salt, opts) {
|
|
961
|
+
const { c, dkLen, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);
|
|
962
|
+
let prfW;
|
|
963
|
+
const arr = new Uint8Array(4);
|
|
964
|
+
const view = createView(arr);
|
|
965
|
+
const u = new Uint8Array(PRF.outputLen);
|
|
966
|
+
for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {
|
|
967
|
+
const Ti = DK.subarray(pos, pos + PRF.outputLen);
|
|
968
|
+
view.setInt32(0, ti, false);
|
|
969
|
+
(prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);
|
|
970
|
+
Ti.set(u.subarray(0, Ti.length));
|
|
971
|
+
for (let ui = 1; ui < c; ui++) {
|
|
972
|
+
PRF._cloneInto(prfW).update(u).digestInto(u);
|
|
973
|
+
for (let i = 0; i < Ti.length; i++)
|
|
974
|
+
Ti[i] ^= u[i];
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
const BSIGMA = Uint8Array.from([
|
|
981
|
+
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
|
982
|
+
14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3,
|
|
983
|
+
11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4,
|
|
984
|
+
7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8,
|
|
985
|
+
9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13,
|
|
986
|
+
2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9,
|
|
987
|
+
12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11,
|
|
988
|
+
13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10,
|
|
989
|
+
6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5,
|
|
990
|
+
10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0,
|
|
991
|
+
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
|
992
|
+
14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3,
|
|
993
|
+
11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4,
|
|
994
|
+
7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8,
|
|
995
|
+
9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13,
|
|
996
|
+
2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9,
|
|
997
|
+
]);
|
|
998
|
+
function G1s(a, b, c, d, x) {
|
|
999
|
+
a = (a + b + x) | 0;
|
|
1000
|
+
d = rotr(d ^ a, 16);
|
|
1001
|
+
c = (c + d) | 0;
|
|
1002
|
+
b = rotr(b ^ c, 12);
|
|
1003
|
+
return { a, b, c, d };
|
|
1004
|
+
}
|
|
1005
|
+
function G2s(a, b, c, d, x) {
|
|
1006
|
+
a = (a + b + x) | 0;
|
|
1007
|
+
d = rotr(d ^ a, 8);
|
|
1008
|
+
c = (c + d) | 0;
|
|
1009
|
+
b = rotr(b ^ c, 7);
|
|
1010
|
+
return { a, b, c, d };
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
const B2B_IV = Uint32Array.from([
|
|
1014
|
+
0xf3bcc908, 0x6a09e667, 0x84caa73b, 0xbb67ae85, 0xfe94f82b, 0x3c6ef372, 0x5f1d36f1, 0xa54ff53a,
|
|
1015
|
+
0xade682d1, 0x510e527f, 0x2b3e6c1f, 0x9b05688c, 0xfb41bd6b, 0x1f83d9ab, 0x137e2179, 0x5be0cd19,
|
|
1016
|
+
]);
|
|
1017
|
+
const BBUF = new Uint32Array(32);
|
|
1018
|
+
function G1b(a, b, c, d, msg, x) {
|
|
1019
|
+
const Xl = msg[x], Xh = msg[x + 1];
|
|
1020
|
+
let Al = BBUF[2 * a], Ah = BBUF[2 * a + 1];
|
|
1021
|
+
let Bl = BBUF[2 * b], Bh = BBUF[2 * b + 1];
|
|
1022
|
+
let Cl = BBUF[2 * c], Ch = BBUF[2 * c + 1];
|
|
1023
|
+
let Dl = BBUF[2 * d], Dh = BBUF[2 * d + 1];
|
|
1024
|
+
let ll = add3L(Al, Bl, Xl);
|
|
1025
|
+
Ah = add3H(ll, Ah, Bh, Xh);
|
|
1026
|
+
Al = ll | 0;
|
|
1027
|
+
({ Dh, Dl } = { Dh: Dh ^ Ah, Dl: Dl ^ Al });
|
|
1028
|
+
({ Dh, Dl } = { Dh: rotr32H(Dh, Dl), Dl: rotr32L(Dh) });
|
|
1029
|
+
({ h: Ch, l: Cl } = add(Ch, Cl, Dh, Dl));
|
|
1030
|
+
({ Bh, Bl } = { Bh: Bh ^ Ch, Bl: Bl ^ Cl });
|
|
1031
|
+
({ Bh, Bl } = { Bh: rotrSH(Bh, Bl, 24), Bl: rotrSL(Bh, Bl, 24) });
|
|
1032
|
+
(BBUF[2 * a] = Al), (BBUF[2 * a + 1] = Ah);
|
|
1033
|
+
(BBUF[2 * b] = Bl), (BBUF[2 * b + 1] = Bh);
|
|
1034
|
+
(BBUF[2 * c] = Cl), (BBUF[2 * c + 1] = Ch);
|
|
1035
|
+
(BBUF[2 * d] = Dl), (BBUF[2 * d + 1] = Dh);
|
|
1036
|
+
}
|
|
1037
|
+
function G2b(a, b, c, d, msg, x) {
|
|
1038
|
+
const Xl = msg[x], Xh = msg[x + 1];
|
|
1039
|
+
let Al = BBUF[2 * a], Ah = BBUF[2 * a + 1];
|
|
1040
|
+
let Bl = BBUF[2 * b], Bh = BBUF[2 * b + 1];
|
|
1041
|
+
let Cl = BBUF[2 * c], Ch = BBUF[2 * c + 1];
|
|
1042
|
+
let Dl = BBUF[2 * d], Dh = BBUF[2 * d + 1];
|
|
1043
|
+
let ll = add3L(Al, Bl, Xl);
|
|
1044
|
+
Ah = add3H(ll, Ah, Bh, Xh);
|
|
1045
|
+
Al = ll | 0;
|
|
1046
|
+
({ Dh, Dl } = { Dh: Dh ^ Ah, Dl: Dl ^ Al });
|
|
1047
|
+
({ Dh, Dl } = { Dh: rotrSH(Dh, Dl, 16), Dl: rotrSL(Dh, Dl, 16) });
|
|
1048
|
+
({ h: Ch, l: Cl } = add(Ch, Cl, Dh, Dl));
|
|
1049
|
+
({ Bh, Bl } = { Bh: Bh ^ Ch, Bl: Bl ^ Cl });
|
|
1050
|
+
({ Bh, Bl } = { Bh: rotrBH(Bh, Bl, 63), Bl: rotrBL(Bh, Bl, 63) });
|
|
1051
|
+
(BBUF[2 * a] = Al), (BBUF[2 * a + 1] = Ah);
|
|
1052
|
+
(BBUF[2 * b] = Bl), (BBUF[2 * b + 1] = Bh);
|
|
1053
|
+
(BBUF[2 * c] = Cl), (BBUF[2 * c + 1] = Ch);
|
|
1054
|
+
(BBUF[2 * d] = Dl), (BBUF[2 * d + 1] = Dh);
|
|
1055
|
+
}
|
|
1056
|
+
function checkBlake2Opts(outputLen, opts = {}, keyLen, saltLen, persLen) {
|
|
1057
|
+
anumber(keyLen);
|
|
1058
|
+
if (outputLen < 0 || outputLen > keyLen)
|
|
1059
|
+
throw new Error('outputLen bigger than keyLen');
|
|
1060
|
+
const { key, salt, personalization } = opts;
|
|
1061
|
+
if (key !== undefined && (key.length < 1 || key.length > keyLen))
|
|
1062
|
+
throw new Error('key length must be undefined or 1..' + keyLen);
|
|
1063
|
+
if (salt !== undefined && salt.length !== saltLen)
|
|
1064
|
+
throw new Error('salt must be undefined or ' + saltLen);
|
|
1065
|
+
if (personalization !== undefined && personalization.length !== persLen)
|
|
1066
|
+
throw new Error('personalization must be undefined or ' + persLen);
|
|
1067
|
+
}
|
|
1068
|
+
class BLAKE2 extends Hash {
|
|
1069
|
+
constructor(blockLen, outputLen) {
|
|
1070
|
+
super();
|
|
1071
|
+
this.finished = false;
|
|
1072
|
+
this.destroyed = false;
|
|
1073
|
+
this.length = 0;
|
|
1074
|
+
this.pos = 0;
|
|
1075
|
+
anumber(blockLen);
|
|
1076
|
+
anumber(outputLen);
|
|
1077
|
+
this.blockLen = blockLen;
|
|
1078
|
+
this.outputLen = outputLen;
|
|
1079
|
+
this.buffer = new Uint8Array(blockLen);
|
|
1080
|
+
this.buffer32 = u32(this.buffer);
|
|
1081
|
+
}
|
|
1082
|
+
update(data) {
|
|
1083
|
+
aexists(this);
|
|
1084
|
+
data = toBytes(data);
|
|
1085
|
+
abytes(data);
|
|
1086
|
+
const { blockLen, buffer, buffer32 } = this;
|
|
1087
|
+
const len = data.length;
|
|
1088
|
+
const offset = data.byteOffset;
|
|
1089
|
+
const buf = data.buffer;
|
|
1090
|
+
for (let pos = 0; pos < len;) {
|
|
1091
|
+
if (this.pos === blockLen) {
|
|
1092
|
+
swap32IfBE(buffer32);
|
|
1093
|
+
this.compress(buffer32, 0, false);
|
|
1094
|
+
swap32IfBE(buffer32);
|
|
1095
|
+
this.pos = 0;
|
|
1096
|
+
}
|
|
1097
|
+
const take = Math.min(blockLen - this.pos, len - pos);
|
|
1098
|
+
const dataOffset = offset + pos;
|
|
1099
|
+
if (take === blockLen && !(dataOffset % 4) && pos + take < len) {
|
|
1100
|
+
const data32 = new Uint32Array(buf, dataOffset, Math.floor((len - pos) / 4));
|
|
1101
|
+
swap32IfBE(data32);
|
|
1102
|
+
for (let pos32 = 0; pos + blockLen < len; pos32 += buffer32.length, pos += blockLen) {
|
|
1103
|
+
this.length += blockLen;
|
|
1104
|
+
this.compress(data32, pos32, false);
|
|
1105
|
+
}
|
|
1106
|
+
swap32IfBE(data32);
|
|
1107
|
+
continue;
|
|
1108
|
+
}
|
|
1109
|
+
buffer.set(data.subarray(pos, pos + take), this.pos);
|
|
1110
|
+
this.pos += take;
|
|
1111
|
+
this.length += take;
|
|
1112
|
+
pos += take;
|
|
1113
|
+
}
|
|
1114
|
+
return this;
|
|
1115
|
+
}
|
|
1116
|
+
digestInto(out) {
|
|
1117
|
+
aexists(this);
|
|
1118
|
+
aoutput(out, this);
|
|
1119
|
+
const { pos, buffer32 } = this;
|
|
1120
|
+
this.finished = true;
|
|
1121
|
+
clean(this.buffer.subarray(pos));
|
|
1122
|
+
swap32IfBE(buffer32);
|
|
1123
|
+
this.compress(buffer32, 0, true);
|
|
1124
|
+
swap32IfBE(buffer32);
|
|
1125
|
+
const out32 = u32(out);
|
|
1126
|
+
this.get().forEach((v, i) => (out32[i] = swap8IfBE(v)));
|
|
1127
|
+
}
|
|
1128
|
+
digest() {
|
|
1129
|
+
const { buffer, outputLen } = this;
|
|
1130
|
+
this.digestInto(buffer);
|
|
1131
|
+
const res = buffer.slice(0, outputLen);
|
|
1132
|
+
this.destroy();
|
|
1133
|
+
return res;
|
|
1134
|
+
}
|
|
1135
|
+
_cloneInto(to) {
|
|
1136
|
+
const { buffer, length, finished, destroyed, outputLen, pos } = this;
|
|
1137
|
+
to || (to = new this.constructor({ dkLen: outputLen }));
|
|
1138
|
+
to.set(...this.get());
|
|
1139
|
+
to.buffer.set(buffer);
|
|
1140
|
+
to.destroyed = destroyed;
|
|
1141
|
+
to.finished = finished;
|
|
1142
|
+
to.length = length;
|
|
1143
|
+
to.pos = pos;
|
|
1144
|
+
to.outputLen = outputLen;
|
|
1145
|
+
return to;
|
|
1146
|
+
}
|
|
1147
|
+
clone() {
|
|
1148
|
+
return this._cloneInto();
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
1151
|
+
class BLAKE2b extends BLAKE2 {
|
|
1152
|
+
constructor(opts = {}) {
|
|
1153
|
+
const olen = opts.dkLen === undefined ? 64 : opts.dkLen;
|
|
1154
|
+
super(128, olen);
|
|
1155
|
+
this.v0l = B2B_IV[0] | 0;
|
|
1156
|
+
this.v0h = B2B_IV[1] | 0;
|
|
1157
|
+
this.v1l = B2B_IV[2] | 0;
|
|
1158
|
+
this.v1h = B2B_IV[3] | 0;
|
|
1159
|
+
this.v2l = B2B_IV[4] | 0;
|
|
1160
|
+
this.v2h = B2B_IV[5] | 0;
|
|
1161
|
+
this.v3l = B2B_IV[6] | 0;
|
|
1162
|
+
this.v3h = B2B_IV[7] | 0;
|
|
1163
|
+
this.v4l = B2B_IV[8] | 0;
|
|
1164
|
+
this.v4h = B2B_IV[9] | 0;
|
|
1165
|
+
this.v5l = B2B_IV[10] | 0;
|
|
1166
|
+
this.v5h = B2B_IV[11] | 0;
|
|
1167
|
+
this.v6l = B2B_IV[12] | 0;
|
|
1168
|
+
this.v6h = B2B_IV[13] | 0;
|
|
1169
|
+
this.v7l = B2B_IV[14] | 0;
|
|
1170
|
+
this.v7h = B2B_IV[15] | 0;
|
|
1171
|
+
checkBlake2Opts(olen, opts, 64, 16, 16);
|
|
1172
|
+
let { key, personalization, salt } = opts;
|
|
1173
|
+
let keyLength = 0;
|
|
1174
|
+
if (key !== undefined) {
|
|
1175
|
+
key = toBytes(key);
|
|
1176
|
+
keyLength = key.length;
|
|
1177
|
+
}
|
|
1178
|
+
this.v0l ^= this.outputLen | (keyLength << 8) | (0x01 << 16) | (0x01 << 24);
|
|
1179
|
+
if (salt !== undefined) {
|
|
1180
|
+
salt = toBytes(salt);
|
|
1181
|
+
const slt = u32(salt);
|
|
1182
|
+
this.v4l ^= swap8IfBE(slt[0]);
|
|
1183
|
+
this.v4h ^= swap8IfBE(slt[1]);
|
|
1184
|
+
this.v5l ^= swap8IfBE(slt[2]);
|
|
1185
|
+
this.v5h ^= swap8IfBE(slt[3]);
|
|
1186
|
+
}
|
|
1187
|
+
if (personalization !== undefined) {
|
|
1188
|
+
personalization = toBytes(personalization);
|
|
1189
|
+
const pers = u32(personalization);
|
|
1190
|
+
this.v6l ^= swap8IfBE(pers[0]);
|
|
1191
|
+
this.v6h ^= swap8IfBE(pers[1]);
|
|
1192
|
+
this.v7l ^= swap8IfBE(pers[2]);
|
|
1193
|
+
this.v7h ^= swap8IfBE(pers[3]);
|
|
1194
|
+
}
|
|
1195
|
+
if (key !== undefined) {
|
|
1196
|
+
const tmp = new Uint8Array(this.blockLen);
|
|
1197
|
+
tmp.set(key);
|
|
1198
|
+
this.update(tmp);
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
get() {
|
|
1202
|
+
let { v0l, v0h, v1l, v1h, v2l, v2h, v3l, v3h, v4l, v4h, v5l, v5h, v6l, v6h, v7l, v7h } = this;
|
|
1203
|
+
return [v0l, v0h, v1l, v1h, v2l, v2h, v3l, v3h, v4l, v4h, v5l, v5h, v6l, v6h, v7l, v7h];
|
|
1204
|
+
}
|
|
1205
|
+
set(v0l, v0h, v1l, v1h, v2l, v2h, v3l, v3h, v4l, v4h, v5l, v5h, v6l, v6h, v7l, v7h) {
|
|
1206
|
+
this.v0l = v0l | 0;
|
|
1207
|
+
this.v0h = v0h | 0;
|
|
1208
|
+
this.v1l = v1l | 0;
|
|
1209
|
+
this.v1h = v1h | 0;
|
|
1210
|
+
this.v2l = v2l | 0;
|
|
1211
|
+
this.v2h = v2h | 0;
|
|
1212
|
+
this.v3l = v3l | 0;
|
|
1213
|
+
this.v3h = v3h | 0;
|
|
1214
|
+
this.v4l = v4l | 0;
|
|
1215
|
+
this.v4h = v4h | 0;
|
|
1216
|
+
this.v5l = v5l | 0;
|
|
1217
|
+
this.v5h = v5h | 0;
|
|
1218
|
+
this.v6l = v6l | 0;
|
|
1219
|
+
this.v6h = v6h | 0;
|
|
1220
|
+
this.v7l = v7l | 0;
|
|
1221
|
+
this.v7h = v7h | 0;
|
|
1222
|
+
}
|
|
1223
|
+
compress(msg, offset, isLast) {
|
|
1224
|
+
this.get().forEach((v, i) => (BBUF[i] = v));
|
|
1225
|
+
BBUF.set(B2B_IV, 16);
|
|
1226
|
+
let { h, l } = fromBig(BigInt(this.length));
|
|
1227
|
+
BBUF[24] = B2B_IV[8] ^ l;
|
|
1228
|
+
BBUF[25] = B2B_IV[9] ^ h;
|
|
1229
|
+
if (isLast) {
|
|
1230
|
+
BBUF[28] = ~BBUF[28];
|
|
1231
|
+
BBUF[29] = ~BBUF[29];
|
|
1232
|
+
}
|
|
1233
|
+
let j = 0;
|
|
1234
|
+
const s = BSIGMA;
|
|
1235
|
+
for (let i = 0; i < 12; i++) {
|
|
1236
|
+
G1b(0, 4, 8, 12, msg, offset + 2 * s[j++]);
|
|
1237
|
+
G2b(0, 4, 8, 12, msg, offset + 2 * s[j++]);
|
|
1238
|
+
G1b(1, 5, 9, 13, msg, offset + 2 * s[j++]);
|
|
1239
|
+
G2b(1, 5, 9, 13, msg, offset + 2 * s[j++]);
|
|
1240
|
+
G1b(2, 6, 10, 14, msg, offset + 2 * s[j++]);
|
|
1241
|
+
G2b(2, 6, 10, 14, msg, offset + 2 * s[j++]);
|
|
1242
|
+
G1b(3, 7, 11, 15, msg, offset + 2 * s[j++]);
|
|
1243
|
+
G2b(3, 7, 11, 15, msg, offset + 2 * s[j++]);
|
|
1244
|
+
G1b(0, 5, 10, 15, msg, offset + 2 * s[j++]);
|
|
1245
|
+
G2b(0, 5, 10, 15, msg, offset + 2 * s[j++]);
|
|
1246
|
+
G1b(1, 6, 11, 12, msg, offset + 2 * s[j++]);
|
|
1247
|
+
G2b(1, 6, 11, 12, msg, offset + 2 * s[j++]);
|
|
1248
|
+
G1b(2, 7, 8, 13, msg, offset + 2 * s[j++]);
|
|
1249
|
+
G2b(2, 7, 8, 13, msg, offset + 2 * s[j++]);
|
|
1250
|
+
G1b(3, 4, 9, 14, msg, offset + 2 * s[j++]);
|
|
1251
|
+
G2b(3, 4, 9, 14, msg, offset + 2 * s[j++]);
|
|
1252
|
+
}
|
|
1253
|
+
this.v0l ^= BBUF[0] ^ BBUF[16];
|
|
1254
|
+
this.v0h ^= BBUF[1] ^ BBUF[17];
|
|
1255
|
+
this.v1l ^= BBUF[2] ^ BBUF[18];
|
|
1256
|
+
this.v1h ^= BBUF[3] ^ BBUF[19];
|
|
1257
|
+
this.v2l ^= BBUF[4] ^ BBUF[20];
|
|
1258
|
+
this.v2h ^= BBUF[5] ^ BBUF[21];
|
|
1259
|
+
this.v3l ^= BBUF[6] ^ BBUF[22];
|
|
1260
|
+
this.v3h ^= BBUF[7] ^ BBUF[23];
|
|
1261
|
+
this.v4l ^= BBUF[8] ^ BBUF[24];
|
|
1262
|
+
this.v4h ^= BBUF[9] ^ BBUF[25];
|
|
1263
|
+
this.v5l ^= BBUF[10] ^ BBUF[26];
|
|
1264
|
+
this.v5h ^= BBUF[11] ^ BBUF[27];
|
|
1265
|
+
this.v6l ^= BBUF[12] ^ BBUF[28];
|
|
1266
|
+
this.v6h ^= BBUF[13] ^ BBUF[29];
|
|
1267
|
+
this.v7l ^= BBUF[14] ^ BBUF[30];
|
|
1268
|
+
this.v7h ^= BBUF[15] ^ BBUF[31];
|
|
1269
|
+
clean(BBUF);
|
|
1270
|
+
}
|
|
1271
|
+
destroy() {
|
|
1272
|
+
this.destroyed = true;
|
|
1273
|
+
clean(this.buffer32);
|
|
1274
|
+
this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
|
1275
|
+
}
|
|
1276
|
+
}
|
|
1277
|
+
const blake2b$2 = createOptHasher((opts) => new BLAKE2b(opts));
|
|
1278
|
+
function compress(s, offset, msg, rounds, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) {
|
|
1279
|
+
let j = 0;
|
|
1280
|
+
for (let i = 0; i < rounds; i++) {
|
|
1281
|
+
({ a: v0, b: v4, c: v8, d: v12 } = G1s(v0, v4, v8, v12, msg[offset + s[j++]]));
|
|
1282
|
+
({ a: v0, b: v4, c: v8, d: v12 } = G2s(v0, v4, v8, v12, msg[offset + s[j++]]));
|
|
1283
|
+
({ a: v1, b: v5, c: v9, d: v13 } = G1s(v1, v5, v9, v13, msg[offset + s[j++]]));
|
|
1284
|
+
({ a: v1, b: v5, c: v9, d: v13 } = G2s(v1, v5, v9, v13, msg[offset + s[j++]]));
|
|
1285
|
+
({ a: v2, b: v6, c: v10, d: v14 } = G1s(v2, v6, v10, v14, msg[offset + s[j++]]));
|
|
1286
|
+
({ a: v2, b: v6, c: v10, d: v14 } = G2s(v2, v6, v10, v14, msg[offset + s[j++]]));
|
|
1287
|
+
({ a: v3, b: v7, c: v11, d: v15 } = G1s(v3, v7, v11, v15, msg[offset + s[j++]]));
|
|
1288
|
+
({ a: v3, b: v7, c: v11, d: v15 } = G2s(v3, v7, v11, v15, msg[offset + s[j++]]));
|
|
1289
|
+
({ a: v0, b: v5, c: v10, d: v15 } = G1s(v0, v5, v10, v15, msg[offset + s[j++]]));
|
|
1290
|
+
({ a: v0, b: v5, c: v10, d: v15 } = G2s(v0, v5, v10, v15, msg[offset + s[j++]]));
|
|
1291
|
+
({ a: v1, b: v6, c: v11, d: v12 } = G1s(v1, v6, v11, v12, msg[offset + s[j++]]));
|
|
1292
|
+
({ a: v1, b: v6, c: v11, d: v12 } = G2s(v1, v6, v11, v12, msg[offset + s[j++]]));
|
|
1293
|
+
({ a: v2, b: v7, c: v8, d: v13 } = G1s(v2, v7, v8, v13, msg[offset + s[j++]]));
|
|
1294
|
+
({ a: v2, b: v7, c: v8, d: v13 } = G2s(v2, v7, v8, v13, msg[offset + s[j++]]));
|
|
1295
|
+
({ a: v3, b: v4, c: v9, d: v14 } = G1s(v3, v4, v9, v14, msg[offset + s[j++]]));
|
|
1296
|
+
({ a: v3, b: v4, c: v9, d: v14 } = G2s(v3, v4, v9, v14, msg[offset + s[j++]]));
|
|
1297
|
+
}
|
|
1298
|
+
return { v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15 };
|
|
1299
|
+
}
|
|
1300
|
+
const B2S_IV = SHA256_IV;
|
|
1301
|
+
class BLAKE2s extends BLAKE2 {
|
|
1302
|
+
constructor(opts = {}) {
|
|
1303
|
+
const olen = opts.dkLen === undefined ? 32 : opts.dkLen;
|
|
1304
|
+
super(64, olen);
|
|
1305
|
+
this.v0 = B2S_IV[0] | 0;
|
|
1306
|
+
this.v1 = B2S_IV[1] | 0;
|
|
1307
|
+
this.v2 = B2S_IV[2] | 0;
|
|
1308
|
+
this.v3 = B2S_IV[3] | 0;
|
|
1309
|
+
this.v4 = B2S_IV[4] | 0;
|
|
1310
|
+
this.v5 = B2S_IV[5] | 0;
|
|
1311
|
+
this.v6 = B2S_IV[6] | 0;
|
|
1312
|
+
this.v7 = B2S_IV[7] | 0;
|
|
1313
|
+
checkBlake2Opts(olen, opts, 32, 8, 8);
|
|
1314
|
+
let { key, personalization, salt } = opts;
|
|
1315
|
+
let keyLength = 0;
|
|
1316
|
+
if (key !== undefined) {
|
|
1317
|
+
key = toBytes(key);
|
|
1318
|
+
keyLength = key.length;
|
|
1319
|
+
}
|
|
1320
|
+
this.v0 ^= this.outputLen | (keyLength << 8) | (0x01 << 16) | (0x01 << 24);
|
|
1321
|
+
if (salt !== undefined) {
|
|
1322
|
+
salt = toBytes(salt);
|
|
1323
|
+
const slt = u32(salt);
|
|
1324
|
+
this.v4 ^= swap8IfBE(slt[0]);
|
|
1325
|
+
this.v5 ^= swap8IfBE(slt[1]);
|
|
1326
|
+
}
|
|
1327
|
+
if (personalization !== undefined) {
|
|
1328
|
+
personalization = toBytes(personalization);
|
|
1329
|
+
const pers = u32(personalization);
|
|
1330
|
+
this.v6 ^= swap8IfBE(pers[0]);
|
|
1331
|
+
this.v7 ^= swap8IfBE(pers[1]);
|
|
1332
|
+
}
|
|
1333
|
+
if (key !== undefined) {
|
|
1334
|
+
abytes(key);
|
|
1335
|
+
const tmp = new Uint8Array(this.blockLen);
|
|
1336
|
+
tmp.set(key);
|
|
1337
|
+
this.update(tmp);
|
|
1338
|
+
}
|
|
1339
|
+
}
|
|
1340
|
+
get() {
|
|
1341
|
+
const { v0, v1, v2, v3, v4, v5, v6, v7 } = this;
|
|
1342
|
+
return [v0, v1, v2, v3, v4, v5, v6, v7];
|
|
1343
|
+
}
|
|
1344
|
+
set(v0, v1, v2, v3, v4, v5, v6, v7) {
|
|
1345
|
+
this.v0 = v0 | 0;
|
|
1346
|
+
this.v1 = v1 | 0;
|
|
1347
|
+
this.v2 = v2 | 0;
|
|
1348
|
+
this.v3 = v3 | 0;
|
|
1349
|
+
this.v4 = v4 | 0;
|
|
1350
|
+
this.v5 = v5 | 0;
|
|
1351
|
+
this.v6 = v6 | 0;
|
|
1352
|
+
this.v7 = v7 | 0;
|
|
1353
|
+
}
|
|
1354
|
+
compress(msg, offset, isLast) {
|
|
1355
|
+
const { h, l } = fromBig(BigInt(this.length));
|
|
1356
|
+
const { v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15 } = compress(BSIGMA, offset, msg, 10, this.v0, this.v1, this.v2, this.v3, this.v4, this.v5, this.v6, this.v7, B2S_IV[0], B2S_IV[1], B2S_IV[2], B2S_IV[3], l ^ B2S_IV[4], h ^ B2S_IV[5], isLast ? ~B2S_IV[6] : B2S_IV[6], B2S_IV[7]);
|
|
1357
|
+
this.v0 ^= v0 ^ v8;
|
|
1358
|
+
this.v1 ^= v1 ^ v9;
|
|
1359
|
+
this.v2 ^= v2 ^ v10;
|
|
1360
|
+
this.v3 ^= v3 ^ v11;
|
|
1361
|
+
this.v4 ^= v4 ^ v12;
|
|
1362
|
+
this.v5 ^= v5 ^ v13;
|
|
1363
|
+
this.v6 ^= v6 ^ v14;
|
|
1364
|
+
this.v7 ^= v7 ^ v15;
|
|
1365
|
+
}
|
|
1366
|
+
destroy() {
|
|
1367
|
+
this.destroyed = true;
|
|
1368
|
+
clean(this.buffer32);
|
|
1369
|
+
this.set(0, 0, 0, 0, 0, 0, 0, 0);
|
|
1370
|
+
}
|
|
1371
|
+
}
|
|
1372
|
+
createOptHasher((opts) => new BLAKE2s(opts));
|
|
1373
|
+
|
|
1374
|
+
const blake2b$1 = blake2b$2;
|
|
1375
|
+
|
|
1376
|
+
const _0n$1 = BigInt(0);
|
|
1377
|
+
const _1n$1 = BigInt(1);
|
|
1378
|
+
const _2n = BigInt(2);
|
|
1379
|
+
const _7n$1 = BigInt(7);
|
|
1380
|
+
const _256n$1 = BigInt(256);
|
|
1381
|
+
const _0x71n = BigInt(0x71);
|
|
1382
|
+
const SHA3_PI = [];
|
|
1383
|
+
const SHA3_ROTL = [];
|
|
1384
|
+
const _SHA3_IOTA = [];
|
|
1385
|
+
for (let round = 0, R = _1n$1, x = 1, y = 0; round < 24; round++) {
|
|
1386
|
+
[x, y] = [y, (2 * x + 3 * y) % 5];
|
|
1387
|
+
SHA3_PI.push(2 * (5 * y + x));
|
|
1388
|
+
SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);
|
|
1389
|
+
let t = _0n$1;
|
|
1390
|
+
for (let j = 0; j < 7; j++) {
|
|
1391
|
+
R = ((R << _1n$1) ^ ((R >> _7n$1) * _0x71n)) % _256n$1;
|
|
1392
|
+
if (R & _2n)
|
|
1393
|
+
t ^= _1n$1 << ((_1n$1 << BigInt(j)) - _1n$1);
|
|
1394
|
+
}
|
|
1395
|
+
_SHA3_IOTA.push(t);
|
|
1396
|
+
}
|
|
1397
|
+
const IOTAS = split(_SHA3_IOTA, true);
|
|
1398
|
+
const SHA3_IOTA_H = IOTAS[0];
|
|
1399
|
+
const SHA3_IOTA_L = IOTAS[1];
|
|
1400
|
+
const rotlH = (h, l, s) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));
|
|
1401
|
+
const rotlL = (h, l, s) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));
|
|
1402
|
+
function keccakP(s, rounds = 24) {
|
|
1403
|
+
const B = new Uint32Array(5 * 2);
|
|
1404
|
+
for (let round = 24 - rounds; round < 24; round++) {
|
|
1405
|
+
for (let x = 0; x < 10; x++)
|
|
1406
|
+
B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];
|
|
1407
|
+
for (let x = 0; x < 10; x += 2) {
|
|
1408
|
+
const idx1 = (x + 8) % 10;
|
|
1409
|
+
const idx0 = (x + 2) % 10;
|
|
1410
|
+
const B0 = B[idx0];
|
|
1411
|
+
const B1 = B[idx0 + 1];
|
|
1412
|
+
const Th = rotlH(B0, B1, 1) ^ B[idx1];
|
|
1413
|
+
const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];
|
|
1414
|
+
for (let y = 0; y < 50; y += 10) {
|
|
1415
|
+
s[x + y] ^= Th;
|
|
1416
|
+
s[x + y + 1] ^= Tl;
|
|
1417
|
+
}
|
|
1418
|
+
}
|
|
1419
|
+
let curH = s[2];
|
|
1420
|
+
let curL = s[3];
|
|
1421
|
+
for (let t = 0; t < 24; t++) {
|
|
1422
|
+
const shift = SHA3_ROTL[t];
|
|
1423
|
+
const Th = rotlH(curH, curL, shift);
|
|
1424
|
+
const Tl = rotlL(curH, curL, shift);
|
|
1425
|
+
const PI = SHA3_PI[t];
|
|
1426
|
+
curH = s[PI];
|
|
1427
|
+
curL = s[PI + 1];
|
|
1428
|
+
s[PI] = Th;
|
|
1429
|
+
s[PI + 1] = Tl;
|
|
1430
|
+
}
|
|
1431
|
+
for (let y = 0; y < 50; y += 10) {
|
|
1432
|
+
for (let x = 0; x < 10; x++)
|
|
1433
|
+
B[x] = s[y + x];
|
|
1434
|
+
for (let x = 0; x < 10; x++)
|
|
1435
|
+
s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];
|
|
1436
|
+
}
|
|
1437
|
+
s[0] ^= SHA3_IOTA_H[round];
|
|
1438
|
+
s[1] ^= SHA3_IOTA_L[round];
|
|
1439
|
+
}
|
|
1440
|
+
clean(B);
|
|
1441
|
+
}
|
|
1442
|
+
class Keccak extends Hash {
|
|
1443
|
+
constructor(blockLen, suffix, outputLen, enableXOF = false, rounds = 24) {
|
|
1444
|
+
super();
|
|
1445
|
+
this.pos = 0;
|
|
1446
|
+
this.posOut = 0;
|
|
1447
|
+
this.finished = false;
|
|
1448
|
+
this.destroyed = false;
|
|
1449
|
+
this.enableXOF = false;
|
|
1450
|
+
this.blockLen = blockLen;
|
|
1451
|
+
this.suffix = suffix;
|
|
1452
|
+
this.outputLen = outputLen;
|
|
1453
|
+
this.enableXOF = enableXOF;
|
|
1454
|
+
this.rounds = rounds;
|
|
1455
|
+
anumber(outputLen);
|
|
1456
|
+
if (!(0 < blockLen && blockLen < 200))
|
|
1457
|
+
throw new Error('only keccak-f1600 function is supported');
|
|
1458
|
+
this.state = new Uint8Array(200);
|
|
1459
|
+
this.state32 = u32(this.state);
|
|
1460
|
+
}
|
|
1461
|
+
clone() {
|
|
1462
|
+
return this._cloneInto();
|
|
1463
|
+
}
|
|
1464
|
+
keccak() {
|
|
1465
|
+
swap32IfBE(this.state32);
|
|
1466
|
+
keccakP(this.state32, this.rounds);
|
|
1467
|
+
swap32IfBE(this.state32);
|
|
1468
|
+
this.posOut = 0;
|
|
1469
|
+
this.pos = 0;
|
|
1470
|
+
}
|
|
1471
|
+
update(data) {
|
|
1472
|
+
aexists(this);
|
|
1473
|
+
data = toBytes(data);
|
|
1474
|
+
abytes(data);
|
|
1475
|
+
const { blockLen, state } = this;
|
|
1476
|
+
const len = data.length;
|
|
1477
|
+
for (let pos = 0; pos < len;) {
|
|
1478
|
+
const take = Math.min(blockLen - this.pos, len - pos);
|
|
1479
|
+
for (let i = 0; i < take; i++)
|
|
1480
|
+
state[this.pos++] ^= data[pos++];
|
|
1481
|
+
if (this.pos === blockLen)
|
|
1482
|
+
this.keccak();
|
|
1483
|
+
}
|
|
1484
|
+
return this;
|
|
1485
|
+
}
|
|
1486
|
+
finish() {
|
|
1487
|
+
if (this.finished)
|
|
1488
|
+
return;
|
|
1489
|
+
this.finished = true;
|
|
1490
|
+
const { state, suffix, pos, blockLen } = this;
|
|
1491
|
+
state[pos] ^= suffix;
|
|
1492
|
+
if ((suffix & 0x80) !== 0 && pos === blockLen - 1)
|
|
1493
|
+
this.keccak();
|
|
1494
|
+
state[blockLen - 1] ^= 0x80;
|
|
1495
|
+
this.keccak();
|
|
1496
|
+
}
|
|
1497
|
+
writeInto(out) {
|
|
1498
|
+
aexists(this, false);
|
|
1499
|
+
abytes(out);
|
|
1500
|
+
this.finish();
|
|
1501
|
+
const bufferOut = this.state;
|
|
1502
|
+
const { blockLen } = this;
|
|
1503
|
+
for (let pos = 0, len = out.length; pos < len;) {
|
|
1504
|
+
if (this.posOut >= blockLen)
|
|
1505
|
+
this.keccak();
|
|
1506
|
+
const take = Math.min(blockLen - this.posOut, len - pos);
|
|
1507
|
+
out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);
|
|
1508
|
+
this.posOut += take;
|
|
1509
|
+
pos += take;
|
|
1510
|
+
}
|
|
1511
|
+
return out;
|
|
1512
|
+
}
|
|
1513
|
+
xofInto(out) {
|
|
1514
|
+
if (!this.enableXOF)
|
|
1515
|
+
throw new Error('XOF is not possible for this instance');
|
|
1516
|
+
return this.writeInto(out);
|
|
1517
|
+
}
|
|
1518
|
+
xof(bytes) {
|
|
1519
|
+
anumber(bytes);
|
|
1520
|
+
return this.xofInto(new Uint8Array(bytes));
|
|
1521
|
+
}
|
|
1522
|
+
digestInto(out) {
|
|
1523
|
+
aoutput(out, this);
|
|
1524
|
+
if (this.finished)
|
|
1525
|
+
throw new Error('digest() was already called');
|
|
1526
|
+
this.writeInto(out);
|
|
1527
|
+
this.destroy();
|
|
1528
|
+
return out;
|
|
1529
|
+
}
|
|
1530
|
+
digest() {
|
|
1531
|
+
return this.digestInto(new Uint8Array(this.outputLen));
|
|
1532
|
+
}
|
|
1533
|
+
destroy() {
|
|
1534
|
+
this.destroyed = true;
|
|
1535
|
+
clean(this.state);
|
|
1536
|
+
}
|
|
1537
|
+
_cloneInto(to) {
|
|
1538
|
+
const { blockLen, suffix, outputLen, rounds, enableXOF } = this;
|
|
1539
|
+
to || (to = new Keccak(blockLen, suffix, outputLen, enableXOF, rounds));
|
|
1540
|
+
to.state32.set(this.state32);
|
|
1541
|
+
to.pos = this.pos;
|
|
1542
|
+
to.posOut = this.posOut;
|
|
1543
|
+
to.finished = this.finished;
|
|
1544
|
+
to.rounds = rounds;
|
|
1545
|
+
to.suffix = suffix;
|
|
1546
|
+
to.outputLen = outputLen;
|
|
1547
|
+
to.enableXOF = enableXOF;
|
|
1548
|
+
to.destroyed = this.destroyed;
|
|
1549
|
+
return to;
|
|
1550
|
+
}
|
|
1551
|
+
}
|
|
1552
|
+
const gen = (suffix, blockLen, outputLen) => createHasher(() => new Keccak(blockLen, suffix, outputLen));
|
|
1553
|
+
(() => gen(0x06, 144, 224 / 8))();
|
|
1554
|
+
(() => gen(0x06, 136, 256 / 8))();
|
|
1555
|
+
(() => gen(0x06, 104, 384 / 8))();
|
|
1556
|
+
(() => gen(0x06, 72, 512 / 8))();
|
|
1557
|
+
(() => gen(0x01, 144, 224 / 8))();
|
|
1558
|
+
const keccak_256 = (() => gen(0x01, 136, 256 / 8))();
|
|
1559
|
+
(() => gen(0x01, 104, 384 / 8))();
|
|
1560
|
+
const keccak_512 = (() => gen(0x01, 72, 512 / 8))();
|
|
1561
|
+
const genShake = (suffix, blockLen, outputLen) => createXOFer((opts = {}) => new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true));
|
|
1562
|
+
(() => genShake(0x1f, 168, 128 / 8))();
|
|
1563
|
+
(() => genShake(0x1f, 136, 256 / 8))();
|
|
1564
|
+
|
|
1565
|
+
let wasm = null;
|
|
1566
|
+
let cachedUint8ArrayMemory = null;
|
|
1567
|
+
let cachedTextDecoder = null;
|
|
1568
|
+
let _isReady = false;
|
|
1569
|
+
let initPromise = null;
|
|
1570
|
+
let WASM_VECTOR_LEN = 0;
|
|
1571
|
+
function getUint8ArrayMemory() {
|
|
1572
|
+
if (cachedUint8ArrayMemory === null || cachedUint8ArrayMemory.byteLength === 0) {
|
|
1573
|
+
cachedUint8ArrayMemory = new Uint8Array(wasm['memory'].buffer);
|
|
1574
|
+
}
|
|
1575
|
+
return cachedUint8ArrayMemory;
|
|
1576
|
+
}
|
|
1577
|
+
function getStringFromWasm(ptr, len) {
|
|
1578
|
+
if (!cachedTextDecoder) {
|
|
1579
|
+
cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
|
|
1580
|
+
cachedTextDecoder.decode();
|
|
1581
|
+
}
|
|
1582
|
+
ptr = ptr >>> 0;
|
|
1583
|
+
return cachedTextDecoder.decode(getUint8ArrayMemory().subarray(ptr, ptr + len));
|
|
1584
|
+
}
|
|
1585
|
+
function getArrayU8FromWasm(ptr, len) {
|
|
1586
|
+
ptr = ptr >>> 0;
|
|
1587
|
+
return getUint8ArrayMemory().subarray(ptr / 1, ptr / 1 + len);
|
|
1588
|
+
}
|
|
1589
|
+
function passArray8ToWasm(arg, malloc) {
|
|
1590
|
+
const ptr = malloc(arg.length * 1, 1) >>> 0;
|
|
1591
|
+
getUint8ArrayMemory().set(arg, ptr / 1);
|
|
1592
|
+
WASM_VECTOR_LEN = arg.length;
|
|
1593
|
+
return ptr;
|
|
1594
|
+
}
|
|
1595
|
+
function addToExternrefTable(obj) {
|
|
1596
|
+
const idx = wasm['__externref_table_alloc']();
|
|
1597
|
+
wasm['__wbindgen_externrefs'].set(idx, obj);
|
|
1598
|
+
return idx;
|
|
1599
|
+
}
|
|
1600
|
+
function takeFromExternrefTable(idx) {
|
|
1601
|
+
const value = wasm['__wbindgen_externrefs'].get(idx);
|
|
1602
|
+
wasm['__externref_table_dealloc'](idx);
|
|
1603
|
+
return value;
|
|
1604
|
+
}
|
|
1605
|
+
function isLikeNone(x) {
|
|
1606
|
+
return x === undefined || x === null;
|
|
1607
|
+
}
|
|
1608
|
+
function handleError(f, args) {
|
|
1609
|
+
try {
|
|
1610
|
+
return f.apply(null, args);
|
|
1611
|
+
}
|
|
1612
|
+
catch (e) {
|
|
1613
|
+
const idx = addToExternrefTable(e);
|
|
1614
|
+
wasm['__wbindgen_exn_store'](idx);
|
|
1615
|
+
return undefined;
|
|
1616
|
+
}
|
|
1617
|
+
}
|
|
1618
|
+
function createImports() {
|
|
1619
|
+
const import0 = {
|
|
1620
|
+
__proto__: null,
|
|
1621
|
+
__wbg___wbindgen_is_function_0095a73b8b156f76: function (arg0) {
|
|
1622
|
+
return typeof (arg0) === 'function';
|
|
1623
|
+
},
|
|
1624
|
+
__wbg___wbindgen_is_object_5ae8e5880f2c1fbd: function (arg0) {
|
|
1625
|
+
const val = arg0;
|
|
1626
|
+
return typeof (val) === 'object' && val !== null;
|
|
1627
|
+
},
|
|
1628
|
+
__wbg___wbindgen_is_string_cd444516edc5b180: function (arg0) {
|
|
1629
|
+
return typeof (arg0) === 'string';
|
|
1630
|
+
},
|
|
1631
|
+
__wbg___wbindgen_is_undefined_9e4d92534c42d778: function (arg0) {
|
|
1632
|
+
return arg0 === undefined;
|
|
1633
|
+
},
|
|
1634
|
+
__wbg___wbindgen_throw_be289d5034ed271b: function (arg0, arg1) {
|
|
1635
|
+
throw new Error(getStringFromWasm(arg0, arg1));
|
|
1636
|
+
},
|
|
1637
|
+
__wbg_call_389efe28435a9388: function () {
|
|
1638
|
+
return handleError(function (arg0, arg1) {
|
|
1639
|
+
return arg0.call(arg1);
|
|
1640
|
+
}, arguments);
|
|
1641
|
+
},
|
|
1642
|
+
__wbg_call_4708e0c13bdc8e95: function () {
|
|
1643
|
+
return handleError(function (arg0, arg1, arg2) {
|
|
1644
|
+
return arg0.call(arg1, arg2);
|
|
1645
|
+
}, arguments);
|
|
1646
|
+
},
|
|
1647
|
+
__wbg_crypto_86f2631e91b51511: function (arg0) {
|
|
1648
|
+
return arg0.crypto;
|
|
1649
|
+
},
|
|
1650
|
+
__wbg_getRandomValues_b3f15fcbfabb0f8b: function () {
|
|
1651
|
+
return handleError(function (arg0, arg1) {
|
|
1652
|
+
arg0.getRandomValues(arg1);
|
|
1653
|
+
}, arguments);
|
|
1654
|
+
},
|
|
1655
|
+
__wbg_length_32ed9a279acd054c: function (arg0) {
|
|
1656
|
+
return arg0.length;
|
|
1657
|
+
},
|
|
1658
|
+
__wbg_msCrypto_d562bbe83e0d4b91: function (arg0) {
|
|
1659
|
+
return arg0.msCrypto;
|
|
1660
|
+
},
|
|
1661
|
+
__wbg_new_no_args_1c7c842f08d00ebb: function (arg0, arg1) {
|
|
1662
|
+
return new Function(getStringFromWasm(arg0, arg1));
|
|
1663
|
+
},
|
|
1664
|
+
__wbg_new_with_length_a2c39cbe88fd8ff1: function (arg0) {
|
|
1665
|
+
return new Uint8Array(arg0 >>> 0);
|
|
1666
|
+
},
|
|
1667
|
+
__wbg_node_e1f24f89a7336c2e: function (arg0) {
|
|
1668
|
+
return arg0.node;
|
|
1669
|
+
},
|
|
1670
|
+
__wbg_process_3975fd6c72f520aa: function (arg0) {
|
|
1671
|
+
return arg0.process;
|
|
1672
|
+
},
|
|
1673
|
+
__wbg_prototypesetcall_bdcdcc5842e4d77d: function (arg0, arg1, arg2) {
|
|
1674
|
+
Uint8Array.prototype.set.call(getArrayU8FromWasm(arg0, arg1), arg2);
|
|
1675
|
+
},
|
|
1676
|
+
__wbg_randomFillSync_f8c153b79f285817: function () {
|
|
1677
|
+
return handleError(function (arg0, arg1) {
|
|
1678
|
+
arg0.randomFillSync(arg1);
|
|
1679
|
+
}, arguments);
|
|
1680
|
+
},
|
|
1681
|
+
__wbg_require_b74f47fc2d022fd6: function () {
|
|
1682
|
+
return handleError(function () {
|
|
1683
|
+
return typeof module !== 'undefined' ? module.require : undefined;
|
|
1684
|
+
}, arguments);
|
|
1685
|
+
},
|
|
1686
|
+
__wbg_static_accessor_GLOBAL_12837167ad935116: function () {
|
|
1687
|
+
const ret = typeof global === 'undefined' ? null : global;
|
|
1688
|
+
return isLikeNone(ret) ? 0 : addToExternrefTable(ret);
|
|
1689
|
+
},
|
|
1690
|
+
__wbg_static_accessor_GLOBAL_THIS_e628e89ab3b1c95f: function () {
|
|
1691
|
+
const ret = typeof globalThis === 'undefined' ? null : globalThis;
|
|
1692
|
+
return isLikeNone(ret) ? 0 : addToExternrefTable(ret);
|
|
1693
|
+
},
|
|
1694
|
+
__wbg_static_accessor_SELF_a621d3dfbb60d0ce: function () {
|
|
1695
|
+
const ret = typeof self === 'undefined' ? null : self;
|
|
1696
|
+
return isLikeNone(ret) ? 0 : addToExternrefTable(ret);
|
|
1697
|
+
},
|
|
1698
|
+
__wbg_static_accessor_WINDOW_f8727f0cf888e0bd: function () {
|
|
1699
|
+
const ret = typeof window === 'undefined' ? null : window;
|
|
1700
|
+
return isLikeNone(ret) ? 0 : addToExternrefTable(ret);
|
|
1701
|
+
},
|
|
1702
|
+
__wbg_subarray_a96e1fef17ed23cb: function (arg0, arg1, arg2) {
|
|
1703
|
+
return arg0.subarray(arg1 >>> 0, arg2 >>> 0);
|
|
1704
|
+
},
|
|
1705
|
+
__wbg_versions_4e31226f5e8dc909: function (arg0) {
|
|
1706
|
+
return arg0.versions;
|
|
1707
|
+
},
|
|
1708
|
+
__wbindgen_cast_0000000000000001: function (arg0, arg1) {
|
|
1709
|
+
return getArrayU8FromWasm(arg0, arg1);
|
|
1710
|
+
},
|
|
1711
|
+
__wbindgen_cast_0000000000000002: function (arg0, arg1) {
|
|
1712
|
+
return getStringFromWasm(arg0, arg1);
|
|
1713
|
+
},
|
|
1714
|
+
__wbindgen_init_externref_table: function () {
|
|
1715
|
+
const table = wasm['__wbindgen_externrefs'];
|
|
1716
|
+
const offset = table.grow(4);
|
|
1717
|
+
table.set(0, undefined);
|
|
1718
|
+
table.set(offset + 0, undefined);
|
|
1719
|
+
table.set(offset + 1, null);
|
|
1720
|
+
table.set(offset + 2, true);
|
|
1721
|
+
table.set(offset + 3, false);
|
|
1722
|
+
},
|
|
1723
|
+
};
|
|
1724
|
+
return {
|
|
1725
|
+
__proto__: null,
|
|
1726
|
+
'./pezkuwi_wasm_crypto_bg.js': import0,
|
|
1727
|
+
};
|
|
1728
|
+
}
|
|
1729
|
+
async function initWasm() {
|
|
1730
|
+
if (_isReady)
|
|
1731
|
+
return true;
|
|
1732
|
+
try {
|
|
1733
|
+
const imports = createImports();
|
|
1734
|
+
const result = await WebAssembly.instantiate(wasmBytes, imports);
|
|
1735
|
+
wasm = result.instance.exports;
|
|
1736
|
+
if (typeof wasm['__wbindgen_start'] === 'function') {
|
|
1737
|
+
wasm['__wbindgen_start']();
|
|
1738
|
+
}
|
|
1739
|
+
_isReady = true;
|
|
1740
|
+
return true;
|
|
1741
|
+
}
|
|
1742
|
+
catch (error) {
|
|
1743
|
+
console.error('FATAL: Unable to initialize @pezkuwi/wasm-crypto:', error.message);
|
|
1744
|
+
return false;
|
|
1745
|
+
}
|
|
1746
|
+
}
|
|
1747
|
+
const bridge = {
|
|
1748
|
+
wasm: null,
|
|
1749
|
+
type: 'wasm'
|
|
1750
|
+
};
|
|
1751
|
+
function isReady() {
|
|
1752
|
+
return _isReady;
|
|
1753
|
+
}
|
|
1754
|
+
async function waitReady() {
|
|
1755
|
+
if (!initPromise) {
|
|
1756
|
+
initPromise = initWasm();
|
|
1757
|
+
}
|
|
1758
|
+
return initPromise;
|
|
1759
|
+
}
|
|
1760
|
+
function getSigningContext() {
|
|
1761
|
+
if (!wasm)
|
|
1762
|
+
throw new Error('WASM not initialized');
|
|
1763
|
+
const ret = wasm['get_signing_context']();
|
|
1764
|
+
const str = getStringFromWasm(ret[0], ret[1]);
|
|
1765
|
+
wasm['__wbindgen_free'](ret[0], ret[1], 1);
|
|
1766
|
+
return str;
|
|
1767
|
+
}
|
|
1768
|
+
function sr25519KeypairFromSeed(seed) {
|
|
1769
|
+
if (!wasm)
|
|
1770
|
+
throw new Error('WASM not initialized');
|
|
1771
|
+
const ptr0 = passArray8ToWasm(seed, wasm['__wbindgen_malloc']);
|
|
1772
|
+
const len0 = WASM_VECTOR_LEN;
|
|
1773
|
+
const ret = wasm['sr25519_keypair_from_seed'](ptr0, len0);
|
|
1774
|
+
if (ret[3]) {
|
|
1775
|
+
throw takeFromExternrefTable(ret[2]);
|
|
1776
|
+
}
|
|
1777
|
+
const v2 = getArrayU8FromWasm(ret[0], ret[1]).slice();
|
|
1778
|
+
wasm['__wbindgen_free'](ret[0], ret[1] * 1, 1);
|
|
1779
|
+
return v2;
|
|
1780
|
+
}
|
|
1781
|
+
function sr25519Sign(publicKey, secretKey, message) {
|
|
1782
|
+
if (!wasm)
|
|
1783
|
+
throw new Error('WASM not initialized');
|
|
1784
|
+
const ptr0 = passArray8ToWasm(publicKey, wasm['__wbindgen_malloc']);
|
|
1785
|
+
const len0 = WASM_VECTOR_LEN;
|
|
1786
|
+
const ptr1 = passArray8ToWasm(secretKey, wasm['__wbindgen_malloc']);
|
|
1787
|
+
const len1 = WASM_VECTOR_LEN;
|
|
1788
|
+
const ptr2 = passArray8ToWasm(message, wasm['__wbindgen_malloc']);
|
|
1789
|
+
const len2 = WASM_VECTOR_LEN;
|
|
1790
|
+
const ret = wasm['sr25519_sign'](ptr0, len0, ptr1, len1, ptr2, len2);
|
|
1791
|
+
if (ret[3]) {
|
|
1792
|
+
throw takeFromExternrefTable(ret[2]);
|
|
1793
|
+
}
|
|
1794
|
+
const v4 = getArrayU8FromWasm(ret[0], ret[1]).slice();
|
|
1795
|
+
wasm['__wbindgen_free'](ret[0], ret[1] * 1, 1);
|
|
1796
|
+
return v4;
|
|
1797
|
+
}
|
|
1798
|
+
function sr25519Verify(signature, message, publicKey) {
|
|
1799
|
+
if (!wasm)
|
|
1800
|
+
throw new Error('WASM not initialized');
|
|
1801
|
+
const ptr0 = passArray8ToWasm(signature, wasm['__wbindgen_malloc']);
|
|
1802
|
+
const len0 = WASM_VECTOR_LEN;
|
|
1803
|
+
const ptr1 = passArray8ToWasm(message, wasm['__wbindgen_malloc']);
|
|
1804
|
+
const len1 = WASM_VECTOR_LEN;
|
|
1805
|
+
const ptr2 = passArray8ToWasm(publicKey, wasm['__wbindgen_malloc']);
|
|
1806
|
+
const len2 = WASM_VECTOR_LEN;
|
|
1807
|
+
const ret = wasm['sr25519_verify'](ptr0, len0, ptr1, len1, ptr2, len2);
|
|
1808
|
+
return ret !== 0;
|
|
1809
|
+
}
|
|
1810
|
+
function normalizeString(str) {
|
|
1811
|
+
return (str || '').normalize('NFKD');
|
|
1812
|
+
}
|
|
1813
|
+
function bip39Validate(phrase) {
|
|
1814
|
+
try {
|
|
1815
|
+
const words = normalizeString(phrase).split(' ');
|
|
1816
|
+
return [12, 15, 18, 21, 24].includes(words.length);
|
|
1817
|
+
}
|
|
1818
|
+
catch {
|
|
1819
|
+
return false;
|
|
1820
|
+
}
|
|
1821
|
+
}
|
|
1822
|
+
const BIP39_WORDLIST = 'abandon|ability|able|about|above|absent|absorb|abstract|absurd|abuse|access|accident|account|accuse|achieve|acid|acoustic|acquire|across|act|action|actor|actress|actual|adapt|add|addict|address|adjust|admit|adult|advance|advice|aerobic|affair|afford|afraid|again|age|agent|agree|ahead|aim|air|airport|aisle|alarm|album|alcohol|alert|alien|all|alley|allow|almost|alone|alpha|already|also|alter|always|amateur|amazing|among|amount|amused|analyst|anchor|ancient|anger|angle|angry|animal|ankle|announce|annual|another|answer|antenna|antique|anxiety|any|apart|apology|appear|apple|approve|april|arch|arctic|area|arena|argue|arm|armed|armor|army|around|arrange|arrest|arrive|arrow|art|artefact|artist|artwork|ask|aspect|assault|asset|assist|assume|asthma|athlete|atom|attack|attend|attitude|attract|auction|audit|august|aunt|author|auto|autumn|average|avocado|avoid|awake|aware|away|awesome|awful|awkward|axis|baby|bachelor|bacon|badge|bag|balance|balcony|ball|bamboo|banana|banner|bar|barely|bargain|barrel|base|basic|basket|battle|beach|bean|beauty|because|become|beef|before|begin|behave|behind|believe|below|belt|bench|benefit|best|betray|better|between|beyond|bicycle|bid|bike|bind|biology|bird|birth|bitter|black|blade|blame|blanket|blast|bleak|bless|blind|blood|blossom|blouse|blue|blur|blush|board|boat|body|boil|bomb|bone|bonus|book|boost|border|boring|borrow|boss|bottom|bounce|box|boy|bracket|brain|brand|brass|brave|bread|breeze|brick|bridge|brief|bright|bring|brisk|broccoli|broken|bronze|broom|brother|brown|brush|bubble|buddy|budget|buffalo|build|bulb|bulk|bullet|bundle|bunker|burden|burger|burst|bus|business|busy|butter|buyer|buzz|cabbage|cabin|cable|cactus|cage|cake|call|calm|camera|camp|can|canal|cancel|candy|cannon|canoe|canvas|canyon|capable|capital|captain|car|carbon|card|cargo|carpet|carry|cart|case|cash|casino|castle|casual|cat|catalog|catch|category|cattle|caught|cause|caution|cave|ceiling|celery|cement|census|century|cereal|certain|chair|chalk|champion|change|chaos|chapter|charge|chase|chat|cheap|check|cheese|chef|cherry|chest|chicken|chief|child|chimney|choice|choose|chronic|chuckle|chunk|churn|cigar|cinnamon|circle|citizen|city|civil|claim|clap|clarify|claw|clay|clean|clerk|clever|click|client|cliff|climb|clinic|clip|clock|clog|close|cloth|cloud|clown|club|clump|cluster|clutch|coach|coast|coconut|code|coffee|coil|coin|collect|color|column|combine|come|comfort|comic|common|company|concert|conduct|confirm|congress|connect|consider|control|convince|cook|cool|copper|copy|coral|core|corn|correct|cost|cotton|couch|country|couple|course|cousin|cover|coyote|crack|cradle|craft|cram|crane|crash|crater|crawl|crazy|cream|credit|creek|crew|cricket|crime|crisp|critic|crop|cross|crouch|crowd|crucial|cruel|cruise|crumble|crunch|crush|cry|crystal|cube|culture|cup|cupboard|curious|current|curtain|curve|cushion|custom|cute|cycle|dad|damage|damp|dance|danger|daring|dash|daughter|dawn|day|deal|debate|debris|decade|december|decide|decline|decorate|decrease|deer|defense|define|defy|degree|delay|deliver|demand|demise|denial|dentist|deny|depart|depend|deposit|depth|deputy|derive|describe|desert|design|desk|despair|destroy|detail|detect|develop|device|devote|diagram|dial|diamond|diary|dice|diesel|diet|differ|digital|dignity|dilemma|dinner|dinosaur|direct|dirt|disagree|discover|disease|dish|dismiss|disorder|display|distance|divert|divide|divorce|dizzy|doctor|document|dog|doll|dolphin|domain|donate|donkey|donor|door|dose|double|dove|draft|dragon|drama|drastic|draw|dream|dress|drift|drill|drink|drip|drive|drop|drum|dry|duck|dumb|dune|during|dust|dutch|duty|dwarf|dynamic|eager|eagle|early|earn|earth|easily|east|easy|echo|ecology|economy|edge|edit|educate|effort|egg|eight|either|elbow|elder|electric|elegant|element|elephant|elevator|elite|else|embark|embody|embrace|emerge|emotion|employ|empower|empty|enable|enact|end|endless|endorse|enemy|energy|enforce|engage|engine|enhance|enjoy|enlist|enough|enrich|enroll|ensure|enter|entire|entry|envelope|episode|equal|equip|era|erase|erode|erosion|error|erupt|escape|essay|essence|estate|eternal|ethics|evidence|evil|evoke|evolve|exact|example|excess|exchange|excite|exclude|excuse|execute|exercise|exhaust|exhibit|exile|exist|exit|exotic|expand|expect|expire|explain|expose|express|extend|extra|eye|eyebrow|fabric|face|faculty|fade|faint|faith|fall|false|fame|family|famous|fan|fancy|fantasy|farm|fashion|fat|fatal|father|fatigue|fault|favorite|feature|february|federal|fee|feed|feel|female|fence|festival|fetch|fever|few|fiber|fiction|field|figure|file|film|filter|final|find|fine|finger|finish|fire|firm|first|fiscal|fish|fit|fitness|fix|flag|flame|flash|flat|flavor|flee|flight|flip|float|flock|floor|flower|fluid|flush|fly|foam|focus|fog|foil|fold|follow|food|foot|force|forest|forget|fork|fortune|forum|forward|fossil|foster|found|fox|fragile|frame|frequent|fresh|friend|fringe|frog|front|frost|frown|frozen|fruit|fuel|fun|funny|furnace|fury|future|gadget|gain|galaxy|gallery|game|gap|garage|garbage|garden|garlic|garment|gas|gasp|gate|gather|gauge|gaze|general|genius|genre|gentle|genuine|gesture|ghost|giant|gift|giggle|ginger|giraffe|girl|give|glad|glance|glare|glass|glide|glimpse|globe|gloom|glory|glove|glow|glue|goat|goddess|gold|good|goose|gorilla|gospel|gossip|govern|gown|grab|grace|grain|grant|grape|grass|gravity|great|green|grid|grief|grit|grocery|group|grow|grunt|guard|guess|guide|guilt|guitar|gun|gym|habit|hair|half|hammer|hamster|hand|happy|harbor|hard|harsh|harvest|hat|have|hawk|hazard|head|health|heart|heavy|hedgehog|height|hello|helmet|help|hen|hero|hidden|high|hill|hint|hip|hire|history|hobby|hockey|hold|hole|holiday|hollow|home|honey|hood|hope|horn|horror|horse|hospital|host|hotel|hour|hover|hub|huge|human|humble|humor|hundred|hungry|hunt|hurdle|hurry|hurt|husband|hybrid|ice|icon|idea|identify|idle|ignore|ill|illegal|illness|image|imitate|immense|immune|impact|impose|improve|impulse|inch|include|income|increase|index|indicate|indoor|industry|infant|inflict|inform|inhale|inherit|initial|inject|injury|inmate|inner|innocent|input|inquiry|insane|insect|inside|inspire|install|intact|interest|into|invest|invite|involve|iron|island|isolate|issue|item|ivory|jacket|jaguar|jar|jazz|jealous|jeans|jelly|jewel|job|join|joke|journey|joy|judge|juice|jump|jungle|junior|junk|just|kangaroo|keen|keep|ketchup|key|kick|kid|kidney|kind|kingdom|kiss|kit|kitchen|kite|kitten|kiwi|knee|knife|knock|know|lab|label|labor|ladder|lady|lake|lamp|language|laptop|large|later|latin|laugh|laundry|lava|law|lawn|lawsuit|layer|lazy|leader|leaf|learn|leave|lecture|left|leg|legal|legend|leisure|lemon|lend|length|lens|leopard|lesson|letter|level|liar|liberty|library|license|life|lift|light|like|limb|limit|link|lion|liquid|list|little|live|lizard|load|loan|lobster|local|lock|logic|lonely|long|loop|lottery|loud|lounge|love|loyal|lucky|luggage|lumber|lunar|lunch|luxury|lyrics|machine|mad|magic|magnet|maid|mail|main|major|make|mammal|man|manage|mandate|mango|mansion|manual|maple|marble|march|margin|marine|market|marriage|mask|mass|master|match|material|math|matrix|matter|maximum|maze|meadow|mean|measure|meat|mechanic|medal|media|melody|melt|member|memory|mention|menu|mercy|merge|merit|merry|mesh|message|metal|method|middle|midnight|milk|million|mimic|mind|minimum|minor|minute|miracle|mirror|misery|miss|mistake|mix|mixed|mixture|mobile|model|modify|mom|moment|monitor|monkey|monster|month|moon|moral|more|morning|mosquito|mother|motion|motor|mountain|mouse|move|movie|much|muffin|mule|multiply|muscle|museum|mushroom|music|must|mutual|myself|mystery|myth|naive|name|napkin|narrow|nasty|nation|nature|near|neck|need|negative|neglect|neither|nephew|nerve|nest|net|network|neutral|never|news|next|nice|night|noble|noise|nominee|noodle|normal|north|nose|notable|note|nothing|notice|novel|now|nuclear|number|nurse|nut|oak|obey|object|oblige|obscure|observe|obtain|obvious|occur|ocean|october|odor|off|offer|office|often|oil|okay|old|olive|olympic|omit|once|one|onion|online|only|open|opera|opinion|oppose|option|orange|orbit|orchard|order|ordinary|organ|orient|original|orphan|ostrich|other|outdoor|outer|output|outside|oval|oven|over|own|owner|oxygen|oyster|ozone|pact|paddle|page|pair|palace|palm|panda|panel|panic|panther|paper|parade|parent|park|parrot|party|pass|patch|path|patient|patrol|pattern|pause|pave|payment|peace|peanut|pear|peasant|pelican|pen|penalty|pencil|people|pepper|perfect|permit|person|pet|phone|photo|phrase|physical|piano|picnic|picture|piece|pig|pigeon|pill|pilot|pink|pioneer|pipe|pistol|pitch|pizza|place|planet|plastic|plate|play|please|pledge|pluck|plug|plunge|poem|poet|point|polar|pole|police|pond|pony|pool|popular|portion|position|possible|post|potato|pottery|poverty|powder|power|practice|praise|predict|prefer|prepare|present|pretty|prevent|price|pride|primary|print|priority|prison|private|prize|problem|process|produce|profit|program|project|promote|proof|property|prosper|protect|proud|provide|public|pudding|pull|pulp|pulse|pumpkin|punch|pupil|puppy|purchase|purity|purpose|purse|push|put|puzzle|pyramid|quality|quantum|quarter|question|quick|quit|quiz|quote|rabbit|raccoon|race|rack|radar|radio|rail|rain|raise|rally|ramp|ranch|random|range|rapid|rare|rate|rather|raven|raw|razor|ready|real|reason|rebel|rebuild|recall|receive|recipe|record|recycle|reduce|reflect|reform|refuse|region|regret|regular|reject|relax|release|relief|rely|remain|remember|remind|remove|render|renew|rent|reopen|repair|repeat|replace|report|require|rescue|resemble|resist|resource|response|result|retire|retreat|return|reunion|reveal|review|reward|rhythm|rib|ribbon|rice|rich|ride|ridge|rifle|right|rigid|ring|riot|ripple|risk|ritual|rival|river|road|roast|robot|robust|rocket|romance|roof|rookie|room|rose|rotate|rough|round|route|royal|rubber|rude|rug|rule|run|runway|rural|sad|saddle|sadness|safe|sail|salad|salmon|salon|salt|salute|same|sample|sand|satisfy|satoshi|sauce|sausage|save|say|scale|scan|scare|scatter|scene|scheme|school|science|scissors|scorpion|scout|scrap|screen|script|scrub|sea|search|season|seat|second|secret|section|security|seed|seek|segment|select|sell|seminar|senior|sense|sentence|series|service|session|settle|setup|seven|shadow|shaft|shallow|share|shed|shell|sheriff|shield|shift|shine|ship|shiver|shock|shoe|shoot|shop|short|shoulder|shove|shrimp|shrug|shuffle|shy|sibling|sick|side|siege|sight|sign|silent|silk|silly|silver|similar|simple|since|sing|siren|sister|situate|six|size|skate|sketch|ski|skill|skin|skirt|skull|slab|slam|sleep|slender|slice|slide|slight|slim|slogan|slot|slow|slush|small|smart|smile|smoke|smooth|snack|snake|snap|sniff|snow|soap|soccer|social|sock|soda|soft|solar|soldier|solid|solution|solve|someone|song|soon|sorry|sort|soul|sound|soup|source|south|space|spare|spatial|spawn|speak|special|speed|spell|spend|sphere|spice|spider|spike|spin|spirit|split|spoil|sponsor|spoon|sport|spot|spray|spread|spring|spy|square|squeeze|squirrel|stable|stadium|staff|stage|stairs|stamp|stand|start|state|stay|steak|steel|stem|step|stereo|stick|still|sting|stock|stomach|stone|stool|story|stove|strategy|street|strike|strong|struggle|student|stuff|stumble|style|subject|submit|subway|success|such|sudden|suffer|sugar|suggest|suit|summer|sun|sunny|sunset|super|supply|supreme|sure|surface|surge|surprise|surround|survey|suspect|sustain|swallow|swamp|swap|swarm|swear|sweet|swift|swim|swing|switch|sword|symbol|symptom|syrup|system|table|tackle|tag|tail|talent|talk|tank|tape|target|task|taste|tattoo|taxi|teach|team|tell|ten|tenant|tennis|tent|term|test|text|thank|that|theme|then|theory|there|they|thing|this|thought|three|thrive|throw|thumb|thunder|ticket|tide|tiger|tilt|timber|time|tiny|tip|tired|tissue|title|toast|tobacco|today|toddler|toe|together|toilet|token|tomato|tomorrow|tone|tongue|tonight|tool|tooth|top|topic|topple|torch|tornado|tortoise|toss|total|tourist|toward|tower|town|toy|track|trade|traffic|tragic|train|transfer|trap|trash|travel|tray|treat|tree|trend|trial|tribe|trick|trigger|trim|trip|trophy|trouble|truck|true|truly|trumpet|trust|truth|try|tube|tuition|tumble|tuna|tunnel|turkey|turn|turtle|twelve|twenty|twice|twin|twist|two|type|typical|ugly|umbrella|unable|unaware|uncle|uncover|under|undo|unfair|unfold|unhappy|uniform|unique|unit|universe|unknown|unlock|until|unusual|unveil|update|upgrade|uphold|upon|upper|upset|urban|urge|usage|use|used|useful|useless|usual|utility|vacant|vacuum|vague|valid|valley|valve|van|vanish|vapor|various|vast|vault|vehicle|velvet|vendor|venture|venue|verb|verify|version|very|vessel|veteran|viable|vibrant|vicious|victory|video|view|village|vintage|violin|virtual|virus|visa|visit|visual|vital|vivid|vocal|voice|void|volcano|volume|vote|voyage|wage|wagon|wait|walk|wall|walnut|want|warfare|warm|warrior|wash|wasp|waste|water|wave|way|wealth|weapon|wear|weasel|weather|web|wedding|weekend|weird|welcome|west|wet|whale|what|wheat|wheel|when|where|whip|whisper|wide|width|wife|wild|will|win|window|wine|wing|wink|winner|winter|wire|wisdom|wise|wish|witness|wolf|woman|wonder|wood|wool|word|work|world|worry|worth|wrap|wreck|wrestle|wrist|write|wrong|yard|year|yellow|you|young|youth|zebra|zero|zone|zoo'.split('|');
|
|
1823
|
+
function binaryToByte(bin) {
|
|
1824
|
+
return parseInt(bin, 2);
|
|
1825
|
+
}
|
|
1826
|
+
function bytesToBinary(bytes) {
|
|
1827
|
+
return bytes.map((x) => x.toString(2).padStart(8, '0')).join('');
|
|
1828
|
+
}
|
|
1829
|
+
function deriveChecksumBits(entropyBuffer) {
|
|
1830
|
+
const hash = sha256$1(entropyBuffer);
|
|
1831
|
+
return bytesToBinary(Array.from(hash)).slice(0, (entropyBuffer.length * 8) / 32);
|
|
1832
|
+
}
|
|
1833
|
+
function bip39Generate(_words) {
|
|
1834
|
+
throw new Error('bip39Generate: use @pezkuwi/util-crypto mnemonicGenerate instead');
|
|
1835
|
+
}
|
|
1836
|
+
function bip39ToEntropy(phrase) {
|
|
1837
|
+
const words = normalizeString(phrase).split(' ');
|
|
1838
|
+
if (words.length % 3 !== 0) {
|
|
1839
|
+
throw new Error('Invalid mnemonic');
|
|
1840
|
+
}
|
|
1841
|
+
const bits = words
|
|
1842
|
+
.map((word) => {
|
|
1843
|
+
const index = BIP39_WORDLIST.indexOf(word);
|
|
1844
|
+
if (index === -1) {
|
|
1845
|
+
throw new Error('Invalid mnemonic');
|
|
1846
|
+
}
|
|
1847
|
+
return index.toString(2).padStart(11, '0');
|
|
1848
|
+
})
|
|
1849
|
+
.join('');
|
|
1850
|
+
const dividerIndex = Math.floor(bits.length / 33) * 32;
|
|
1851
|
+
const entropyBits = bits.slice(0, dividerIndex);
|
|
1852
|
+
const checksumBits = bits.slice(dividerIndex);
|
|
1853
|
+
const matched = entropyBits.match(/(.{1,8})/g);
|
|
1854
|
+
const entropyBytes = matched?.map(binaryToByte);
|
|
1855
|
+
if (!entropyBytes || (entropyBytes.length % 4 !== 0) || (entropyBytes.length < 16) || (entropyBytes.length > 32)) {
|
|
1856
|
+
throw new Error('Invalid entropy');
|
|
1857
|
+
}
|
|
1858
|
+
const entropy = new Uint8Array(entropyBytes);
|
|
1859
|
+
if (deriveChecksumBits(entropy) !== checksumBits) {
|
|
1860
|
+
throw new Error('Invalid mnemonic checksum');
|
|
1861
|
+
}
|
|
1862
|
+
return entropy;
|
|
1863
|
+
}
|
|
1864
|
+
function bip39ToMiniSecret(phrase, password) {
|
|
1865
|
+
const entropy = bip39ToEntropy(phrase);
|
|
1866
|
+
const salt = new TextEncoder().encode(`mnemonic${normalizeString(password)}`);
|
|
1867
|
+
return pbkdf2$1(sha512$1, entropy, salt, { c: 2048, dkLen: 64 }).slice(0, 32);
|
|
1868
|
+
}
|
|
1869
|
+
function bip39ToSeed(phrase, password) {
|
|
1870
|
+
const salt = new TextEncoder().encode(`mnemonic${normalizeString(password)}`);
|
|
1871
|
+
const input = new TextEncoder().encode(normalizeString(phrase));
|
|
1872
|
+
return pbkdf2$1(sha256$1, input, salt, { c: 2048, dkLen: 64 });
|
|
1873
|
+
}
|
|
1874
|
+
function ed25519KeypairFromSeed(_seed) {
|
|
1875
|
+
throw new Error('ed25519KeypairFromSeed not yet implemented');
|
|
1876
|
+
}
|
|
1877
|
+
function ed25519Sign(_publicKey, _secretKey, _message) {
|
|
1878
|
+
throw new Error('ed25519Sign not yet implemented');
|
|
1879
|
+
}
|
|
1880
|
+
function ed25519Verify(_signature, _message, _publicKey) {
|
|
1881
|
+
throw new Error('ed25519Verify not yet implemented');
|
|
1882
|
+
}
|
|
1883
|
+
function sr25519Agree(_publicKey, _secretKey) {
|
|
1884
|
+
throw new Error('sr25519Agree not yet implemented');
|
|
1885
|
+
}
|
|
1886
|
+
function sr25519DeriveKeypairHard(_pair, _cc) {
|
|
1887
|
+
throw new Error('sr25519DeriveKeypairHard not yet implemented');
|
|
1888
|
+
}
|
|
1889
|
+
function sr25519DeriveKeypairSoft(_pair, _cc) {
|
|
1890
|
+
throw new Error('sr25519DeriveKeypairSoft not yet implemented');
|
|
1891
|
+
}
|
|
1892
|
+
function sr25519DerivePublicSoft(_publicKey, _cc) {
|
|
1893
|
+
throw new Error('sr25519DerivePublicSoft not yet implemented');
|
|
1894
|
+
}
|
|
1895
|
+
function vrfSign(_secretKey, _context, _message, _extra) {
|
|
1896
|
+
throw new Error('vrfSign not yet implemented');
|
|
1897
|
+
}
|
|
1898
|
+
function vrfVerify(_publicKey, _context, _message, _extra, _outAndProof) {
|
|
1899
|
+
throw new Error('vrfVerify not yet implemented');
|
|
1900
|
+
}
|
|
1901
|
+
function secp256k1FromSeed(_seed) {
|
|
1902
|
+
throw new Error('secp256k1FromSeed not yet implemented');
|
|
1903
|
+
}
|
|
1904
|
+
function secp256k1Compress(_publicKey) {
|
|
1905
|
+
throw new Error('secp256k1Compress not yet implemented');
|
|
1906
|
+
}
|
|
1907
|
+
function secp256k1Expand(_publicKey) {
|
|
1908
|
+
throw new Error('secp256k1Expand not yet implemented');
|
|
1909
|
+
}
|
|
1910
|
+
function secp256k1Recover(_msgHash, _signature, _recoveryId) {
|
|
1911
|
+
throw new Error('secp256k1Recover not yet implemented');
|
|
1912
|
+
}
|
|
1913
|
+
function secp256k1Sign(_msgHash, _secretKey) {
|
|
1914
|
+
throw new Error('secp256k1Sign not yet implemented');
|
|
1915
|
+
}
|
|
1916
|
+
function blake2b(data, key, size) {
|
|
1917
|
+
if (key && key.length > 0) {
|
|
1918
|
+
return blake2b$1(data, { dkLen: size, key });
|
|
1919
|
+
}
|
|
1920
|
+
return blake2b$1(data, { dkLen: size });
|
|
1921
|
+
}
|
|
1922
|
+
function hmacSha256(key, data) {
|
|
1923
|
+
return hmac(sha256$1, key, data);
|
|
1924
|
+
}
|
|
1925
|
+
function hmacSha512(key, data) {
|
|
1926
|
+
return hmac(sha512$1, key, data);
|
|
1927
|
+
}
|
|
1928
|
+
function keccak256(data) {
|
|
1929
|
+
return keccak_256(data);
|
|
1930
|
+
}
|
|
1931
|
+
function keccak512(data) {
|
|
1932
|
+
return keccak_512(data);
|
|
1933
|
+
}
|
|
1934
|
+
function pbkdf2(data, salt, rounds) {
|
|
1935
|
+
return pbkdf2$1(sha512$1, data, salt, { c: rounds, dkLen: 64 });
|
|
1936
|
+
}
|
|
1937
|
+
function scrypt(_password, _salt, _log2n, _r, _p) {
|
|
1938
|
+
throw new Error('scrypt not yet implemented - use @pezkuwi/util-crypto scryptSync instead');
|
|
1939
|
+
}
|
|
1940
|
+
function sha256(data) {
|
|
1941
|
+
return sha256$1(data);
|
|
1942
|
+
}
|
|
1943
|
+
function sha512(data) {
|
|
1944
|
+
return sha512$1(data);
|
|
1945
|
+
}
|
|
1946
|
+
const P64_1 = BigInt('11400714785074694791');
|
|
1947
|
+
const P64_2 = BigInt('14029467366897019727');
|
|
1948
|
+
const P64_3 = BigInt('1609587929392839161');
|
|
1949
|
+
const P64_4 = BigInt('9650029242287828579');
|
|
1950
|
+
const P64_5 = BigInt('2870177450012600261');
|
|
1951
|
+
const U64 = BigInt('0xffffffffffffffff');
|
|
1952
|
+
const _0n = BigInt(0);
|
|
1953
|
+
const _1n = BigInt(1);
|
|
1954
|
+
const _7n = BigInt(7);
|
|
1955
|
+
const _11n = BigInt(11);
|
|
1956
|
+
const _12n = BigInt(12);
|
|
1957
|
+
const _16n = BigInt(16);
|
|
1958
|
+
const _18n = BigInt(18);
|
|
1959
|
+
const _23n = BigInt(23);
|
|
1960
|
+
const _27n = BigInt(27);
|
|
1961
|
+
const _29n = BigInt(29);
|
|
1962
|
+
const _31n = BigInt(31);
|
|
1963
|
+
const _32n = BigInt(32);
|
|
1964
|
+
const _33n = BigInt(33);
|
|
1965
|
+
const _64n = BigInt(64);
|
|
1966
|
+
const _256n = BigInt(256);
|
|
1967
|
+
function rotl(a, b) {
|
|
1968
|
+
const c = a & U64;
|
|
1969
|
+
return ((c << b) | (c >> (_64n - b))) & U64;
|
|
1970
|
+
}
|
|
1971
|
+
function fromU8a(u8a, p, count) {
|
|
1972
|
+
const bigints = new Array(count);
|
|
1973
|
+
let offset = 0;
|
|
1974
|
+
for (let i = 0; i < count; i++, offset += 2) {
|
|
1975
|
+
bigints[i] = BigInt(u8a[p + offset] | (u8a[p + 1 + offset] << 8));
|
|
1976
|
+
}
|
|
1977
|
+
let result = _0n;
|
|
1978
|
+
for (let i = count - 1; i >= 0; i--) {
|
|
1979
|
+
result = (result << _16n) + bigints[i];
|
|
1980
|
+
}
|
|
1981
|
+
return result;
|
|
1982
|
+
}
|
|
1983
|
+
function xxhashInit(seed, input) {
|
|
1984
|
+
const state = {
|
|
1985
|
+
seed,
|
|
1986
|
+
u8a: new Uint8Array(32),
|
|
1987
|
+
u8asize: 0,
|
|
1988
|
+
v1: seed + P64_1 + P64_2,
|
|
1989
|
+
v2: seed + P64_2,
|
|
1990
|
+
v3: seed,
|
|
1991
|
+
v4: seed - P64_1
|
|
1992
|
+
};
|
|
1993
|
+
if (input.length < 32) {
|
|
1994
|
+
state.u8a.set(input);
|
|
1995
|
+
state.u8asize = input.length;
|
|
1996
|
+
return state;
|
|
1997
|
+
}
|
|
1998
|
+
const limit = input.length - 32;
|
|
1999
|
+
let p = 0;
|
|
2000
|
+
if (limit >= 0) {
|
|
2001
|
+
const adjustV = (v) => P64_1 * rotl(v + P64_2 * fromU8a(input, p, 4), _31n);
|
|
2002
|
+
do {
|
|
2003
|
+
state.v1 = adjustV(state.v1);
|
|
2004
|
+
p += 8;
|
|
2005
|
+
state.v2 = adjustV(state.v2);
|
|
2006
|
+
p += 8;
|
|
2007
|
+
state.v3 = adjustV(state.v3);
|
|
2008
|
+
p += 8;
|
|
2009
|
+
state.v4 = adjustV(state.v4);
|
|
2010
|
+
p += 8;
|
|
2011
|
+
} while (p <= limit);
|
|
2012
|
+
}
|
|
2013
|
+
if (p < input.length) {
|
|
2014
|
+
state.u8a.set(input.subarray(p, input.length));
|
|
2015
|
+
state.u8asize = input.length - p;
|
|
2016
|
+
}
|
|
2017
|
+
return state;
|
|
2018
|
+
}
|
|
2019
|
+
function xxhash64(input, initSeed) {
|
|
2020
|
+
const { seed, u8a, u8asize, v1, v2, v3, v4 } = xxhashInit(BigInt(initSeed), input);
|
|
2021
|
+
let p = 0;
|
|
2022
|
+
let h64 = U64 & (BigInt(input.length) + (input.length >= 32
|
|
2023
|
+
? (((((((((rotl(v1, _1n) + rotl(v2, _7n) + rotl(v3, _12n) + rotl(v4, _18n)) ^ (P64_1 * rotl(v1 * P64_2, _31n))) * P64_1 + P64_4) ^ (P64_1 * rotl(v2 * P64_2, _31n))) * P64_1 + P64_4) ^ (P64_1 * rotl(v3 * P64_2, _31n))) * P64_1 + P64_4) ^ (P64_1 * rotl(v4 * P64_2, _31n))) * P64_1 + P64_4)
|
|
2024
|
+
: (seed + P64_5)));
|
|
2025
|
+
while (p <= (u8asize - 8)) {
|
|
2026
|
+
h64 = U64 & (P64_4 + P64_1 * rotl(h64 ^ (P64_1 * rotl(P64_2 * fromU8a(u8a, p, 4), _31n)), _27n));
|
|
2027
|
+
p += 8;
|
|
2028
|
+
}
|
|
2029
|
+
if ((p + 4) <= u8asize) {
|
|
2030
|
+
h64 = U64 & (P64_3 + P64_2 * rotl(h64 ^ (P64_1 * fromU8a(u8a, p, 2)), _23n));
|
|
2031
|
+
p += 4;
|
|
2032
|
+
}
|
|
2033
|
+
while (p < u8asize) {
|
|
2034
|
+
h64 = U64 & (P64_1 * rotl(h64 ^ (P64_5 * BigInt(u8a[p++])), _11n));
|
|
2035
|
+
}
|
|
2036
|
+
h64 = U64 & (P64_2 * (h64 ^ (h64 >> _33n)));
|
|
2037
|
+
h64 = U64 & (P64_3 * (h64 ^ (h64 >> _29n)));
|
|
2038
|
+
h64 = U64 & (h64 ^ (h64 >> _32n));
|
|
2039
|
+
const result = new Uint8Array(8);
|
|
2040
|
+
for (let i = 7; i >= 0; i--) {
|
|
2041
|
+
result[i] = Number(h64 % _256n);
|
|
2042
|
+
h64 = h64 / _256n;
|
|
2043
|
+
}
|
|
2044
|
+
return result;
|
|
2045
|
+
}
|
|
2046
|
+
function twox(data, rounds) {
|
|
2047
|
+
const result = new Uint8Array(rounds * 8);
|
|
2048
|
+
for (let seed = 0; seed < rounds; seed++) {
|
|
2049
|
+
result.set(xxhash64(data, seed).reverse(), seed * 8);
|
|
2050
|
+
}
|
|
2051
|
+
return result;
|
|
2052
|
+
}
|
|
2053
|
+
|
|
2054
|
+
exports.bip39Generate = bip39Generate;
|
|
2055
|
+
exports.bip39ToEntropy = bip39ToEntropy;
|
|
2056
|
+
exports.bip39ToMiniSecret = bip39ToMiniSecret;
|
|
2057
|
+
exports.bip39ToSeed = bip39ToSeed;
|
|
2058
|
+
exports.bip39Validate = bip39Validate;
|
|
2059
|
+
exports.blake2b = blake2b;
|
|
2060
|
+
exports.bridge = bridge;
|
|
2061
|
+
exports.ed25519KeypairFromSeed = ed25519KeypairFromSeed;
|
|
2062
|
+
exports.ed25519Sign = ed25519Sign;
|
|
2063
|
+
exports.ed25519Verify = ed25519Verify;
|
|
2064
|
+
exports.getSigningContext = getSigningContext;
|
|
2065
|
+
exports.hmacSha256 = hmacSha256;
|
|
2066
|
+
exports.hmacSha512 = hmacSha512;
|
|
2067
|
+
exports.isReady = isReady;
|
|
2068
|
+
exports.keccak256 = keccak256;
|
|
2069
|
+
exports.keccak512 = keccak512;
|
|
2070
|
+
exports.packageInfo = packageInfo;
|
|
2071
|
+
exports.pbkdf2 = pbkdf2;
|
|
2072
|
+
exports.scrypt = scrypt;
|
|
2073
|
+
exports.secp256k1Compress = secp256k1Compress;
|
|
2074
|
+
exports.secp256k1Expand = secp256k1Expand;
|
|
2075
|
+
exports.secp256k1FromSeed = secp256k1FromSeed;
|
|
2076
|
+
exports.secp256k1Recover = secp256k1Recover;
|
|
2077
|
+
exports.secp256k1Sign = secp256k1Sign;
|
|
2078
|
+
exports.sha256 = sha256;
|
|
2079
|
+
exports.sha512 = sha512;
|
|
2080
|
+
exports.sr25519Agree = sr25519Agree;
|
|
2081
|
+
exports.sr25519DeriveKeypairHard = sr25519DeriveKeypairHard;
|
|
2082
|
+
exports.sr25519DeriveKeypairSoft = sr25519DeriveKeypairSoft;
|
|
2083
|
+
exports.sr25519DerivePublicSoft = sr25519DerivePublicSoft;
|
|
2084
|
+
exports.sr25519KeypairFromSeed = sr25519KeypairFromSeed;
|
|
2085
|
+
exports.sr25519Sign = sr25519Sign;
|
|
2086
|
+
exports.sr25519Verify = sr25519Verify;
|
|
2087
|
+
exports.twox = twox;
|
|
2088
|
+
exports.vrfSign = vrfSign;
|
|
2089
|
+
exports.vrfVerify = vrfVerify;
|
|
2090
|
+
exports.waitReady = waitReady;
|
|
2091
|
+
|
|
2092
|
+
}));
|