@bitcoin-js/tiny-secp256k1-asmjs 2.2.4 → 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.
@@ -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 !== -1
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 ? true : false;
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);