@neuraiproject/neurai-message 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -8
- package/dist/NeuraiMessage.global.js +12837 -0
- package/dist/browser.mjs +12810 -0
- package/dist/index.cjs +2901 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +2890 -0
- package/dist/main.js +10421 -16548
- package/dist/module.js +10783 -16914
- package/dist/src/browser-shims.d.ts +1 -0
- package/dist/src/browser.d.ts +1 -0
- package/dist/src/core.d.ts +6 -0
- package/dist/src/global.d.ts +8 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/legacy-message.d.ts +6 -0
- package/index.ts +1 -256
- package/package.json +33 -19
- package/src/browser-shims.ts +9 -0
- package/src/browser.ts +1 -0
- package/src/core.ts +257 -0
- package/src/global.ts +15 -0
- package/src/index.ts +1 -0
- package/src/legacy-message.ts +140 -0
- package/{test.js → test.spec.js} +5 -7
- package/tsconfig.json +6 -3
- package/vitest.config.mjs +7 -0
- package/dist/main.js.map +0 -1
- package/dist/module.js.map +0 -1
- package/dist/types.d.ts +0 -8
- package/dist/types.d.ts.map +0 -1
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,2890 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
9
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
10
|
+
}) : x)(function(x) {
|
|
11
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
12
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
13
|
+
});
|
|
14
|
+
var __commonJS = (cb, mod) => function __require2() {
|
|
15
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
16
|
+
};
|
|
17
|
+
var __copyProps = (to, from, except, desc) => {
|
|
18
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
19
|
+
for (let key of __getOwnPropNames(from))
|
|
20
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
21
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
22
|
+
}
|
|
23
|
+
return to;
|
|
24
|
+
};
|
|
25
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
26
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
27
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
28
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
29
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
30
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
31
|
+
mod
|
|
32
|
+
));
|
|
33
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
34
|
+
|
|
35
|
+
// node_modules/create-hash/index.js
|
|
36
|
+
var require_create_hash = __commonJS({
|
|
37
|
+
"node_modules/create-hash/index.js"(exports, module) {
|
|
38
|
+
module.exports = __require("crypto").createHash;
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// node_modules/bech32/dist/index.js
|
|
43
|
+
var require_dist = __commonJS({
|
|
44
|
+
"node_modules/bech32/dist/index.js"(exports) {
|
|
45
|
+
"use strict";
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.bech32m = exports.bech32 = void 0;
|
|
48
|
+
var ALPHABET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
|
|
49
|
+
var ALPHABET_MAP = {};
|
|
50
|
+
for (let z = 0; z < ALPHABET.length; z++) {
|
|
51
|
+
const x = ALPHABET.charAt(z);
|
|
52
|
+
ALPHABET_MAP[x] = z;
|
|
53
|
+
}
|
|
54
|
+
function polymodStep(pre) {
|
|
55
|
+
const b = pre >> 25;
|
|
56
|
+
return (pre & 33554431) << 5 ^ -(b >> 0 & 1) & 996825010 ^ -(b >> 1 & 1) & 642813549 ^ -(b >> 2 & 1) & 513874426 ^ -(b >> 3 & 1) & 1027748829 ^ -(b >> 4 & 1) & 705979059;
|
|
57
|
+
}
|
|
58
|
+
function prefixChk(prefix) {
|
|
59
|
+
let chk = 1;
|
|
60
|
+
for (let i = 0; i < prefix.length; ++i) {
|
|
61
|
+
const c = prefix.charCodeAt(i);
|
|
62
|
+
if (c < 33 || c > 126)
|
|
63
|
+
return "Invalid prefix (" + prefix + ")";
|
|
64
|
+
chk = polymodStep(chk) ^ c >> 5;
|
|
65
|
+
}
|
|
66
|
+
chk = polymodStep(chk);
|
|
67
|
+
for (let i = 0; i < prefix.length; ++i) {
|
|
68
|
+
const v = prefix.charCodeAt(i);
|
|
69
|
+
chk = polymodStep(chk) ^ v & 31;
|
|
70
|
+
}
|
|
71
|
+
return chk;
|
|
72
|
+
}
|
|
73
|
+
function convert(data, inBits, outBits, pad) {
|
|
74
|
+
let value = 0;
|
|
75
|
+
let bits = 0;
|
|
76
|
+
const maxV = (1 << outBits) - 1;
|
|
77
|
+
const result = [];
|
|
78
|
+
for (let i = 0; i < data.length; ++i) {
|
|
79
|
+
value = value << inBits | data[i];
|
|
80
|
+
bits += inBits;
|
|
81
|
+
while (bits >= outBits) {
|
|
82
|
+
bits -= outBits;
|
|
83
|
+
result.push(value >> bits & maxV);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (pad) {
|
|
87
|
+
if (bits > 0) {
|
|
88
|
+
result.push(value << outBits - bits & maxV);
|
|
89
|
+
}
|
|
90
|
+
} else {
|
|
91
|
+
if (bits >= inBits)
|
|
92
|
+
return "Excess padding";
|
|
93
|
+
if (value << outBits - bits & maxV)
|
|
94
|
+
return "Non-zero padding";
|
|
95
|
+
}
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
function toWords(bytes) {
|
|
99
|
+
return convert(bytes, 8, 5, true);
|
|
100
|
+
}
|
|
101
|
+
function fromWordsUnsafe(words) {
|
|
102
|
+
const res = convert(words, 5, 8, false);
|
|
103
|
+
if (Array.isArray(res))
|
|
104
|
+
return res;
|
|
105
|
+
}
|
|
106
|
+
function fromWords(words) {
|
|
107
|
+
const res = convert(words, 5, 8, false);
|
|
108
|
+
if (Array.isArray(res))
|
|
109
|
+
return res;
|
|
110
|
+
throw new Error(res);
|
|
111
|
+
}
|
|
112
|
+
function getLibraryFromEncoding(encoding) {
|
|
113
|
+
let ENCODING_CONST;
|
|
114
|
+
if (encoding === "bech32") {
|
|
115
|
+
ENCODING_CONST = 1;
|
|
116
|
+
} else {
|
|
117
|
+
ENCODING_CONST = 734539939;
|
|
118
|
+
}
|
|
119
|
+
function encode(prefix, words, LIMIT) {
|
|
120
|
+
LIMIT = LIMIT || 90;
|
|
121
|
+
if (prefix.length + 7 + words.length > LIMIT)
|
|
122
|
+
throw new TypeError("Exceeds length limit");
|
|
123
|
+
prefix = prefix.toLowerCase();
|
|
124
|
+
let chk = prefixChk(prefix);
|
|
125
|
+
if (typeof chk === "string")
|
|
126
|
+
throw new Error(chk);
|
|
127
|
+
let result = prefix + "1";
|
|
128
|
+
for (let i = 0; i < words.length; ++i) {
|
|
129
|
+
const x = words[i];
|
|
130
|
+
if (x >> 5 !== 0)
|
|
131
|
+
throw new Error("Non 5-bit word");
|
|
132
|
+
chk = polymodStep(chk) ^ x;
|
|
133
|
+
result += ALPHABET.charAt(x);
|
|
134
|
+
}
|
|
135
|
+
for (let i = 0; i < 6; ++i) {
|
|
136
|
+
chk = polymodStep(chk);
|
|
137
|
+
}
|
|
138
|
+
chk ^= ENCODING_CONST;
|
|
139
|
+
for (let i = 0; i < 6; ++i) {
|
|
140
|
+
const v = chk >> (5 - i) * 5 & 31;
|
|
141
|
+
result += ALPHABET.charAt(v);
|
|
142
|
+
}
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
function __decode(str, LIMIT) {
|
|
146
|
+
LIMIT = LIMIT || 90;
|
|
147
|
+
if (str.length < 8)
|
|
148
|
+
return str + " too short";
|
|
149
|
+
if (str.length > LIMIT)
|
|
150
|
+
return "Exceeds length limit";
|
|
151
|
+
const lowered = str.toLowerCase();
|
|
152
|
+
const uppered = str.toUpperCase();
|
|
153
|
+
if (str !== lowered && str !== uppered)
|
|
154
|
+
return "Mixed-case string " + str;
|
|
155
|
+
str = lowered;
|
|
156
|
+
const split2 = str.lastIndexOf("1");
|
|
157
|
+
if (split2 === -1)
|
|
158
|
+
return "No separator character for " + str;
|
|
159
|
+
if (split2 === 0)
|
|
160
|
+
return "Missing prefix for " + str;
|
|
161
|
+
const prefix = str.slice(0, split2);
|
|
162
|
+
const wordChars = str.slice(split2 + 1);
|
|
163
|
+
if (wordChars.length < 6)
|
|
164
|
+
return "Data too short";
|
|
165
|
+
let chk = prefixChk(prefix);
|
|
166
|
+
if (typeof chk === "string")
|
|
167
|
+
return chk;
|
|
168
|
+
const words = [];
|
|
169
|
+
for (let i = 0; i < wordChars.length; ++i) {
|
|
170
|
+
const c = wordChars.charAt(i);
|
|
171
|
+
const v = ALPHABET_MAP[c];
|
|
172
|
+
if (v === void 0)
|
|
173
|
+
return "Unknown character " + c;
|
|
174
|
+
chk = polymodStep(chk) ^ v;
|
|
175
|
+
if (i + 6 >= wordChars.length)
|
|
176
|
+
continue;
|
|
177
|
+
words.push(v);
|
|
178
|
+
}
|
|
179
|
+
if (chk !== ENCODING_CONST)
|
|
180
|
+
return "Invalid checksum for " + str;
|
|
181
|
+
return { prefix, words };
|
|
182
|
+
}
|
|
183
|
+
function decodeUnsafe(str, LIMIT) {
|
|
184
|
+
const res = __decode(str, LIMIT);
|
|
185
|
+
if (typeof res === "object")
|
|
186
|
+
return res;
|
|
187
|
+
}
|
|
188
|
+
function decode(str, LIMIT) {
|
|
189
|
+
const res = __decode(str, LIMIT);
|
|
190
|
+
if (typeof res === "object")
|
|
191
|
+
return res;
|
|
192
|
+
throw new Error(res);
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
decodeUnsafe,
|
|
196
|
+
decode,
|
|
197
|
+
encode,
|
|
198
|
+
toWords,
|
|
199
|
+
fromWordsUnsafe,
|
|
200
|
+
fromWords
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
exports.bech32 = getLibraryFromEncoding("bech32");
|
|
204
|
+
exports.bech32m = getLibraryFromEncoding("bech32m");
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
// node_modules/safe-buffer/index.js
|
|
209
|
+
var require_safe_buffer = __commonJS({
|
|
210
|
+
"node_modules/safe-buffer/index.js"(exports, module) {
|
|
211
|
+
var buffer = __require("buffer");
|
|
212
|
+
var Buffer4 = buffer.Buffer;
|
|
213
|
+
function copyProps(src, dst) {
|
|
214
|
+
for (var key in src) {
|
|
215
|
+
dst[key] = src[key];
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (Buffer4.from && Buffer4.alloc && Buffer4.allocUnsafe && Buffer4.allocUnsafeSlow) {
|
|
219
|
+
module.exports = buffer;
|
|
220
|
+
} else {
|
|
221
|
+
copyProps(buffer, exports);
|
|
222
|
+
exports.Buffer = SafeBuffer;
|
|
223
|
+
}
|
|
224
|
+
function SafeBuffer(arg, encodingOrOffset, length) {
|
|
225
|
+
return Buffer4(arg, encodingOrOffset, length);
|
|
226
|
+
}
|
|
227
|
+
SafeBuffer.prototype = Object.create(Buffer4.prototype);
|
|
228
|
+
copyProps(Buffer4, SafeBuffer);
|
|
229
|
+
SafeBuffer.from = function(arg, encodingOrOffset, length) {
|
|
230
|
+
if (typeof arg === "number") {
|
|
231
|
+
throw new TypeError("Argument must not be a number");
|
|
232
|
+
}
|
|
233
|
+
return Buffer4(arg, encodingOrOffset, length);
|
|
234
|
+
};
|
|
235
|
+
SafeBuffer.alloc = function(size, fill, encoding) {
|
|
236
|
+
if (typeof size !== "number") {
|
|
237
|
+
throw new TypeError("Argument must be a number");
|
|
238
|
+
}
|
|
239
|
+
var buf = Buffer4(size);
|
|
240
|
+
if (fill !== void 0) {
|
|
241
|
+
if (typeof encoding === "string") {
|
|
242
|
+
buf.fill(fill, encoding);
|
|
243
|
+
} else {
|
|
244
|
+
buf.fill(fill);
|
|
245
|
+
}
|
|
246
|
+
} else {
|
|
247
|
+
buf.fill(0);
|
|
248
|
+
}
|
|
249
|
+
return buf;
|
|
250
|
+
};
|
|
251
|
+
SafeBuffer.allocUnsafe = function(size) {
|
|
252
|
+
if (typeof size !== "number") {
|
|
253
|
+
throw new TypeError("Argument must be a number");
|
|
254
|
+
}
|
|
255
|
+
return Buffer4(size);
|
|
256
|
+
};
|
|
257
|
+
SafeBuffer.allocUnsafeSlow = function(size) {
|
|
258
|
+
if (typeof size !== "number") {
|
|
259
|
+
throw new TypeError("Argument must be a number");
|
|
260
|
+
}
|
|
261
|
+
return buffer.SlowBuffer(size);
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
// node_modules/base-x/src/index.js
|
|
267
|
+
var require_src = __commonJS({
|
|
268
|
+
"node_modules/base-x/src/index.js"(exports, module) {
|
|
269
|
+
"use strict";
|
|
270
|
+
var _Buffer = require_safe_buffer().Buffer;
|
|
271
|
+
function base(ALPHABET) {
|
|
272
|
+
if (ALPHABET.length >= 255) {
|
|
273
|
+
throw new TypeError("Alphabet too long");
|
|
274
|
+
}
|
|
275
|
+
var BASE_MAP = new Uint8Array(256);
|
|
276
|
+
for (var j = 0; j < BASE_MAP.length; j++) {
|
|
277
|
+
BASE_MAP[j] = 255;
|
|
278
|
+
}
|
|
279
|
+
for (var i = 0; i < ALPHABET.length; i++) {
|
|
280
|
+
var x = ALPHABET.charAt(i);
|
|
281
|
+
var xc = x.charCodeAt(0);
|
|
282
|
+
if (BASE_MAP[xc] !== 255) {
|
|
283
|
+
throw new TypeError(x + " is ambiguous");
|
|
284
|
+
}
|
|
285
|
+
BASE_MAP[xc] = i;
|
|
286
|
+
}
|
|
287
|
+
var BASE = ALPHABET.length;
|
|
288
|
+
var LEADER = ALPHABET.charAt(0);
|
|
289
|
+
var FACTOR = Math.log(BASE) / Math.log(256);
|
|
290
|
+
var iFACTOR = Math.log(256) / Math.log(BASE);
|
|
291
|
+
function encode(source) {
|
|
292
|
+
if (Array.isArray(source) || source instanceof Uint8Array) {
|
|
293
|
+
source = _Buffer.from(source);
|
|
294
|
+
}
|
|
295
|
+
if (!_Buffer.isBuffer(source)) {
|
|
296
|
+
throw new TypeError("Expected Buffer");
|
|
297
|
+
}
|
|
298
|
+
if (source.length === 0) {
|
|
299
|
+
return "";
|
|
300
|
+
}
|
|
301
|
+
var zeroes = 0;
|
|
302
|
+
var length = 0;
|
|
303
|
+
var pbegin = 0;
|
|
304
|
+
var pend = source.length;
|
|
305
|
+
while (pbegin !== pend && source[pbegin] === 0) {
|
|
306
|
+
pbegin++;
|
|
307
|
+
zeroes++;
|
|
308
|
+
}
|
|
309
|
+
var size = (pend - pbegin) * iFACTOR + 1 >>> 0;
|
|
310
|
+
var b58 = new Uint8Array(size);
|
|
311
|
+
while (pbegin !== pend) {
|
|
312
|
+
var carry = source[pbegin];
|
|
313
|
+
var i2 = 0;
|
|
314
|
+
for (var it1 = size - 1; (carry !== 0 || i2 < length) && it1 !== -1; it1--, i2++) {
|
|
315
|
+
carry += 256 * b58[it1] >>> 0;
|
|
316
|
+
b58[it1] = carry % BASE >>> 0;
|
|
317
|
+
carry = carry / BASE >>> 0;
|
|
318
|
+
}
|
|
319
|
+
if (carry !== 0) {
|
|
320
|
+
throw new Error("Non-zero carry");
|
|
321
|
+
}
|
|
322
|
+
length = i2;
|
|
323
|
+
pbegin++;
|
|
324
|
+
}
|
|
325
|
+
var it2 = size - length;
|
|
326
|
+
while (it2 !== size && b58[it2] === 0) {
|
|
327
|
+
it2++;
|
|
328
|
+
}
|
|
329
|
+
var str = LEADER.repeat(zeroes);
|
|
330
|
+
for (; it2 < size; ++it2) {
|
|
331
|
+
str += ALPHABET.charAt(b58[it2]);
|
|
332
|
+
}
|
|
333
|
+
return str;
|
|
334
|
+
}
|
|
335
|
+
function decodeUnsafe(source) {
|
|
336
|
+
if (typeof source !== "string") {
|
|
337
|
+
throw new TypeError("Expected String");
|
|
338
|
+
}
|
|
339
|
+
if (source.length === 0) {
|
|
340
|
+
return _Buffer.alloc(0);
|
|
341
|
+
}
|
|
342
|
+
var psz = 0;
|
|
343
|
+
var zeroes = 0;
|
|
344
|
+
var length = 0;
|
|
345
|
+
while (source[psz] === LEADER) {
|
|
346
|
+
zeroes++;
|
|
347
|
+
psz++;
|
|
348
|
+
}
|
|
349
|
+
var size = (source.length - psz) * FACTOR + 1 >>> 0;
|
|
350
|
+
var b256 = new Uint8Array(size);
|
|
351
|
+
while (psz < source.length) {
|
|
352
|
+
var charCode = source.charCodeAt(psz);
|
|
353
|
+
if (charCode > 255) {
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
var carry = BASE_MAP[charCode];
|
|
357
|
+
if (carry === 255) {
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
var i2 = 0;
|
|
361
|
+
for (var it3 = size - 1; (carry !== 0 || i2 < length) && it3 !== -1; it3--, i2++) {
|
|
362
|
+
carry += BASE * b256[it3] >>> 0;
|
|
363
|
+
b256[it3] = carry % 256 >>> 0;
|
|
364
|
+
carry = carry / 256 >>> 0;
|
|
365
|
+
}
|
|
366
|
+
if (carry !== 0) {
|
|
367
|
+
throw new Error("Non-zero carry");
|
|
368
|
+
}
|
|
369
|
+
length = i2;
|
|
370
|
+
psz++;
|
|
371
|
+
}
|
|
372
|
+
var it4 = size - length;
|
|
373
|
+
while (it4 !== size && b256[it4] === 0) {
|
|
374
|
+
it4++;
|
|
375
|
+
}
|
|
376
|
+
var vch = _Buffer.allocUnsafe(zeroes + (size - it4));
|
|
377
|
+
vch.fill(0, 0, zeroes);
|
|
378
|
+
var j2 = zeroes;
|
|
379
|
+
while (it4 !== size) {
|
|
380
|
+
vch[j2++] = b256[it4++];
|
|
381
|
+
}
|
|
382
|
+
return vch;
|
|
383
|
+
}
|
|
384
|
+
function decode(string) {
|
|
385
|
+
var buffer = decodeUnsafe(string);
|
|
386
|
+
if (buffer) {
|
|
387
|
+
return buffer;
|
|
388
|
+
}
|
|
389
|
+
throw new Error("Non-base" + BASE + " character");
|
|
390
|
+
}
|
|
391
|
+
return {
|
|
392
|
+
encode,
|
|
393
|
+
decodeUnsafe,
|
|
394
|
+
decode
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
module.exports = base;
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
// node_modules/bs58/index.js
|
|
402
|
+
var require_bs58 = __commonJS({
|
|
403
|
+
"node_modules/bs58/index.js"(exports, module) {
|
|
404
|
+
var basex = require_src();
|
|
405
|
+
var ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
406
|
+
module.exports = basex(ALPHABET);
|
|
407
|
+
}
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
// node_modules/bs58check/base.js
|
|
411
|
+
var require_base = __commonJS({
|
|
412
|
+
"node_modules/bs58check/base.js"(exports, module) {
|
|
413
|
+
"use strict";
|
|
414
|
+
var base58 = require_bs58();
|
|
415
|
+
var Buffer4 = require_safe_buffer().Buffer;
|
|
416
|
+
module.exports = function(checksumFn) {
|
|
417
|
+
function encode(payload) {
|
|
418
|
+
var checksum = checksumFn(payload);
|
|
419
|
+
return base58.encode(Buffer4.concat([
|
|
420
|
+
payload,
|
|
421
|
+
checksum
|
|
422
|
+
], payload.length + 4));
|
|
423
|
+
}
|
|
424
|
+
function decodeRaw(buffer) {
|
|
425
|
+
var payload = buffer.slice(0, -4);
|
|
426
|
+
var checksum = buffer.slice(-4);
|
|
427
|
+
var newChecksum = checksumFn(payload);
|
|
428
|
+
if (checksum[0] ^ newChecksum[0] | checksum[1] ^ newChecksum[1] | checksum[2] ^ newChecksum[2] | checksum[3] ^ newChecksum[3]) return;
|
|
429
|
+
return payload;
|
|
430
|
+
}
|
|
431
|
+
function decodeUnsafe(string) {
|
|
432
|
+
var buffer = base58.decodeUnsafe(string);
|
|
433
|
+
if (!buffer) return;
|
|
434
|
+
return decodeRaw(buffer);
|
|
435
|
+
}
|
|
436
|
+
function decode(string) {
|
|
437
|
+
var buffer = base58.decode(string);
|
|
438
|
+
var payload = decodeRaw(buffer, checksumFn);
|
|
439
|
+
if (!payload) throw new Error("Invalid checksum");
|
|
440
|
+
return payload;
|
|
441
|
+
}
|
|
442
|
+
return {
|
|
443
|
+
encode,
|
|
444
|
+
decode,
|
|
445
|
+
decodeUnsafe
|
|
446
|
+
};
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
// node_modules/bs58check/index.js
|
|
452
|
+
var require_bs58check = __commonJS({
|
|
453
|
+
"node_modules/bs58check/index.js"(exports, module) {
|
|
454
|
+
"use strict";
|
|
455
|
+
var createHash3 = require_create_hash();
|
|
456
|
+
var bs58checkBase = require_base();
|
|
457
|
+
function sha256x2(buffer) {
|
|
458
|
+
var tmp = createHash3("sha256").update(buffer).digest();
|
|
459
|
+
return createHash3("sha256").update(tmp).digest();
|
|
460
|
+
}
|
|
461
|
+
module.exports = bs58checkBase(sha256x2);
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
// node_modules/varuint-bitcoin/index.js
|
|
466
|
+
var require_varuint_bitcoin = __commonJS({
|
|
467
|
+
"node_modules/varuint-bitcoin/index.js"(exports, module) {
|
|
468
|
+
"use strict";
|
|
469
|
+
var Buffer4 = require_safe_buffer().Buffer;
|
|
470
|
+
var MAX_SAFE_INTEGER = 9007199254740991;
|
|
471
|
+
function checkUInt53(n) {
|
|
472
|
+
if (n < 0 || n > MAX_SAFE_INTEGER || n % 1 !== 0) throw new RangeError("value out of range");
|
|
473
|
+
}
|
|
474
|
+
function encode(number, buffer, offset) {
|
|
475
|
+
checkUInt53(number);
|
|
476
|
+
if (!buffer) buffer = Buffer4.allocUnsafe(encodingLength(number));
|
|
477
|
+
if (!Buffer4.isBuffer(buffer)) throw new TypeError("buffer must be a Buffer instance");
|
|
478
|
+
if (!offset) offset = 0;
|
|
479
|
+
if (number < 253) {
|
|
480
|
+
buffer.writeUInt8(number, offset);
|
|
481
|
+
encode.bytes = 1;
|
|
482
|
+
} else if (number <= 65535) {
|
|
483
|
+
buffer.writeUInt8(253, offset);
|
|
484
|
+
buffer.writeUInt16LE(number, offset + 1);
|
|
485
|
+
encode.bytes = 3;
|
|
486
|
+
} else if (number <= 4294967295) {
|
|
487
|
+
buffer.writeUInt8(254, offset);
|
|
488
|
+
buffer.writeUInt32LE(number, offset + 1);
|
|
489
|
+
encode.bytes = 5;
|
|
490
|
+
} else {
|
|
491
|
+
buffer.writeUInt8(255, offset);
|
|
492
|
+
buffer.writeUInt32LE(number >>> 0, offset + 1);
|
|
493
|
+
buffer.writeUInt32LE(number / 4294967296 | 0, offset + 5);
|
|
494
|
+
encode.bytes = 9;
|
|
495
|
+
}
|
|
496
|
+
return buffer;
|
|
497
|
+
}
|
|
498
|
+
function decode(buffer, offset) {
|
|
499
|
+
if (!Buffer4.isBuffer(buffer)) throw new TypeError("buffer must be a Buffer instance");
|
|
500
|
+
if (!offset) offset = 0;
|
|
501
|
+
var first = buffer.readUInt8(offset);
|
|
502
|
+
if (first < 253) {
|
|
503
|
+
decode.bytes = 1;
|
|
504
|
+
return first;
|
|
505
|
+
} else if (first === 253) {
|
|
506
|
+
decode.bytes = 3;
|
|
507
|
+
return buffer.readUInt16LE(offset + 1);
|
|
508
|
+
} else if (first === 254) {
|
|
509
|
+
decode.bytes = 5;
|
|
510
|
+
return buffer.readUInt32LE(offset + 1);
|
|
511
|
+
} else {
|
|
512
|
+
decode.bytes = 9;
|
|
513
|
+
var lo = buffer.readUInt32LE(offset + 1);
|
|
514
|
+
var hi = buffer.readUInt32LE(offset + 5);
|
|
515
|
+
var number = hi * 4294967296 + lo;
|
|
516
|
+
checkUInt53(number);
|
|
517
|
+
return number;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
function encodingLength(number) {
|
|
521
|
+
checkUInt53(number);
|
|
522
|
+
return number < 253 ? 1 : number <= 65535 ? 3 : number <= 4294967295 ? 5 : 9;
|
|
523
|
+
}
|
|
524
|
+
module.exports = { encode, decode, encodingLength };
|
|
525
|
+
}
|
|
526
|
+
});
|
|
527
|
+
|
|
528
|
+
// src/core.ts
|
|
529
|
+
var import_create_hash2 = __toESM(require_create_hash());
|
|
530
|
+
var import_bech322 = __toESM(require_dist());
|
|
531
|
+
import { Buffer as Buffer3 } from "buffer";
|
|
532
|
+
|
|
533
|
+
// node_modules/@noble/hashes/utils.js
|
|
534
|
+
function isBytes(a) {
|
|
535
|
+
return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array";
|
|
536
|
+
}
|
|
537
|
+
function anumber(n, title = "") {
|
|
538
|
+
if (!Number.isSafeInteger(n) || n < 0) {
|
|
539
|
+
const prefix = title && `"${title}" `;
|
|
540
|
+
throw new Error(`${prefix}expected integer >= 0, got ${n}`);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
function abytes(value, length, title = "") {
|
|
544
|
+
const bytes = isBytes(value);
|
|
545
|
+
const len = value?.length;
|
|
546
|
+
const needsLen = length !== void 0;
|
|
547
|
+
if (!bytes || needsLen && len !== length) {
|
|
548
|
+
const prefix = title && `"${title}" `;
|
|
549
|
+
const ofLen = needsLen ? ` of length ${length}` : "";
|
|
550
|
+
const got = bytes ? `length=${len}` : `type=${typeof value}`;
|
|
551
|
+
throw new Error(prefix + "expected Uint8Array" + ofLen + ", got " + got);
|
|
552
|
+
}
|
|
553
|
+
return value;
|
|
554
|
+
}
|
|
555
|
+
function ahash(h) {
|
|
556
|
+
if (typeof h !== "function" || typeof h.create !== "function")
|
|
557
|
+
throw new Error("Hash must wrapped by utils.createHasher");
|
|
558
|
+
anumber(h.outputLen);
|
|
559
|
+
anumber(h.blockLen);
|
|
560
|
+
}
|
|
561
|
+
function aexists(instance, checkFinished = true) {
|
|
562
|
+
if (instance.destroyed)
|
|
563
|
+
throw new Error("Hash instance has been destroyed");
|
|
564
|
+
if (checkFinished && instance.finished)
|
|
565
|
+
throw new Error("Hash#digest() has already been called");
|
|
566
|
+
}
|
|
567
|
+
function aoutput(out, instance) {
|
|
568
|
+
abytes(out, void 0, "digestInto() output");
|
|
569
|
+
const min = instance.outputLen;
|
|
570
|
+
if (out.length < min) {
|
|
571
|
+
throw new Error('"digestInto() output" expected to be of length >=' + min);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
function u32(arr) {
|
|
575
|
+
return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));
|
|
576
|
+
}
|
|
577
|
+
function clean(...arrays) {
|
|
578
|
+
for (let i = 0; i < arrays.length; i++) {
|
|
579
|
+
arrays[i].fill(0);
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
function createView(arr) {
|
|
583
|
+
return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);
|
|
584
|
+
}
|
|
585
|
+
function rotr(word, shift) {
|
|
586
|
+
return word << 32 - shift | word >>> shift;
|
|
587
|
+
}
|
|
588
|
+
var isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([287454020]).buffer)[0] === 68)();
|
|
589
|
+
function byteSwap(word) {
|
|
590
|
+
return word << 24 & 4278190080 | word << 8 & 16711680 | word >>> 8 & 65280 | word >>> 24 & 255;
|
|
591
|
+
}
|
|
592
|
+
function byteSwap32(arr) {
|
|
593
|
+
for (let i = 0; i < arr.length; i++) {
|
|
594
|
+
arr[i] = byteSwap(arr[i]);
|
|
595
|
+
}
|
|
596
|
+
return arr;
|
|
597
|
+
}
|
|
598
|
+
var swap32IfBE = isLE ? (u) => u : byteSwap32;
|
|
599
|
+
function concatBytes(...arrays) {
|
|
600
|
+
let sum = 0;
|
|
601
|
+
for (let i = 0; i < arrays.length; i++) {
|
|
602
|
+
const a = arrays[i];
|
|
603
|
+
abytes(a);
|
|
604
|
+
sum += a.length;
|
|
605
|
+
}
|
|
606
|
+
const res = new Uint8Array(sum);
|
|
607
|
+
for (let i = 0, pad = 0; i < arrays.length; i++) {
|
|
608
|
+
const a = arrays[i];
|
|
609
|
+
res.set(a, pad);
|
|
610
|
+
pad += a.length;
|
|
611
|
+
}
|
|
612
|
+
return res;
|
|
613
|
+
}
|
|
614
|
+
function createHasher(hashCons, info = {}) {
|
|
615
|
+
const hashC = (msg, opts) => hashCons(opts).update(msg).digest();
|
|
616
|
+
const tmp = hashCons(void 0);
|
|
617
|
+
hashC.outputLen = tmp.outputLen;
|
|
618
|
+
hashC.blockLen = tmp.blockLen;
|
|
619
|
+
hashC.create = (opts) => hashCons(opts);
|
|
620
|
+
Object.assign(hashC, info);
|
|
621
|
+
return Object.freeze(hashC);
|
|
622
|
+
}
|
|
623
|
+
function randomBytes(bytesLength = 32) {
|
|
624
|
+
const cr2 = typeof globalThis === "object" ? globalThis.crypto : null;
|
|
625
|
+
if (typeof cr2?.getRandomValues !== "function")
|
|
626
|
+
throw new Error("crypto.getRandomValues must be defined");
|
|
627
|
+
return cr2.getRandomValues(new Uint8Array(bytesLength));
|
|
628
|
+
}
|
|
629
|
+
var oidNist = (suffix) => ({
|
|
630
|
+
oid: Uint8Array.from([6, 9, 96, 134, 72, 1, 101, 3, 4, 2, suffix])
|
|
631
|
+
});
|
|
632
|
+
|
|
633
|
+
// node_modules/@noble/curves/utils.js
|
|
634
|
+
function abool(value, title = "") {
|
|
635
|
+
if (typeof value !== "boolean") {
|
|
636
|
+
const prefix = title && `"${title}" `;
|
|
637
|
+
throw new Error(prefix + "expected boolean, got type=" + typeof value);
|
|
638
|
+
}
|
|
639
|
+
return value;
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
// node_modules/@noble/hashes/_u64.js
|
|
643
|
+
var U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);
|
|
644
|
+
var _32n = /* @__PURE__ */ BigInt(32);
|
|
645
|
+
function fromBig(n, le = false) {
|
|
646
|
+
if (le)
|
|
647
|
+
return { h: Number(n & U32_MASK64), l: Number(n >> _32n & U32_MASK64) };
|
|
648
|
+
return { h: Number(n >> _32n & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };
|
|
649
|
+
}
|
|
650
|
+
function split(lst, le = false) {
|
|
651
|
+
const len = lst.length;
|
|
652
|
+
let Ah = new Uint32Array(len);
|
|
653
|
+
let Al = new Uint32Array(len);
|
|
654
|
+
for (let i = 0; i < len; i++) {
|
|
655
|
+
const { h, l } = fromBig(lst[i], le);
|
|
656
|
+
[Ah[i], Al[i]] = [h, l];
|
|
657
|
+
}
|
|
658
|
+
return [Ah, Al];
|
|
659
|
+
}
|
|
660
|
+
var rotlSH = (h, l, s) => h << s | l >>> 32 - s;
|
|
661
|
+
var rotlSL = (h, l, s) => l << s | h >>> 32 - s;
|
|
662
|
+
var rotlBH = (h, l, s) => l << s - 32 | h >>> 64 - s;
|
|
663
|
+
var rotlBL = (h, l, s) => h << s - 32 | l >>> 64 - s;
|
|
664
|
+
|
|
665
|
+
// node_modules/@noble/hashes/sha3.js
|
|
666
|
+
var _0n = BigInt(0);
|
|
667
|
+
var _1n = BigInt(1);
|
|
668
|
+
var _2n = BigInt(2);
|
|
669
|
+
var _7n = BigInt(7);
|
|
670
|
+
var _256n = BigInt(256);
|
|
671
|
+
var _0x71n = BigInt(113);
|
|
672
|
+
var SHA3_PI = [];
|
|
673
|
+
var SHA3_ROTL = [];
|
|
674
|
+
var _SHA3_IOTA = [];
|
|
675
|
+
for (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {
|
|
676
|
+
[x, y] = [y, (2 * x + 3 * y) % 5];
|
|
677
|
+
SHA3_PI.push(2 * (5 * y + x));
|
|
678
|
+
SHA3_ROTL.push((round + 1) * (round + 2) / 2 % 64);
|
|
679
|
+
let t = _0n;
|
|
680
|
+
for (let j = 0; j < 7; j++) {
|
|
681
|
+
R = (R << _1n ^ (R >> _7n) * _0x71n) % _256n;
|
|
682
|
+
if (R & _2n)
|
|
683
|
+
t ^= _1n << (_1n << BigInt(j)) - _1n;
|
|
684
|
+
}
|
|
685
|
+
_SHA3_IOTA.push(t);
|
|
686
|
+
}
|
|
687
|
+
var IOTAS = split(_SHA3_IOTA, true);
|
|
688
|
+
var SHA3_IOTA_H = IOTAS[0];
|
|
689
|
+
var SHA3_IOTA_L = IOTAS[1];
|
|
690
|
+
var rotlH = (h, l, s) => s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s);
|
|
691
|
+
var rotlL = (h, l, s) => s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s);
|
|
692
|
+
function keccakP(s, rounds = 24) {
|
|
693
|
+
const B = new Uint32Array(5 * 2);
|
|
694
|
+
for (let round = 24 - rounds; round < 24; round++) {
|
|
695
|
+
for (let x = 0; x < 10; x++)
|
|
696
|
+
B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];
|
|
697
|
+
for (let x = 0; x < 10; x += 2) {
|
|
698
|
+
const idx1 = (x + 8) % 10;
|
|
699
|
+
const idx0 = (x + 2) % 10;
|
|
700
|
+
const B0 = B[idx0];
|
|
701
|
+
const B1 = B[idx0 + 1];
|
|
702
|
+
const Th = rotlH(B0, B1, 1) ^ B[idx1];
|
|
703
|
+
const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];
|
|
704
|
+
for (let y = 0; y < 50; y += 10) {
|
|
705
|
+
s[x + y] ^= Th;
|
|
706
|
+
s[x + y + 1] ^= Tl;
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
let curH = s[2];
|
|
710
|
+
let curL = s[3];
|
|
711
|
+
for (let t = 0; t < 24; t++) {
|
|
712
|
+
const shift = SHA3_ROTL[t];
|
|
713
|
+
const Th = rotlH(curH, curL, shift);
|
|
714
|
+
const Tl = rotlL(curH, curL, shift);
|
|
715
|
+
const PI = SHA3_PI[t];
|
|
716
|
+
curH = s[PI];
|
|
717
|
+
curL = s[PI + 1];
|
|
718
|
+
s[PI] = Th;
|
|
719
|
+
s[PI + 1] = Tl;
|
|
720
|
+
}
|
|
721
|
+
for (let y = 0; y < 50; y += 10) {
|
|
722
|
+
for (let x = 0; x < 10; x++)
|
|
723
|
+
B[x] = s[y + x];
|
|
724
|
+
for (let x = 0; x < 10; x++)
|
|
725
|
+
s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];
|
|
726
|
+
}
|
|
727
|
+
s[0] ^= SHA3_IOTA_H[round];
|
|
728
|
+
s[1] ^= SHA3_IOTA_L[round];
|
|
729
|
+
}
|
|
730
|
+
clean(B);
|
|
731
|
+
}
|
|
732
|
+
var Keccak = class _Keccak {
|
|
733
|
+
// NOTE: we accept arguments in bytes instead of bits here.
|
|
734
|
+
constructor(blockLen, suffix, outputLen, enableXOF = false, rounds = 24) {
|
|
735
|
+
__publicField(this, "state");
|
|
736
|
+
__publicField(this, "pos", 0);
|
|
737
|
+
__publicField(this, "posOut", 0);
|
|
738
|
+
__publicField(this, "finished", false);
|
|
739
|
+
__publicField(this, "state32");
|
|
740
|
+
__publicField(this, "destroyed", false);
|
|
741
|
+
__publicField(this, "blockLen");
|
|
742
|
+
__publicField(this, "suffix");
|
|
743
|
+
__publicField(this, "outputLen");
|
|
744
|
+
__publicField(this, "enableXOF", false);
|
|
745
|
+
__publicField(this, "rounds");
|
|
746
|
+
this.blockLen = blockLen;
|
|
747
|
+
this.suffix = suffix;
|
|
748
|
+
this.outputLen = outputLen;
|
|
749
|
+
this.enableXOF = enableXOF;
|
|
750
|
+
this.rounds = rounds;
|
|
751
|
+
anumber(outputLen, "outputLen");
|
|
752
|
+
if (!(0 < blockLen && blockLen < 200))
|
|
753
|
+
throw new Error("only keccak-f1600 function is supported");
|
|
754
|
+
this.state = new Uint8Array(200);
|
|
755
|
+
this.state32 = u32(this.state);
|
|
756
|
+
}
|
|
757
|
+
clone() {
|
|
758
|
+
return this._cloneInto();
|
|
759
|
+
}
|
|
760
|
+
keccak() {
|
|
761
|
+
swap32IfBE(this.state32);
|
|
762
|
+
keccakP(this.state32, this.rounds);
|
|
763
|
+
swap32IfBE(this.state32);
|
|
764
|
+
this.posOut = 0;
|
|
765
|
+
this.pos = 0;
|
|
766
|
+
}
|
|
767
|
+
update(data) {
|
|
768
|
+
aexists(this);
|
|
769
|
+
abytes(data);
|
|
770
|
+
const { blockLen, state } = this;
|
|
771
|
+
const len = data.length;
|
|
772
|
+
for (let pos = 0; pos < len; ) {
|
|
773
|
+
const take = Math.min(blockLen - this.pos, len - pos);
|
|
774
|
+
for (let i = 0; i < take; i++)
|
|
775
|
+
state[this.pos++] ^= data[pos++];
|
|
776
|
+
if (this.pos === blockLen)
|
|
777
|
+
this.keccak();
|
|
778
|
+
}
|
|
779
|
+
return this;
|
|
780
|
+
}
|
|
781
|
+
finish() {
|
|
782
|
+
if (this.finished)
|
|
783
|
+
return;
|
|
784
|
+
this.finished = true;
|
|
785
|
+
const { state, suffix, pos, blockLen } = this;
|
|
786
|
+
state[pos] ^= suffix;
|
|
787
|
+
if ((suffix & 128) !== 0 && pos === blockLen - 1)
|
|
788
|
+
this.keccak();
|
|
789
|
+
state[blockLen - 1] ^= 128;
|
|
790
|
+
this.keccak();
|
|
791
|
+
}
|
|
792
|
+
writeInto(out) {
|
|
793
|
+
aexists(this, false);
|
|
794
|
+
abytes(out);
|
|
795
|
+
this.finish();
|
|
796
|
+
const bufferOut = this.state;
|
|
797
|
+
const { blockLen } = this;
|
|
798
|
+
for (let pos = 0, len = out.length; pos < len; ) {
|
|
799
|
+
if (this.posOut >= blockLen)
|
|
800
|
+
this.keccak();
|
|
801
|
+
const take = Math.min(blockLen - this.posOut, len - pos);
|
|
802
|
+
out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);
|
|
803
|
+
this.posOut += take;
|
|
804
|
+
pos += take;
|
|
805
|
+
}
|
|
806
|
+
return out;
|
|
807
|
+
}
|
|
808
|
+
xofInto(out) {
|
|
809
|
+
if (!this.enableXOF)
|
|
810
|
+
throw new Error("XOF is not possible for this instance");
|
|
811
|
+
return this.writeInto(out);
|
|
812
|
+
}
|
|
813
|
+
xof(bytes) {
|
|
814
|
+
anumber(bytes);
|
|
815
|
+
return this.xofInto(new Uint8Array(bytes));
|
|
816
|
+
}
|
|
817
|
+
digestInto(out) {
|
|
818
|
+
aoutput(out, this);
|
|
819
|
+
if (this.finished)
|
|
820
|
+
throw new Error("digest() was already called");
|
|
821
|
+
this.writeInto(out);
|
|
822
|
+
this.destroy();
|
|
823
|
+
return out;
|
|
824
|
+
}
|
|
825
|
+
digest() {
|
|
826
|
+
return this.digestInto(new Uint8Array(this.outputLen));
|
|
827
|
+
}
|
|
828
|
+
destroy() {
|
|
829
|
+
this.destroyed = true;
|
|
830
|
+
clean(this.state);
|
|
831
|
+
}
|
|
832
|
+
_cloneInto(to) {
|
|
833
|
+
const { blockLen, suffix, outputLen, rounds, enableXOF } = this;
|
|
834
|
+
to || (to = new _Keccak(blockLen, suffix, outputLen, enableXOF, rounds));
|
|
835
|
+
to.state32.set(this.state32);
|
|
836
|
+
to.pos = this.pos;
|
|
837
|
+
to.posOut = this.posOut;
|
|
838
|
+
to.finished = this.finished;
|
|
839
|
+
to.rounds = rounds;
|
|
840
|
+
to.suffix = suffix;
|
|
841
|
+
to.outputLen = outputLen;
|
|
842
|
+
to.enableXOF = enableXOF;
|
|
843
|
+
to.destroyed = this.destroyed;
|
|
844
|
+
return to;
|
|
845
|
+
}
|
|
846
|
+
};
|
|
847
|
+
var genShake = (suffix, blockLen, outputLen, info = {}) => createHasher((opts = {}) => new Keccak(blockLen, suffix, opts.dkLen === void 0 ? outputLen : opts.dkLen, true), info);
|
|
848
|
+
var shake128 = /* @__PURE__ */ genShake(31, 168, 16, /* @__PURE__ */ oidNist(11));
|
|
849
|
+
var shake256 = /* @__PURE__ */ genShake(31, 136, 32, /* @__PURE__ */ oidNist(12));
|
|
850
|
+
|
|
851
|
+
// node_modules/@noble/curves/abstract/fft.js
|
|
852
|
+
function checkU32(n) {
|
|
853
|
+
if (!Number.isSafeInteger(n) || n < 0 || n > 4294967295)
|
|
854
|
+
throw new Error("wrong u32 integer:" + n);
|
|
855
|
+
return n;
|
|
856
|
+
}
|
|
857
|
+
function isPowerOfTwo(x) {
|
|
858
|
+
checkU32(x);
|
|
859
|
+
return (x & x - 1) === 0 && x !== 0;
|
|
860
|
+
}
|
|
861
|
+
function reverseBits(n, bits) {
|
|
862
|
+
checkU32(n);
|
|
863
|
+
let reversed = 0;
|
|
864
|
+
for (let i = 0; i < bits; i++, n >>>= 1)
|
|
865
|
+
reversed = reversed << 1 | n & 1;
|
|
866
|
+
return reversed;
|
|
867
|
+
}
|
|
868
|
+
function log2(n) {
|
|
869
|
+
checkU32(n);
|
|
870
|
+
return 31 - Math.clz32(n);
|
|
871
|
+
}
|
|
872
|
+
function bitReversalInplace(values) {
|
|
873
|
+
const n = values.length;
|
|
874
|
+
if (n < 2 || !isPowerOfTwo(n))
|
|
875
|
+
throw new Error("n must be a power of 2 and greater than 1. Got " + n);
|
|
876
|
+
const bits = log2(n);
|
|
877
|
+
for (let i = 0; i < n; i++) {
|
|
878
|
+
const j = reverseBits(i, bits);
|
|
879
|
+
if (i < j) {
|
|
880
|
+
const tmp = values[i];
|
|
881
|
+
values[i] = values[j];
|
|
882
|
+
values[j] = tmp;
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
return values;
|
|
886
|
+
}
|
|
887
|
+
var FFTCore = (F2, coreOpts) => {
|
|
888
|
+
const { N: N3, roots, dit, invertButterflies = false, skipStages = 0, brp = true } = coreOpts;
|
|
889
|
+
const bits = log2(N3);
|
|
890
|
+
if (!isPowerOfTwo(N3))
|
|
891
|
+
throw new Error("FFT: Polynomial size should be power of two");
|
|
892
|
+
const isDit = dit !== invertButterflies;
|
|
893
|
+
isDit;
|
|
894
|
+
return (values) => {
|
|
895
|
+
if (values.length !== N3)
|
|
896
|
+
throw new Error("FFT: wrong Polynomial length");
|
|
897
|
+
if (dit && brp)
|
|
898
|
+
bitReversalInplace(values);
|
|
899
|
+
for (let i = 0, g = 1; i < bits - skipStages; i++) {
|
|
900
|
+
const s = dit ? i + 1 + skipStages : bits - i;
|
|
901
|
+
const m = 1 << s;
|
|
902
|
+
const m2 = m >> 1;
|
|
903
|
+
const stride = N3 >> s;
|
|
904
|
+
for (let k = 0; k < N3; k += m) {
|
|
905
|
+
for (let j = 0, grp = g++; j < m2; j++) {
|
|
906
|
+
const rootPos = invertButterflies ? dit ? N3 - grp : grp : j * stride;
|
|
907
|
+
const i0 = k + j;
|
|
908
|
+
const i1 = k + j + m2;
|
|
909
|
+
const omega = roots[rootPos];
|
|
910
|
+
const b = values[i1];
|
|
911
|
+
const a = values[i0];
|
|
912
|
+
if (isDit) {
|
|
913
|
+
const t = F2.mul(b, omega);
|
|
914
|
+
values[i0] = F2.add(a, t);
|
|
915
|
+
values[i1] = F2.sub(a, t);
|
|
916
|
+
} else if (invertButterflies) {
|
|
917
|
+
values[i0] = F2.add(b, a);
|
|
918
|
+
values[i1] = F2.mul(F2.sub(b, a), omega);
|
|
919
|
+
} else {
|
|
920
|
+
values[i0] = F2.add(a, b);
|
|
921
|
+
values[i1] = F2.mul(F2.sub(a, b), omega);
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
if (!dit && brp)
|
|
927
|
+
bitReversalInplace(values);
|
|
928
|
+
return values;
|
|
929
|
+
};
|
|
930
|
+
};
|
|
931
|
+
|
|
932
|
+
// node_modules/@noble/post-quantum/utils.js
|
|
933
|
+
var abytesDoc = abytes;
|
|
934
|
+
var randomBytes2 = randomBytes;
|
|
935
|
+
function equalBytes(a, b) {
|
|
936
|
+
if (a.length !== b.length)
|
|
937
|
+
return false;
|
|
938
|
+
let diff = 0;
|
|
939
|
+
for (let i = 0; i < a.length; i++)
|
|
940
|
+
diff |= a[i] ^ b[i];
|
|
941
|
+
return diff === 0;
|
|
942
|
+
}
|
|
943
|
+
function validateOpts(opts) {
|
|
944
|
+
if (Object.prototype.toString.call(opts) !== "[object Object]")
|
|
945
|
+
throw new TypeError("expected valid options object");
|
|
946
|
+
}
|
|
947
|
+
function validateVerOpts(opts) {
|
|
948
|
+
validateOpts(opts);
|
|
949
|
+
if (opts.context !== void 0)
|
|
950
|
+
abytes(opts.context, void 0, "opts.context");
|
|
951
|
+
}
|
|
952
|
+
function validateSigOpts(opts) {
|
|
953
|
+
validateVerOpts(opts);
|
|
954
|
+
if (opts.extraEntropy !== false && opts.extraEntropy !== void 0)
|
|
955
|
+
abytes(opts.extraEntropy, void 0, "opts.extraEntropy");
|
|
956
|
+
}
|
|
957
|
+
function splitCoder(label, ...lengths2) {
|
|
958
|
+
const getLength = (c) => typeof c === "number" ? c : c.bytesLen;
|
|
959
|
+
const bytesLen = lengths2.reduce((sum, a) => sum + getLength(a), 0);
|
|
960
|
+
return {
|
|
961
|
+
bytesLen,
|
|
962
|
+
encode: (bufs) => {
|
|
963
|
+
const res = new Uint8Array(bytesLen);
|
|
964
|
+
for (let i = 0, pos = 0; i < lengths2.length; i++) {
|
|
965
|
+
const c = lengths2[i];
|
|
966
|
+
const l = getLength(c);
|
|
967
|
+
const b = typeof c === "number" ? bufs[i] : c.encode(bufs[i]);
|
|
968
|
+
abytes(b, l, label);
|
|
969
|
+
res.set(b, pos);
|
|
970
|
+
if (typeof c !== "number")
|
|
971
|
+
b.fill(0);
|
|
972
|
+
pos += l;
|
|
973
|
+
}
|
|
974
|
+
return res;
|
|
975
|
+
},
|
|
976
|
+
decode: (buf) => {
|
|
977
|
+
abytes(buf, bytesLen, label);
|
|
978
|
+
const res = [];
|
|
979
|
+
for (const c of lengths2) {
|
|
980
|
+
const l = getLength(c);
|
|
981
|
+
const b = buf.subarray(0, l);
|
|
982
|
+
res.push(typeof c === "number" ? b : c.decode(b));
|
|
983
|
+
buf = buf.subarray(l);
|
|
984
|
+
}
|
|
985
|
+
return res;
|
|
986
|
+
}
|
|
987
|
+
};
|
|
988
|
+
}
|
|
989
|
+
function vecCoder(c, vecLen) {
|
|
990
|
+
const bytesLen = vecLen * c.bytesLen;
|
|
991
|
+
return {
|
|
992
|
+
bytesLen,
|
|
993
|
+
encode: (u) => {
|
|
994
|
+
if (u.length !== vecLen)
|
|
995
|
+
throw new RangeError(`vecCoder.encode: wrong length=${u.length}. Expected: ${vecLen}`);
|
|
996
|
+
const res = new Uint8Array(bytesLen);
|
|
997
|
+
for (let i = 0, pos = 0; i < u.length; i++) {
|
|
998
|
+
const b = c.encode(u[i]);
|
|
999
|
+
res.set(b, pos);
|
|
1000
|
+
b.fill(0);
|
|
1001
|
+
pos += b.length;
|
|
1002
|
+
}
|
|
1003
|
+
return res;
|
|
1004
|
+
},
|
|
1005
|
+
decode: (a) => {
|
|
1006
|
+
abytes(a, bytesLen);
|
|
1007
|
+
const r = [];
|
|
1008
|
+
for (let i = 0; i < a.length; i += c.bytesLen)
|
|
1009
|
+
r.push(c.decode(a.subarray(i, i + c.bytesLen)));
|
|
1010
|
+
return r;
|
|
1011
|
+
}
|
|
1012
|
+
};
|
|
1013
|
+
}
|
|
1014
|
+
function cleanBytes(...list) {
|
|
1015
|
+
for (const t of list) {
|
|
1016
|
+
if (Array.isArray(t))
|
|
1017
|
+
for (const b of t)
|
|
1018
|
+
b.fill(0);
|
|
1019
|
+
else
|
|
1020
|
+
t.fill(0);
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
function getMask(bits) {
|
|
1024
|
+
if (!Number.isSafeInteger(bits) || bits < 0 || bits > 32)
|
|
1025
|
+
throw new RangeError(`expected bits in [0..32], got ${bits}`);
|
|
1026
|
+
return bits === 32 ? 4294967295 : ~(-1 << bits) >>> 0;
|
|
1027
|
+
}
|
|
1028
|
+
var EMPTY = /* @__PURE__ */ Uint8Array.of();
|
|
1029
|
+
function getMessage(msg, ctx = EMPTY) {
|
|
1030
|
+
abytes(msg);
|
|
1031
|
+
abytes(ctx);
|
|
1032
|
+
if (ctx.length > 255)
|
|
1033
|
+
throw new RangeError("context should be 255 bytes or less");
|
|
1034
|
+
return concatBytes(new Uint8Array([0, ctx.length]), ctx, msg);
|
|
1035
|
+
}
|
|
1036
|
+
var oidNistP = /* @__PURE__ */ Uint8Array.from([6, 9, 96, 134, 72, 1, 101, 3, 4, 2]);
|
|
1037
|
+
function checkHash(hash, requiredStrength = 0) {
|
|
1038
|
+
if (!hash.oid || !equalBytes(hash.oid.subarray(0, 10), oidNistP))
|
|
1039
|
+
throw new Error("hash.oid is invalid: expected NIST hash");
|
|
1040
|
+
const collisionResistance = hash.outputLen * 8 / 2;
|
|
1041
|
+
if (requiredStrength > collisionResistance) {
|
|
1042
|
+
throw new Error("Pre-hash security strength too low: " + collisionResistance + ", required: " + requiredStrength);
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
function getMessagePrehash(hash, msg, ctx = EMPTY) {
|
|
1046
|
+
abytes(msg);
|
|
1047
|
+
abytes(ctx);
|
|
1048
|
+
if (ctx.length > 255)
|
|
1049
|
+
throw new RangeError("context should be 255 bytes or less");
|
|
1050
|
+
const hashed = hash(msg);
|
|
1051
|
+
return concatBytes(new Uint8Array([1, ctx.length]), ctx, hash.oid, hashed);
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
// node_modules/@noble/post-quantum/_crystals.js
|
|
1055
|
+
var genCrystals = (opts) => {
|
|
1056
|
+
const { newPoly: newPoly2, N: N3, Q: Q2, F: F2, ROOT_OF_UNITY: ROOT_OF_UNITY2, brvBits, isKyber } = opts;
|
|
1057
|
+
const mod = (a, modulo = Q2) => {
|
|
1058
|
+
const result = a % modulo | 0;
|
|
1059
|
+
return (result >= 0 ? result | 0 : modulo + result | 0) | 0;
|
|
1060
|
+
};
|
|
1061
|
+
const smod = (a, modulo = Q2) => {
|
|
1062
|
+
const r = mod(a, modulo) | 0;
|
|
1063
|
+
return (r > modulo >> 1 ? r - modulo | 0 : r) | 0;
|
|
1064
|
+
};
|
|
1065
|
+
function getZettas() {
|
|
1066
|
+
const out = newPoly2(N3);
|
|
1067
|
+
for (let i = 0; i < N3; i++) {
|
|
1068
|
+
const b = reverseBits(i, brvBits);
|
|
1069
|
+
const p = BigInt(ROOT_OF_UNITY2) ** BigInt(b) % BigInt(Q2);
|
|
1070
|
+
out[i] = Number(p) | 0;
|
|
1071
|
+
}
|
|
1072
|
+
return out;
|
|
1073
|
+
}
|
|
1074
|
+
const nttZetas = getZettas();
|
|
1075
|
+
const field = {
|
|
1076
|
+
add: (a, b) => mod((a | 0) + (b | 0)) | 0,
|
|
1077
|
+
sub: (a, b) => mod((a | 0) - (b | 0)) | 0,
|
|
1078
|
+
mul: (a, b) => mod((a | 0) * (b | 0)) | 0,
|
|
1079
|
+
inv: (_a) => {
|
|
1080
|
+
throw new Error("not implemented");
|
|
1081
|
+
}
|
|
1082
|
+
};
|
|
1083
|
+
const nttOpts = {
|
|
1084
|
+
N: N3,
|
|
1085
|
+
roots: nttZetas,
|
|
1086
|
+
invertButterflies: true,
|
|
1087
|
+
skipStages: isKyber ? 1 : 0,
|
|
1088
|
+
brp: false
|
|
1089
|
+
};
|
|
1090
|
+
const dif = FFTCore(field, { dit: false, ...nttOpts });
|
|
1091
|
+
const dit = FFTCore(field, { dit: true, ...nttOpts });
|
|
1092
|
+
const NTT = {
|
|
1093
|
+
encode: (r) => {
|
|
1094
|
+
return dif(r);
|
|
1095
|
+
},
|
|
1096
|
+
decode: (r) => {
|
|
1097
|
+
dit(r);
|
|
1098
|
+
for (let i = 0; i < r.length; i++)
|
|
1099
|
+
r[i] = mod(F2 * r[i]);
|
|
1100
|
+
return r;
|
|
1101
|
+
}
|
|
1102
|
+
};
|
|
1103
|
+
const bitsCoder = (d, c) => {
|
|
1104
|
+
const mask = getMask(d);
|
|
1105
|
+
const bytesLen = d * (N3 / 8);
|
|
1106
|
+
return {
|
|
1107
|
+
bytesLen,
|
|
1108
|
+
encode: (poly) => {
|
|
1109
|
+
const r = new Uint8Array(bytesLen);
|
|
1110
|
+
for (let i = 0, buf = 0, bufLen = 0, pos = 0; i < poly.length; i++) {
|
|
1111
|
+
buf |= (c.encode(poly[i]) & mask) << bufLen;
|
|
1112
|
+
bufLen += d;
|
|
1113
|
+
for (; bufLen >= 8; bufLen -= 8, buf >>= 8)
|
|
1114
|
+
r[pos++] = buf & getMask(bufLen);
|
|
1115
|
+
}
|
|
1116
|
+
return r;
|
|
1117
|
+
},
|
|
1118
|
+
decode: (bytes) => {
|
|
1119
|
+
const r = newPoly2(N3);
|
|
1120
|
+
for (let i = 0, buf = 0, bufLen = 0, pos = 0; i < bytes.length; i++) {
|
|
1121
|
+
buf |= bytes[i] << bufLen;
|
|
1122
|
+
bufLen += 8;
|
|
1123
|
+
for (; bufLen >= d; bufLen -= d, buf >>= d)
|
|
1124
|
+
r[pos++] = c.decode(buf & mask);
|
|
1125
|
+
}
|
|
1126
|
+
return r;
|
|
1127
|
+
}
|
|
1128
|
+
};
|
|
1129
|
+
};
|
|
1130
|
+
return { mod, smod, nttZetas, NTT, bitsCoder };
|
|
1131
|
+
};
|
|
1132
|
+
var createXofShake = (shake) => (seed, blockLen) => {
|
|
1133
|
+
if (!blockLen)
|
|
1134
|
+
blockLen = shake.blockLen;
|
|
1135
|
+
const _seed = new Uint8Array(seed.length + 2);
|
|
1136
|
+
_seed.set(seed);
|
|
1137
|
+
const seedLen = seed.length;
|
|
1138
|
+
const buf = new Uint8Array(blockLen);
|
|
1139
|
+
let h = shake.create({});
|
|
1140
|
+
let calls = 0;
|
|
1141
|
+
let xofs = 0;
|
|
1142
|
+
return {
|
|
1143
|
+
stats: () => ({ calls, xofs }),
|
|
1144
|
+
get: (x, y) => {
|
|
1145
|
+
_seed[seedLen + 0] = x;
|
|
1146
|
+
_seed[seedLen + 1] = y;
|
|
1147
|
+
h.destroy();
|
|
1148
|
+
h = shake.create({}).update(_seed);
|
|
1149
|
+
calls++;
|
|
1150
|
+
return () => {
|
|
1151
|
+
xofs++;
|
|
1152
|
+
return h.xofInto(buf);
|
|
1153
|
+
};
|
|
1154
|
+
},
|
|
1155
|
+
clean: () => {
|
|
1156
|
+
h.destroy();
|
|
1157
|
+
cleanBytes(buf, _seed);
|
|
1158
|
+
}
|
|
1159
|
+
};
|
|
1160
|
+
};
|
|
1161
|
+
var XOF128 = /* @__PURE__ */ createXofShake(shake128);
|
|
1162
|
+
var XOF256 = /* @__PURE__ */ createXofShake(shake256);
|
|
1163
|
+
|
|
1164
|
+
// node_modules/@noble/post-quantum/ml-dsa.js
|
|
1165
|
+
function validateInternalOpts(opts) {
|
|
1166
|
+
validateOpts(opts);
|
|
1167
|
+
if (opts.externalMu !== void 0)
|
|
1168
|
+
abool(opts.externalMu, "opts.externalMu");
|
|
1169
|
+
}
|
|
1170
|
+
var N = 256;
|
|
1171
|
+
var Q = 8380417;
|
|
1172
|
+
var ROOT_OF_UNITY = 1753;
|
|
1173
|
+
var F = 8347681;
|
|
1174
|
+
var D = 13;
|
|
1175
|
+
var GAMMA2_1 = Math.floor((Q - 1) / 88) | 0;
|
|
1176
|
+
var GAMMA2_2 = Math.floor((Q - 1) / 32) | 0;
|
|
1177
|
+
var PARAMS = /* @__PURE__ */ (() => ({
|
|
1178
|
+
2: { K: 4, L: 4, D, GAMMA1: 2 ** 17, GAMMA2: GAMMA2_1, TAU: 39, ETA: 2, OMEGA: 80 },
|
|
1179
|
+
3: { K: 6, L: 5, D, GAMMA1: 2 ** 19, GAMMA2: GAMMA2_2, TAU: 49, ETA: 4, OMEGA: 55 },
|
|
1180
|
+
5: { K: 8, L: 7, D, GAMMA1: 2 ** 19, GAMMA2: GAMMA2_2, TAU: 60, ETA: 2, OMEGA: 75 }
|
|
1181
|
+
}))();
|
|
1182
|
+
var newPoly = (n) => new Int32Array(n);
|
|
1183
|
+
var crystals = /* @__PURE__ */ genCrystals({
|
|
1184
|
+
N,
|
|
1185
|
+
Q,
|
|
1186
|
+
F,
|
|
1187
|
+
ROOT_OF_UNITY,
|
|
1188
|
+
newPoly,
|
|
1189
|
+
isKyber: false,
|
|
1190
|
+
brvBits: 8
|
|
1191
|
+
});
|
|
1192
|
+
var id = (n) => n;
|
|
1193
|
+
var polyCoder = (d, compress = id, verify = id) => crystals.bitsCoder(d, {
|
|
1194
|
+
encode: (i) => compress(verify(i)),
|
|
1195
|
+
decode: (i) => verify(compress(i))
|
|
1196
|
+
});
|
|
1197
|
+
var polyAdd = (a, b) => {
|
|
1198
|
+
for (let i = 0; i < a.length; i++)
|
|
1199
|
+
a[i] = crystals.mod(a[i] + b[i]);
|
|
1200
|
+
return a;
|
|
1201
|
+
};
|
|
1202
|
+
var polySub = (a, b) => {
|
|
1203
|
+
for (let i = 0; i < a.length; i++)
|
|
1204
|
+
a[i] = crystals.mod(a[i] - b[i]);
|
|
1205
|
+
return a;
|
|
1206
|
+
};
|
|
1207
|
+
var polyShiftl = (p) => {
|
|
1208
|
+
for (let i = 0; i < N; i++)
|
|
1209
|
+
p[i] <<= D;
|
|
1210
|
+
return p;
|
|
1211
|
+
};
|
|
1212
|
+
var polyChknorm = (p, B) => {
|
|
1213
|
+
for (let i = 0; i < N; i++)
|
|
1214
|
+
if (Math.abs(crystals.smod(p[i])) >= B)
|
|
1215
|
+
return true;
|
|
1216
|
+
return false;
|
|
1217
|
+
};
|
|
1218
|
+
var MultiplyNTTs = (a, b) => {
|
|
1219
|
+
const c = newPoly(N);
|
|
1220
|
+
for (let i = 0; i < a.length; i++)
|
|
1221
|
+
c[i] = crystals.mod(a[i] * b[i]);
|
|
1222
|
+
return c;
|
|
1223
|
+
};
|
|
1224
|
+
function RejNTTPoly(xof) {
|
|
1225
|
+
const r = newPoly(N);
|
|
1226
|
+
for (let j = 0; j < N; ) {
|
|
1227
|
+
const b = xof();
|
|
1228
|
+
if (b.length % 3)
|
|
1229
|
+
throw new Error("RejNTTPoly: unaligned block");
|
|
1230
|
+
for (let i = 0; j < N && i <= b.length - 3; i += 3) {
|
|
1231
|
+
const t = (b[i + 0] | b[i + 1] << 8 | b[i + 2] << 16) & 8388607;
|
|
1232
|
+
if (t < Q)
|
|
1233
|
+
r[j++] = t;
|
|
1234
|
+
}
|
|
1235
|
+
}
|
|
1236
|
+
return r;
|
|
1237
|
+
}
|
|
1238
|
+
function getDilithium(opts) {
|
|
1239
|
+
const { K, L: L3, GAMMA1, GAMMA2, TAU, ETA, OMEGA } = opts;
|
|
1240
|
+
const { CRH_BYTES, TR_BYTES, C_TILDE_BYTES, XOF128: XOF1282, XOF256: XOF2562, securityLevel } = opts;
|
|
1241
|
+
if (![2, 4].includes(ETA))
|
|
1242
|
+
throw new Error("Wrong ETA");
|
|
1243
|
+
if (![1 << 17, 1 << 19].includes(GAMMA1))
|
|
1244
|
+
throw new Error("Wrong GAMMA1");
|
|
1245
|
+
if (![GAMMA2_1, GAMMA2_2].includes(GAMMA2))
|
|
1246
|
+
throw new Error("Wrong GAMMA2");
|
|
1247
|
+
const BETA = TAU * ETA;
|
|
1248
|
+
const decompose = (r) => {
|
|
1249
|
+
const rPlus = crystals.mod(r);
|
|
1250
|
+
const r0 = crystals.smod(rPlus, 2 * GAMMA2) | 0;
|
|
1251
|
+
if (rPlus - r0 === Q - 1)
|
|
1252
|
+
return { r1: 0 | 0, r0: r0 - 1 | 0 };
|
|
1253
|
+
const r1 = Math.floor((rPlus - r0) / (2 * GAMMA2)) | 0;
|
|
1254
|
+
return { r1, r0 };
|
|
1255
|
+
};
|
|
1256
|
+
const HighBits = (r) => decompose(r).r1;
|
|
1257
|
+
const LowBits = (r) => decompose(r).r0;
|
|
1258
|
+
const MakeHint = (z, r) => {
|
|
1259
|
+
const res0 = z <= GAMMA2 || z > Q - GAMMA2 || z === Q - GAMMA2 && r === 0 ? 0 : 1;
|
|
1260
|
+
return res0;
|
|
1261
|
+
};
|
|
1262
|
+
const UseHint = (h, r) => {
|
|
1263
|
+
const m = Math.floor((Q - 1) / (2 * GAMMA2));
|
|
1264
|
+
const { r1, r0 } = decompose(r);
|
|
1265
|
+
if (h === 1)
|
|
1266
|
+
return r0 > 0 ? crystals.mod(r1 + 1, m) | 0 : crystals.mod(r1 - 1, m) | 0;
|
|
1267
|
+
return r1 | 0;
|
|
1268
|
+
};
|
|
1269
|
+
const Power2Round = (r) => {
|
|
1270
|
+
const rPlus = crystals.mod(r);
|
|
1271
|
+
const r0 = crystals.smod(rPlus, 2 ** D) | 0;
|
|
1272
|
+
return { r1: Math.floor((rPlus - r0) / 2 ** D) | 0, r0 };
|
|
1273
|
+
};
|
|
1274
|
+
const hintCoder = {
|
|
1275
|
+
bytesLen: OMEGA + K,
|
|
1276
|
+
encode: (h) => {
|
|
1277
|
+
if (h === false)
|
|
1278
|
+
throw new Error("hint.encode: hint is false");
|
|
1279
|
+
const res = new Uint8Array(OMEGA + K);
|
|
1280
|
+
for (let i = 0, k = 0; i < K; i++) {
|
|
1281
|
+
for (let j = 0; j < N; j++)
|
|
1282
|
+
if (h[i][j] !== 0)
|
|
1283
|
+
res[k++] = j;
|
|
1284
|
+
res[OMEGA + i] = k;
|
|
1285
|
+
}
|
|
1286
|
+
return res;
|
|
1287
|
+
},
|
|
1288
|
+
decode: (buf) => {
|
|
1289
|
+
const h = [];
|
|
1290
|
+
let k = 0;
|
|
1291
|
+
for (let i = 0; i < K; i++) {
|
|
1292
|
+
const hi = newPoly(N);
|
|
1293
|
+
if (buf[OMEGA + i] < k || buf[OMEGA + i] > OMEGA)
|
|
1294
|
+
return false;
|
|
1295
|
+
for (let j = k; j < buf[OMEGA + i]; j++) {
|
|
1296
|
+
if (j > k && buf[j] <= buf[j - 1])
|
|
1297
|
+
return false;
|
|
1298
|
+
hi[buf[j]] = 1;
|
|
1299
|
+
}
|
|
1300
|
+
k = buf[OMEGA + i];
|
|
1301
|
+
h.push(hi);
|
|
1302
|
+
}
|
|
1303
|
+
for (let j = k; j < OMEGA; j++)
|
|
1304
|
+
if (buf[j] !== 0)
|
|
1305
|
+
return false;
|
|
1306
|
+
return h;
|
|
1307
|
+
}
|
|
1308
|
+
};
|
|
1309
|
+
const ETACoder = polyCoder(ETA === 2 ? 3 : 4, (i) => ETA - i, (i) => {
|
|
1310
|
+
if (!(-ETA <= i && i <= ETA))
|
|
1311
|
+
throw new Error(`malformed key s1/s3 ${i} outside of ETA range [${-ETA}, ${ETA}]`);
|
|
1312
|
+
return i;
|
|
1313
|
+
});
|
|
1314
|
+
const T0Coder = polyCoder(13, (i) => (1 << D - 1) - i);
|
|
1315
|
+
const T1Coder = polyCoder(10);
|
|
1316
|
+
const ZCoder = polyCoder(GAMMA1 === 1 << 17 ? 18 : 20, (i) => crystals.smod(GAMMA1 - i));
|
|
1317
|
+
const W1Coder = polyCoder(GAMMA2 === GAMMA2_1 ? 6 : 4);
|
|
1318
|
+
const W1Vec = vecCoder(W1Coder, K);
|
|
1319
|
+
const publicCoder = splitCoder("publicKey", 32, vecCoder(T1Coder, K));
|
|
1320
|
+
const secretCoder = splitCoder("secretKey", 32, 32, TR_BYTES, vecCoder(ETACoder, L3), vecCoder(ETACoder, K), vecCoder(T0Coder, K));
|
|
1321
|
+
const sigCoder = splitCoder("signature", C_TILDE_BYTES, vecCoder(ZCoder, L3), hintCoder);
|
|
1322
|
+
const CoefFromHalfByte = ETA === 2 ? (n) => n < 15 ? 2 - n % 5 : false : (n) => n < 9 ? 4 - n : false;
|
|
1323
|
+
function RejBoundedPoly(xof) {
|
|
1324
|
+
const r = newPoly(N);
|
|
1325
|
+
for (let j = 0; j < N; ) {
|
|
1326
|
+
const b = xof();
|
|
1327
|
+
for (let i = 0; j < N && i < b.length; i += 1) {
|
|
1328
|
+
const d1 = CoefFromHalfByte(b[i] & 15);
|
|
1329
|
+
const d2 = CoefFromHalfByte(b[i] >> 4 & 15);
|
|
1330
|
+
if (d1 !== false)
|
|
1331
|
+
r[j++] = d1;
|
|
1332
|
+
if (j < N && d2 !== false)
|
|
1333
|
+
r[j++] = d2;
|
|
1334
|
+
}
|
|
1335
|
+
}
|
|
1336
|
+
return r;
|
|
1337
|
+
}
|
|
1338
|
+
const SampleInBall = (seed) => {
|
|
1339
|
+
const pre = newPoly(N);
|
|
1340
|
+
const s = shake256.create({}).update(seed);
|
|
1341
|
+
const buf = new Uint8Array(shake256.blockLen);
|
|
1342
|
+
s.xofInto(buf);
|
|
1343
|
+
const masks = buf.slice(0, 8);
|
|
1344
|
+
for (let i = N - TAU, pos = 8, maskPos = 0, maskBit = 0; i < N; i++) {
|
|
1345
|
+
let b = i + 1;
|
|
1346
|
+
for (; b > i; ) {
|
|
1347
|
+
b = buf[pos++];
|
|
1348
|
+
if (pos < shake256.blockLen)
|
|
1349
|
+
continue;
|
|
1350
|
+
s.xofInto(buf);
|
|
1351
|
+
pos = 0;
|
|
1352
|
+
}
|
|
1353
|
+
pre[i] = pre[b];
|
|
1354
|
+
pre[b] = 1 - ((masks[maskPos] >> maskBit++ & 1) << 1);
|
|
1355
|
+
if (maskBit >= 8) {
|
|
1356
|
+
maskPos++;
|
|
1357
|
+
maskBit = 0;
|
|
1358
|
+
}
|
|
1359
|
+
}
|
|
1360
|
+
return pre;
|
|
1361
|
+
};
|
|
1362
|
+
const polyPowerRound = (p) => {
|
|
1363
|
+
const res0 = newPoly(N);
|
|
1364
|
+
const res1 = newPoly(N);
|
|
1365
|
+
for (let i = 0; i < p.length; i++) {
|
|
1366
|
+
const { r0, r1 } = Power2Round(p[i]);
|
|
1367
|
+
res0[i] = r0;
|
|
1368
|
+
res1[i] = r1;
|
|
1369
|
+
}
|
|
1370
|
+
return { r0: res0, r1: res1 };
|
|
1371
|
+
};
|
|
1372
|
+
const polyUseHint = (u, h) => {
|
|
1373
|
+
for (let i = 0; i < N; i++)
|
|
1374
|
+
u[i] = UseHint(h[i], u[i]);
|
|
1375
|
+
return u;
|
|
1376
|
+
};
|
|
1377
|
+
const polyMakeHint = (a, b) => {
|
|
1378
|
+
const v = newPoly(N);
|
|
1379
|
+
let cnt = 0;
|
|
1380
|
+
for (let i = 0; i < N; i++) {
|
|
1381
|
+
const h = MakeHint(a[i], b[i]);
|
|
1382
|
+
v[i] = h;
|
|
1383
|
+
cnt += h;
|
|
1384
|
+
}
|
|
1385
|
+
return { v, cnt };
|
|
1386
|
+
};
|
|
1387
|
+
const signRandBytes = 32;
|
|
1388
|
+
const seedCoder = splitCoder("seed", 32, 64, 32);
|
|
1389
|
+
const internal = {
|
|
1390
|
+
info: { type: "internal-ml-dsa" },
|
|
1391
|
+
lengths: {
|
|
1392
|
+
secretKey: secretCoder.bytesLen,
|
|
1393
|
+
publicKey: publicCoder.bytesLen,
|
|
1394
|
+
seed: 32,
|
|
1395
|
+
signature: sigCoder.bytesLen,
|
|
1396
|
+
signRand: signRandBytes
|
|
1397
|
+
},
|
|
1398
|
+
keygen: (seed) => {
|
|
1399
|
+
const seedDst = new Uint8Array(32 + 2);
|
|
1400
|
+
const randSeed = seed === void 0;
|
|
1401
|
+
if (randSeed)
|
|
1402
|
+
seed = randomBytes2(32);
|
|
1403
|
+
abytesDoc(seed, 32, "seed");
|
|
1404
|
+
seedDst.set(seed);
|
|
1405
|
+
if (randSeed)
|
|
1406
|
+
cleanBytes(seed);
|
|
1407
|
+
seedDst[32] = K;
|
|
1408
|
+
seedDst[33] = L3;
|
|
1409
|
+
const [rho, rhoPrime, K_] = seedCoder.decode(shake256(seedDst, { dkLen: seedCoder.bytesLen }));
|
|
1410
|
+
const xofPrime = XOF2562(rhoPrime);
|
|
1411
|
+
const s1 = [];
|
|
1412
|
+
for (let i = 0; i < L3; i++)
|
|
1413
|
+
s1.push(RejBoundedPoly(xofPrime.get(i & 255, i >> 8 & 255)));
|
|
1414
|
+
const s2 = [];
|
|
1415
|
+
for (let i = L3; i < L3 + K; i++)
|
|
1416
|
+
s2.push(RejBoundedPoly(xofPrime.get(i & 255, i >> 8 & 255)));
|
|
1417
|
+
const s1Hat = s1.map((i) => crystals.NTT.encode(i.slice()));
|
|
1418
|
+
const t0 = [];
|
|
1419
|
+
const t1 = [];
|
|
1420
|
+
const xof = XOF1282(rho);
|
|
1421
|
+
const t = newPoly(N);
|
|
1422
|
+
for (let i = 0; i < K; i++) {
|
|
1423
|
+
cleanBytes(t);
|
|
1424
|
+
for (let j = 0; j < L3; j++) {
|
|
1425
|
+
const aij = RejNTTPoly(xof.get(j, i));
|
|
1426
|
+
polyAdd(t, MultiplyNTTs(aij, s1Hat[j]));
|
|
1427
|
+
}
|
|
1428
|
+
crystals.NTT.decode(t);
|
|
1429
|
+
const { r0, r1 } = polyPowerRound(polyAdd(t, s2[i]));
|
|
1430
|
+
t0.push(r0);
|
|
1431
|
+
t1.push(r1);
|
|
1432
|
+
}
|
|
1433
|
+
const publicKey = publicCoder.encode([rho, t1]);
|
|
1434
|
+
const tr = shake256(publicKey, { dkLen: TR_BYTES });
|
|
1435
|
+
const secretKey = secretCoder.encode([rho, K_, tr, s1, s2, t0]);
|
|
1436
|
+
xof.clean();
|
|
1437
|
+
xofPrime.clean();
|
|
1438
|
+
cleanBytes(rho, rhoPrime, K_, s1, s2, s1Hat, t, t0, t1, tr, seedDst);
|
|
1439
|
+
return { publicKey, secretKey };
|
|
1440
|
+
},
|
|
1441
|
+
getPublicKey: (secretKey) => {
|
|
1442
|
+
const [rho, _K, _tr, s1, s2, _t0] = secretCoder.decode(secretKey);
|
|
1443
|
+
const xof = XOF1282(rho);
|
|
1444
|
+
const s1Hat = s1.map((p) => crystals.NTT.encode(p.slice()));
|
|
1445
|
+
const t1 = [];
|
|
1446
|
+
const tmp = newPoly(N);
|
|
1447
|
+
for (let i = 0; i < K; i++) {
|
|
1448
|
+
tmp.fill(0);
|
|
1449
|
+
for (let j = 0; j < L3; j++) {
|
|
1450
|
+
const aij = RejNTTPoly(xof.get(j, i));
|
|
1451
|
+
polyAdd(tmp, MultiplyNTTs(aij, s1Hat[j]));
|
|
1452
|
+
}
|
|
1453
|
+
crystals.NTT.decode(tmp);
|
|
1454
|
+
polyAdd(tmp, s2[i]);
|
|
1455
|
+
const { r1 } = polyPowerRound(tmp);
|
|
1456
|
+
t1.push(r1);
|
|
1457
|
+
}
|
|
1458
|
+
xof.clean();
|
|
1459
|
+
cleanBytes(tmp, s1Hat, _t0, s1, s2);
|
|
1460
|
+
return publicCoder.encode([rho, t1]);
|
|
1461
|
+
},
|
|
1462
|
+
// NOTE: random is optional.
|
|
1463
|
+
sign: (msg, secretKey, opts2 = {}) => {
|
|
1464
|
+
validateSigOpts(opts2);
|
|
1465
|
+
validateInternalOpts(opts2);
|
|
1466
|
+
let { extraEntropy: random, externalMu = false } = opts2;
|
|
1467
|
+
const [rho, _K, tr, s1, s2, t0] = secretCoder.decode(secretKey);
|
|
1468
|
+
const A = [];
|
|
1469
|
+
const xof = XOF1282(rho);
|
|
1470
|
+
for (let i = 0; i < K; i++) {
|
|
1471
|
+
const pv = [];
|
|
1472
|
+
for (let j = 0; j < L3; j++)
|
|
1473
|
+
pv.push(RejNTTPoly(xof.get(j, i)));
|
|
1474
|
+
A.push(pv);
|
|
1475
|
+
}
|
|
1476
|
+
xof.clean();
|
|
1477
|
+
for (let i = 0; i < L3; i++)
|
|
1478
|
+
crystals.NTT.encode(s1[i]);
|
|
1479
|
+
for (let i = 0; i < K; i++) {
|
|
1480
|
+
crystals.NTT.encode(s2[i]);
|
|
1481
|
+
crystals.NTT.encode(t0[i]);
|
|
1482
|
+
}
|
|
1483
|
+
const mu = externalMu ? msg : (
|
|
1484
|
+
// 6: µ ← H(tr||M, 512)
|
|
1485
|
+
// ▷ Compute message representative µ
|
|
1486
|
+
shake256.create({ dkLen: CRH_BYTES }).update(tr).update(msg).digest()
|
|
1487
|
+
);
|
|
1488
|
+
const rnd = random === false ? new Uint8Array(32) : random === void 0 ? randomBytes2(signRandBytes) : random;
|
|
1489
|
+
abytesDoc(rnd, 32, "extraEntropy");
|
|
1490
|
+
const rhoprime = shake256.create({ dkLen: CRH_BYTES }).update(_K).update(rnd).update(mu).digest();
|
|
1491
|
+
abytesDoc(rhoprime, CRH_BYTES);
|
|
1492
|
+
const x256 = XOF2562(rhoprime, ZCoder.bytesLen);
|
|
1493
|
+
main_loop: for (let kappa = 0; ; ) {
|
|
1494
|
+
const y = [];
|
|
1495
|
+
for (let i = 0; i < L3; i++, kappa++)
|
|
1496
|
+
y.push(ZCoder.decode(x256.get(kappa & 255, kappa >> 8)()));
|
|
1497
|
+
const z = y.map((i) => crystals.NTT.encode(i.slice()));
|
|
1498
|
+
const w = [];
|
|
1499
|
+
for (let i = 0; i < K; i++) {
|
|
1500
|
+
const wi = newPoly(N);
|
|
1501
|
+
for (let j = 0; j < L3; j++)
|
|
1502
|
+
polyAdd(wi, MultiplyNTTs(A[i][j], z[j]));
|
|
1503
|
+
crystals.NTT.decode(wi);
|
|
1504
|
+
w.push(wi);
|
|
1505
|
+
}
|
|
1506
|
+
const w1 = w.map((j) => j.map(HighBits));
|
|
1507
|
+
const cTilde = shake256.create({ dkLen: C_TILDE_BYTES }).update(mu).update(W1Vec.encode(w1)).digest();
|
|
1508
|
+
const cHat = crystals.NTT.encode(SampleInBall(cTilde));
|
|
1509
|
+
const cs1 = s1.map((i) => MultiplyNTTs(i, cHat));
|
|
1510
|
+
for (let i = 0; i < L3; i++) {
|
|
1511
|
+
polyAdd(crystals.NTT.decode(cs1[i]), y[i]);
|
|
1512
|
+
if (polyChknorm(cs1[i], GAMMA1 - BETA))
|
|
1513
|
+
continue main_loop;
|
|
1514
|
+
}
|
|
1515
|
+
let cnt = 0;
|
|
1516
|
+
const h = [];
|
|
1517
|
+
for (let i = 0; i < K; i++) {
|
|
1518
|
+
const cs2 = crystals.NTT.decode(MultiplyNTTs(s2[i], cHat));
|
|
1519
|
+
const r0 = polySub(w[i], cs2).map(LowBits);
|
|
1520
|
+
if (polyChknorm(r0, GAMMA2 - BETA))
|
|
1521
|
+
continue main_loop;
|
|
1522
|
+
const ct0 = crystals.NTT.decode(MultiplyNTTs(t0[i], cHat));
|
|
1523
|
+
if (polyChknorm(ct0, GAMMA2))
|
|
1524
|
+
continue main_loop;
|
|
1525
|
+
polyAdd(r0, ct0);
|
|
1526
|
+
const hint = polyMakeHint(r0, w1[i]);
|
|
1527
|
+
h.push(hint.v);
|
|
1528
|
+
cnt += hint.cnt;
|
|
1529
|
+
}
|
|
1530
|
+
if (cnt > OMEGA)
|
|
1531
|
+
continue;
|
|
1532
|
+
x256.clean();
|
|
1533
|
+
const res = sigCoder.encode([cTilde, cs1, h]);
|
|
1534
|
+
cleanBytes(cTilde, cs1, h, cHat, w1, w, z, y, rhoprime, s1, s2, t0, ...A);
|
|
1535
|
+
if (!externalMu)
|
|
1536
|
+
cleanBytes(mu);
|
|
1537
|
+
return res;
|
|
1538
|
+
}
|
|
1539
|
+
throw new Error("Unreachable code path reached, report this error");
|
|
1540
|
+
},
|
|
1541
|
+
verify: (sig, msg, publicKey, opts2 = {}) => {
|
|
1542
|
+
validateInternalOpts(opts2);
|
|
1543
|
+
const { externalMu = false } = opts2;
|
|
1544
|
+
const [rho, t1] = publicCoder.decode(publicKey);
|
|
1545
|
+
const tr = shake256(publicKey, { dkLen: TR_BYTES });
|
|
1546
|
+
if (sig.length !== sigCoder.bytesLen)
|
|
1547
|
+
return false;
|
|
1548
|
+
const [cTilde, z, h] = sigCoder.decode(sig);
|
|
1549
|
+
if (h === false)
|
|
1550
|
+
return false;
|
|
1551
|
+
for (let i = 0; i < L3; i++)
|
|
1552
|
+
if (polyChknorm(z[i], GAMMA1 - BETA))
|
|
1553
|
+
return false;
|
|
1554
|
+
const mu = externalMu ? msg : (
|
|
1555
|
+
// 7: µ ← H(tr||M, 512)
|
|
1556
|
+
shake256.create({ dkLen: CRH_BYTES }).update(tr).update(msg).digest()
|
|
1557
|
+
);
|
|
1558
|
+
const c = crystals.NTT.encode(SampleInBall(cTilde));
|
|
1559
|
+
const zNtt = z.map((i) => i.slice());
|
|
1560
|
+
for (let i = 0; i < L3; i++)
|
|
1561
|
+
crystals.NTT.encode(zNtt[i]);
|
|
1562
|
+
const wTick1 = [];
|
|
1563
|
+
const xof = XOF1282(rho);
|
|
1564
|
+
for (let i = 0; i < K; i++) {
|
|
1565
|
+
const ct12d = MultiplyNTTs(crystals.NTT.encode(polyShiftl(t1[i])), c);
|
|
1566
|
+
const Az = newPoly(N);
|
|
1567
|
+
for (let j = 0; j < L3; j++) {
|
|
1568
|
+
const aij = RejNTTPoly(xof.get(j, i));
|
|
1569
|
+
polyAdd(Az, MultiplyNTTs(aij, zNtt[j]));
|
|
1570
|
+
}
|
|
1571
|
+
const wApprox = crystals.NTT.decode(polySub(Az, ct12d));
|
|
1572
|
+
wTick1.push(polyUseHint(wApprox, h[i]));
|
|
1573
|
+
}
|
|
1574
|
+
xof.clean();
|
|
1575
|
+
const c2 = shake256.create({ dkLen: C_TILDE_BYTES }).update(mu).update(W1Vec.encode(wTick1)).digest();
|
|
1576
|
+
for (const t of h) {
|
|
1577
|
+
const sum = t.reduce((acc, i) => acc + i, 0);
|
|
1578
|
+
if (!(sum <= OMEGA))
|
|
1579
|
+
return false;
|
|
1580
|
+
}
|
|
1581
|
+
for (const t of z)
|
|
1582
|
+
if (polyChknorm(t, GAMMA1 - BETA))
|
|
1583
|
+
return false;
|
|
1584
|
+
return equalBytes(cTilde, c2);
|
|
1585
|
+
}
|
|
1586
|
+
};
|
|
1587
|
+
return {
|
|
1588
|
+
info: { type: "ml-dsa" },
|
|
1589
|
+
internal,
|
|
1590
|
+
securityLevel,
|
|
1591
|
+
keygen: internal.keygen,
|
|
1592
|
+
lengths: internal.lengths,
|
|
1593
|
+
getPublicKey: internal.getPublicKey,
|
|
1594
|
+
sign: (msg, secretKey, opts2 = {}) => {
|
|
1595
|
+
validateSigOpts(opts2);
|
|
1596
|
+
const M2 = getMessage(msg, opts2.context);
|
|
1597
|
+
const res = internal.sign(M2, secretKey, opts2);
|
|
1598
|
+
cleanBytes(M2);
|
|
1599
|
+
return res;
|
|
1600
|
+
},
|
|
1601
|
+
verify: (sig, msg, publicKey, opts2 = {}) => {
|
|
1602
|
+
validateVerOpts(opts2);
|
|
1603
|
+
return internal.verify(sig, getMessage(msg, opts2.context), publicKey);
|
|
1604
|
+
},
|
|
1605
|
+
prehash: (hash) => {
|
|
1606
|
+
checkHash(hash, securityLevel);
|
|
1607
|
+
return {
|
|
1608
|
+
info: { type: "hashml-dsa" },
|
|
1609
|
+
securityLevel,
|
|
1610
|
+
lengths: internal.lengths,
|
|
1611
|
+
keygen: internal.keygen,
|
|
1612
|
+
getPublicKey: internal.getPublicKey,
|
|
1613
|
+
sign: (msg, secretKey, opts2 = {}) => {
|
|
1614
|
+
validateSigOpts(opts2);
|
|
1615
|
+
const M2 = getMessagePrehash(hash, msg, opts2.context);
|
|
1616
|
+
const res = internal.sign(M2, secretKey, opts2);
|
|
1617
|
+
cleanBytes(M2);
|
|
1618
|
+
return res;
|
|
1619
|
+
},
|
|
1620
|
+
verify: (sig, msg, publicKey, opts2 = {}) => {
|
|
1621
|
+
validateVerOpts(opts2);
|
|
1622
|
+
return internal.verify(sig, getMessagePrehash(hash, msg, opts2.context), publicKey);
|
|
1623
|
+
}
|
|
1624
|
+
};
|
|
1625
|
+
}
|
|
1626
|
+
};
|
|
1627
|
+
}
|
|
1628
|
+
var ml_dsa44 = /* @__PURE__ */ (() => getDilithium({
|
|
1629
|
+
...PARAMS[2],
|
|
1630
|
+
CRH_BYTES: 64,
|
|
1631
|
+
TR_BYTES: 64,
|
|
1632
|
+
C_TILDE_BYTES: 32,
|
|
1633
|
+
XOF128,
|
|
1634
|
+
XOF256,
|
|
1635
|
+
securityLevel: 128
|
|
1636
|
+
}))();
|
|
1637
|
+
|
|
1638
|
+
// src/legacy-message.ts
|
|
1639
|
+
import { Buffer as Buffer2 } from "buffer";
|
|
1640
|
+
|
|
1641
|
+
// node_modules/@noble/hashes/hmac.js
|
|
1642
|
+
var _HMAC = class {
|
|
1643
|
+
constructor(hash, key) {
|
|
1644
|
+
__publicField(this, "oHash");
|
|
1645
|
+
__publicField(this, "iHash");
|
|
1646
|
+
__publicField(this, "blockLen");
|
|
1647
|
+
__publicField(this, "outputLen");
|
|
1648
|
+
__publicField(this, "finished", false);
|
|
1649
|
+
__publicField(this, "destroyed", false);
|
|
1650
|
+
ahash(hash);
|
|
1651
|
+
abytes(key, void 0, "key");
|
|
1652
|
+
this.iHash = hash.create();
|
|
1653
|
+
if (typeof this.iHash.update !== "function")
|
|
1654
|
+
throw new Error("Expected instance of class which extends utils.Hash");
|
|
1655
|
+
this.blockLen = this.iHash.blockLen;
|
|
1656
|
+
this.outputLen = this.iHash.outputLen;
|
|
1657
|
+
const blockLen = this.blockLen;
|
|
1658
|
+
const pad = new Uint8Array(blockLen);
|
|
1659
|
+
pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);
|
|
1660
|
+
for (let i = 0; i < pad.length; i++)
|
|
1661
|
+
pad[i] ^= 54;
|
|
1662
|
+
this.iHash.update(pad);
|
|
1663
|
+
this.oHash = hash.create();
|
|
1664
|
+
for (let i = 0; i < pad.length; i++)
|
|
1665
|
+
pad[i] ^= 54 ^ 92;
|
|
1666
|
+
this.oHash.update(pad);
|
|
1667
|
+
clean(pad);
|
|
1668
|
+
}
|
|
1669
|
+
update(buf) {
|
|
1670
|
+
aexists(this);
|
|
1671
|
+
this.iHash.update(buf);
|
|
1672
|
+
return this;
|
|
1673
|
+
}
|
|
1674
|
+
digestInto(out) {
|
|
1675
|
+
aexists(this);
|
|
1676
|
+
abytes(out, this.outputLen, "output");
|
|
1677
|
+
this.finished = true;
|
|
1678
|
+
this.iHash.digestInto(out);
|
|
1679
|
+
this.oHash.update(out);
|
|
1680
|
+
this.oHash.digestInto(out);
|
|
1681
|
+
this.destroy();
|
|
1682
|
+
}
|
|
1683
|
+
digest() {
|
|
1684
|
+
const out = new Uint8Array(this.oHash.outputLen);
|
|
1685
|
+
this.digestInto(out);
|
|
1686
|
+
return out;
|
|
1687
|
+
}
|
|
1688
|
+
_cloneInto(to) {
|
|
1689
|
+
to || (to = Object.create(Object.getPrototypeOf(this), {}));
|
|
1690
|
+
const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;
|
|
1691
|
+
to = to;
|
|
1692
|
+
to.finished = finished;
|
|
1693
|
+
to.destroyed = destroyed;
|
|
1694
|
+
to.blockLen = blockLen;
|
|
1695
|
+
to.outputLen = outputLen;
|
|
1696
|
+
to.oHash = oHash._cloneInto(to.oHash);
|
|
1697
|
+
to.iHash = iHash._cloneInto(to.iHash);
|
|
1698
|
+
return to;
|
|
1699
|
+
}
|
|
1700
|
+
clone() {
|
|
1701
|
+
return this._cloneInto();
|
|
1702
|
+
}
|
|
1703
|
+
destroy() {
|
|
1704
|
+
this.destroyed = true;
|
|
1705
|
+
this.oHash.destroy();
|
|
1706
|
+
this.iHash.destroy();
|
|
1707
|
+
}
|
|
1708
|
+
};
|
|
1709
|
+
var hmac = (hash, key, message) => new _HMAC(hash, key).update(message).digest();
|
|
1710
|
+
hmac.create = (hash, key) => new _HMAC(hash, key);
|
|
1711
|
+
|
|
1712
|
+
// node_modules/@noble/hashes/_md.js
|
|
1713
|
+
function Chi(a, b, c) {
|
|
1714
|
+
return a & b ^ ~a & c;
|
|
1715
|
+
}
|
|
1716
|
+
function Maj(a, b, c) {
|
|
1717
|
+
return a & b ^ a & c ^ b & c;
|
|
1718
|
+
}
|
|
1719
|
+
var HashMD = class {
|
|
1720
|
+
constructor(blockLen, outputLen, padOffset, isLE2) {
|
|
1721
|
+
__publicField(this, "blockLen");
|
|
1722
|
+
__publicField(this, "outputLen");
|
|
1723
|
+
__publicField(this, "padOffset");
|
|
1724
|
+
__publicField(this, "isLE");
|
|
1725
|
+
// For partial updates less than block size
|
|
1726
|
+
__publicField(this, "buffer");
|
|
1727
|
+
__publicField(this, "view");
|
|
1728
|
+
__publicField(this, "finished", false);
|
|
1729
|
+
__publicField(this, "length", 0);
|
|
1730
|
+
__publicField(this, "pos", 0);
|
|
1731
|
+
__publicField(this, "destroyed", false);
|
|
1732
|
+
this.blockLen = blockLen;
|
|
1733
|
+
this.outputLen = outputLen;
|
|
1734
|
+
this.padOffset = padOffset;
|
|
1735
|
+
this.isLE = isLE2;
|
|
1736
|
+
this.buffer = new Uint8Array(blockLen);
|
|
1737
|
+
this.view = createView(this.buffer);
|
|
1738
|
+
}
|
|
1739
|
+
update(data) {
|
|
1740
|
+
aexists(this);
|
|
1741
|
+
abytes(data);
|
|
1742
|
+
const { view, buffer, blockLen } = this;
|
|
1743
|
+
const len = data.length;
|
|
1744
|
+
for (let pos = 0; pos < len; ) {
|
|
1745
|
+
const take = Math.min(blockLen - this.pos, len - pos);
|
|
1746
|
+
if (take === blockLen) {
|
|
1747
|
+
const dataView = createView(data);
|
|
1748
|
+
for (; blockLen <= len - pos; pos += blockLen)
|
|
1749
|
+
this.process(dataView, pos);
|
|
1750
|
+
continue;
|
|
1751
|
+
}
|
|
1752
|
+
buffer.set(data.subarray(pos, pos + take), this.pos);
|
|
1753
|
+
this.pos += take;
|
|
1754
|
+
pos += take;
|
|
1755
|
+
if (this.pos === blockLen) {
|
|
1756
|
+
this.process(view, 0);
|
|
1757
|
+
this.pos = 0;
|
|
1758
|
+
}
|
|
1759
|
+
}
|
|
1760
|
+
this.length += data.length;
|
|
1761
|
+
this.roundClean();
|
|
1762
|
+
return this;
|
|
1763
|
+
}
|
|
1764
|
+
digestInto(out) {
|
|
1765
|
+
aexists(this);
|
|
1766
|
+
aoutput(out, this);
|
|
1767
|
+
this.finished = true;
|
|
1768
|
+
const { buffer, view, blockLen, isLE: isLE2 } = this;
|
|
1769
|
+
let { pos } = this;
|
|
1770
|
+
buffer[pos++] = 128;
|
|
1771
|
+
clean(this.buffer.subarray(pos));
|
|
1772
|
+
if (this.padOffset > blockLen - pos) {
|
|
1773
|
+
this.process(view, 0);
|
|
1774
|
+
pos = 0;
|
|
1775
|
+
}
|
|
1776
|
+
for (let i = pos; i < blockLen; i++)
|
|
1777
|
+
buffer[i] = 0;
|
|
1778
|
+
view.setBigUint64(blockLen - 8, BigInt(this.length * 8), isLE2);
|
|
1779
|
+
this.process(view, 0);
|
|
1780
|
+
const oview = createView(out);
|
|
1781
|
+
const len = this.outputLen;
|
|
1782
|
+
if (len % 4)
|
|
1783
|
+
throw new Error("_sha2: outputLen must be aligned to 32bit");
|
|
1784
|
+
const outLen = len / 4;
|
|
1785
|
+
const state = this.get();
|
|
1786
|
+
if (outLen > state.length)
|
|
1787
|
+
throw new Error("_sha2: outputLen bigger than state");
|
|
1788
|
+
for (let i = 0; i < outLen; i++)
|
|
1789
|
+
oview.setUint32(4 * i, state[i], isLE2);
|
|
1790
|
+
}
|
|
1791
|
+
digest() {
|
|
1792
|
+
const { buffer, outputLen } = this;
|
|
1793
|
+
this.digestInto(buffer);
|
|
1794
|
+
const res = buffer.slice(0, outputLen);
|
|
1795
|
+
this.destroy();
|
|
1796
|
+
return res;
|
|
1797
|
+
}
|
|
1798
|
+
_cloneInto(to) {
|
|
1799
|
+
to || (to = new this.constructor());
|
|
1800
|
+
to.set(...this.get());
|
|
1801
|
+
const { blockLen, buffer, length, finished, destroyed, pos } = this;
|
|
1802
|
+
to.destroyed = destroyed;
|
|
1803
|
+
to.finished = finished;
|
|
1804
|
+
to.length = length;
|
|
1805
|
+
to.pos = pos;
|
|
1806
|
+
if (length % blockLen)
|
|
1807
|
+
to.buffer.set(buffer);
|
|
1808
|
+
return to;
|
|
1809
|
+
}
|
|
1810
|
+
clone() {
|
|
1811
|
+
return this._cloneInto();
|
|
1812
|
+
}
|
|
1813
|
+
};
|
|
1814
|
+
var SHA256_IV = /* @__PURE__ */ Uint32Array.from([
|
|
1815
|
+
1779033703,
|
|
1816
|
+
3144134277,
|
|
1817
|
+
1013904242,
|
|
1818
|
+
2773480762,
|
|
1819
|
+
1359893119,
|
|
1820
|
+
2600822924,
|
|
1821
|
+
528734635,
|
|
1822
|
+
1541459225
|
|
1823
|
+
]);
|
|
1824
|
+
|
|
1825
|
+
// node_modules/@noble/hashes/sha2.js
|
|
1826
|
+
var SHA256_K = /* @__PURE__ */ Uint32Array.from([
|
|
1827
|
+
1116352408,
|
|
1828
|
+
1899447441,
|
|
1829
|
+
3049323471,
|
|
1830
|
+
3921009573,
|
|
1831
|
+
961987163,
|
|
1832
|
+
1508970993,
|
|
1833
|
+
2453635748,
|
|
1834
|
+
2870763221,
|
|
1835
|
+
3624381080,
|
|
1836
|
+
310598401,
|
|
1837
|
+
607225278,
|
|
1838
|
+
1426881987,
|
|
1839
|
+
1925078388,
|
|
1840
|
+
2162078206,
|
|
1841
|
+
2614888103,
|
|
1842
|
+
3248222580,
|
|
1843
|
+
3835390401,
|
|
1844
|
+
4022224774,
|
|
1845
|
+
264347078,
|
|
1846
|
+
604807628,
|
|
1847
|
+
770255983,
|
|
1848
|
+
1249150122,
|
|
1849
|
+
1555081692,
|
|
1850
|
+
1996064986,
|
|
1851
|
+
2554220882,
|
|
1852
|
+
2821834349,
|
|
1853
|
+
2952996808,
|
|
1854
|
+
3210313671,
|
|
1855
|
+
3336571891,
|
|
1856
|
+
3584528711,
|
|
1857
|
+
113926993,
|
|
1858
|
+
338241895,
|
|
1859
|
+
666307205,
|
|
1860
|
+
773529912,
|
|
1861
|
+
1294757372,
|
|
1862
|
+
1396182291,
|
|
1863
|
+
1695183700,
|
|
1864
|
+
1986661051,
|
|
1865
|
+
2177026350,
|
|
1866
|
+
2456956037,
|
|
1867
|
+
2730485921,
|
|
1868
|
+
2820302411,
|
|
1869
|
+
3259730800,
|
|
1870
|
+
3345764771,
|
|
1871
|
+
3516065817,
|
|
1872
|
+
3600352804,
|
|
1873
|
+
4094571909,
|
|
1874
|
+
275423344,
|
|
1875
|
+
430227734,
|
|
1876
|
+
506948616,
|
|
1877
|
+
659060556,
|
|
1878
|
+
883997877,
|
|
1879
|
+
958139571,
|
|
1880
|
+
1322822218,
|
|
1881
|
+
1537002063,
|
|
1882
|
+
1747873779,
|
|
1883
|
+
1955562222,
|
|
1884
|
+
2024104815,
|
|
1885
|
+
2227730452,
|
|
1886
|
+
2361852424,
|
|
1887
|
+
2428436474,
|
|
1888
|
+
2756734187,
|
|
1889
|
+
3204031479,
|
|
1890
|
+
3329325298
|
|
1891
|
+
]);
|
|
1892
|
+
var SHA256_W = /* @__PURE__ */ new Uint32Array(64);
|
|
1893
|
+
var SHA2_32B = class extends HashMD {
|
|
1894
|
+
constructor(outputLen) {
|
|
1895
|
+
super(64, outputLen, 8, false);
|
|
1896
|
+
}
|
|
1897
|
+
get() {
|
|
1898
|
+
const { A, B, C: C2, D: D2, E, F: F2, G: G2, H } = this;
|
|
1899
|
+
return [A, B, C2, D2, E, F2, G2, H];
|
|
1900
|
+
}
|
|
1901
|
+
// prettier-ignore
|
|
1902
|
+
set(A, B, C2, D2, E, F2, G2, H) {
|
|
1903
|
+
this.A = A | 0;
|
|
1904
|
+
this.B = B | 0;
|
|
1905
|
+
this.C = C2 | 0;
|
|
1906
|
+
this.D = D2 | 0;
|
|
1907
|
+
this.E = E | 0;
|
|
1908
|
+
this.F = F2 | 0;
|
|
1909
|
+
this.G = G2 | 0;
|
|
1910
|
+
this.H = H | 0;
|
|
1911
|
+
}
|
|
1912
|
+
process(view, offset) {
|
|
1913
|
+
for (let i = 0; i < 16; i++, offset += 4)
|
|
1914
|
+
SHA256_W[i] = view.getUint32(offset, false);
|
|
1915
|
+
for (let i = 16; i < 64; i++) {
|
|
1916
|
+
const W15 = SHA256_W[i - 15];
|
|
1917
|
+
const W2 = SHA256_W[i - 2];
|
|
1918
|
+
const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ W15 >>> 3;
|
|
1919
|
+
const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ W2 >>> 10;
|
|
1920
|
+
SHA256_W[i] = s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16] | 0;
|
|
1921
|
+
}
|
|
1922
|
+
let { A, B, C: C2, D: D2, E, F: F2, G: G2, H } = this;
|
|
1923
|
+
for (let i = 0; i < 64; i++) {
|
|
1924
|
+
const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);
|
|
1925
|
+
const T1 = H + sigma1 + Chi(E, F2, G2) + SHA256_K[i] + SHA256_W[i] | 0;
|
|
1926
|
+
const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);
|
|
1927
|
+
const T2 = sigma0 + Maj(A, B, C2) | 0;
|
|
1928
|
+
H = G2;
|
|
1929
|
+
G2 = F2;
|
|
1930
|
+
F2 = E;
|
|
1931
|
+
E = D2 + T1 | 0;
|
|
1932
|
+
D2 = C2;
|
|
1933
|
+
C2 = B;
|
|
1934
|
+
B = A;
|
|
1935
|
+
A = T1 + T2 | 0;
|
|
1936
|
+
}
|
|
1937
|
+
A = A + this.A | 0;
|
|
1938
|
+
B = B + this.B | 0;
|
|
1939
|
+
C2 = C2 + this.C | 0;
|
|
1940
|
+
D2 = D2 + this.D | 0;
|
|
1941
|
+
E = E + this.E | 0;
|
|
1942
|
+
F2 = F2 + this.F | 0;
|
|
1943
|
+
G2 = G2 + this.G | 0;
|
|
1944
|
+
H = H + this.H | 0;
|
|
1945
|
+
this.set(A, B, C2, D2, E, F2, G2, H);
|
|
1946
|
+
}
|
|
1947
|
+
roundClean() {
|
|
1948
|
+
clean(SHA256_W);
|
|
1949
|
+
}
|
|
1950
|
+
destroy() {
|
|
1951
|
+
this.set(0, 0, 0, 0, 0, 0, 0, 0);
|
|
1952
|
+
clean(this.buffer);
|
|
1953
|
+
}
|
|
1954
|
+
};
|
|
1955
|
+
var _SHA256 = class extends SHA2_32B {
|
|
1956
|
+
constructor() {
|
|
1957
|
+
super(32);
|
|
1958
|
+
// We cannot use array here since array allows indexing by variable
|
|
1959
|
+
// which means optimizer/compiler cannot use registers.
|
|
1960
|
+
__publicField(this, "A", SHA256_IV[0] | 0);
|
|
1961
|
+
__publicField(this, "B", SHA256_IV[1] | 0);
|
|
1962
|
+
__publicField(this, "C", SHA256_IV[2] | 0);
|
|
1963
|
+
__publicField(this, "D", SHA256_IV[3] | 0);
|
|
1964
|
+
__publicField(this, "E", SHA256_IV[4] | 0);
|
|
1965
|
+
__publicField(this, "F", SHA256_IV[5] | 0);
|
|
1966
|
+
__publicField(this, "G", SHA256_IV[6] | 0);
|
|
1967
|
+
__publicField(this, "H", SHA256_IV[7] | 0);
|
|
1968
|
+
}
|
|
1969
|
+
};
|
|
1970
|
+
var sha256 = /* @__PURE__ */ createHasher(
|
|
1971
|
+
() => new _SHA256(),
|
|
1972
|
+
/* @__PURE__ */ oidNist(1)
|
|
1973
|
+
);
|
|
1974
|
+
|
|
1975
|
+
// node_modules/@noble/secp256k1/index.js
|
|
1976
|
+
var secp256k1_CURVE = {
|
|
1977
|
+
p: 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2fn,
|
|
1978
|
+
n: 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n,
|
|
1979
|
+
h: 1n,
|
|
1980
|
+
a: 0n,
|
|
1981
|
+
b: 7n,
|
|
1982
|
+
Gx: 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798n,
|
|
1983
|
+
Gy: 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8n
|
|
1984
|
+
};
|
|
1985
|
+
var { p: P, n: N2, Gx, Gy, b: _b } = secp256k1_CURVE;
|
|
1986
|
+
var L = 32;
|
|
1987
|
+
var L2 = 64;
|
|
1988
|
+
var lengths = {
|
|
1989
|
+
publicKey: L + 1,
|
|
1990
|
+
publicKeyUncompressed: L2 + 1,
|
|
1991
|
+
signature: L2,
|
|
1992
|
+
seed: L + L / 2
|
|
1993
|
+
};
|
|
1994
|
+
var captureTrace = (...args) => {
|
|
1995
|
+
if ("captureStackTrace" in Error && typeof Error.captureStackTrace === "function") {
|
|
1996
|
+
Error.captureStackTrace(...args);
|
|
1997
|
+
}
|
|
1998
|
+
};
|
|
1999
|
+
var err = (message = "") => {
|
|
2000
|
+
const e = new Error(message);
|
|
2001
|
+
captureTrace(e, err);
|
|
2002
|
+
throw e;
|
|
2003
|
+
};
|
|
2004
|
+
var isBig = (n) => typeof n === "bigint";
|
|
2005
|
+
var isStr = (s) => typeof s === "string";
|
|
2006
|
+
var isBytes2 = (a) => a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array";
|
|
2007
|
+
var abytes2 = (value, length, title = "") => {
|
|
2008
|
+
const bytes = isBytes2(value);
|
|
2009
|
+
const len = value?.length;
|
|
2010
|
+
const needsLen = length !== void 0;
|
|
2011
|
+
if (!bytes || needsLen && len !== length) {
|
|
2012
|
+
const prefix = title && `"${title}" `;
|
|
2013
|
+
const ofLen = needsLen ? ` of length ${length}` : "";
|
|
2014
|
+
const got = bytes ? `length=${len}` : `type=${typeof value}`;
|
|
2015
|
+
err(prefix + "expected Uint8Array" + ofLen + ", got " + got);
|
|
2016
|
+
}
|
|
2017
|
+
return value;
|
|
2018
|
+
};
|
|
2019
|
+
var u8n = (len) => new Uint8Array(len);
|
|
2020
|
+
var padh = (n, pad) => n.toString(16).padStart(pad, "0");
|
|
2021
|
+
var bytesToHex = (b) => Array.from(abytes2(b)).map((e) => padh(e, 2)).join("");
|
|
2022
|
+
var C = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 };
|
|
2023
|
+
var _ch = (ch) => {
|
|
2024
|
+
if (ch >= C._0 && ch <= C._9)
|
|
2025
|
+
return ch - C._0;
|
|
2026
|
+
if (ch >= C.A && ch <= C.F)
|
|
2027
|
+
return ch - (C.A - 10);
|
|
2028
|
+
if (ch >= C.a && ch <= C.f)
|
|
2029
|
+
return ch - (C.a - 10);
|
|
2030
|
+
return;
|
|
2031
|
+
};
|
|
2032
|
+
var hexToBytes = (hex) => {
|
|
2033
|
+
const e = "hex invalid";
|
|
2034
|
+
if (!isStr(hex))
|
|
2035
|
+
return err(e);
|
|
2036
|
+
const hl = hex.length;
|
|
2037
|
+
const al = hl / 2;
|
|
2038
|
+
if (hl % 2)
|
|
2039
|
+
return err(e);
|
|
2040
|
+
const array = u8n(al);
|
|
2041
|
+
for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {
|
|
2042
|
+
const n1 = _ch(hex.charCodeAt(hi));
|
|
2043
|
+
const n2 = _ch(hex.charCodeAt(hi + 1));
|
|
2044
|
+
if (n1 === void 0 || n2 === void 0)
|
|
2045
|
+
return err(e);
|
|
2046
|
+
array[ai] = n1 * 16 + n2;
|
|
2047
|
+
}
|
|
2048
|
+
return array;
|
|
2049
|
+
};
|
|
2050
|
+
var cr = () => globalThis?.crypto;
|
|
2051
|
+
var subtle = () => cr()?.subtle ?? err("crypto.subtle must be defined, consider polyfill");
|
|
2052
|
+
var concatBytes2 = (...arrs) => {
|
|
2053
|
+
const r = u8n(arrs.reduce((sum, a) => sum + abytes2(a).length, 0));
|
|
2054
|
+
let pad = 0;
|
|
2055
|
+
arrs.forEach((a) => {
|
|
2056
|
+
r.set(a, pad);
|
|
2057
|
+
pad += a.length;
|
|
2058
|
+
});
|
|
2059
|
+
return r;
|
|
2060
|
+
};
|
|
2061
|
+
var randomBytes3 = (len = L) => {
|
|
2062
|
+
const c = cr();
|
|
2063
|
+
return c.getRandomValues(u8n(len));
|
|
2064
|
+
};
|
|
2065
|
+
var big = BigInt;
|
|
2066
|
+
var arange = (n, min, max, msg = "bad number: out of range") => isBig(n) && min <= n && n < max ? n : err(msg);
|
|
2067
|
+
var M = (a, b = P) => {
|
|
2068
|
+
const r = a % b;
|
|
2069
|
+
return r >= 0n ? r : b + r;
|
|
2070
|
+
};
|
|
2071
|
+
var modN = (a) => M(a, N2);
|
|
2072
|
+
var invert = (num, md) => {
|
|
2073
|
+
if (num === 0n || md <= 0n)
|
|
2074
|
+
err("no inverse n=" + num + " mod=" + md);
|
|
2075
|
+
let a = M(num, md), b = md, x = 0n, y = 1n, u = 1n, v = 0n;
|
|
2076
|
+
while (a !== 0n) {
|
|
2077
|
+
const q = b / a, r = b % a;
|
|
2078
|
+
const m = x - u * q, n = y - v * q;
|
|
2079
|
+
b = a, a = r, x = u, y = v, u = m, v = n;
|
|
2080
|
+
}
|
|
2081
|
+
return b === 1n ? M(x, md) : err("no inverse");
|
|
2082
|
+
};
|
|
2083
|
+
var callHash = (name) => {
|
|
2084
|
+
const fn = hashes[name];
|
|
2085
|
+
if (typeof fn !== "function")
|
|
2086
|
+
err("hashes." + name + " not set");
|
|
2087
|
+
return fn;
|
|
2088
|
+
};
|
|
2089
|
+
var apoint = (p) => p instanceof Point ? p : err("Point expected");
|
|
2090
|
+
var koblitz = (x) => M(M(x * x) * x + _b);
|
|
2091
|
+
var FpIsValid = (n) => arange(n, 0n, P);
|
|
2092
|
+
var FpIsValidNot0 = (n) => arange(n, 1n, P);
|
|
2093
|
+
var FnIsValidNot0 = (n) => arange(n, 1n, N2);
|
|
2094
|
+
var isEven = (y) => (y & 1n) === 0n;
|
|
2095
|
+
var u8of = (n) => Uint8Array.of(n);
|
|
2096
|
+
var getPrefix = (y) => u8of(isEven(y) ? 2 : 3);
|
|
2097
|
+
var lift_x = (x) => {
|
|
2098
|
+
const c = koblitz(FpIsValidNot0(x));
|
|
2099
|
+
let r = 1n;
|
|
2100
|
+
for (let num = c, e = (P + 1n) / 4n; e > 0n; e >>= 1n) {
|
|
2101
|
+
if (e & 1n)
|
|
2102
|
+
r = r * num % P;
|
|
2103
|
+
num = num * num % P;
|
|
2104
|
+
}
|
|
2105
|
+
return M(r * r) === c ? r : err("sqrt invalid");
|
|
2106
|
+
};
|
|
2107
|
+
var _Point = class _Point {
|
|
2108
|
+
constructor(X, Y, Z) {
|
|
2109
|
+
__publicField(this, "X");
|
|
2110
|
+
__publicField(this, "Y");
|
|
2111
|
+
__publicField(this, "Z");
|
|
2112
|
+
this.X = FpIsValid(X);
|
|
2113
|
+
this.Y = FpIsValidNot0(Y);
|
|
2114
|
+
this.Z = FpIsValid(Z);
|
|
2115
|
+
Object.freeze(this);
|
|
2116
|
+
}
|
|
2117
|
+
static CURVE() {
|
|
2118
|
+
return secp256k1_CURVE;
|
|
2119
|
+
}
|
|
2120
|
+
/** Create 3d xyz point from 2d xy. (0, 0) => (0, 1, 0), not (0, 0, 1) */
|
|
2121
|
+
static fromAffine(ap) {
|
|
2122
|
+
const { x, y } = ap;
|
|
2123
|
+
return x === 0n && y === 0n ? I : new _Point(x, y, 1n);
|
|
2124
|
+
}
|
|
2125
|
+
/** Convert Uint8Array or hex string to Point. */
|
|
2126
|
+
static fromBytes(bytes) {
|
|
2127
|
+
abytes2(bytes);
|
|
2128
|
+
const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths;
|
|
2129
|
+
let p = void 0;
|
|
2130
|
+
const length = bytes.length;
|
|
2131
|
+
const head = bytes[0];
|
|
2132
|
+
const tail = bytes.subarray(1);
|
|
2133
|
+
const x = sliceBytesNumBE(tail, 0, L);
|
|
2134
|
+
if (length === comp && (head === 2 || head === 3)) {
|
|
2135
|
+
let y = lift_x(x);
|
|
2136
|
+
const evenY = isEven(y);
|
|
2137
|
+
const evenH = isEven(big(head));
|
|
2138
|
+
if (evenH !== evenY)
|
|
2139
|
+
y = M(-y);
|
|
2140
|
+
p = new _Point(x, y, 1n);
|
|
2141
|
+
}
|
|
2142
|
+
if (length === uncomp && head === 4)
|
|
2143
|
+
p = new _Point(x, sliceBytesNumBE(tail, L, L2), 1n);
|
|
2144
|
+
return p ? p.assertValidity() : err("bad point: not on curve");
|
|
2145
|
+
}
|
|
2146
|
+
static fromHex(hex) {
|
|
2147
|
+
return _Point.fromBytes(hexToBytes(hex));
|
|
2148
|
+
}
|
|
2149
|
+
get x() {
|
|
2150
|
+
return this.toAffine().x;
|
|
2151
|
+
}
|
|
2152
|
+
get y() {
|
|
2153
|
+
return this.toAffine().y;
|
|
2154
|
+
}
|
|
2155
|
+
/** Equality check: compare points P&Q. */
|
|
2156
|
+
equals(other) {
|
|
2157
|
+
const { X: X1, Y: Y1, Z: Z1 } = this;
|
|
2158
|
+
const { X: X2, Y: Y2, Z: Z2 } = apoint(other);
|
|
2159
|
+
const X1Z2 = M(X1 * Z2);
|
|
2160
|
+
const X2Z1 = M(X2 * Z1);
|
|
2161
|
+
const Y1Z2 = M(Y1 * Z2);
|
|
2162
|
+
const Y2Z1 = M(Y2 * Z1);
|
|
2163
|
+
return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;
|
|
2164
|
+
}
|
|
2165
|
+
is0() {
|
|
2166
|
+
return this.equals(I);
|
|
2167
|
+
}
|
|
2168
|
+
/** Flip point over y coordinate. */
|
|
2169
|
+
negate() {
|
|
2170
|
+
return new _Point(this.X, M(-this.Y), this.Z);
|
|
2171
|
+
}
|
|
2172
|
+
/** Point doubling: P+P, complete formula. */
|
|
2173
|
+
double() {
|
|
2174
|
+
return this.add(this);
|
|
2175
|
+
}
|
|
2176
|
+
/**
|
|
2177
|
+
* Point addition: P+Q, complete, exception-free formula
|
|
2178
|
+
* (Renes-Costello-Batina, algo 1 of [2015/1060](https://eprint.iacr.org/2015/1060)).
|
|
2179
|
+
* Cost: `12M + 0S + 3*a + 3*b3 + 23add`.
|
|
2180
|
+
*/
|
|
2181
|
+
// prettier-ignore
|
|
2182
|
+
add(other) {
|
|
2183
|
+
const { X: X1, Y: Y1, Z: Z1 } = this;
|
|
2184
|
+
const { X: X2, Y: Y2, Z: Z2 } = apoint(other);
|
|
2185
|
+
const a = 0n;
|
|
2186
|
+
const b = _b;
|
|
2187
|
+
let X3 = 0n, Y3 = 0n, Z3 = 0n;
|
|
2188
|
+
const b3 = M(b * 3n);
|
|
2189
|
+
let t0 = M(X1 * X2), t1 = M(Y1 * Y2), t2 = M(Z1 * Z2), t3 = M(X1 + Y1);
|
|
2190
|
+
let t4 = M(X2 + Y2);
|
|
2191
|
+
t3 = M(t3 * t4);
|
|
2192
|
+
t4 = M(t0 + t1);
|
|
2193
|
+
t3 = M(t3 - t4);
|
|
2194
|
+
t4 = M(X1 + Z1);
|
|
2195
|
+
let t5 = M(X2 + Z2);
|
|
2196
|
+
t4 = M(t4 * t5);
|
|
2197
|
+
t5 = M(t0 + t2);
|
|
2198
|
+
t4 = M(t4 - t5);
|
|
2199
|
+
t5 = M(Y1 + Z1);
|
|
2200
|
+
X3 = M(Y2 + Z2);
|
|
2201
|
+
t5 = M(t5 * X3);
|
|
2202
|
+
X3 = M(t1 + t2);
|
|
2203
|
+
t5 = M(t5 - X3);
|
|
2204
|
+
Z3 = M(a * t4);
|
|
2205
|
+
X3 = M(b3 * t2);
|
|
2206
|
+
Z3 = M(X3 + Z3);
|
|
2207
|
+
X3 = M(t1 - Z3);
|
|
2208
|
+
Z3 = M(t1 + Z3);
|
|
2209
|
+
Y3 = M(X3 * Z3);
|
|
2210
|
+
t1 = M(t0 + t0);
|
|
2211
|
+
t1 = M(t1 + t0);
|
|
2212
|
+
t2 = M(a * t2);
|
|
2213
|
+
t4 = M(b3 * t4);
|
|
2214
|
+
t1 = M(t1 + t2);
|
|
2215
|
+
t2 = M(t0 - t2);
|
|
2216
|
+
t2 = M(a * t2);
|
|
2217
|
+
t4 = M(t4 + t2);
|
|
2218
|
+
t0 = M(t1 * t4);
|
|
2219
|
+
Y3 = M(Y3 + t0);
|
|
2220
|
+
t0 = M(t5 * t4);
|
|
2221
|
+
X3 = M(t3 * X3);
|
|
2222
|
+
X3 = M(X3 - t0);
|
|
2223
|
+
t0 = M(t3 * t1);
|
|
2224
|
+
Z3 = M(t5 * Z3);
|
|
2225
|
+
Z3 = M(Z3 + t0);
|
|
2226
|
+
return new _Point(X3, Y3, Z3);
|
|
2227
|
+
}
|
|
2228
|
+
subtract(other) {
|
|
2229
|
+
return this.add(apoint(other).negate());
|
|
2230
|
+
}
|
|
2231
|
+
/**
|
|
2232
|
+
* Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.
|
|
2233
|
+
* Uses {@link wNAF} for base point.
|
|
2234
|
+
* Uses fake point to mitigate side-channel leakage.
|
|
2235
|
+
* @param n scalar by which point is multiplied
|
|
2236
|
+
* @param safe safe mode guards against timing attacks; unsafe mode is faster
|
|
2237
|
+
*/
|
|
2238
|
+
multiply(n, safe = true) {
|
|
2239
|
+
if (!safe && n === 0n)
|
|
2240
|
+
return I;
|
|
2241
|
+
FnIsValidNot0(n);
|
|
2242
|
+
if (n === 1n)
|
|
2243
|
+
return this;
|
|
2244
|
+
if (this.equals(G))
|
|
2245
|
+
return wNAF(n).p;
|
|
2246
|
+
let p = I;
|
|
2247
|
+
let f = G;
|
|
2248
|
+
for (let d = this; n > 0n; d = d.double(), n >>= 1n) {
|
|
2249
|
+
if (n & 1n)
|
|
2250
|
+
p = p.add(d);
|
|
2251
|
+
else if (safe)
|
|
2252
|
+
f = f.add(d);
|
|
2253
|
+
}
|
|
2254
|
+
return p;
|
|
2255
|
+
}
|
|
2256
|
+
multiplyUnsafe(scalar) {
|
|
2257
|
+
return this.multiply(scalar, false);
|
|
2258
|
+
}
|
|
2259
|
+
/** Convert point to 2d xy affine point. (X, Y, Z) ∋ (x=X/Z, y=Y/Z) */
|
|
2260
|
+
toAffine() {
|
|
2261
|
+
const { X: x, Y: y, Z: z } = this;
|
|
2262
|
+
if (this.equals(I))
|
|
2263
|
+
return { x: 0n, y: 0n };
|
|
2264
|
+
if (z === 1n)
|
|
2265
|
+
return { x, y };
|
|
2266
|
+
const iz = invert(z, P);
|
|
2267
|
+
if (M(z * iz) !== 1n)
|
|
2268
|
+
err("inverse invalid");
|
|
2269
|
+
return { x: M(x * iz), y: M(y * iz) };
|
|
2270
|
+
}
|
|
2271
|
+
/** Checks if the point is valid and on-curve. */
|
|
2272
|
+
assertValidity() {
|
|
2273
|
+
const { x, y } = this.toAffine();
|
|
2274
|
+
FpIsValidNot0(x);
|
|
2275
|
+
FpIsValidNot0(y);
|
|
2276
|
+
return M(y * y) === koblitz(x) ? this : err("bad point: not on curve");
|
|
2277
|
+
}
|
|
2278
|
+
/** Converts point to 33/65-byte Uint8Array. */
|
|
2279
|
+
toBytes(isCompressed = true) {
|
|
2280
|
+
const { x, y } = this.assertValidity().toAffine();
|
|
2281
|
+
const x32b = numTo32b(x);
|
|
2282
|
+
if (isCompressed)
|
|
2283
|
+
return concatBytes2(getPrefix(y), x32b);
|
|
2284
|
+
return concatBytes2(u8of(4), x32b, numTo32b(y));
|
|
2285
|
+
}
|
|
2286
|
+
toHex(isCompressed) {
|
|
2287
|
+
return bytesToHex(this.toBytes(isCompressed));
|
|
2288
|
+
}
|
|
2289
|
+
};
|
|
2290
|
+
__publicField(_Point, "BASE");
|
|
2291
|
+
__publicField(_Point, "ZERO");
|
|
2292
|
+
var Point = _Point;
|
|
2293
|
+
var G = new Point(Gx, Gy, 1n);
|
|
2294
|
+
var I = new Point(0n, 1n, 0n);
|
|
2295
|
+
Point.BASE = G;
|
|
2296
|
+
Point.ZERO = I;
|
|
2297
|
+
var doubleScalarMulUns = (R, u1, u2) => {
|
|
2298
|
+
return G.multiply(u1, false).add(R.multiply(u2, false)).assertValidity();
|
|
2299
|
+
};
|
|
2300
|
+
var bytesToNumBE = (b) => big("0x" + (bytesToHex(b) || "0"));
|
|
2301
|
+
var sliceBytesNumBE = (b, from, to) => bytesToNumBE(b.subarray(from, to));
|
|
2302
|
+
var B256 = 2n ** 256n;
|
|
2303
|
+
var numTo32b = (num) => hexToBytes(padh(arange(num, 0n, B256), L2));
|
|
2304
|
+
var secretKeyToScalar = (secretKey) => {
|
|
2305
|
+
const num = bytesToNumBE(abytes2(secretKey, L, "secret key"));
|
|
2306
|
+
return arange(num, 1n, N2, "invalid secret key: outside of range");
|
|
2307
|
+
};
|
|
2308
|
+
var highS = (n) => n > N2 >> 1n;
|
|
2309
|
+
var getPublicKey = (privKey, isCompressed = true) => {
|
|
2310
|
+
return G.multiply(secretKeyToScalar(privKey)).toBytes(isCompressed);
|
|
2311
|
+
};
|
|
2312
|
+
var assertRecoveryBit = (recovery) => {
|
|
2313
|
+
if (![0, 1, 2, 3].includes(recovery))
|
|
2314
|
+
err("recovery id must be valid and present");
|
|
2315
|
+
};
|
|
2316
|
+
var assertSigFormat = (format) => {
|
|
2317
|
+
if (format != null && !ALL_SIG.includes(format))
|
|
2318
|
+
err(`Signature format must be one of: ${ALL_SIG.join(", ")}`);
|
|
2319
|
+
if (format === SIG_DER)
|
|
2320
|
+
err('Signature format "der" is not supported: switch to noble-curves');
|
|
2321
|
+
};
|
|
2322
|
+
var assertSigLength = (sig, format = SIG_COMPACT) => {
|
|
2323
|
+
assertSigFormat(format);
|
|
2324
|
+
const SL = lengths.signature;
|
|
2325
|
+
const RL = SL + 1;
|
|
2326
|
+
let msg = `Signature format "${format}" expects Uint8Array with length `;
|
|
2327
|
+
if (format === SIG_COMPACT && sig.length !== SL)
|
|
2328
|
+
err(msg + SL);
|
|
2329
|
+
if (format === SIG_RECOVERED && sig.length !== RL)
|
|
2330
|
+
err(msg + RL);
|
|
2331
|
+
};
|
|
2332
|
+
var Signature = class _Signature {
|
|
2333
|
+
constructor(r, s, recovery) {
|
|
2334
|
+
__publicField(this, "r");
|
|
2335
|
+
__publicField(this, "s");
|
|
2336
|
+
__publicField(this, "recovery");
|
|
2337
|
+
this.r = FnIsValidNot0(r);
|
|
2338
|
+
this.s = FnIsValidNot0(s);
|
|
2339
|
+
if (recovery != null)
|
|
2340
|
+
this.recovery = recovery;
|
|
2341
|
+
Object.freeze(this);
|
|
2342
|
+
}
|
|
2343
|
+
static fromBytes(b, format = SIG_COMPACT) {
|
|
2344
|
+
assertSigLength(b, format);
|
|
2345
|
+
let rec;
|
|
2346
|
+
if (format === SIG_RECOVERED) {
|
|
2347
|
+
rec = b[0];
|
|
2348
|
+
b = b.subarray(1);
|
|
2349
|
+
}
|
|
2350
|
+
const r = sliceBytesNumBE(b, 0, L);
|
|
2351
|
+
const s = sliceBytesNumBE(b, L, L2);
|
|
2352
|
+
return new _Signature(r, s, rec);
|
|
2353
|
+
}
|
|
2354
|
+
addRecoveryBit(bit) {
|
|
2355
|
+
return new _Signature(this.r, this.s, bit);
|
|
2356
|
+
}
|
|
2357
|
+
hasHighS() {
|
|
2358
|
+
return highS(this.s);
|
|
2359
|
+
}
|
|
2360
|
+
toBytes(format = SIG_COMPACT) {
|
|
2361
|
+
const { r, s, recovery } = this;
|
|
2362
|
+
const res = concatBytes2(numTo32b(r), numTo32b(s));
|
|
2363
|
+
if (format === SIG_RECOVERED) {
|
|
2364
|
+
assertRecoveryBit(recovery);
|
|
2365
|
+
return concatBytes2(Uint8Array.of(recovery), res);
|
|
2366
|
+
}
|
|
2367
|
+
return res;
|
|
2368
|
+
}
|
|
2369
|
+
};
|
|
2370
|
+
var bits2int = (bytes) => {
|
|
2371
|
+
const delta = bytes.length * 8 - 256;
|
|
2372
|
+
if (delta > 1024)
|
|
2373
|
+
err("msg invalid");
|
|
2374
|
+
const num = bytesToNumBE(bytes);
|
|
2375
|
+
return delta > 0 ? num >> big(delta) : num;
|
|
2376
|
+
};
|
|
2377
|
+
var bits2int_modN = (bytes) => modN(bits2int(abytes2(bytes)));
|
|
2378
|
+
var SIG_COMPACT = "compact";
|
|
2379
|
+
var SIG_RECOVERED = "recovered";
|
|
2380
|
+
var SIG_DER = "der";
|
|
2381
|
+
var ALL_SIG = [SIG_COMPACT, SIG_RECOVERED, SIG_DER];
|
|
2382
|
+
var defaultSignOpts = {
|
|
2383
|
+
lowS: true,
|
|
2384
|
+
prehash: true,
|
|
2385
|
+
format: SIG_COMPACT,
|
|
2386
|
+
extraEntropy: false
|
|
2387
|
+
};
|
|
2388
|
+
var _sha = "SHA-256";
|
|
2389
|
+
var hashes = {
|
|
2390
|
+
hmacSha256Async: async (key, message) => {
|
|
2391
|
+
const s = subtle();
|
|
2392
|
+
const name = "HMAC";
|
|
2393
|
+
const k = await s.importKey("raw", key, { name, hash: { name: _sha } }, false, ["sign"]);
|
|
2394
|
+
return u8n(await s.sign(name, k, message));
|
|
2395
|
+
},
|
|
2396
|
+
hmacSha256: void 0,
|
|
2397
|
+
sha256Async: async (msg) => u8n(await subtle().digest(_sha, msg)),
|
|
2398
|
+
sha256: void 0
|
|
2399
|
+
};
|
|
2400
|
+
var prepMsg = (msg, opts, async_) => {
|
|
2401
|
+
abytes2(msg, void 0, "message");
|
|
2402
|
+
if (!opts.prehash)
|
|
2403
|
+
return msg;
|
|
2404
|
+
return async_ ? hashes.sha256Async(msg) : callHash("sha256")(msg);
|
|
2405
|
+
};
|
|
2406
|
+
var NULL = u8n(0);
|
|
2407
|
+
var byte0 = u8of(0);
|
|
2408
|
+
var byte1 = u8of(1);
|
|
2409
|
+
var _maxDrbgIters = 1e3;
|
|
2410
|
+
var _drbgErr = "drbg: tried max amount of iterations";
|
|
2411
|
+
var hmacDrbg = (seed, pred) => {
|
|
2412
|
+
let v = u8n(L);
|
|
2413
|
+
let k = u8n(L);
|
|
2414
|
+
let i = 0;
|
|
2415
|
+
const reset = () => {
|
|
2416
|
+
v.fill(1);
|
|
2417
|
+
k.fill(0);
|
|
2418
|
+
};
|
|
2419
|
+
const h = (...b) => callHash("hmacSha256")(k, concatBytes2(v, ...b));
|
|
2420
|
+
const reseed = (seed2 = NULL) => {
|
|
2421
|
+
k = h(byte0, seed2);
|
|
2422
|
+
v = h();
|
|
2423
|
+
if (seed2.length === 0)
|
|
2424
|
+
return;
|
|
2425
|
+
k = h(byte1, seed2);
|
|
2426
|
+
v = h();
|
|
2427
|
+
};
|
|
2428
|
+
const gen = () => {
|
|
2429
|
+
if (i++ >= _maxDrbgIters)
|
|
2430
|
+
err(_drbgErr);
|
|
2431
|
+
v = h();
|
|
2432
|
+
return v;
|
|
2433
|
+
};
|
|
2434
|
+
reset();
|
|
2435
|
+
reseed(seed);
|
|
2436
|
+
let res = void 0;
|
|
2437
|
+
while (!(res = pred(gen())))
|
|
2438
|
+
reseed();
|
|
2439
|
+
reset();
|
|
2440
|
+
return res;
|
|
2441
|
+
};
|
|
2442
|
+
var _sign = (messageHash, secretKey, opts, hmacDrbg2) => {
|
|
2443
|
+
let { lowS, extraEntropy } = opts;
|
|
2444
|
+
const int2octets = numTo32b;
|
|
2445
|
+
const h1i = bits2int_modN(messageHash);
|
|
2446
|
+
const h1o = int2octets(h1i);
|
|
2447
|
+
const d = secretKeyToScalar(secretKey);
|
|
2448
|
+
const seedArgs = [int2octets(d), h1o];
|
|
2449
|
+
if (extraEntropy != null && extraEntropy !== false) {
|
|
2450
|
+
const e = extraEntropy === true ? randomBytes3(L) : extraEntropy;
|
|
2451
|
+
seedArgs.push(abytes2(e, void 0, "extraEntropy"));
|
|
2452
|
+
}
|
|
2453
|
+
const seed = concatBytes2(...seedArgs);
|
|
2454
|
+
const m = h1i;
|
|
2455
|
+
const k2sig = (kBytes) => {
|
|
2456
|
+
const k = bits2int(kBytes);
|
|
2457
|
+
if (!(1n <= k && k < N2))
|
|
2458
|
+
return;
|
|
2459
|
+
const ik = invert(k, N2);
|
|
2460
|
+
const q = G.multiply(k).toAffine();
|
|
2461
|
+
const r = modN(q.x);
|
|
2462
|
+
if (r === 0n)
|
|
2463
|
+
return;
|
|
2464
|
+
const s = modN(ik * modN(m + r * d));
|
|
2465
|
+
if (s === 0n)
|
|
2466
|
+
return;
|
|
2467
|
+
let recovery = (q.x === r ? 0 : 2) | Number(q.y & 1n);
|
|
2468
|
+
let normS = s;
|
|
2469
|
+
if (lowS && highS(s)) {
|
|
2470
|
+
normS = modN(-s);
|
|
2471
|
+
recovery ^= 1;
|
|
2472
|
+
}
|
|
2473
|
+
const sig = new Signature(r, normS, recovery);
|
|
2474
|
+
return sig.toBytes(opts.format);
|
|
2475
|
+
};
|
|
2476
|
+
return hmacDrbg2(seed, k2sig);
|
|
2477
|
+
};
|
|
2478
|
+
var setDefaults = (opts) => {
|
|
2479
|
+
const res = {};
|
|
2480
|
+
Object.keys(defaultSignOpts).forEach((k) => {
|
|
2481
|
+
res[k] = opts[k] ?? defaultSignOpts[k];
|
|
2482
|
+
});
|
|
2483
|
+
return res;
|
|
2484
|
+
};
|
|
2485
|
+
var sign = (message, secretKey, opts = {}) => {
|
|
2486
|
+
opts = setDefaults(opts);
|
|
2487
|
+
message = prepMsg(message, opts, false);
|
|
2488
|
+
return _sign(message, secretKey, opts, hmacDrbg);
|
|
2489
|
+
};
|
|
2490
|
+
var _recover = (signature, messageHash) => {
|
|
2491
|
+
const sig = Signature.fromBytes(signature, "recovered");
|
|
2492
|
+
const { r, s, recovery } = sig;
|
|
2493
|
+
assertRecoveryBit(recovery);
|
|
2494
|
+
const h = bits2int_modN(abytes2(messageHash, L));
|
|
2495
|
+
const radj = recovery === 2 || recovery === 3 ? r + N2 : r;
|
|
2496
|
+
FpIsValidNot0(radj);
|
|
2497
|
+
const head = getPrefix(big(recovery));
|
|
2498
|
+
const Rb = concatBytes2(head, numTo32b(radj));
|
|
2499
|
+
const R = Point.fromBytes(Rb);
|
|
2500
|
+
const ir = invert(radj, N2);
|
|
2501
|
+
const u1 = modN(-h * ir);
|
|
2502
|
+
const u2 = modN(s * ir);
|
|
2503
|
+
const point = doubleScalarMulUns(R, u1, u2);
|
|
2504
|
+
return point.toBytes();
|
|
2505
|
+
};
|
|
2506
|
+
var recoverPublicKey = (signature, message, opts = {}) => {
|
|
2507
|
+
message = prepMsg(message, setDefaults(opts), false);
|
|
2508
|
+
return _recover(signature, message);
|
|
2509
|
+
};
|
|
2510
|
+
var randomSecretKey = (seed = randomBytes3(lengths.seed)) => {
|
|
2511
|
+
abytes2(seed);
|
|
2512
|
+
if (seed.length < lengths.seed || seed.length > 1024)
|
|
2513
|
+
err("expected 40-1024b");
|
|
2514
|
+
const num = M(bytesToNumBE(seed), N2 - 1n);
|
|
2515
|
+
return numTo32b(num + 1n);
|
|
2516
|
+
};
|
|
2517
|
+
var createKeygen = (getPublicKey2) => (seed) => {
|
|
2518
|
+
const secretKey = randomSecretKey(seed);
|
|
2519
|
+
return { secretKey, publicKey: getPublicKey2(secretKey) };
|
|
2520
|
+
};
|
|
2521
|
+
var keygen = createKeygen(getPublicKey);
|
|
2522
|
+
var extpubSchnorr = (priv) => {
|
|
2523
|
+
const d_ = secretKeyToScalar(priv);
|
|
2524
|
+
const p = G.multiply(d_);
|
|
2525
|
+
const { x, y } = p.assertValidity().toAffine();
|
|
2526
|
+
const d = isEven(y) ? d_ : modN(-d_);
|
|
2527
|
+
const px = numTo32b(x);
|
|
2528
|
+
return { d, px };
|
|
2529
|
+
};
|
|
2530
|
+
var pubSchnorr = (secretKey) => {
|
|
2531
|
+
return extpubSchnorr(secretKey).px;
|
|
2532
|
+
};
|
|
2533
|
+
var keygenSchnorr = createKeygen(pubSchnorr);
|
|
2534
|
+
var W = 8;
|
|
2535
|
+
var scalarBits = 256;
|
|
2536
|
+
var pwindows = Math.ceil(scalarBits / W) + 1;
|
|
2537
|
+
var pwindowSize = 2 ** (W - 1);
|
|
2538
|
+
var precompute = () => {
|
|
2539
|
+
const points = [];
|
|
2540
|
+
let p = G;
|
|
2541
|
+
let b = p;
|
|
2542
|
+
for (let w = 0; w < pwindows; w++) {
|
|
2543
|
+
b = p;
|
|
2544
|
+
points.push(b);
|
|
2545
|
+
for (let i = 1; i < pwindowSize; i++) {
|
|
2546
|
+
b = b.add(p);
|
|
2547
|
+
points.push(b);
|
|
2548
|
+
}
|
|
2549
|
+
p = b.double();
|
|
2550
|
+
}
|
|
2551
|
+
return points;
|
|
2552
|
+
};
|
|
2553
|
+
var Gpows = void 0;
|
|
2554
|
+
var ctneg = (cnd, p) => {
|
|
2555
|
+
const n = p.negate();
|
|
2556
|
+
return cnd ? n : p;
|
|
2557
|
+
};
|
|
2558
|
+
var wNAF = (n) => {
|
|
2559
|
+
const comp = Gpows || (Gpows = precompute());
|
|
2560
|
+
let p = I;
|
|
2561
|
+
let f = G;
|
|
2562
|
+
const pow_2_w = 2 ** W;
|
|
2563
|
+
const maxNum = pow_2_w;
|
|
2564
|
+
const mask = big(pow_2_w - 1);
|
|
2565
|
+
const shiftBy = big(W);
|
|
2566
|
+
for (let w = 0; w < pwindows; w++) {
|
|
2567
|
+
let wbits = Number(n & mask);
|
|
2568
|
+
n >>= shiftBy;
|
|
2569
|
+
if (wbits > pwindowSize) {
|
|
2570
|
+
wbits -= maxNum;
|
|
2571
|
+
n += 1n;
|
|
2572
|
+
}
|
|
2573
|
+
const off = w * pwindowSize;
|
|
2574
|
+
const offF = off;
|
|
2575
|
+
const offP = off + Math.abs(wbits) - 1;
|
|
2576
|
+
const isEven2 = w % 2 !== 0;
|
|
2577
|
+
const isNeg = wbits < 0;
|
|
2578
|
+
if (wbits === 0) {
|
|
2579
|
+
f = f.add(ctneg(isEven2, comp[offF]));
|
|
2580
|
+
} else {
|
|
2581
|
+
p = p.add(ctneg(isNeg, comp[offP]));
|
|
2582
|
+
}
|
|
2583
|
+
}
|
|
2584
|
+
if (n !== 0n)
|
|
2585
|
+
err("invalid wnaf");
|
|
2586
|
+
return { p, f };
|
|
2587
|
+
};
|
|
2588
|
+
|
|
2589
|
+
// src/legacy-message.ts
|
|
2590
|
+
var import_bech32 = __toESM(require_dist());
|
|
2591
|
+
var import_bs58check = __toESM(require_bs58check());
|
|
2592
|
+
var import_create_hash = __toESM(require_create_hash());
|
|
2593
|
+
var import_varuint_bitcoin = __toESM(require_varuint_bitcoin());
|
|
2594
|
+
hashes.hmacSha256 = (key, msg) => hmac(sha256, key, msg);
|
|
2595
|
+
hashes.sha256 = sha256;
|
|
2596
|
+
function sha2562(bytes) {
|
|
2597
|
+
return (0, import_create_hash.default)("sha256").update(bytes).digest();
|
|
2598
|
+
}
|
|
2599
|
+
function hash256(bytes) {
|
|
2600
|
+
return sha2562(sha2562(bytes));
|
|
2601
|
+
}
|
|
2602
|
+
function hash160(bytes) {
|
|
2603
|
+
return (0, import_create_hash.default)("ripemd160").update(sha2562(bytes)).digest();
|
|
2604
|
+
}
|
|
2605
|
+
function encodeCompactSignature(signature, recovery, compressed) {
|
|
2606
|
+
let header = recovery + 27;
|
|
2607
|
+
if (compressed) {
|
|
2608
|
+
header += 4;
|
|
2609
|
+
}
|
|
2610
|
+
return Buffer2.concat([Buffer2.from([header]), Buffer2.from(signature)]);
|
|
2611
|
+
}
|
|
2612
|
+
function decodeCompactSignature(buffer) {
|
|
2613
|
+
if (buffer.length !== 65) {
|
|
2614
|
+
throw new Error("Invalid signature length");
|
|
2615
|
+
}
|
|
2616
|
+
const flagByte = buffer.readUInt8(0) - 27;
|
|
2617
|
+
if (flagByte < 0 || flagByte > 15) {
|
|
2618
|
+
throw new Error("Invalid signature parameter");
|
|
2619
|
+
}
|
|
2620
|
+
return {
|
|
2621
|
+
compressed: !!(flagByte & 12),
|
|
2622
|
+
recovery: flagByte & 3,
|
|
2623
|
+
signature: buffer.subarray(1),
|
|
2624
|
+
segwitType: !(flagByte & 8) ? null : !(flagByte & 4) ? "p2sh(p2wpkh)" : "p2wpkh"
|
|
2625
|
+
};
|
|
2626
|
+
}
|
|
2627
|
+
function decodeBech32Address(address) {
|
|
2628
|
+
const result = import_bech32.bech32.decode(address);
|
|
2629
|
+
return Buffer2.from(import_bech32.bech32.fromWords(result.words.slice(1)));
|
|
2630
|
+
}
|
|
2631
|
+
function segwitRedeemHash(publicKeyHash) {
|
|
2632
|
+
const redeemScript = Buffer2.concat([
|
|
2633
|
+
Buffer2.from("0014", "hex"),
|
|
2634
|
+
Buffer2.from(publicKeyHash)
|
|
2635
|
+
]);
|
|
2636
|
+
return hash160(redeemScript);
|
|
2637
|
+
}
|
|
2638
|
+
function magicHash(message, messagePrefix) {
|
|
2639
|
+
const prefix = Buffer2.isBuffer(messagePrefix) ? messagePrefix : Buffer2.from(messagePrefix, "utf8");
|
|
2640
|
+
const payload = Buffer2.isBuffer(message) ? message : Buffer2.from(message, "utf8");
|
|
2641
|
+
const messageVISize = import_varuint_bitcoin.default.encodingLength(payload.length);
|
|
2642
|
+
const buffer = Buffer2.allocUnsafe(prefix.length + messageVISize + payload.length);
|
|
2643
|
+
prefix.copy(buffer, 0);
|
|
2644
|
+
import_varuint_bitcoin.default.encode(payload.length, buffer, prefix.length);
|
|
2645
|
+
payload.copy(buffer, prefix.length + messageVISize);
|
|
2646
|
+
return hash256(buffer);
|
|
2647
|
+
}
|
|
2648
|
+
function signLegacyMessage(message, privateKey, compressed, messagePrefix) {
|
|
2649
|
+
const hash = magicHash(message, messagePrefix);
|
|
2650
|
+
const recoveredSignature = sign(hash, Buffer2.from(privateKey), {
|
|
2651
|
+
prehash: false,
|
|
2652
|
+
format: "recovered"
|
|
2653
|
+
});
|
|
2654
|
+
return encodeCompactSignature(
|
|
2655
|
+
recoveredSignature.subarray(1),
|
|
2656
|
+
recoveredSignature[0],
|
|
2657
|
+
compressed
|
|
2658
|
+
);
|
|
2659
|
+
}
|
|
2660
|
+
function verifyLegacyCompactMessage(message, address, signature, messagePrefix) {
|
|
2661
|
+
const parsed = decodeCompactSignature(Buffer2.from(signature));
|
|
2662
|
+
const hash = magicHash(message, messagePrefix);
|
|
2663
|
+
const recoveredSignature = Buffer2.concat([
|
|
2664
|
+
Buffer2.from([parsed.recovery]),
|
|
2665
|
+
Buffer2.from(parsed.signature)
|
|
2666
|
+
]);
|
|
2667
|
+
const publicKey = Buffer2.from(
|
|
2668
|
+
recoverPublicKey(recoveredSignature, hash, {
|
|
2669
|
+
prehash: false
|
|
2670
|
+
})
|
|
2671
|
+
);
|
|
2672
|
+
const normalizedPublicKey = parsed.compressed ? publicKey : Buffer2.from(Point.fromBytes(publicKey).toBytes(false));
|
|
2673
|
+
const publicKeyHash = hash160(normalizedPublicKey);
|
|
2674
|
+
if (parsed.segwitType === "p2sh(p2wpkh)") {
|
|
2675
|
+
return segwitRedeemHash(publicKeyHash).equals(
|
|
2676
|
+
Buffer2.from(import_bs58check.default.decode(address).slice(1))
|
|
2677
|
+
);
|
|
2678
|
+
}
|
|
2679
|
+
if (parsed.segwitType === "p2wpkh") {
|
|
2680
|
+
return publicKeyHash.equals(decodeBech32Address(address));
|
|
2681
|
+
}
|
|
2682
|
+
return publicKeyHash.equals(Buffer2.from(import_bs58check.default.decode(address).slice(1)));
|
|
2683
|
+
}
|
|
2684
|
+
|
|
2685
|
+
// src/core.ts
|
|
2686
|
+
var MESSAGE_MAGIC = "Neurai Signed Message:\n";
|
|
2687
|
+
var PQ_MESSAGE_SIGNATURE_PREFIX = 53;
|
|
2688
|
+
var PQ_SERIALIZED_PUBKEY_PREFIX = 5;
|
|
2689
|
+
var PQ_PUBLIC_KEY_LENGTH = 1312;
|
|
2690
|
+
var PQ_SERIALIZED_PUBKEY_LENGTH = 1 + PQ_PUBLIC_KEY_LENGTH;
|
|
2691
|
+
var PQ_SIGNATURE_LENGTH = 2420;
|
|
2692
|
+
var LEGACY_MESSAGE_PREFIX = String.fromCharCode(Buffer3.byteLength(MESSAGE_MAGIC, "utf8")) + MESSAGE_MAGIC;
|
|
2693
|
+
function encodeCompactSize(value) {
|
|
2694
|
+
if (!Number.isInteger(value) || value < 0) {
|
|
2695
|
+
throw new Error("CompactSize value must be a non-negative integer");
|
|
2696
|
+
}
|
|
2697
|
+
if (value < 253) {
|
|
2698
|
+
return Buffer3.from([value]);
|
|
2699
|
+
}
|
|
2700
|
+
if (value <= 65535) {
|
|
2701
|
+
const buffer = Buffer3.alloc(3);
|
|
2702
|
+
buffer[0] = 253;
|
|
2703
|
+
buffer.writeUInt16LE(value, 1);
|
|
2704
|
+
return buffer;
|
|
2705
|
+
}
|
|
2706
|
+
if (value <= 4294967295) {
|
|
2707
|
+
const buffer = Buffer3.alloc(5);
|
|
2708
|
+
buffer[0] = 254;
|
|
2709
|
+
buffer.writeUInt32LE(value, 1);
|
|
2710
|
+
return buffer;
|
|
2711
|
+
}
|
|
2712
|
+
throw new Error("CompactSize values above uint32 are not supported");
|
|
2713
|
+
}
|
|
2714
|
+
function decodeCompactSize(buffer, offset) {
|
|
2715
|
+
if (offset >= buffer.length) {
|
|
2716
|
+
throw new Error("Unexpected end of CompactSize data");
|
|
2717
|
+
}
|
|
2718
|
+
const first = buffer[offset];
|
|
2719
|
+
if (first < 253) {
|
|
2720
|
+
return { value: first, offset: offset + 1 };
|
|
2721
|
+
}
|
|
2722
|
+
if (first === 253) {
|
|
2723
|
+
if (offset + 3 > buffer.length) {
|
|
2724
|
+
throw new Error("Unexpected end of CompactSize uint16 data");
|
|
2725
|
+
}
|
|
2726
|
+
return { value: buffer.readUInt16LE(offset + 1), offset: offset + 3 };
|
|
2727
|
+
}
|
|
2728
|
+
if (first === 254) {
|
|
2729
|
+
if (offset + 5 > buffer.length) {
|
|
2730
|
+
throw new Error("Unexpected end of CompactSize uint32 data");
|
|
2731
|
+
}
|
|
2732
|
+
return { value: buffer.readUInt32LE(offset + 1), offset: offset + 5 };
|
|
2733
|
+
}
|
|
2734
|
+
if (first === 255) {
|
|
2735
|
+
throw new Error("CompactSize uint64 is not supported");
|
|
2736
|
+
}
|
|
2737
|
+
throw new Error("Invalid CompactSize prefix");
|
|
2738
|
+
}
|
|
2739
|
+
function sha2563(bytes) {
|
|
2740
|
+
return (0, import_create_hash2.default)("sha256").update(bytes).digest();
|
|
2741
|
+
}
|
|
2742
|
+
function hash2562(bytes) {
|
|
2743
|
+
return sha2563(sha2563(bytes));
|
|
2744
|
+
}
|
|
2745
|
+
function hash1602(bytes) {
|
|
2746
|
+
return (0, import_create_hash2.default)("ripemd160").update(sha2563(bytes)).digest();
|
|
2747
|
+
}
|
|
2748
|
+
function encodeMessageHash(message) {
|
|
2749
|
+
const messageBytes = Buffer3.from(message, "utf8");
|
|
2750
|
+
const magicBytes = Buffer3.from(MESSAGE_MAGIC, "utf8");
|
|
2751
|
+
const payload = Buffer3.concat([
|
|
2752
|
+
encodeCompactSize(magicBytes.length),
|
|
2753
|
+
magicBytes,
|
|
2754
|
+
encodeCompactSize(messageBytes.length),
|
|
2755
|
+
messageBytes
|
|
2756
|
+
]);
|
|
2757
|
+
return hash2562(payload);
|
|
2758
|
+
}
|
|
2759
|
+
function toSignatureBuffer(signature) {
|
|
2760
|
+
return typeof signature === "string" ? Buffer3.from(signature, "base64") : Buffer3.from(signature);
|
|
2761
|
+
}
|
|
2762
|
+
function normalizePQPublicKey(publicKey) {
|
|
2763
|
+
const buffer = Buffer3.from(publicKey);
|
|
2764
|
+
if (buffer.length === PQ_SERIALIZED_PUBKEY_LENGTH && buffer[0] === PQ_SERIALIZED_PUBKEY_PREFIX) {
|
|
2765
|
+
return buffer;
|
|
2766
|
+
}
|
|
2767
|
+
if (buffer.length === PQ_PUBLIC_KEY_LENGTH) {
|
|
2768
|
+
return Buffer3.concat([Buffer3.from([PQ_SERIALIZED_PUBKEY_PREFIX]), buffer]);
|
|
2769
|
+
}
|
|
2770
|
+
throw new Error("Invalid PQ public key length");
|
|
2771
|
+
}
|
|
2772
|
+
function isPQMessageSignature(signature) {
|
|
2773
|
+
const buffer = toSignatureBuffer(signature);
|
|
2774
|
+
return buffer.length > 0 && buffer[0] === PQ_MESSAGE_SIGNATURE_PREFIX;
|
|
2775
|
+
}
|
|
2776
|
+
function decodePQAddress(address) {
|
|
2777
|
+
const decoded = import_bech322.bech32m.decode(address);
|
|
2778
|
+
if (decoded.words.length === 0) {
|
|
2779
|
+
throw new Error("Invalid bech32m address");
|
|
2780
|
+
}
|
|
2781
|
+
return {
|
|
2782
|
+
prefix: decoded.prefix,
|
|
2783
|
+
version: decoded.words[0],
|
|
2784
|
+
program: Buffer3.from(import_bech322.bech32m.fromWords(decoded.words.slice(1)))
|
|
2785
|
+
};
|
|
2786
|
+
}
|
|
2787
|
+
function sign2(message, privateKey, compressed = true) {
|
|
2788
|
+
const signature = signLegacyMessage(
|
|
2789
|
+
message,
|
|
2790
|
+
Buffer3.from(privateKey),
|
|
2791
|
+
compressed,
|
|
2792
|
+
LEGACY_MESSAGE_PREFIX
|
|
2793
|
+
);
|
|
2794
|
+
return signature.toString("base64");
|
|
2795
|
+
}
|
|
2796
|
+
function signPQMessage(message, privateKey, publicKey) {
|
|
2797
|
+
const serializedPublicKey = normalizePQPublicKey(publicKey);
|
|
2798
|
+
const hash = encodeMessageHash(message);
|
|
2799
|
+
const pqSignature = Buffer3.from(ml_dsa44.sign(hash, Buffer3.from(privateKey)));
|
|
2800
|
+
const payload = Buffer3.concat([
|
|
2801
|
+
Buffer3.from([PQ_MESSAGE_SIGNATURE_PREFIX]),
|
|
2802
|
+
encodeCompactSize(serializedPublicKey.length),
|
|
2803
|
+
serializedPublicKey,
|
|
2804
|
+
encodeCompactSize(pqSignature.length),
|
|
2805
|
+
pqSignature
|
|
2806
|
+
]);
|
|
2807
|
+
return payload.toString("base64");
|
|
2808
|
+
}
|
|
2809
|
+
function verifyLegacyMessage(message, address, signature) {
|
|
2810
|
+
try {
|
|
2811
|
+
return verifyLegacyCompactMessage(
|
|
2812
|
+
message,
|
|
2813
|
+
address,
|
|
2814
|
+
toSignatureBuffer(signature),
|
|
2815
|
+
LEGACY_MESSAGE_PREFIX
|
|
2816
|
+
);
|
|
2817
|
+
} catch {
|
|
2818
|
+
return false;
|
|
2819
|
+
}
|
|
2820
|
+
}
|
|
2821
|
+
function verifyPQMessage(message, address, signature) {
|
|
2822
|
+
try {
|
|
2823
|
+
const payload = toSignatureBuffer(signature);
|
|
2824
|
+
let offset = 0;
|
|
2825
|
+
if (payload[offset++] !== PQ_MESSAGE_SIGNATURE_PREFIX) {
|
|
2826
|
+
return false;
|
|
2827
|
+
}
|
|
2828
|
+
const publicKeyLength = decodeCompactSize(payload, offset);
|
|
2829
|
+
offset = publicKeyLength.offset;
|
|
2830
|
+
const serializedPublicKey = payload.subarray(
|
|
2831
|
+
offset,
|
|
2832
|
+
offset + publicKeyLength.value
|
|
2833
|
+
);
|
|
2834
|
+
offset += publicKeyLength.value;
|
|
2835
|
+
const signatureLength = decodeCompactSize(payload, offset);
|
|
2836
|
+
offset = signatureLength.offset;
|
|
2837
|
+
const pqSignature = payload.subarray(offset, offset + signatureLength.value);
|
|
2838
|
+
offset += signatureLength.value;
|
|
2839
|
+
if (offset !== payload.length) {
|
|
2840
|
+
return false;
|
|
2841
|
+
}
|
|
2842
|
+
if (serializedPublicKey.length !== PQ_SERIALIZED_PUBKEY_LENGTH || serializedPublicKey[0] !== PQ_SERIALIZED_PUBKEY_PREFIX || pqSignature.length !== PQ_SIGNATURE_LENGTH) {
|
|
2843
|
+
return false;
|
|
2844
|
+
}
|
|
2845
|
+
const decodedAddress = decodePQAddress(address);
|
|
2846
|
+
if (decodedAddress.version !== 1 || decodedAddress.program.length !== 20) {
|
|
2847
|
+
return false;
|
|
2848
|
+
}
|
|
2849
|
+
const expectedProgram = hash1602(serializedPublicKey);
|
|
2850
|
+
if (!expectedProgram.equals(decodedAddress.program)) {
|
|
2851
|
+
return false;
|
|
2852
|
+
}
|
|
2853
|
+
return ml_dsa44.verify(
|
|
2854
|
+
pqSignature,
|
|
2855
|
+
encodeMessageHash(message),
|
|
2856
|
+
serializedPublicKey.subarray(1)
|
|
2857
|
+
);
|
|
2858
|
+
} catch {
|
|
2859
|
+
return false;
|
|
2860
|
+
}
|
|
2861
|
+
}
|
|
2862
|
+
function verifyMessage(message, address, signature) {
|
|
2863
|
+
return isPQMessageSignature(signature) ? verifyPQMessage(message, address, signature) : verifyLegacyMessage(message, address, signature);
|
|
2864
|
+
}
|
|
2865
|
+
export {
|
|
2866
|
+
sign2 as sign,
|
|
2867
|
+
signPQMessage,
|
|
2868
|
+
verifyLegacyMessage,
|
|
2869
|
+
verifyMessage,
|
|
2870
|
+
verifyPQMessage
|
|
2871
|
+
};
|
|
2872
|
+
/*! Bundled license information:
|
|
2873
|
+
|
|
2874
|
+
safe-buffer/index.js:
|
|
2875
|
+
(*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> *)
|
|
2876
|
+
|
|
2877
|
+
@noble/hashes/utils.js:
|
|
2878
|
+
(*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) *)
|
|
2879
|
+
|
|
2880
|
+
@noble/curves/utils.js:
|
|
2881
|
+
(*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) *)
|
|
2882
|
+
|
|
2883
|
+
@noble/post-quantum/utils.js:
|
|
2884
|
+
@noble/post-quantum/_crystals.js:
|
|
2885
|
+
@noble/post-quantum/ml-dsa.js:
|
|
2886
|
+
(*! noble-post-quantum - MIT License (c) 2024 Paul Miller (paulmillr.com) *)
|
|
2887
|
+
|
|
2888
|
+
@noble/secp256k1/index.js:
|
|
2889
|
+
(*! noble-secp256k1 - MIT License (c) 2019 Paul Miller (paulmillr.com) *)
|
|
2890
|
+
*/
|