@bitcoin-js/tiny-secp256k1-asmjs 2.2.2
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/LICENSE +21 -0
- package/README.md +355 -0
- package/lib/cjs/index.cjs +387 -0
- package/lib/cjs/rand.browser.cjs +20 -0
- package/lib/cjs/rand.cjs +8 -0
- package/lib/cjs/secp256k1.asm.cjs +33218 -0
- package/lib/cjs/validate.cjs +144 -0
- package/lib/cjs/validate_error.cjs +26 -0
- package/lib/cjs/wasm_loader.cjs +7 -0
- package/lib/cjs/wasm_path_cjs.cjs +12 -0
- package/lib/index.d.ts +33 -0
- package/lib/index.js +361 -0
- package/lib/rand.browser.d.ts +1 -0
- package/lib/rand.browser.js +16 -0
- package/lib/rand.d.ts +1 -0
- package/lib/rand.js +4 -0
- package/lib/secp256k1.asm.js +33218 -0
- package/lib/validate.d.ts +25 -0
- package/lib/validate.js +124 -0
- package/lib/validate_error.d.ts +9 -0
- package/lib/validate_error.js +22 -0
- package/lib/wasm_loader.d.ts +41 -0
- package/lib/wasm_loader.js +5 -0
- package/lib/wasm_path.d.ts +1 -0
- package/lib/wasm_path.js +5 -0
- package/package.json +63 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifySchnorr = exports.recover = exports.verify = exports.signSchnorr = exports.signRecoverable = exports.sign = exports.xOnlyPointAddTweakCheck = exports.xOnlyPointAddTweak = exports.privateNegate = exports.privateSub = exports.privateAdd = exports.pointMultiply = exports.xOnlyPointFromPoint = exports.xOnlyPointFromScalar = exports.pointFromScalar = exports.pointCompress = exports.pointAddScalar = exports.pointAdd = exports.isPrivate = exports.isXOnlyPoint = exports.isPointCompressed = exports.isPoint = exports.__initializeContext = void 0;
|
|
4
|
+
const uint8array_tools_1 = require("uint8array-tools");
|
|
5
|
+
const validate = require("./validate.cjs");
|
|
6
|
+
const wasm_loader_js_1 = require("./wasm_loader.cjs");
|
|
7
|
+
const WASM_BUFFER = new Uint8Array(wasm_loader_js_1.default.memory.buffer);
|
|
8
|
+
const WASM_PRIVATE_KEY_PTR = wasm_loader_js_1.default.PRIVATE_INPUT.value;
|
|
9
|
+
const WASM_PUBLIC_KEY_INPUT_PTR = wasm_loader_js_1.default.PUBLIC_KEY_INPUT.value;
|
|
10
|
+
const WASM_PUBLIC_KEY_INPUT_PTR2 = wasm_loader_js_1.default.PUBLIC_KEY_INPUT2.value;
|
|
11
|
+
const WASM_X_ONLY_PUBLIC_KEY_INPUT_PTR = wasm_loader_js_1.default.X_ONLY_PUBLIC_KEY_INPUT.value;
|
|
12
|
+
const WASM_X_ONLY_PUBLIC_KEY_INPUT2_PTR = wasm_loader_js_1.default.X_ONLY_PUBLIC_KEY_INPUT2.value;
|
|
13
|
+
const WASM_TWEAK_INPUT_PTR = wasm_loader_js_1.default.TWEAK_INPUT.value;
|
|
14
|
+
const WASM_HASH_INPUT_PTR = wasm_loader_js_1.default.HASH_INPUT.value;
|
|
15
|
+
const WASM_EXTRA_DATA_INPUT_PTR = wasm_loader_js_1.default.EXTRA_DATA_INPUT.value;
|
|
16
|
+
const WASM_SIGNATURE_INPUT_PTR = wasm_loader_js_1.default.SIGNATURE_INPUT.value;
|
|
17
|
+
const PRIVATE_KEY_INPUT = WASM_BUFFER.subarray(WASM_PRIVATE_KEY_PTR, WASM_PRIVATE_KEY_PTR + validate.PRIVATE_KEY_SIZE);
|
|
18
|
+
const PUBLIC_KEY_INPUT = WASM_BUFFER.subarray(WASM_PUBLIC_KEY_INPUT_PTR, WASM_PUBLIC_KEY_INPUT_PTR + validate.PUBLIC_KEY_UNCOMPRESSED_SIZE);
|
|
19
|
+
const PUBLIC_KEY_INPUT2 = WASM_BUFFER.subarray(WASM_PUBLIC_KEY_INPUT_PTR2, WASM_PUBLIC_KEY_INPUT_PTR2 + validate.PUBLIC_KEY_UNCOMPRESSED_SIZE);
|
|
20
|
+
const X_ONLY_PUBLIC_KEY_INPUT = WASM_BUFFER.subarray(WASM_X_ONLY_PUBLIC_KEY_INPUT_PTR, WASM_X_ONLY_PUBLIC_KEY_INPUT_PTR + validate.X_ONLY_PUBLIC_KEY_SIZE);
|
|
21
|
+
const X_ONLY_PUBLIC_KEY_INPUT2 = WASM_BUFFER.subarray(WASM_X_ONLY_PUBLIC_KEY_INPUT2_PTR, WASM_X_ONLY_PUBLIC_KEY_INPUT2_PTR + validate.X_ONLY_PUBLIC_KEY_SIZE);
|
|
22
|
+
const TWEAK_INPUT = WASM_BUFFER.subarray(WASM_TWEAK_INPUT_PTR, WASM_TWEAK_INPUT_PTR + validate.TWEAK_SIZE);
|
|
23
|
+
const HASH_INPUT = WASM_BUFFER.subarray(WASM_HASH_INPUT_PTR, WASM_HASH_INPUT_PTR + validate.HASH_SIZE);
|
|
24
|
+
const EXTRA_DATA_INPUT = WASM_BUFFER.subarray(WASM_EXTRA_DATA_INPUT_PTR, WASM_EXTRA_DATA_INPUT_PTR + validate.EXTRA_DATA_SIZE);
|
|
25
|
+
const SIGNATURE_INPUT = WASM_BUFFER.subarray(WASM_SIGNATURE_INPUT_PTR, WASM_SIGNATURE_INPUT_PTR + validate.SIGNATURE_SIZE);
|
|
26
|
+
function assumeCompression(compressed, p) {
|
|
27
|
+
if (compressed === undefined) {
|
|
28
|
+
return p !== undefined ? p.length : validate.PUBLIC_KEY_COMPRESSED_SIZE;
|
|
29
|
+
}
|
|
30
|
+
return compressed
|
|
31
|
+
? validate.PUBLIC_KEY_COMPRESSED_SIZE
|
|
32
|
+
: validate.PUBLIC_KEY_UNCOMPRESSED_SIZE;
|
|
33
|
+
}
|
|
34
|
+
function _isPoint(p) {
|
|
35
|
+
try {
|
|
36
|
+
PUBLIC_KEY_INPUT.set(p);
|
|
37
|
+
return wasm_loader_js_1.default.isPoint(p.length) === 1;
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
PUBLIC_KEY_INPUT.fill(0);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function __initializeContext() {
|
|
44
|
+
wasm_loader_js_1.default.initializeContext();
|
|
45
|
+
}
|
|
46
|
+
exports.__initializeContext = __initializeContext;
|
|
47
|
+
function isPoint(p) {
|
|
48
|
+
return validate.isDERPoint(p) && _isPoint(p);
|
|
49
|
+
}
|
|
50
|
+
exports.isPoint = isPoint;
|
|
51
|
+
function isPointCompressed(p) {
|
|
52
|
+
return validate.isPointCompressed(p) && _isPoint(p);
|
|
53
|
+
}
|
|
54
|
+
exports.isPointCompressed = isPointCompressed;
|
|
55
|
+
function isXOnlyPoint(p) {
|
|
56
|
+
return validate.isXOnlyPoint(p) && _isPoint(p);
|
|
57
|
+
}
|
|
58
|
+
exports.isXOnlyPoint = isXOnlyPoint;
|
|
59
|
+
function isPrivate(d) {
|
|
60
|
+
return validate.isPrivate(d);
|
|
61
|
+
}
|
|
62
|
+
exports.isPrivate = isPrivate;
|
|
63
|
+
function pointAdd(pA, pB, compressed) {
|
|
64
|
+
validate.validatePoint(pA);
|
|
65
|
+
validate.validatePoint(pB);
|
|
66
|
+
const outputlen = assumeCompression(compressed, pA);
|
|
67
|
+
try {
|
|
68
|
+
PUBLIC_KEY_INPUT.set(pA);
|
|
69
|
+
PUBLIC_KEY_INPUT2.set(pB);
|
|
70
|
+
return wasm_loader_js_1.default.pointAdd(pA.length, pB.length, outputlen) === 1
|
|
71
|
+
? PUBLIC_KEY_INPUT.slice(0, outputlen)
|
|
72
|
+
: null;
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
PUBLIC_KEY_INPUT.fill(0);
|
|
76
|
+
PUBLIC_KEY_INPUT2.fill(0);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.pointAdd = pointAdd;
|
|
80
|
+
function pointAddScalar(p, tweak, compressed) {
|
|
81
|
+
validate.validatePoint(p);
|
|
82
|
+
validate.validateTweak(tweak);
|
|
83
|
+
const outputlen = assumeCompression(compressed, p);
|
|
84
|
+
try {
|
|
85
|
+
PUBLIC_KEY_INPUT.set(p);
|
|
86
|
+
TWEAK_INPUT.set(tweak);
|
|
87
|
+
return wasm_loader_js_1.default.pointAddScalar(p.length, outputlen) === 1
|
|
88
|
+
? PUBLIC_KEY_INPUT.slice(0, outputlen)
|
|
89
|
+
: null;
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
PUBLIC_KEY_INPUT.fill(0);
|
|
93
|
+
TWEAK_INPUT.fill(0);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.pointAddScalar = pointAddScalar;
|
|
97
|
+
function pointCompress(p, compressed) {
|
|
98
|
+
validate.validatePoint(p);
|
|
99
|
+
const outputlen = assumeCompression(compressed, p);
|
|
100
|
+
try {
|
|
101
|
+
PUBLIC_KEY_INPUT.set(p);
|
|
102
|
+
wasm_loader_js_1.default.pointCompress(p.length, outputlen);
|
|
103
|
+
return PUBLIC_KEY_INPUT.slice(0, outputlen);
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
PUBLIC_KEY_INPUT.fill(0);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.pointCompress = pointCompress;
|
|
110
|
+
function pointFromScalar(d, compressed) {
|
|
111
|
+
validate.validatePrivate(d);
|
|
112
|
+
const outputlen = assumeCompression(compressed);
|
|
113
|
+
try {
|
|
114
|
+
PRIVATE_KEY_INPUT.set(d);
|
|
115
|
+
return wasm_loader_js_1.default.pointFromScalar(outputlen) === 1
|
|
116
|
+
? PUBLIC_KEY_INPUT.slice(0, outputlen)
|
|
117
|
+
: null;
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
PRIVATE_KEY_INPUT.fill(0);
|
|
121
|
+
PUBLIC_KEY_INPUT.fill(0);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.pointFromScalar = pointFromScalar;
|
|
125
|
+
function xOnlyPointFromScalar(d) {
|
|
126
|
+
validate.validatePrivate(d);
|
|
127
|
+
try {
|
|
128
|
+
PRIVATE_KEY_INPUT.set(d);
|
|
129
|
+
wasm_loader_js_1.default.xOnlyPointFromScalar();
|
|
130
|
+
return X_ONLY_PUBLIC_KEY_INPUT.slice(0, validate.X_ONLY_PUBLIC_KEY_SIZE);
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
PRIVATE_KEY_INPUT.fill(0);
|
|
134
|
+
X_ONLY_PUBLIC_KEY_INPUT.fill(0);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
exports.xOnlyPointFromScalar = xOnlyPointFromScalar;
|
|
138
|
+
function xOnlyPointFromPoint(p) {
|
|
139
|
+
validate.validatePoint(p);
|
|
140
|
+
try {
|
|
141
|
+
PUBLIC_KEY_INPUT.set(p);
|
|
142
|
+
wasm_loader_js_1.default.xOnlyPointFromPoint(p.length);
|
|
143
|
+
return X_ONLY_PUBLIC_KEY_INPUT.slice(0, validate.X_ONLY_PUBLIC_KEY_SIZE);
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
PUBLIC_KEY_INPUT.fill(0);
|
|
147
|
+
X_ONLY_PUBLIC_KEY_INPUT.fill(0);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
exports.xOnlyPointFromPoint = xOnlyPointFromPoint;
|
|
151
|
+
function pointMultiply(p, tweak, compressed) {
|
|
152
|
+
validate.validatePoint(p);
|
|
153
|
+
validate.validateTweak(tweak);
|
|
154
|
+
const outputlen = assumeCompression(compressed, p);
|
|
155
|
+
try {
|
|
156
|
+
PUBLIC_KEY_INPUT.set(p);
|
|
157
|
+
TWEAK_INPUT.set(tweak);
|
|
158
|
+
return wasm_loader_js_1.default.pointMultiply(p.length, outputlen) === 1
|
|
159
|
+
? PUBLIC_KEY_INPUT.slice(0, outputlen)
|
|
160
|
+
: null;
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
PUBLIC_KEY_INPUT.fill(0);
|
|
164
|
+
TWEAK_INPUT.fill(0);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
exports.pointMultiply = pointMultiply;
|
|
168
|
+
function privateAdd(d, tweak) {
|
|
169
|
+
validate.validatePrivate(d);
|
|
170
|
+
validate.validateTweak(tweak);
|
|
171
|
+
try {
|
|
172
|
+
PRIVATE_KEY_INPUT.set(d);
|
|
173
|
+
TWEAK_INPUT.set(tweak);
|
|
174
|
+
return wasm_loader_js_1.default.privateAdd() === 1
|
|
175
|
+
? PRIVATE_KEY_INPUT.slice(0, validate.PRIVATE_KEY_SIZE)
|
|
176
|
+
: null;
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
PRIVATE_KEY_INPUT.fill(0);
|
|
180
|
+
TWEAK_INPUT.fill(0);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
exports.privateAdd = privateAdd;
|
|
184
|
+
function privateSub(d, tweak) {
|
|
185
|
+
validate.validatePrivate(d);
|
|
186
|
+
validate.validateTweak(tweak);
|
|
187
|
+
// We can not pass zero tweak to WASM, because WASM use `secp256k1_ec_seckey_negate` for tweak negate.
|
|
188
|
+
// (zero is not valid seckey)
|
|
189
|
+
if (validate.isZero(tweak)) {
|
|
190
|
+
return new Uint8Array(d);
|
|
191
|
+
}
|
|
192
|
+
try {
|
|
193
|
+
PRIVATE_KEY_INPUT.set(d);
|
|
194
|
+
TWEAK_INPUT.set(tweak);
|
|
195
|
+
return wasm_loader_js_1.default.privateSub() === 1
|
|
196
|
+
? PRIVATE_KEY_INPUT.slice(0, validate.PRIVATE_KEY_SIZE)
|
|
197
|
+
: null;
|
|
198
|
+
}
|
|
199
|
+
finally {
|
|
200
|
+
PRIVATE_KEY_INPUT.fill(0);
|
|
201
|
+
TWEAK_INPUT.fill(0);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
exports.privateSub = privateSub;
|
|
205
|
+
function privateNegate(d) {
|
|
206
|
+
validate.validatePrivate(d);
|
|
207
|
+
try {
|
|
208
|
+
PRIVATE_KEY_INPUT.set(d);
|
|
209
|
+
wasm_loader_js_1.default.privateNegate();
|
|
210
|
+
return PRIVATE_KEY_INPUT.slice(0, validate.PRIVATE_KEY_SIZE);
|
|
211
|
+
}
|
|
212
|
+
finally {
|
|
213
|
+
PRIVATE_KEY_INPUT.fill(0);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
exports.privateNegate = privateNegate;
|
|
217
|
+
function xOnlyPointAddTweak(p, tweak) {
|
|
218
|
+
validate.validateXOnlyPoint(p);
|
|
219
|
+
validate.validateTweak(tweak);
|
|
220
|
+
try {
|
|
221
|
+
X_ONLY_PUBLIC_KEY_INPUT.set(p);
|
|
222
|
+
TWEAK_INPUT.set(tweak);
|
|
223
|
+
const parity = wasm_loader_js_1.default.xOnlyPointAddTweak();
|
|
224
|
+
return parity !== -1
|
|
225
|
+
? {
|
|
226
|
+
parity,
|
|
227
|
+
xOnlyPubkey: X_ONLY_PUBLIC_KEY_INPUT.slice(0, validate.X_ONLY_PUBLIC_KEY_SIZE),
|
|
228
|
+
}
|
|
229
|
+
: null;
|
|
230
|
+
}
|
|
231
|
+
finally {
|
|
232
|
+
X_ONLY_PUBLIC_KEY_INPUT.fill(0);
|
|
233
|
+
TWEAK_INPUT.fill(0);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
exports.xOnlyPointAddTweak = xOnlyPointAddTweak;
|
|
237
|
+
function xOnlyPointAddTweakCheck(point, tweak, resultToCheck, tweakParity) {
|
|
238
|
+
validate.validateXOnlyPoint(point);
|
|
239
|
+
validate.validateXOnlyPoint(resultToCheck);
|
|
240
|
+
validate.validateTweak(tweak);
|
|
241
|
+
const hasParity = tweakParity !== undefined;
|
|
242
|
+
if (hasParity)
|
|
243
|
+
validate.validateParity(tweakParity);
|
|
244
|
+
try {
|
|
245
|
+
X_ONLY_PUBLIC_KEY_INPUT.set(point);
|
|
246
|
+
X_ONLY_PUBLIC_KEY_INPUT2.set(resultToCheck);
|
|
247
|
+
TWEAK_INPUT.set(tweak);
|
|
248
|
+
if (hasParity) {
|
|
249
|
+
return wasm_loader_js_1.default.xOnlyPointAddTweakCheck(tweakParity) === 1;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
wasm_loader_js_1.default.xOnlyPointAddTweak();
|
|
253
|
+
const newKey = X_ONLY_PUBLIC_KEY_INPUT.slice(0, validate.X_ONLY_PUBLIC_KEY_SIZE);
|
|
254
|
+
return (0, uint8array_tools_1.compare)(newKey, resultToCheck) === 0;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
finally {
|
|
258
|
+
X_ONLY_PUBLIC_KEY_INPUT.fill(0);
|
|
259
|
+
X_ONLY_PUBLIC_KEY_INPUT2.fill(0);
|
|
260
|
+
TWEAK_INPUT.fill(0);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
exports.xOnlyPointAddTweakCheck = xOnlyPointAddTweakCheck;
|
|
264
|
+
function sign(h, d, e) {
|
|
265
|
+
validate.validateHash(h);
|
|
266
|
+
validate.validatePrivate(d);
|
|
267
|
+
validate.validateExtraData(e);
|
|
268
|
+
try {
|
|
269
|
+
HASH_INPUT.set(h);
|
|
270
|
+
PRIVATE_KEY_INPUT.set(d);
|
|
271
|
+
if (e !== undefined)
|
|
272
|
+
EXTRA_DATA_INPUT.set(e);
|
|
273
|
+
wasm_loader_js_1.default.sign(e === undefined ? 0 : 1);
|
|
274
|
+
return SIGNATURE_INPUT.slice(0, validate.SIGNATURE_SIZE);
|
|
275
|
+
}
|
|
276
|
+
finally {
|
|
277
|
+
HASH_INPUT.fill(0);
|
|
278
|
+
PRIVATE_KEY_INPUT.fill(0);
|
|
279
|
+
if (e !== undefined)
|
|
280
|
+
EXTRA_DATA_INPUT.fill(0);
|
|
281
|
+
SIGNATURE_INPUT.fill(0);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
exports.sign = sign;
|
|
285
|
+
function signRecoverable(h, d, e) {
|
|
286
|
+
validate.validateHash(h);
|
|
287
|
+
validate.validatePrivate(d);
|
|
288
|
+
validate.validateExtraData(e);
|
|
289
|
+
try {
|
|
290
|
+
HASH_INPUT.set(h);
|
|
291
|
+
PRIVATE_KEY_INPUT.set(d);
|
|
292
|
+
if (e !== undefined)
|
|
293
|
+
EXTRA_DATA_INPUT.set(e);
|
|
294
|
+
const recoveryId = wasm_loader_js_1.default.signRecoverable(e === undefined ? 0 : 1);
|
|
295
|
+
const signature = SIGNATURE_INPUT.slice(0, validate.SIGNATURE_SIZE);
|
|
296
|
+
return {
|
|
297
|
+
signature,
|
|
298
|
+
recoveryId,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
finally {
|
|
302
|
+
HASH_INPUT.fill(0);
|
|
303
|
+
PRIVATE_KEY_INPUT.fill(0);
|
|
304
|
+
if (e !== undefined)
|
|
305
|
+
EXTRA_DATA_INPUT.fill(0);
|
|
306
|
+
SIGNATURE_INPUT.fill(0);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
exports.signRecoverable = signRecoverable;
|
|
310
|
+
function signSchnorr(h, d, e) {
|
|
311
|
+
validate.validateHash(h);
|
|
312
|
+
validate.validatePrivate(d);
|
|
313
|
+
validate.validateExtraData(e);
|
|
314
|
+
try {
|
|
315
|
+
HASH_INPUT.set(h);
|
|
316
|
+
PRIVATE_KEY_INPUT.set(d);
|
|
317
|
+
if (e !== undefined)
|
|
318
|
+
EXTRA_DATA_INPUT.set(e);
|
|
319
|
+
wasm_loader_js_1.default.signSchnorr(e === undefined ? 0 : 1);
|
|
320
|
+
return SIGNATURE_INPUT.slice(0, validate.SIGNATURE_SIZE);
|
|
321
|
+
}
|
|
322
|
+
finally {
|
|
323
|
+
HASH_INPUT.fill(0);
|
|
324
|
+
PRIVATE_KEY_INPUT.fill(0);
|
|
325
|
+
if (e !== undefined)
|
|
326
|
+
EXTRA_DATA_INPUT.fill(0);
|
|
327
|
+
SIGNATURE_INPUT.fill(0);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
exports.signSchnorr = signSchnorr;
|
|
331
|
+
function verify(h, Q, signature, strict = false) {
|
|
332
|
+
validate.validateHash(h);
|
|
333
|
+
validate.validatePoint(Q);
|
|
334
|
+
validate.validateSignature(signature);
|
|
335
|
+
try {
|
|
336
|
+
HASH_INPUT.set(h);
|
|
337
|
+
PUBLIC_KEY_INPUT.set(Q);
|
|
338
|
+
SIGNATURE_INPUT.set(signature);
|
|
339
|
+
return wasm_loader_js_1.default.verify(Q.length, strict === true ? 1 : 0) === 1 ? true : false;
|
|
340
|
+
}
|
|
341
|
+
finally {
|
|
342
|
+
HASH_INPUT.fill(0);
|
|
343
|
+
PUBLIC_KEY_INPUT.fill(0);
|
|
344
|
+
SIGNATURE_INPUT.fill(0);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
exports.verify = verify;
|
|
348
|
+
function recover(h, signature, recoveryId, compressed = false) {
|
|
349
|
+
validate.validateHash(h);
|
|
350
|
+
validate.validateSignature(signature);
|
|
351
|
+
validate.validateSignatureNonzeroRS(signature);
|
|
352
|
+
if (recoveryId & 2) {
|
|
353
|
+
validate.validateSigrPMinusN(signature);
|
|
354
|
+
}
|
|
355
|
+
validate.validateSignatureCustom(() => isXOnlyPoint(signature.subarray(0, 32)));
|
|
356
|
+
const outputlen = assumeCompression(compressed);
|
|
357
|
+
try {
|
|
358
|
+
HASH_INPUT.set(h);
|
|
359
|
+
SIGNATURE_INPUT.set(signature);
|
|
360
|
+
return wasm_loader_js_1.default.recover(outputlen, recoveryId) === 1
|
|
361
|
+
? PUBLIC_KEY_INPUT.slice(0, outputlen)
|
|
362
|
+
: null;
|
|
363
|
+
}
|
|
364
|
+
finally {
|
|
365
|
+
HASH_INPUT.fill(0);
|
|
366
|
+
SIGNATURE_INPUT.fill(0);
|
|
367
|
+
PUBLIC_KEY_INPUT.fill(0);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
exports.recover = recover;
|
|
371
|
+
function verifySchnorr(h, Q, signature) {
|
|
372
|
+
validate.validateHash(h);
|
|
373
|
+
validate.validateXOnlyPoint(Q);
|
|
374
|
+
validate.validateSignature(signature);
|
|
375
|
+
try {
|
|
376
|
+
HASH_INPUT.set(h);
|
|
377
|
+
X_ONLY_PUBLIC_KEY_INPUT.set(Q);
|
|
378
|
+
SIGNATURE_INPUT.set(signature);
|
|
379
|
+
return wasm_loader_js_1.default.verifySchnorr() === 1 ? true : false;
|
|
380
|
+
}
|
|
381
|
+
finally {
|
|
382
|
+
HASH_INPUT.fill(0);
|
|
383
|
+
X_ONLY_PUBLIC_KEY_INPUT.fill(0);
|
|
384
|
+
SIGNATURE_INPUT.fill(0);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
exports.verifySchnorr = verifySchnorr;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateInt32 = void 0;
|
|
4
|
+
function get4RandomBytes() {
|
|
5
|
+
const bytes = new Uint8Array(4);
|
|
6
|
+
if (typeof crypto === "undefined") {
|
|
7
|
+
throw new Error("The crypto object is unavailable. This may occur if your environment does not support the Web Cryptography API.");
|
|
8
|
+
}
|
|
9
|
+
crypto.getRandomValues(bytes);
|
|
10
|
+
return bytes;
|
|
11
|
+
}
|
|
12
|
+
// Only to be used to initialize the context for rust-secp256k1
|
|
13
|
+
function generateInt32() {
|
|
14
|
+
const array = get4RandomBytes();
|
|
15
|
+
return ((array[0] << (3 * 8)) +
|
|
16
|
+
(array[1] << (2 * 8)) +
|
|
17
|
+
(array[2] << (1 * 8)) +
|
|
18
|
+
array[3]);
|
|
19
|
+
}
|
|
20
|
+
exports.generateInt32 = generateInt32;
|
package/lib/cjs/rand.cjs
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateInt32 = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
function generateInt32() {
|
|
6
|
+
return (0, crypto_1.randomBytes)(4).readInt32BE(0);
|
|
7
|
+
}
|
|
8
|
+
exports.generateInt32 = generateInt32;
|