@bitcoin-js/tiny-secp256k1-asmjs 2.2.3 → 2.2.5
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 +1 -0
- package/lib/cjs/index.cjs +26 -21
- package/lib/cjs/secp256k1.asm.cjs +19960 -20338
- package/lib/cjs/validate.cjs +6 -1
- package/lib/cjs/validate_error.cjs +15 -1
- package/lib/index.js +26 -21
- package/lib/secp256k1.asm.js +19960 -20338
- package/lib/validate.d.ts +1 -0
- package/lib/validate.js +4 -0
- package/lib/validate_error.d.ts +6 -0
- package/lib/validate_error.js +13 -0
- package/lib/wasm_loader.d.ts +4 -4
- package/package.json +3 -3
package/lib/cjs/validate.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.validateSigrPMinusN = exports.validateSignatureNonzeroRS = exports.validateSignatureCustom = exports.validateSignature = exports.validateExtraData = exports.validateHash = exports.validateTweak = exports.validateXOnlyPoint = exports.validatePoint = exports.validatePrivate = exports.validateParity = exports.isPointCompressed = exports.isDERPoint = exports.isXOnlyPoint = exports.isPoint = exports.isPrivate = exports.isZero = exports.SIGNATURE_SIZE = exports.EXTRA_DATA_SIZE = exports.HASH_SIZE = exports.TWEAK_SIZE = exports.X_ONLY_PUBLIC_KEY_SIZE = exports.PUBLIC_KEY_UNCOMPRESSED_SIZE = exports.PUBLIC_KEY_COMPRESSED_SIZE = exports.PRIVATE_KEY_SIZE = void 0;
|
|
3
|
+
exports.validateSigrPMinusN = exports.validateSignatureNonzeroRS = exports.validateSignatureCustom = exports.validateSignature = exports.validateExtraData = exports.validateHash = exports.validateTweak = exports.validateXOnlyPoint = exports.validatePoint = exports.validatePrivate = exports.validateRecoveryId = exports.validateParity = exports.isPointCompressed = exports.isDERPoint = exports.isXOnlyPoint = exports.isPoint = exports.isPrivate = exports.isZero = exports.SIGNATURE_SIZE = exports.EXTRA_DATA_SIZE = exports.HASH_SIZE = exports.TWEAK_SIZE = exports.X_ONLY_PUBLIC_KEY_SIZE = exports.PUBLIC_KEY_UNCOMPRESSED_SIZE = exports.PUBLIC_KEY_COMPRESSED_SIZE = exports.PRIVATE_KEY_SIZE = void 0;
|
|
4
4
|
const validate_error_js_1 = require("./validate_error.cjs");
|
|
5
5
|
exports.PRIVATE_KEY_SIZE = 32;
|
|
6
6
|
exports.PUBLIC_KEY_COMPRESSED_SIZE = 33;
|
|
@@ -90,6 +90,11 @@ function validateParity(p) {
|
|
|
90
90
|
(0, validate_error_js_1.throwError)(validate_error_js_1.ERROR_BAD_PARITY);
|
|
91
91
|
}
|
|
92
92
|
exports.validateParity = validateParity;
|
|
93
|
+
function validateRecoveryId(recoveryId) {
|
|
94
|
+
if (!Number.isInteger(recoveryId) || recoveryId < 0 || recoveryId > 3)
|
|
95
|
+
(0, validate_error_js_1.throwError)(validate_error_js_1.ERROR_BAD_RECOVERY_ID);
|
|
96
|
+
}
|
|
97
|
+
exports.validateRecoveryId = validateRecoveryId;
|
|
93
98
|
function validatePrivate(d) {
|
|
94
99
|
if (!isPrivate(d))
|
|
95
100
|
(0, validate_error_js_1.throwError)(validate_error_js_1.ERROR_BAD_PRIVATE);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.throwError = exports.ERROR_BAD_RECOVERY_ID = exports.ERROR_BAD_PARITY = exports.ERROR_BAD_EXTRA_DATA = exports.ERROR_BAD_SIGNATURE = exports.ERROR_BAD_HASH = exports.ERROR_BAD_TWEAK = exports.ERROR_BAD_POINT = exports.ERROR_BAD_PRIVATE = void 0;
|
|
3
|
+
exports.vCheck = exports.throwError = exports.ERROR_BAD_RECOVERY_ID = exports.ERROR_BAD_PARITY = exports.ERROR_BAD_EXTRA_DATA = exports.ERROR_BAD_SIGNATURE = exports.ERROR_BAD_HASH = exports.ERROR_BAD_TWEAK = exports.ERROR_BAD_POINT = exports.ERROR_BAD_PRIVATE = void 0;
|
|
4
4
|
exports.ERROR_BAD_PRIVATE = 0;
|
|
5
5
|
exports.ERROR_BAD_POINT = 1;
|
|
6
6
|
exports.ERROR_BAD_TWEAK = 2;
|
|
@@ -24,3 +24,17 @@ function throwError(errcode) {
|
|
|
24
24
|
throw new TypeError(message);
|
|
25
25
|
}
|
|
26
26
|
exports.throwError = throwError;
|
|
27
|
+
/**
|
|
28
|
+
* Checks for error codes in the higher bits and throws an error if any are found.
|
|
29
|
+
* @param retval The return value of the wasm function.
|
|
30
|
+
* @returns The original return value if no error is found.
|
|
31
|
+
*/
|
|
32
|
+
function vCheck(retval) {
|
|
33
|
+
if ((retval & 0x80) !== 0) {
|
|
34
|
+
const ERROR_MASK = 0xff00;
|
|
35
|
+
const errorCode = (retval & ERROR_MASK) >> 8;
|
|
36
|
+
throwError(errorCode);
|
|
37
|
+
}
|
|
38
|
+
return retval;
|
|
39
|
+
}
|
|
40
|
+
exports.vCheck = vCheck;
|
package/lib/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { compare } from "uint8array-tools";
|
|
2
2
|
import * as validate from "./validate.js";
|
|
3
|
+
import { vCheck } from "./validate_error.js";
|
|
3
4
|
import wasm from "./wasm_loader.js";
|
|
4
5
|
const WASM_BUFFER = new Uint8Array(wasm.memory.buffer);
|
|
5
6
|
const WASM_PRIVATE_KEY_PTR = wasm.PRIVATE_INPUT.value;
|
|
@@ -31,7 +32,7 @@ function assumeCompression(compressed, p) {
|
|
|
31
32
|
function _isPoint(p) {
|
|
32
33
|
try {
|
|
33
34
|
PUBLIC_KEY_INPUT.set(p);
|
|
34
|
-
return wasm.isPoint(p.length) === 1;
|
|
35
|
+
return vCheck(wasm.isPoint(p.length)) === 1;
|
|
35
36
|
}
|
|
36
37
|
finally {
|
|
37
38
|
PUBLIC_KEY_INPUT.fill(0);
|
|
@@ -59,7 +60,7 @@ export function pointAdd(pA, pB, compressed) {
|
|
|
59
60
|
try {
|
|
60
61
|
PUBLIC_KEY_INPUT.set(pA);
|
|
61
62
|
PUBLIC_KEY_INPUT2.set(pB);
|
|
62
|
-
return wasm.pointAdd(pA.length, pB.length, outputlen) === 1
|
|
63
|
+
return vCheck(wasm.pointAdd(pA.length, pB.length, outputlen)) === 1
|
|
63
64
|
? PUBLIC_KEY_INPUT.slice(0, outputlen)
|
|
64
65
|
: null;
|
|
65
66
|
}
|
|
@@ -75,7 +76,7 @@ export function pointAddScalar(p, tweak, compressed) {
|
|
|
75
76
|
try {
|
|
76
77
|
PUBLIC_KEY_INPUT.set(p);
|
|
77
78
|
TWEAK_INPUT.set(tweak);
|
|
78
|
-
return wasm.pointAddScalar(p.length, outputlen) === 1
|
|
79
|
+
return vCheck(wasm.pointAddScalar(p.length, outputlen)) === 1
|
|
79
80
|
? PUBLIC_KEY_INPUT.slice(0, outputlen)
|
|
80
81
|
: null;
|
|
81
82
|
}
|
|
@@ -89,7 +90,7 @@ export function pointCompress(p, compressed) {
|
|
|
89
90
|
const outputlen = assumeCompression(compressed, p);
|
|
90
91
|
try {
|
|
91
92
|
PUBLIC_KEY_INPUT.set(p);
|
|
92
|
-
wasm.pointCompress(p.length, outputlen);
|
|
93
|
+
vCheck(wasm.pointCompress(p.length, outputlen));
|
|
93
94
|
return PUBLIC_KEY_INPUT.slice(0, outputlen);
|
|
94
95
|
}
|
|
95
96
|
finally {
|
|
@@ -101,7 +102,7 @@ export function pointFromScalar(d, compressed) {
|
|
|
101
102
|
const outputlen = assumeCompression(compressed);
|
|
102
103
|
try {
|
|
103
104
|
PRIVATE_KEY_INPUT.set(d);
|
|
104
|
-
return wasm.pointFromScalar(outputlen) === 1
|
|
105
|
+
return vCheck(wasm.pointFromScalar(outputlen)) === 1
|
|
105
106
|
? PUBLIC_KEY_INPUT.slice(0, outputlen)
|
|
106
107
|
: null;
|
|
107
108
|
}
|
|
@@ -114,7 +115,7 @@ export function xOnlyPointFromScalar(d) {
|
|
|
114
115
|
validate.validatePrivate(d);
|
|
115
116
|
try {
|
|
116
117
|
PRIVATE_KEY_INPUT.set(d);
|
|
117
|
-
wasm.xOnlyPointFromScalar();
|
|
118
|
+
vCheck(wasm.xOnlyPointFromScalar());
|
|
118
119
|
return X_ONLY_PUBLIC_KEY_INPUT.slice(0, validate.X_ONLY_PUBLIC_KEY_SIZE);
|
|
119
120
|
}
|
|
120
121
|
finally {
|
|
@@ -126,7 +127,7 @@ export function xOnlyPointFromPoint(p) {
|
|
|
126
127
|
validate.validatePoint(p);
|
|
127
128
|
try {
|
|
128
129
|
PUBLIC_KEY_INPUT.set(p);
|
|
129
|
-
wasm.xOnlyPointFromPoint(p.length);
|
|
130
|
+
vCheck(wasm.xOnlyPointFromPoint(p.length));
|
|
130
131
|
return X_ONLY_PUBLIC_KEY_INPUT.slice(0, validate.X_ONLY_PUBLIC_KEY_SIZE);
|
|
131
132
|
}
|
|
132
133
|
finally {
|
|
@@ -141,7 +142,7 @@ export function pointMultiply(p, tweak, compressed) {
|
|
|
141
142
|
try {
|
|
142
143
|
PUBLIC_KEY_INPUT.set(p);
|
|
143
144
|
TWEAK_INPUT.set(tweak);
|
|
144
|
-
return wasm.pointMultiply(p.length, outputlen) === 1
|
|
145
|
+
return vCheck(wasm.pointMultiply(p.length, outputlen)) === 1
|
|
145
146
|
? PUBLIC_KEY_INPUT.slice(0, outputlen)
|
|
146
147
|
: null;
|
|
147
148
|
}
|
|
@@ -156,7 +157,7 @@ export function privateAdd(d, tweak) {
|
|
|
156
157
|
try {
|
|
157
158
|
PRIVATE_KEY_INPUT.set(d);
|
|
158
159
|
TWEAK_INPUT.set(tweak);
|
|
159
|
-
return wasm.privateAdd() === 1
|
|
160
|
+
return vCheck(wasm.privateAdd()) === 1
|
|
160
161
|
? PRIVATE_KEY_INPUT.slice(0, validate.PRIVATE_KEY_SIZE)
|
|
161
162
|
: null;
|
|
162
163
|
}
|
|
@@ -176,7 +177,7 @@ export function privateSub(d, tweak) {
|
|
|
176
177
|
try {
|
|
177
178
|
PRIVATE_KEY_INPUT.set(d);
|
|
178
179
|
TWEAK_INPUT.set(tweak);
|
|
179
|
-
return wasm.privateSub() === 1
|
|
180
|
+
return vCheck(wasm.privateSub()) === 1
|
|
180
181
|
? PRIVATE_KEY_INPUT.slice(0, validate.PRIVATE_KEY_SIZE)
|
|
181
182
|
: null;
|
|
182
183
|
}
|
|
@@ -189,7 +190,7 @@ export function privateNegate(d) {
|
|
|
189
190
|
validate.validatePrivate(d);
|
|
190
191
|
try {
|
|
191
192
|
PRIVATE_KEY_INPUT.set(d);
|
|
192
|
-
wasm.privateNegate();
|
|
193
|
+
vCheck(wasm.privateNegate());
|
|
193
194
|
return PRIVATE_KEY_INPUT.slice(0, validate.PRIVATE_KEY_SIZE);
|
|
194
195
|
}
|
|
195
196
|
finally {
|
|
@@ -202,8 +203,8 @@ export function xOnlyPointAddTweak(p, tweak) {
|
|
|
202
203
|
try {
|
|
203
204
|
X_ONLY_PUBLIC_KEY_INPUT.set(p);
|
|
204
205
|
TWEAK_INPUT.set(tweak);
|
|
205
|
-
const parity = wasm.xOnlyPointAddTweak();
|
|
206
|
-
return parity !==
|
|
206
|
+
const parity = vCheck(wasm.xOnlyPointAddTweak());
|
|
207
|
+
return parity !== 42
|
|
207
208
|
? {
|
|
208
209
|
parity,
|
|
209
210
|
xOnlyPubkey: X_ONLY_PUBLIC_KEY_INPUT.slice(0, validate.X_ONLY_PUBLIC_KEY_SIZE),
|
|
@@ -227,10 +228,11 @@ export function xOnlyPointAddTweakCheck(point, tweak, resultToCheck, tweakParity
|
|
|
227
228
|
X_ONLY_PUBLIC_KEY_INPUT2.set(resultToCheck);
|
|
228
229
|
TWEAK_INPUT.set(tweak);
|
|
229
230
|
if (hasParity) {
|
|
230
|
-
return wasm.xOnlyPointAddTweakCheck(tweakParity) === 1;
|
|
231
|
+
return vCheck(wasm.xOnlyPointAddTweakCheck(tweakParity)) === 1;
|
|
231
232
|
}
|
|
232
233
|
else {
|
|
233
|
-
wasm.xOnlyPointAddTweak()
|
|
234
|
+
if (vCheck(wasm.xOnlyPointAddTweak()) === 42)
|
|
235
|
+
return false;
|
|
234
236
|
const newKey = X_ONLY_PUBLIC_KEY_INPUT.slice(0, validate.X_ONLY_PUBLIC_KEY_SIZE);
|
|
235
237
|
return compare(newKey, resultToCheck) === 0;
|
|
236
238
|
}
|
|
@@ -250,7 +252,7 @@ export function sign(h, d, e) {
|
|
|
250
252
|
PRIVATE_KEY_INPUT.set(d);
|
|
251
253
|
if (e !== undefined)
|
|
252
254
|
EXTRA_DATA_INPUT.set(e);
|
|
253
|
-
wasm.sign(e === undefined ? 0 : 1);
|
|
255
|
+
vCheck(wasm.sign(e === undefined ? 0 : 1));
|
|
254
256
|
return SIGNATURE_INPUT.slice(0, validate.SIGNATURE_SIZE);
|
|
255
257
|
}
|
|
256
258
|
finally {
|
|
@@ -270,7 +272,7 @@ export function signRecoverable(h, d, e) {
|
|
|
270
272
|
PRIVATE_KEY_INPUT.set(d);
|
|
271
273
|
if (e !== undefined)
|
|
272
274
|
EXTRA_DATA_INPUT.set(e);
|
|
273
|
-
const recoveryId = wasm.signRecoverable(e === undefined ? 0 : 1);
|
|
275
|
+
const recoveryId = vCheck(wasm.signRecoverable(e === undefined ? 0 : 1));
|
|
274
276
|
const signature = SIGNATURE_INPUT.slice(0, validate.SIGNATURE_SIZE);
|
|
275
277
|
return {
|
|
276
278
|
signature,
|
|
@@ -294,7 +296,7 @@ export function signSchnorr(h, d, e) {
|
|
|
294
296
|
PRIVATE_KEY_INPUT.set(d);
|
|
295
297
|
if (e !== undefined)
|
|
296
298
|
EXTRA_DATA_INPUT.set(e);
|
|
297
|
-
wasm.signSchnorr(e === undefined ? 0 : 1);
|
|
299
|
+
vCheck(wasm.signSchnorr(e === undefined ? 0 : 1));
|
|
298
300
|
return SIGNATURE_INPUT.slice(0, validate.SIGNATURE_SIZE);
|
|
299
301
|
}
|
|
300
302
|
finally {
|
|
@@ -313,7 +315,9 @@ export function verify(h, Q, signature, strict = false) {
|
|
|
313
315
|
HASH_INPUT.set(h);
|
|
314
316
|
PUBLIC_KEY_INPUT.set(Q);
|
|
315
317
|
SIGNATURE_INPUT.set(signature);
|
|
316
|
-
return wasm.verify(Q.length, strict === true ? 1 : 0) === 1
|
|
318
|
+
return vCheck(wasm.verify(Q.length, strict === true ? 1 : 0)) === 1
|
|
319
|
+
? true
|
|
320
|
+
: false;
|
|
317
321
|
}
|
|
318
322
|
finally {
|
|
319
323
|
HASH_INPUT.fill(0);
|
|
@@ -324,6 +328,7 @@ export function verify(h, Q, signature, strict = false) {
|
|
|
324
328
|
export function recover(h, signature, recoveryId, compressed = false) {
|
|
325
329
|
validate.validateHash(h);
|
|
326
330
|
validate.validateSignature(signature);
|
|
331
|
+
validate.validateRecoveryId(recoveryId);
|
|
327
332
|
validate.validateSignatureNonzeroRS(signature);
|
|
328
333
|
if (recoveryId & 2) {
|
|
329
334
|
validate.validateSigrPMinusN(signature);
|
|
@@ -333,7 +338,7 @@ export function recover(h, signature, recoveryId, compressed = false) {
|
|
|
333
338
|
try {
|
|
334
339
|
HASH_INPUT.set(h);
|
|
335
340
|
SIGNATURE_INPUT.set(signature);
|
|
336
|
-
return wasm.recover(outputlen, recoveryId) === 1
|
|
341
|
+
return vCheck(wasm.recover(outputlen, recoveryId)) === 1
|
|
337
342
|
? PUBLIC_KEY_INPUT.slice(0, outputlen)
|
|
338
343
|
: null;
|
|
339
344
|
}
|
|
@@ -351,7 +356,7 @@ export function verifySchnorr(h, Q, signature) {
|
|
|
351
356
|
HASH_INPUT.set(h);
|
|
352
357
|
X_ONLY_PUBLIC_KEY_INPUT.set(Q);
|
|
353
358
|
SIGNATURE_INPUT.set(signature);
|
|
354
|
-
return wasm.verifySchnorr() === 1 ? true : false;
|
|
359
|
+
return vCheck(wasm.verifySchnorr()) === 1 ? true : false;
|
|
355
360
|
}
|
|
356
361
|
finally {
|
|
357
362
|
HASH_INPUT.fill(0);
|