@bsv/sdk 1.1.23 → 1.1.24

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.
Files changed (52) hide show
  1. package/dist/cjs/package.json +1 -1
  2. package/dist/cjs/src/primitives/Curve.js +7 -7
  3. package/dist/cjs/src/primitives/Curve.js.map +1 -1
  4. package/dist/cjs/src/primitives/ECDSA.js +394 -71
  5. package/dist/cjs/src/primitives/ECDSA.js.map +1 -1
  6. package/dist/cjs/src/primitives/Point.js +103 -23
  7. package/dist/cjs/src/primitives/Point.js.map +1 -1
  8. package/dist/cjs/src/primitives/TransactionSignature.js +4 -3
  9. package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -1
  10. package/dist/cjs/src/primitives/utils.js +14 -15
  11. package/dist/cjs/src/primitives/utils.js.map +1 -1
  12. package/dist/cjs/src/script/Spend.js +4 -4
  13. package/dist/cjs/src/script/Spend.js.map +1 -1
  14. package/dist/cjs/src/transaction/Transaction.js +79 -65
  15. package/dist/cjs/src/transaction/Transaction.js.map +1 -1
  16. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  17. package/dist/esm/src/primitives/Curve.js +7 -7
  18. package/dist/esm/src/primitives/Curve.js.map +1 -1
  19. package/dist/esm/src/primitives/ECDSA.js +394 -71
  20. package/dist/esm/src/primitives/ECDSA.js.map +1 -1
  21. package/dist/esm/src/primitives/Point.js +103 -23
  22. package/dist/esm/src/primitives/Point.js.map +1 -1
  23. package/dist/esm/src/primitives/TransactionSignature.js +4 -3
  24. package/dist/esm/src/primitives/TransactionSignature.js.map +1 -1
  25. package/dist/esm/src/primitives/utils.js +14 -15
  26. package/dist/esm/src/primitives/utils.js.map +1 -1
  27. package/dist/esm/src/script/Spend.js +4 -4
  28. package/dist/esm/src/script/Spend.js.map +1 -1
  29. package/dist/esm/src/transaction/Transaction.js +79 -65
  30. package/dist/esm/src/transaction/Transaction.js.map +1 -1
  31. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  32. package/dist/types/src/primitives/ECDSA.d.ts.map +1 -1
  33. package/dist/types/src/primitives/Point.d.ts +5 -0
  34. package/dist/types/src/primitives/Point.d.ts.map +1 -1
  35. package/dist/types/src/primitives/TransactionSignature.d.ts.map +1 -1
  36. package/dist/types/src/primitives/utils.d.ts.map +1 -1
  37. package/dist/types/src/transaction/Transaction.d.ts.map +1 -1
  38. package/dist/types/src/transaction/TransactionInput.d.ts +1 -1
  39. package/dist/types/src/transaction/TransactionInput.d.ts.map +1 -1
  40. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  41. package/docs/primitives.md +4 -3
  42. package/docs/transaction.md +1 -1
  43. package/package.json +1 -1
  44. package/src/primitives/Curve.ts +7 -7
  45. package/src/primitives/ECDSA.ts +485 -75
  46. package/src/primitives/Point.ts +110 -25
  47. package/src/primitives/TransactionSignature.ts +4 -3
  48. package/src/primitives/utils.ts +15 -11
  49. package/src/script/Spend.ts +4 -4
  50. package/src/transaction/Transaction.ts +93 -68
  51. package/src/transaction/TransactionInput.ts +1 -1
  52. package/src/transaction/__tests/Transaction.benchmarks.test.ts +222 -0
@@ -21,11 +21,10 @@ import DRBG from './DRBG.js';
21
21
  * let msg = new BigNumber('1234567890abcdef', 16);
22
22
  * let truncatedMsg = truncateToN(msg);
23
23
  */
24
- function truncateToN(msg, truncOnly) {
25
- const curve = new Curve();
24
+ function truncateToN(msg, truncOnly, curve = new Curve()) {
26
25
  const delta = msg.byteLength() * 8 - curve.n.bitLength();
27
26
  if (delta > 0) {
28
- msg = msg.ushrn(delta);
27
+ msg.iushrn(delta);
29
28
  }
30
29
  if (!truncOnly && msg.cmp(curve.n) >= 0) {
31
30
  return msg.sub(curve.n);
@@ -50,67 +49,250 @@ function truncateToN(msg, truncOnly) {
50
49
  * const signature = sign(msg, key)
51
50
  */
52
51
  export const sign = (msg, key, forceLowS = false, customK) => {
53
- const curve = new Curve();
54
- msg = truncateToN(msg);
55
- // Zero-extend key to provide enough entropy
56
- const bytes = curve.n.byteLength();
57
- const bkey = key.toArray('be', bytes);
58
- // Zero-extend nonce to have the same byte size as N
59
- const nonce = msg.toArray('be', bytes);
60
- // Instantiate Hmac_DRBG
61
- const drbg = new DRBG(bkey, nonce);
62
- // Number of bytes to generate
63
- const ns1 = curve.n.subn(1);
64
- for (let iter = 0;; iter++) {
65
- // Compute the k-value
66
- let k = typeof customK === 'function'
67
- ? customK(iter)
68
- : BigNumber.isBN(customK)
69
- ? customK
70
- : new BigNumber(drbg.generate(bytes), 16);
71
- k = truncateToN(k, true);
72
- if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0) {
73
- if (BigNumber.isBN(customK)) {
74
- throw new Error('Invalid fixed custom K value (must be more than 1 and less than N-1)');
52
+ if (typeof BigInt === 'function') {
53
+ // Curve parameters for secp256k1
54
+ const zero = BigInt(0);
55
+ const one = BigInt(1);
56
+ const two = BigInt(2);
57
+ const n = BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141'); // Order of the curve
58
+ const p = BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F'); // Field prime
59
+ const Gx = BigInt('0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798');
60
+ const Gy = BigInt('0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8');
61
+ const G = { x: Gx, y: Gy };
62
+ // Convert msg and key to BigInt
63
+ const z = BigInt('0x' + msg.toString(16));
64
+ const d = BigInt('0x' + key.toString(16));
65
+ // Validate private key
66
+ if (d <= zero || d >= n) {
67
+ throw new Error('Invalid private key');
68
+ }
69
+ // Helper function to convert BigInt to byte array
70
+ function bigIntToBytes(value, length) {
71
+ const hex = value.toString(16).padStart(length * 2, '0');
72
+ const bytes = new Uint8Array(length);
73
+ for (let i = 0; i < length; i++) {
74
+ bytes[i] = parseInt(hex.substr(i * 2, 2), 16);
75
+ }
76
+ return bytes;
77
+ }
78
+ // Zero-extend key to provide enough entropy
79
+ const bytes = 32; // Assuming 256-bit curve
80
+ const bkey = bigIntToBytes(d, bytes); // 'd' is the private key BigInt
81
+ // Zero-extend nonce to have the same byte size as N
82
+ const nonce = bigIntToBytes(z, bytes); // 'z' is the message hash BigInt
83
+ // Instantiate Hmac_DRBG
84
+ const drbg = new DRBG(Array.from(bkey), Array.from(nonce));
85
+ // Number of bytes to generate
86
+ const ns1 = n - one;
87
+ let iter = 0;
88
+ // Truncate to N function for BigInt
89
+ function truncateToN(k, n, truncOnly = true) {
90
+ const kBitLength = k.toString(2).length;
91
+ const nBitLength = n.toString(2).length;
92
+ const delta = kBitLength - nBitLength;
93
+ if (delta > 0) {
94
+ k = k >> BigInt(delta);
95
+ }
96
+ if (!truncOnly && k >= n) {
97
+ return k - n;
75
98
  }
76
99
  else {
77
- continue;
100
+ return k;
78
101
  }
79
102
  }
80
- const kp = curve.g.mul(k);
81
- if (kp.isInfinity()) {
82
- if (BigNumber.isBN(customK)) {
83
- throw new Error('Invalid fixed custom K value (must not create a point at infinity when multiplied by the generator point)');
103
+ function generateK() {
104
+ if (typeof customK === 'function') {
105
+ // Call customK function to get k as BigNumber
106
+ const k_bn = customK(iter);
107
+ // Convert k_bn (BigNumber) to BigInt
108
+ const k_str = k_bn.toString(16);
109
+ return BigInt('0x' + k_str);
110
+ }
111
+ else if (BigNumber.isBN(customK)) {
112
+ // Use customK provided, convert to BigInt
113
+ const k_str = customK.toString(16);
114
+ return BigInt('0x' + k_str);
84
115
  }
85
116
  else {
86
- continue;
117
+ // Use DRBG to generate k
118
+ const k_hex = drbg.generate(bytes); // Generate hex string
119
+ return BigInt('0x' + k_hex);
87
120
  }
88
121
  }
89
- const kpX = kp.getX();
90
- const r = kpX.umod(curve.n);
91
- if (r.cmpn(0) === 0) {
92
- if (BigNumber.isBN(customK)) {
93
- throw new Error('Invalid fixed custom K value (when multiplied by G, the resulting x coordinate mod N must not be zero)');
122
+ // Modular arithmetic functions
123
+ function mod(a, m) {
124
+ return ((a % m) + m) % m;
125
+ }
126
+ function modInv(a, m) {
127
+ let lm = one;
128
+ let hm = zero;
129
+ let low = mod(a, m);
130
+ let high = m;
131
+ while (low > one) {
132
+ const r = high / low;
133
+ const nm = hm - lm * r;
134
+ const neww = high - low * r;
135
+ hm = lm;
136
+ lm = nm;
137
+ high = low;
138
+ low = neww;
139
+ }
140
+ return mod(lm, m);
141
+ }
142
+ function pointAdd(P, Q) {
143
+ if (P === null)
144
+ return Q;
145
+ if (Q === null)
146
+ return P;
147
+ if (P.x === Q.x && P.y === mod(-Q.y, p)) {
148
+ return null; // Point at infinity
149
+ }
150
+ let m;
151
+ if (P.x === Q.x && P.y === Q.y) {
152
+ // Point doubling
153
+ if (P.y === zero) {
154
+ return null; // Point at infinity
155
+ }
156
+ const numerator = mod(BigInt(3) * P.x * P.x, p); // 3 * x^2
157
+ const denominator = modInv(two * P.y, p);
158
+ m = mod(numerator * denominator, p);
94
159
  }
95
160
  else {
96
- continue;
161
+ const numerator = mod(Q.y - P.y, p);
162
+ const denominator = modInv(Q.x - P.x, p);
163
+ m = mod(numerator * denominator, p);
97
164
  }
165
+ const xR = mod(m * m - P.x - Q.x, p);
166
+ const yR = mod(m * (P.x - xR) - P.y, p);
167
+ return { x: xR, y: yR };
98
168
  }
99
- let s = k.invm(curve.n).mul(r.mul(key).iadd(msg));
100
- s = s.umod(curve.n);
101
- if (s.cmpn(0) === 0) {
102
- if (BigNumber.isBN(customK)) {
103
- throw new Error('Invalid fixed custom K value (when used with the key, it cannot create a zero value for S)');
169
+ function scalarMul(k, P) {
170
+ let N = P;
171
+ let Q = null; // Point at infinity
172
+ while (k > zero) {
173
+ if (k % two === one) {
174
+ Q = pointAdd(Q, N);
175
+ }
176
+ N = pointAdd(N, N);
177
+ k >>= one;
104
178
  }
105
- else {
106
- continue;
179
+ return Q;
180
+ }
181
+ while (true) {
182
+ let k = generateK();
183
+ iter += 1;
184
+ // Truncate k to n bits
185
+ k = truncateToN(k, n, true);
186
+ if (k <= one || k >= ns1) {
187
+ if (customK instanceof BigNumber) {
188
+ throw new Error('Invalid fixed custom K value (must be more than 1 and less than N-1)');
189
+ }
190
+ else {
191
+ continue;
192
+ }
193
+ }
194
+ const R = scalarMul(k, G);
195
+ if (R === null) {
196
+ if (customK instanceof BigNumber) {
197
+ throw new Error('Invalid fixed custom K value (must not create a point at infinity when multiplied by the generator point)');
198
+ }
199
+ else {
200
+ continue;
201
+ }
202
+ }
203
+ const r = mod(R.x, n);
204
+ if (r === zero) {
205
+ if (customK instanceof BigNumber) {
206
+ throw new Error('Invalid fixed custom K value (when multiplied by G, the resulting x coordinate mod N must not be zero)');
207
+ }
208
+ else {
209
+ continue;
210
+ }
211
+ }
212
+ const kInv = modInv(k, n);
213
+ const rd = mod(r * d, n);
214
+ let s = mod(kInv * (z + rd), n);
215
+ if (s === zero) {
216
+ if (customK instanceof BigNumber) {
217
+ throw new Error('Invalid fixed custom K value (when used with the key, it cannot create a zero value for S)');
218
+ }
219
+ else {
220
+ continue;
221
+ }
107
222
  }
223
+ // Use complement of `s` if it is > n / 2
224
+ if (forceLowS && s > n / two) {
225
+ s = n - s;
226
+ }
227
+ // Return signature as BigNumbers
228
+ const r_bn = new BigNumber(r.toString(16), 16);
229
+ const s_bn = new BigNumber(s.toString(16), 16);
230
+ return new Signature(r_bn, s_bn);
108
231
  }
109
- // Use complement of `s`, if it is > `n / 2`
110
- if (forceLowS && s.cmp(curve.n.ushrn(1)) > 0) {
111
- s = curve.n.sub(s);
232
+ }
233
+ else {
234
+ const curve = new Curve();
235
+ msg = truncateToN(msg);
236
+ // Zero-extend key to provide enough entropy
237
+ const bytes = curve.n.byteLength();
238
+ const bkey = key.toArray('be', bytes);
239
+ // Zero-extend nonce to have the same byte size as N
240
+ const nonce = msg.toArray('be', bytes);
241
+ // Instantiate Hmac_DRBG
242
+ const drbg = new DRBG(bkey, nonce);
243
+ // Number of bytes to generate
244
+ const ns1 = curve.n.subn(1);
245
+ for (let iter = 0;; iter++) {
246
+ // Compute the k-value
247
+ let k = typeof customK === 'function'
248
+ ? customK(iter)
249
+ : BigNumber.isBN(customK)
250
+ ? customK
251
+ : new BigNumber(drbg.generate(bytes), 16);
252
+ k = truncateToN(k, true);
253
+ if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0) {
254
+ if (BigNumber.isBN(customK)) {
255
+ throw new Error('Invalid fixed custom K value (must be more than 1 and less than N-1)');
256
+ }
257
+ else {
258
+ continue;
259
+ }
260
+ }
261
+ const kp = curve.g.mul(k);
262
+ if (kp.isInfinity()) {
263
+ if (BigNumber.isBN(customK)) {
264
+ throw new Error('Invalid fixed custom K value (must not create a point at infinity when multiplied by the generator point)');
265
+ }
266
+ else {
267
+ continue;
268
+ }
269
+ }
270
+ const kpX = kp.getX();
271
+ const r = kpX.umod(curve.n);
272
+ if (r.cmpn(0) === 0) {
273
+ if (BigNumber.isBN(customK)) {
274
+ throw new Error('Invalid fixed custom K value (when multiplied by G, the resulting x coordinate mod N must not be zero)');
275
+ }
276
+ else {
277
+ continue;
278
+ }
279
+ }
280
+ let s = k.invm(curve.n).mul(r.mul(key).iadd(msg));
281
+ s = s.umod(curve.n);
282
+ if (s.cmpn(0) === 0) {
283
+ if (BigNumber.isBN(customK)) {
284
+ throw new Error('Invalid fixed custom K value (when used with the key, it cannot create a zero value for S)');
285
+ }
286
+ else {
287
+ continue;
288
+ }
289
+ }
290
+ // Use complement of `s`, if it is > `n / 2`
291
+ if (forceLowS && s.cmp(curve.n.ushrn(1)) > 0) {
292
+ s = curve.n.sub(s);
293
+ }
294
+ return new Signature(r, s);
112
295
  }
113
- return new Signature(r, s);
114
296
  }
115
297
  };
116
298
  /**
@@ -132,30 +314,171 @@ export const sign = (msg, key, forceLowS = false, customK) => {
132
314
  * const isVerified = verify(msg, sig, key)
133
315
  */
134
316
  export const verify = (msg, sig, key) => {
135
- const curve = new Curve();
136
- msg = truncateToN(msg);
137
- // Perform primitive values validation
138
- const r = sig.r;
139
- const s = sig.s;
140
- if (r.cmpn(1) < 0 || r.cmp(curve.n) >= 0) {
141
- return false;
142
- }
143
- if (s.cmpn(1) < 0 || s.cmp(curve.n) >= 0) {
144
- return false;
317
+ // Use BigInt for verification opportunistically
318
+ if (typeof BigInt === 'function') {
319
+ // Curve parameters for secp256k1
320
+ const zero = BigInt(0);
321
+ const one = BigInt(1);
322
+ const two = BigInt(2);
323
+ const three = BigInt(3);
324
+ const p = BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F'); // Field prime
325
+ const n = BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141'); // Order of the curve
326
+ const G = {
327
+ x: BigInt('0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798'),
328
+ y: BigInt('0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8')
329
+ };
330
+ // Modular arithmetic functions
331
+ const mod = (a, m) => ((a % m) + m) % m;
332
+ const modInv = (a, m) => {
333
+ // Extended Euclidean Algorithm for modular inverse
334
+ let [old_r, r] = [a, m];
335
+ let [old_s, s] = [BigInt(1), BigInt(0)];
336
+ while (r !== zero) {
337
+ const q = old_r / r;
338
+ [old_r, r] = [r, old_r - q * r];
339
+ [old_s, s] = [s, old_s - q * s];
340
+ }
341
+ if (old_r > one)
342
+ return zero; // No inverse
343
+ return mod(old_s, m);
344
+ };
345
+ const modMul = (a, b, m) => mod(a * b, m);
346
+ const modSub = (a, b, m) => mod(a - b, m);
347
+ const modAdd = (a, b, m) => mod(a + b, m);
348
+ // Define constants
349
+ const four = BigInt(4);
350
+ const eight = BigInt(8);
351
+ // Point Doubling
352
+ const pointDouble = (P) => {
353
+ const { X: X1, Y: Y1, Z: Z1 } = P;
354
+ if (Y1 === zero) {
355
+ return { X: zero, Y: one, Z: zero }; // Point at infinity
356
+ }
357
+ const Y1_sq = modMul(Y1, Y1, p); // Y1^2
358
+ const S = modMul(four, modMul(X1, Y1_sq, p), p); // S = 4 * X1 * Y1^2
359
+ const M = modMul(three, modMul(X1, X1, p), p); // M = 3 * X1^2
360
+ const X3 = modSub(modMul(M, M, p), modMul(two, S, p), p); // X3 = M^2 - 2 * S
361
+ const Y3 = modSub(modMul(M, modSub(S, X3, p), p), modMul(eight, modMul(Y1_sq, Y1_sq, p), p), p); // Y3 = M * (S - X3) - 8 * Y1^4
362
+ const Z3 = modMul(two, modMul(Y1, Z1, p), p); // Z3 = 2 * Y1 * Z1
363
+ return { X: X3, Y: Y3, Z: Z3 };
364
+ };
365
+ // Point Addition
366
+ const pointAdd = (P, Q) => {
367
+ if (P.Z === zero)
368
+ return Q;
369
+ if (Q.Z === zero)
370
+ return P;
371
+ const Z1Z1 = modMul(P.Z, P.Z, p);
372
+ const Z2Z2 = modMul(Q.Z, Q.Z, p);
373
+ const U1 = modMul(P.X, Z2Z2, p);
374
+ const U2 = modMul(Q.X, Z1Z1, p);
375
+ const S1 = modMul(P.Y, modMul(Z2Z2, Q.Z, p), p);
376
+ const S2 = modMul(Q.Y, modMul(Z1Z1, P.Z, p), p);
377
+ const H = modSub(U2, U1, p);
378
+ const r = modSub(S2, S1, p);
379
+ if (H === zero) {
380
+ if (r === zero) {
381
+ // P == Q
382
+ return pointDouble(P);
383
+ }
384
+ else {
385
+ // Point at infinity
386
+ return { X: zero, Y: one, Z: zero };
387
+ }
388
+ }
389
+ const HH = modMul(H, H, p);
390
+ const HHH = modMul(H, HH, p);
391
+ const V = modMul(U1, HH, p);
392
+ const X3 = modSub(modSub(modMul(r, r, p), HHH, p), modMul(two, V, p), p);
393
+ const Y3 = modSub(modMul(r, modSub(V, X3, p), p), modMul(S1, HHH, p), p);
394
+ const Z3 = modMul(H, modMul(P.Z, Q.Z, p), p);
395
+ return { X: X3, Y: Y3, Z: Z3 };
396
+ };
397
+ // Scalar Multiplication
398
+ const scalarMultiply = (k, P) => {
399
+ const N = { X: P.x, Y: P.y, Z: one };
400
+ let Q = { X: zero, Y: one, Z: zero }; // Point at infinity
401
+ const kBin = k.toString(2);
402
+ for (let i = 0; i < kBin.length; i++) {
403
+ Q = pointDouble(Q);
404
+ if (kBin[i] === '1') {
405
+ Q = pointAdd(Q, N);
406
+ }
407
+ }
408
+ return Q;
409
+ };
410
+ // Verify Function Using Jacobian Coordinates
411
+ const verifyECDSA = (hash, publicKey, signature) => {
412
+ const { r, s } = signature;
413
+ const z = hash;
414
+ // Check r and s are in [1, n - 1]
415
+ if (r <= zero || r >= n || s <= zero || s >= n) {
416
+ return false;
417
+ }
418
+ const w = modInv(s, n); // w = s^-1 mod n
419
+ if (w === zero) {
420
+ return false; // No inverse exists
421
+ }
422
+ const u1 = modMul(z, w, n);
423
+ const u2 = modMul(r, w, n);
424
+ // Compute point R = u1 * G + u2 * Q
425
+ const RG = scalarMultiply(u1, G);
426
+ const RQ = scalarMultiply(u2, publicKey);
427
+ const R = pointAdd(RG, RQ);
428
+ if (R.Z === zero) {
429
+ // Point at infinity
430
+ return false;
431
+ }
432
+ // Compute affine x-coordinate x1 = X / Z^2 mod p
433
+ const ZInv = modInv(R.Z, p);
434
+ if (ZInv === zero) {
435
+ return false; // No inverse exists
436
+ }
437
+ const ZInv2 = modMul(ZInv, ZInv, p);
438
+ const x1_affine = modMul(R.X, ZInv2, p);
439
+ // Compute v = x1_affine mod n
440
+ const v = mod(x1_affine, n);
441
+ // Signature is valid if v == r mod n
442
+ return v === r;
443
+ };
444
+ // Convert inputs to BigInt
445
+ const hash = BigInt('0x' + msg.toString(16));
446
+ const publicKey = {
447
+ x: BigInt('0x' + key.x.toString(16)),
448
+ y: BigInt('0x' + key.y.toString(16))
449
+ };
450
+ const signature = {
451
+ r: BigInt('0x' + sig.r.toString(16)),
452
+ s: BigInt('0x' + sig.s.toString(16))
453
+ };
454
+ return verifyECDSA(hash, publicKey, signature);
145
455
  }
146
- // Validate signature
147
- const sinv = s.invm(curve.n);
148
- const u1 = sinv.mul(msg).umod(curve.n);
149
- const u2 = sinv.mul(r).umod(curve.n);
150
- // NOTE: Greg Maxwell's trick, inspired by:
151
- // https://git.io/vad3K
152
- const p = curve.g.jmulAdd(u1, key, u2);
153
- if (p.isInfinity()) {
154
- return false;
456
+ else {
457
+ const curve = new Curve();
458
+ msg = truncateToN(msg);
459
+ // Perform primitive values validation
460
+ const r = sig.r;
461
+ const s = sig.s;
462
+ if (r.cmpn(1) < 0 || r.cmp(curve.n) >= 0) {
463
+ return false;
464
+ }
465
+ if (s.cmpn(1) < 0 || s.cmp(curve.n) >= 0) {
466
+ return false;
467
+ }
468
+ // Validate signature
469
+ const sinv = s.invm(curve.n);
470
+ const u1 = sinv.mul(msg).umod(curve.n);
471
+ const u2 = sinv.mul(r).umod(curve.n);
472
+ // NOTE: Greg Maxwell's trick, inspired by:
473
+ // https://git.io/vad3K
474
+ const p = curve.g.jmulAdd(u1, key, u2);
475
+ if (p.isInfinity()) {
476
+ return false;
477
+ }
478
+ // Compare `p.x` of Jacobian point with `r`,
479
+ // this will do `p.x == r * p.z^2` instead of multiplying `p.x` by the
480
+ // inverse of `p.z^2`
481
+ return p.eqXToP(r);
155
482
  }
156
- // Compare `p.x` of Jacobian point with `r`,
157
- // this will do `p.x == r * p.z^2` instead of multiplying `p.x` by the
158
- // inverse of `p.z^2`
159
- return p.eqXToP(r);
160
483
  };
161
484
  //# sourceMappingURL=ECDSA.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ECDSA.js","sourceRoot":"","sources":["../../../../src/primitives/ECDSA.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ECDSA.js","sourceRoot":"","sources":["../../../../src/primitives/ECDSA.ts"],"names":[],"mappings":"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"}