@noble/curves 1.0.0 → 1.1.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.
Files changed (79) hide show
  1. package/README.md +165 -116
  2. package/_shortw_utils.d.ts +1 -1
  3. package/abstract/edwards.d.ts +7 -2
  4. package/abstract/edwards.d.ts.map +1 -1
  5. package/abstract/edwards.js +7 -2
  6. package/abstract/edwards.js.map +1 -1
  7. package/abstract/modular.d.ts +5 -3
  8. package/abstract/modular.d.ts.map +1 -1
  9. package/abstract/modular.js +6 -4
  10. package/abstract/modular.js.map +1 -1
  11. package/abstract/utils.d.ts +42 -5
  12. package/abstract/utils.d.ts.map +1 -1
  13. package/abstract/utils.js +68 -25
  14. package/abstract/utils.js.map +1 -1
  15. package/abstract/weierstrass.d.ts +17 -2
  16. package/abstract/weierstrass.d.ts.map +1 -1
  17. package/abstract/weierstrass.js +28 -12
  18. package/abstract/weierstrass.js.map +1 -1
  19. package/bls12-381.d.ts.map +1 -1
  20. package/bls12-381.js +4 -3
  21. package/bls12-381.js.map +1 -1
  22. package/ed25519.d.ts +32 -20
  23. package/ed25519.d.ts.map +1 -1
  24. package/ed25519.js +52 -33
  25. package/ed25519.js.map +1 -1
  26. package/ed448.d.ts +4 -4
  27. package/ed448.d.ts.map +1 -1
  28. package/ed448.js +12 -11
  29. package/ed448.js.map +1 -1
  30. package/esm/abstract/edwards.js +7 -2
  31. package/esm/abstract/edwards.js.map +1 -1
  32. package/esm/abstract/modular.js +6 -4
  33. package/esm/abstract/modular.js.map +1 -1
  34. package/esm/abstract/utils.js +68 -25
  35. package/esm/abstract/utils.js.map +1 -1
  36. package/esm/abstract/weierstrass.js +28 -12
  37. package/esm/abstract/weierstrass.js.map +1 -1
  38. package/esm/bls12-381.js +4 -3
  39. package/esm/bls12-381.js.map +1 -1
  40. package/esm/ed25519.js +51 -32
  41. package/esm/ed25519.js.map +1 -1
  42. package/esm/ed448.js +10 -8
  43. package/esm/ed448.js.map +1 -1
  44. package/esm/p256.js +10 -9
  45. package/esm/p256.js.map +1 -1
  46. package/esm/p384.js +7 -6
  47. package/esm/p384.js.map +1 -1
  48. package/esm/p521.js +7 -6
  49. package/esm/p521.js.map +1 -1
  50. package/esm/secp256k1.js +11 -9
  51. package/esm/secp256k1.js.map +1 -1
  52. package/p256.d.ts +4 -5
  53. package/p256.d.ts.map +1 -1
  54. package/p256.js +10 -10
  55. package/p256.js.map +1 -1
  56. package/p384.d.ts +4 -5
  57. package/p384.d.ts.map +1 -1
  58. package/p384.js +7 -7
  59. package/p384.js.map +1 -1
  60. package/p521.d.ts +4 -5
  61. package/p521.d.ts.map +1 -1
  62. package/p521.js +7 -7
  63. package/p521.js.map +1 -1
  64. package/package.json +5 -8
  65. package/secp256k1.d.ts +5 -5
  66. package/secp256k1.d.ts.map +1 -1
  67. package/secp256k1.js +11 -10
  68. package/secp256k1.js.map +1 -1
  69. package/src/abstract/edwards.ts +13 -4
  70. package/src/abstract/modular.ts +6 -8
  71. package/src/abstract/utils.ts +73 -32
  72. package/src/abstract/weierstrass.ts +39 -19
  73. package/src/bls12-381.ts +5 -9
  74. package/src/ed25519.ts +96 -69
  75. package/src/ed448.ts +36 -32
  76. package/src/p256.ts +13 -14
  77. package/src/p384.ts +12 -13
  78. package/src/p521.ts +12 -13
  79. package/src/secp256k1.ts +60 -55
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noble/curves",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Audited & minimal JS implementation of elliptic curve cryptography",
5
5
  "files": [
6
6
  "abstract",
@@ -28,7 +28,7 @@
28
28
  },
29
29
  "license": "MIT",
30
30
  "dependencies": {
31
- "@noble/hashes": "1.3.0"
31
+ "@noble/hashes": "1.3.1"
32
32
  },
33
33
  "devDependencies": {
34
34
  "fast-check": "3.0.0",
@@ -164,6 +164,8 @@
164
164
  "secp256k1",
165
165
  "ed25519",
166
166
  "ed448",
167
+ "x25519",
168
+ "ed25519",
167
169
  "bls12-381",
168
170
  "bn254",
169
171
  "pasta",
@@ -174,10 +176,5 @@
174
176
  "eddsa",
175
177
  "schnorr"
176
178
  ],
177
- "funding": [
178
- {
179
- "type": "individual",
180
- "url": "https://paulmillr.com/funding/"
181
- }
182
- ]
179
+ "funding": "https://paulmillr.com/funding/"
183
180
  }
package/secp256k1.d.ts CHANGED
@@ -1,8 +1,7 @@
1
1
  import { mod } from './abstract/modular.js';
2
2
  import { ProjPointType as PointType } from './abstract/weierstrass.js';
3
3
  import type { Hex, PrivKey } from './abstract/utils.js';
4
- import { bytesToNumberBE } from './abstract/utils.js';
5
- import * as htf from './abstract/hash-to-curve.js';
4
+ import { bytesToNumberBE, numberToBytesBE } from './abstract/utils.js';
6
5
  export declare const secp256k1: Readonly<{
7
6
  create: (hash: import("./abstract/utils.js").CHash) => import("./abstract/weierstrass.js").CurveFn;
8
7
  CURVE: Readonly<{
@@ -40,7 +39,7 @@ export declare const secp256k1: Readonly<{
40
39
  }>;
41
40
  getPublicKey: (privateKey: PrivKey, isCompressed?: boolean | undefined) => Uint8Array;
42
41
  getSharedSecret: (privateA: PrivKey, publicB: Hex, isCompressed?: boolean | undefined) => Uint8Array;
43
- sign: (msgHash: Hex, privKey: PrivKey, opts?: import("./abstract/weierstrass.js").SignOpts | undefined) => import("./abstract/weierstrass.js").SignatureType;
42
+ sign: (msgHash: Hex, privKey: PrivKey, opts?: import("./abstract/weierstrass.js").SignOpts | undefined) => import("./abstract/weierstrass.js").RecoveredSignatureType;
44
43
  verify: (signature: Hex | {
45
44
  r: bigint;
46
45
  s: bigint;
@@ -82,12 +81,13 @@ export declare const schnorr: {
82
81
  randomPrivateKey: () => Uint8Array;
83
82
  lift_x: typeof lift_x;
84
83
  pointToBytes: (point: PointType<bigint>) => Uint8Array;
85
- numberToBytesBE: (n: bigint, len: number) => Uint8Array;
84
+ numberToBytesBE: typeof numberToBytesBE;
86
85
  bytesToNumberBE: typeof bytesToNumberBE;
87
86
  taggedHash: typeof taggedHash;
88
87
  mod: typeof mod;
89
88
  };
90
89
  };
91
- export declare const hashToCurve: (msg: Uint8Array, options?: htf.htfBasicOpts | undefined) => htf.H2CPoint<bigint>, encodeToCurve: (msg: Uint8Array, options?: htf.htfBasicOpts | undefined) => htf.H2CPoint<bigint>;
90
+ export declare const hashToCurve: (msg: Uint8Array, options?: import("./abstract/hash-to-curve.js").htfBasicOpts | undefined) => import("./abstract/hash-to-curve.js").H2CPoint<bigint>;
91
+ export declare const encodeToCurve: (msg: Uint8Array, options?: import("./abstract/hash-to-curve.js").htfBasicOpts | undefined) => import("./abstract/hash-to-curve.js").H2CPoint<bigint>;
92
92
  export {};
93
93
  //# sourceMappingURL=secp256k1.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"secp256k1.d.ts","sourceRoot":"","sources":["src/secp256k1.ts"],"names":[],"mappings":"AAGA,OAAO,EAAS,GAAG,EAAQ,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,IAAI,SAAS,EAAuB,MAAM,2BAA2B,CAAC;AAC5F,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAA6C,MAAM,qBAAqB,CAAC;AACjG,OAAO,KAAK,GAAG,MAAM,6BAA6B,CAAC;AAuCnD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2CrB,CAAC;AASF,iBAAS,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAU,CAQtE;AAkBD;;;GAGG;AACH,iBAAS,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAS5C;AAQD;;GAEG;AACH,iBAAS,mBAAmB,CAAC,UAAU,EAAE,GAAG,GAAG,UAAU,CAExD;AAED;;;GAGG;AACH,iBAAS,WAAW,CAClB,OAAO,EAAE,GAAG,EACZ,UAAU,EAAE,OAAO,EACnB,OAAO,GAAE,GAAqB,GAC7B,UAAU,CAgBZ;AAED;;;GAGG;AACH,iBAAS,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,CAiB5E;AAED,eAAO,MAAM,OAAO;;;;;;;8BA5FS,UAAU,MAAM,CAAC;;;;;;CAyG7C,CAAC;AAuCF,eAAO,MAAQ,WAAW,qFAAE,aAAa,mFAexC,CAAC"}
1
+ {"version":3,"file":"secp256k1.d.ts","sourceRoot":"","sources":["src/secp256k1.ts"],"names":[],"mappings":"AAGA,OAAO,EAAS,GAAG,EAAQ,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,IAAI,SAAS,EAAuB,MAAM,2BAA2B,CAAC;AAC5F,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAA4B,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAwCjG,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2CrB,CAAC;AASF,iBAAS,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAU,CAQtE;AAkBD;;;GAGG;AACH,iBAAS,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAS5C;AAQD;;GAEG;AACH,iBAAS,mBAAmB,CAAC,UAAU,EAAE,GAAG,GAAG,UAAU,CAExD;AAED;;;GAGG;AACH,iBAAS,WAAW,CAClB,OAAO,EAAE,GAAG,EACZ,UAAU,EAAE,OAAO,EACnB,OAAO,GAAE,GAAqB,GAC7B,UAAU,CAgBZ;AAED;;;GAGG;AACH,iBAAS,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,CAiB5E;AAED,eAAO,MAAM,OAAO;;;;;;;8BA5FS,UAAU,MAAM,CAAC;;;;;;CAyGzC,CAAC;AA0DN,eAAO,MAAM,WAAW,uJAA4C,CAAC;AACrE,eAAO,MAAM,aAAa,uJAA8C,CAAC"}
package/secp256k1.js CHANGED
@@ -1,5 +1,4 @@
1
1
  "use strict";
2
- var _a;
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
4
3
  exports.encodeToCurve = exports.hashToCurve = exports.schnorr = exports.secp256k1 = void 0;
5
4
  /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
@@ -8,7 +7,7 @@ const utils_1 = require("@noble/hashes/utils");
8
7
  const modular_js_1 = require("./abstract/modular.js");
9
8
  const weierstrass_js_1 = require("./abstract/weierstrass.js");
10
9
  const utils_js_1 = require("./abstract/utils.js");
11
- const htf = require("./abstract/hash-to-curve.js");
10
+ const hash_to_curve_js_1 = require("./abstract/hash-to-curve.js");
12
11
  const _shortw_utils_js_1 = require("./_shortw_utils.js");
13
12
  const secp256k1P = BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f');
14
13
  const secp256k1N = BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141');
@@ -193,7 +192,7 @@ function schnorrVerify(signature, message, publicKey) {
193
192
  return false;
194
193
  }
195
194
  }
196
- exports.schnorr = {
195
+ exports.schnorr = (() => ({
197
196
  getPublicKey: schnorrGetPublicKey,
198
197
  sign: schnorrSign,
199
198
  verify: schnorrVerify,
@@ -206,8 +205,8 @@ exports.schnorr = {
206
205
  taggedHash,
207
206
  mod: modular_js_1.mod,
208
207
  },
209
- };
210
- const isoMap = htf.isogenyMap(Fp, [
208
+ }))();
209
+ const isoMap = /* @__PURE__ */ (() => (0, hash_to_curve_js_1.isogenyMap)(Fp, [
211
210
  // xNum
212
211
  [
213
212
  '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',
@@ -235,13 +234,13 @@ const isoMap = htf.isogenyMap(Fp, [
235
234
  '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',
236
235
  '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1
237
236
  ],
238
- ].map((i) => i.map((j) => BigInt(j))));
239
- const mapSWU = (0, weierstrass_js_1.mapToCurveSimpleSWU)(Fp, {
237
+ ].map((i) => i.map((j) => BigInt(j)))))();
238
+ const mapSWU = /* @__PURE__ */ (() => (0, weierstrass_js_1.mapToCurveSimpleSWU)(Fp, {
240
239
  A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),
241
240
  B: BigInt('1771'),
242
241
  Z: Fp.create(BigInt('-11')),
243
- });
244
- _a = htf.createHasher(exports.secp256k1.ProjectivePoint, (scalars) => {
242
+ }))();
243
+ const htf = /* @__PURE__ */ (() => (0, hash_to_curve_js_1.createHasher)(exports.secp256k1.ProjectivePoint, (scalars) => {
245
244
  const { x, y } = mapSWU(Fp.create(scalars[0]));
246
245
  return isoMap(x, y);
247
246
  }, {
@@ -252,5 +251,7 @@ _a = htf.createHasher(exports.secp256k1.ProjectivePoint, (scalars) => {
252
251
  k: 128,
253
252
  expand: 'xmd',
254
253
  hash: sha256_1.sha256,
255
- }), exports.hashToCurve = _a.hashToCurve, exports.encodeToCurve = _a.encodeToCurve;
254
+ }))();
255
+ exports.hashToCurve = (() => htf.hashToCurve)();
256
+ exports.encodeToCurve = (() => htf.encodeToCurve)();
256
257
  //# sourceMappingURL=secp256k1.js.map
package/secp256k1.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"secp256k1.js","sourceRoot":"","sources":["src/secp256k1.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"secp256k1.js","sourceRoot":"","sources":["src/secp256k1.ts"],"names":[],"mappings":"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"}
@@ -75,8 +75,13 @@ export interface ExtPointConstructor extends GroupConstructor<ExtPointType> {
75
75
  export type CurveFn = {
76
76
  CURVE: ReturnType<typeof validateOpts>;
77
77
  getPublicKey: (privateKey: Hex) => Uint8Array;
78
- sign: (message: Hex, privateKey: Hex) => Uint8Array;
79
- verify: (sig: Hex, message: Hex, publicKey: Hex) => boolean;
78
+ sign: (message: Hex, privateKey: Hex, options?: { context?: Hex }) => Uint8Array;
79
+ verify: (
80
+ sig: Hex,
81
+ message: Hex,
82
+ publicKey: Hex,
83
+ options?: { context?: Hex; zip215: boolean }
84
+ ) => boolean;
80
85
  ExtendedPoint: ExtPointConstructor;
81
86
  utils: {
82
87
  randomPrivateKey: () => Uint8Array;
@@ -102,7 +107,7 @@ export function twistedEdwards(curveDef: CurveType): CurveFn {
102
107
  nByteLength,
103
108
  h: cofactor,
104
109
  } = CURVE;
105
- const MASK = _2n ** BigInt(nByteLength * 8);
110
+ const MASK = _2n << (BigInt(nByteLength * 8) - _1n);
106
111
  const modP = Fp.create; // Function overrides
107
112
 
108
113
  // sqrt(u/v)
@@ -379,7 +384,10 @@ export function twistedEdwards(curveDef: CurveType): CurveFn {
379
384
  let { isValid, value: x } = uvRatio(u, v); // √(u/v)
380
385
  if (!isValid) throw new Error('Point.fromHex: invalid y coordinate');
381
386
  const isXOdd = (x & _1n) === _1n; // There are 2 square roots. Use x_0 bit to select proper
382
- const isLastByteOdd = (lastByte & 0x80) !== 0; // if x=0 and x_0 = 1, fail
387
+ const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit
388
+ if (!zip215 && x === _0n && isLastByteOdd)
389
+ // if x=0 and x_0 = 1, fail
390
+ throw new Error('Point.fromHex: x=0 and x_0=1');
383
391
  if (isLastByteOdd !== isXOdd) x = modP(-x); // if x_0 != x mod 2, set x = p-x
384
392
  return Point.fromAffine({ x, y });
385
393
  }
@@ -466,6 +474,7 @@ export function twistedEdwards(curveDef: CurveType): CurveFn {
466
474
  } catch (error) {
467
475
  return false;
468
476
  }
477
+ if (!zip215 && A.isSmallOrder()) return false;
469
478
 
470
479
  const k = hashDomainToScalar(context, R.toRawBytes(), A.toRawBytes(), msg);
471
480
  const RkA = R.add(A.multiplyUnsafe(k));
@@ -22,10 +22,10 @@ export function mod(a: bigint, b: bigint): bigint {
22
22
  return result >= _0n ? result : b + result;
23
23
  }
24
24
  /**
25
- * Efficiently exponentiate num to power and do modular division.
25
+ * Efficiently raise num to power and do modular division.
26
26
  * Unsafe in some contexts: uses ladder, so can expose bigint bits.
27
27
  * @example
28
- * powMod(2n, 6n, 11n) // 64n % 11n == 9n
28
+ * pow(2n, 6n, 11n) // 64n % 11n == 9n
29
29
  */
30
30
  // TODO: use field version && remove
31
31
  export function pow(num: bigint, power: bigint, modulo: bigint): bigint {
@@ -55,7 +55,7 @@ export function invert(number: bigint, modulo: bigint): bigint {
55
55
  if (number === _0n || modulo <= _0n) {
56
56
  throw new Error(`invert: expected positive integers, got n=${number} mod=${modulo}`);
57
57
  }
58
- // Eucledian GCD https://brilliant.org/wiki/extended-euclidean-algorithm/
58
+ // Euclidean GCD https://brilliant.org/wiki/extended-euclidean-algorithm/
59
59
  // Fermat's little theorem "CT-like" version inv(n) = n^(m-2) mod m is 30x slower.
60
60
  let a = mod(number, modulo);
61
61
  let b = modulo;
@@ -198,10 +198,6 @@ export function FpSqrt(P: bigint) {
198
198
  // Little-endian check for first LE bit (last BE bit);
199
199
  export const isNegativeLE = (num: bigint, modulo: bigint) => (mod(num, modulo) & _1n) === _1n;
200
200
 
201
- // Currently completly inconsistent naming:
202
- // - readable: add, mul, sqr, sqrt, inv, div, pow, eq, sub
203
- // - unreadable mess: addition, multiply, square, squareRoot, inversion, divide, power, equals, subtract
204
-
205
201
  // Field is not always over prime, Fp2 for example has ORDER(q)=p^m
206
202
  export interface IField<T> {
207
203
  ORDER: bigint;
@@ -406,10 +402,12 @@ export function FpSqrtEven<T>(Fp: IField<T>, elm: T) {
406
402
  /**
407
403
  * FIPS 186 B.4.1-compliant "constant-time" private key generation utility.
408
404
  * Can take (n+8) or more bytes of uniform input e.g. from CSPRNG or KDF
409
- * and convert them into private scalar, with the modulo bias being neglible.
405
+ * and convert them into private scalar, with the modulo bias being negligible.
410
406
  * Needs at least 40 bytes of input for 32-byte private key.
411
407
  * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/
412
408
  * @param hash hash output from SHA3 or a similar function
409
+ * @param groupOrder size of subgroup - (e.g. curveFn.CURVE.n)
410
+ * @param isLE interpret hash bytes as LE num
413
411
  * @returns valid private scalar
414
412
  */
415
413
  export function hashToPrivateScalar(
@@ -1,13 +1,14 @@
1
1
  /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
2
+ // 100 lines of code in the file are duplicated from noble-hashes (utils).
3
+ // This is OK: `abstract` directory does not use noble-hashes.
4
+ // User may opt-in into using different hashing library. This way, noble-hashes
5
+ // won't be included into their bundle.
2
6
  const _0n = BigInt(0);
3
7
  const _1n = BigInt(1);
4
8
  const _2n = BigInt(2);
5
9
  const u8a = (a: any): a is Uint8Array => a instanceof Uint8Array;
6
-
7
- // We accept hex strings besides Uint8Array for simplicity
8
- export type Hex = Uint8Array | string;
9
- // Very few implementations accept numbers, we do it to ease learning curve
10
- export type PrivKey = Hex | bigint;
10
+ export type Hex = Uint8Array | string; // hex strings are accepted for simplicity
11
+ export type PrivKey = Hex | bigint; // bigints are accepted to ease learning curve
11
12
  export type CHash = {
12
13
  (message: Uint8Array | string): Uint8Array;
13
14
  blockLen: number;
@@ -17,6 +18,9 @@ export type CHash = {
17
18
  export type FHash = (message: Uint8Array | string) => Uint8Array;
18
19
 
19
20
  const hexes = Array.from({ length: 256 }, (v, i) => i.toString(16).padStart(2, '0'));
21
+ /**
22
+ * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'
23
+ */
20
24
  export function bytesToHex(bytes: Uint8Array): string {
21
25
  if (!u8a(bytes)) throw new Error('Uint8Array expected');
22
26
  // pre-caching improves the speed 6x
@@ -38,22 +42,25 @@ export function hexToNumber(hex: string): bigint {
38
42
  return BigInt(hex === '' ? '0' : `0x${hex}`);
39
43
  }
40
44
 
41
- // Caching slows it down 2-3x
45
+ /**
46
+ * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])
47
+ */
42
48
  export function hexToBytes(hex: string): Uint8Array {
43
49
  if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);
44
- if (hex.length % 2) throw new Error('hex string is invalid: unpadded ' + hex.length);
45
- const array = new Uint8Array(hex.length / 2);
50
+ const len = hex.length;
51
+ if (len % 2) throw new Error('padded hex string expected, got unpadded hex of length ' + len);
52
+ const array = new Uint8Array(len / 2);
46
53
  for (let i = 0; i < array.length; i++) {
47
54
  const j = i * 2;
48
55
  const hexByte = hex.slice(j, j + 2);
49
56
  const byte = Number.parseInt(hexByte, 16);
50
- if (Number.isNaN(byte) || byte < 0) throw new Error('invalid byte sequence');
57
+ if (Number.isNaN(byte) || byte < 0) throw new Error('Invalid byte sequence');
51
58
  array[i] = byte;
52
59
  }
53
60
  return array;
54
61
  }
55
62
 
56
- // Big Endian
63
+ // BE: Big Endian, LE: Little Endian
57
64
  export function bytesToNumberBE(bytes: Uint8Array): bigint {
58
65
  return hexToNumber(bytesToHex(bytes));
59
66
  }
@@ -62,12 +69,26 @@ export function bytesToNumberLE(bytes: Uint8Array): bigint {
62
69
  return hexToNumber(bytesToHex(Uint8Array.from(bytes).reverse()));
63
70
  }
64
71
 
65
- export const numberToBytesBE = (n: bigint, len: number) =>
66
- hexToBytes(n.toString(16).padStart(len * 2, '0'));
67
- export const numberToBytesLE = (n: bigint, len: number) => numberToBytesBE(n, len).reverse();
68
- // Returns variable number bytes (minimal bigint encoding?)
69
- export const numberToVarBytesBE = (n: bigint) => hexToBytes(numberToHexUnpadded(n));
72
+ export function numberToBytesBE(n: number | bigint, len: number): Uint8Array {
73
+ return hexToBytes(n.toString(16).padStart(len * 2, '0'));
74
+ }
75
+ export function numberToBytesLE(n: number | bigint, len: number): Uint8Array {
76
+ return numberToBytesBE(n, len).reverse();
77
+ }
78
+ // Unpadded, rarely used
79
+ export function numberToVarBytesBE(n: number | bigint): Uint8Array {
80
+ return hexToBytes(numberToHexUnpadded(n));
81
+ }
70
82
 
83
+ /**
84
+ * Takes hex string or Uint8Array, converts to Uint8Array.
85
+ * Validates output length.
86
+ * Will throw error for other types.
87
+ * @param title descriptive title for an error e.g. 'private key'
88
+ * @param hex hex string or Uint8Array
89
+ * @param expectedLength optional, will compare to result array's length
90
+ * @returns
91
+ */
71
92
  export function ensureBytes(title: string, hex: Hex, expectedLength?: number): Uint8Array {
72
93
  let res: Uint8Array;
73
94
  if (typeof hex === 'string') {
@@ -89,11 +110,13 @@ export function ensureBytes(title: string, hex: Hex, expectedLength?: number): U
89
110
  return res;
90
111
  }
91
112
 
92
- // Copies several Uint8Arrays into one.
93
- export function concatBytes(...arrs: Uint8Array[]): Uint8Array {
94
- const r = new Uint8Array(arrs.reduce((sum, a) => sum + a.length, 0));
113
+ /**
114
+ * Copies several Uint8Arrays into one.
115
+ */
116
+ export function concatBytes(...arrays: Uint8Array[]): Uint8Array {
117
+ const r = new Uint8Array(arrays.reduce((sum, a) => sum + a.length, 0));
95
118
  let pad = 0; // walk through each item, ensure they have proper type
96
- arrs.forEach((a) => {
119
+ arrays.forEach((a) => {
97
120
  if (!u8a(a)) throw new Error('Uint8Array expected');
98
121
  r.set(a, pad);
99
122
  pad += a.length;
@@ -111,29 +134,47 @@ export function equalBytes(b1: Uint8Array, b2: Uint8Array) {
111
134
  // Global symbols in both browsers and Node.js since v11
112
135
  // See https://github.com/microsoft/TypeScript/issues/31535
113
136
  declare const TextEncoder: any;
137
+
138
+ /**
139
+ * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])
140
+ */
114
141
  export function utf8ToBytes(str: string): Uint8Array {
115
- if (typeof str !== 'string') {
116
- throw new Error(`utf8ToBytes expected string, got ${typeof str}`);
117
- }
118
- return new TextEncoder().encode(str);
142
+ if (typeof str !== 'string') throw new Error(`utf8ToBytes expected string, got ${typeof str}`);
143
+ return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809
119
144
  }
120
145
 
121
146
  // Bit operations
122
147
 
123
- // Amount of bits inside bigint (Same as n.toString(2).length)
148
+ /**
149
+ * Calculates amount of bits in a bigint.
150
+ * Same as `n.toString(2).length`
151
+ */
124
152
  export function bitLen(n: bigint) {
125
153
  let len;
126
154
  for (len = 0; n > _0n; n >>= _1n, len += 1);
127
155
  return len;
128
156
  }
129
- // Gets single bit at position. NOTE: first bit position is 0 (same as arrays)
130
- // Same as !!+Array.from(n.toString(2)).reverse()[pos]
131
- export const bitGet = (n: bigint, pos: number) => (n >> BigInt(pos)) & _1n;
132
- // Sets single bit at position
133
- export const bitSet = (n: bigint, pos: number, value: boolean) =>
134
- n | ((value ? _1n : _0n) << BigInt(pos));
135
- // Return mask for N bits (Same as BigInt(`0b${Array(i).fill('1').join('')}`))
136
- // Not using ** operator with bigints for old engines.
157
+
158
+ /**
159
+ * Gets single bit at position.
160
+ * NOTE: first bit position is 0 (same as arrays)
161
+ * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`
162
+ */
163
+ export function bitGet(n: bigint, pos: number) {
164
+ return (n >> BigInt(pos)) & _1n;
165
+ }
166
+
167
+ /**
168
+ * Sets single bit at position.
169
+ */
170
+ export const bitSet = (n: bigint, pos: number, value: boolean) => {
171
+ return n | ((value ? _1n : _0n) << BigInt(pos));
172
+ };
173
+
174
+ /**
175
+ * Calculate mask for N bits. Not using ** operator with bigints because of old engines.
176
+ * Same as BigInt(`0b${Array(i).fill('1').join('')}`)
177
+ */
137
178
  export const bitMask = (n: number) => (_2n << BigInt(n - 1)) - _1n;
138
179
 
139
180
  // DRBG
@@ -618,7 +618,7 @@ export interface SignatureType {
618
618
  readonly s: bigint;
619
619
  readonly recovery?: number;
620
620
  assertValidity(): void;
621
- addRecoveryBit(recovery: number): SignatureType;
621
+ addRecoveryBit(recovery: number): RecoveredSignatureType;
622
622
  hasHighS(): boolean;
623
623
  normalizeS(): SignatureType;
624
624
  recoverPublicKey(msgHash: Hex): ProjPointType<bigint>;
@@ -628,6 +628,9 @@ export interface SignatureType {
628
628
  toDERRawBytes(isCompressed?: boolean): Uint8Array;
629
629
  toDERHex(isCompressed?: boolean): string;
630
630
  }
631
+ export type RecoveredSignatureType = SignatureType & {
632
+ readonly recovery: number;
633
+ };
631
634
  // Static methods
632
635
  export type SignatureConstructor = {
633
636
  new (r: bigint, s: bigint): SignatureType;
@@ -669,7 +672,7 @@ export type CurveFn = {
669
672
  CURVE: ReturnType<typeof validateOpts>;
670
673
  getPublicKey: (privateKey: PrivKey, isCompressed?: boolean) => Uint8Array;
671
674
  getSharedSecret: (privateA: PrivKey, publicB: Hex, isCompressed?: boolean) => Uint8Array;
672
- sign: (msgHash: Hex, privKey: PrivKey, opts?: SignOpts) => SignatureType;
675
+ sign: (msgHash: Hex, privKey: PrivKey, opts?: SignOpts) => RecoveredSignatureType;
673
676
  verify: (signature: Hex | SignatureLike, msgHash: Hex, publicKey: Hex, opts?: VerOpts) => boolean;
674
677
  ProjectivePoint: ProjConstructor<bigint>;
675
678
  Signature: SignatureConstructor;
@@ -782,8 +785,8 @@ export function weierstrass(curveDef: CurveType): CurveFn {
782
785
  if (!isWithinCurveOrder(this.s)) throw new Error('s must be 0 < s < CURVE.n');
783
786
  }
784
787
 
785
- addRecoveryBit(recovery: number) {
786
- return new Signature(this.r, this.s, recovery);
788
+ addRecoveryBit(recovery: number): RecoveredSignature {
789
+ return new Signature(this.r, this.s, recovery) as RecoveredSignature;
787
790
  }
788
791
 
789
792
  recoverPublicKey(msgHash: Hex): typeof Point.BASE {
@@ -828,6 +831,7 @@ export function weierstrass(curveDef: CurveType): CurveFn {
828
831
  return numToNByteStr(this.r) + numToNByteStr(this.s);
829
832
  }
830
833
  }
834
+ type RecoveredSignature = Signature & { recovery: number };
831
835
 
832
836
  const utils = {
833
837
  isValidPrivateKey(privateKey: PrivKey) {
@@ -965,7 +969,7 @@ export function weierstrass(curveDef: CurveType): CurveFn {
965
969
  const seed = ut.concatBytes(...seedArgs); // Step D of RFC6979 3.2
966
970
  const m = h1int; // NOTE: no need to call bits2int second time here, it is inside truncateHash!
967
971
  // Converts signature params into point w r/s, checks result for validity.
968
- function k2sig(kBytes: Uint8Array): Signature | undefined {
972
+ function k2sig(kBytes: Uint8Array): RecoveredSignature | undefined {
969
973
  // RFC 6979 Section 3.2, step 3: k = bits2int(T)
970
974
  const k = bits2int(kBytes); // Cannot use fields methods, since it is group element
971
975
  if (!isWithinCurveOrder(k)) return; // Important: all mod() calls here must be done over N
@@ -984,7 +988,7 @@ export function weierstrass(curveDef: CurveType): CurveFn {
984
988
  normS = normalizeS(s); // if lowS was passed, ensure s is always
985
989
  recovery ^= 1; // // in the bottom half of N
986
990
  }
987
- return new Signature(r, normS, recovery); // use normS, not s
991
+ return new Signature(r, normS, recovery) as RecoveredSignature; // use normS, not s
988
992
  }
989
993
  return { seed, k2sig };
990
994
  }
@@ -992,18 +996,22 @@ export function weierstrass(curveDef: CurveType): CurveFn {
992
996
  const defaultVerOpts: VerOpts = { lowS: CURVE.lowS, prehash: false };
993
997
 
994
998
  /**
995
- * Signs message hash (not message: you need to hash it by yourself).
999
+ * Signs message hash with a private key.
996
1000
  * ```
997
1001
  * sign(m, d, k) where
998
1002
  * (x, y) = G × k
999
1003
  * r = x mod n
1000
1004
  * s = (m + dr)/k mod n
1001
1005
  * ```
1002
- * @param opts `lowS, extraEntropy, prehash`
1006
+ * @param msgHash NOT message. msg needs to be hashed to `msgHash`, or use `prehash`.
1007
+ * @param privKey private key
1008
+ * @param opts lowS for non-malleable sigs. extraEntropy for mixing randomness into k. prehash will hash first arg.
1009
+ * @returns signature with recovery param
1003
1010
  */
1004
- function sign(msgHash: Hex, privKey: PrivKey, opts = defaultSigOpts): Signature {
1011
+ function sign(msgHash: Hex, privKey: PrivKey, opts = defaultSigOpts): RecoveredSignature {
1005
1012
  const { seed, k2sig } = prepSig(msgHash, privKey, opts); // Steps A, D of RFC6979 3.2.
1006
- const drbg = ut.createHmacDrbg<Signature>(CURVE.hash.outputLen, CURVE.nByteLength, CURVE.hmac);
1013
+ const C = CURVE;
1014
+ const drbg = ut.createHmacDrbg<RecoveredSignature>(C.hash.outputLen, C.nByteLength, C.hmac);
1007
1015
  return drbg(seed, k2sig); // Steps B, C, D, E, F, G
1008
1016
  }
1009
1017
 
@@ -1084,20 +1092,29 @@ export function weierstrass(curveDef: CurveType): CurveFn {
1084
1092
  };
1085
1093
  }
1086
1094
 
1087
- // Implementation of the Shallue and van de Woestijne method for any Weierstrass curve
1088
- // TODO: check if there is a way to merge this with uvRatio in Edwards && move to modular?
1089
- // b = True and y = sqrt(u / v) if (u / v) is square in F, and
1090
- // b = False and y = sqrt(Z * (u / v)) otherwise.
1095
+ /**
1096
+ * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.
1097
+ * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.
1098
+ * b = True and y = sqrt(u / v) if (u / v) is square in F, and
1099
+ * b = False and y = sqrt(Z * (u / v)) otherwise.
1100
+ * @param Fp
1101
+ * @param Z
1102
+ * @returns
1103
+ */
1091
1104
  export function SWUFpSqrtRatio<T>(Fp: mod.IField<T>, Z: T) {
1092
1105
  // Generic implementation
1093
1106
  const q = Fp.ORDER;
1094
1107
  let l = _0n;
1095
1108
  for (let o = q - _1n; o % _2n === _0n; o /= _2n) l += _1n;
1096
1109
  const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.
1097
- const c2 = (q - _1n) / _2n ** c1; // 2. c2 = (q - 1) / (2^c1) # Integer arithmetic
1110
+ // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.
1111
+ // 2n ** c1 == 2n << (c1-1)
1112
+ const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);
1113
+ const _2n_pow_c1 = _2n_pow_c1_1 * _2n;
1114
+ const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1) # Integer arithmetic
1098
1115
  const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2 # Integer arithmetic
1099
- const c4 = _2n ** c1 - _1n; // 4. c4 = 2^c1 - 1 # Integer arithmetic
1100
- const c5 = _2n ** (c1 - _1n); // 5. c5 = 2^(c1 - 1) # Integer arithmetic
1116
+ const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1 # Integer arithmetic
1117
+ const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1) # Integer arithmetic
1101
1118
  const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2
1102
1119
  const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)
1103
1120
  let sqrtRatio = (u: T, v: T): { isValid: boolean; value: T } => {
@@ -1119,7 +1136,8 @@ export function SWUFpSqrtRatio<T>(Fp: mod.IField<T>, Z: T) {
1119
1136
  tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)
1120
1137
  // 17. for i in (c1, c1 - 1, ..., 2):
1121
1138
  for (let i = c1; i > _1n; i--) {
1122
- let tv5 = _2n ** (i - _2n); // 18. tv5 = i - 2; 19. tv5 = 2^tv5
1139
+ let tv5 = i - _2n; // 18. tv5 = i - 2
1140
+ tv5 = _2n << (tv5 - _1n); // 19. tv5 = 2^tv5
1123
1141
  let tvv5 = Fp.pow(tv4, tv5); // 20. tv5 = tv4^tv5
1124
1142
  const e1 = Fp.eql(tvv5, Fp.ONE); // 21. e1 = tv5 == 1
1125
1143
  tv2 = Fp.mul(tv3, tv1); // 22. tv2 = tv3 * tv1
@@ -1151,7 +1169,9 @@ export function SWUFpSqrtRatio<T>(Fp: mod.IField<T>, Z: T) {
1151
1169
  // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8
1152
1170
  return sqrtRatio;
1153
1171
  }
1154
- // From draft-irtf-cfrg-hash-to-curve-16
1172
+ /**
1173
+ * From draft-irtf-cfrg-hash-to-curve-16
1174
+ */
1155
1175
  export function mapToCurveSimpleSWU<T>(
1156
1176
  Fp: mod.IField<T>,
1157
1177
  opts: {
package/src/bls12-381.ts CHANGED
@@ -60,11 +60,10 @@ const _8n = BigInt(8), _16n = BigInt(16);
60
60
 
61
61
  // CURVE FIELDS
62
62
  // Finite field over p.
63
- const Fp = mod.Field(
64
- BigInt(
65
- '0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'
66
- )
63
+ const Fp_raw = BigInt(
64
+ '0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'
67
65
  );
66
+ const Fp = mod.Field(Fp_raw);
68
67
  type Fp = bigint;
69
68
  // Finite field over r.
70
69
  // This particular field is not used anywhere in bls12-381, but it is still useful.
@@ -110,10 +109,7 @@ type Fp2Utils = {
110
109
  // G² - 1
111
110
  // h2q
112
111
  // NOTE: ORDER was wrong!
113
- const FP2_ORDER =
114
- BigInt(
115
- '0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'
116
- ) ** _2n;
112
+ const FP2_ORDER = Fp_raw * Fp_raw;
117
113
 
118
114
  const Fp2: mod.IField<Fp2> & Fp2Utils = {
119
115
  ORDER: FP2_ORDER,
@@ -1197,7 +1193,7 @@ export const bls12_381: CurveFn<Fp, Fp2, Fp6, Fp12> = bls({
1197
1193
  ),
1198
1194
  ]),
1199
1195
  a: Fp2.ZERO,
1200
- b: Fp2.fromBigTuple([4n, _4n]),
1196
+ b: Fp2.fromBigTuple([_4n, _4n]),
1201
1197
  hEff: BigInt(
1202
1198
  '0xbc69f08f2ee75b3584c6a0ea91b352888e2a8e9145ad7689986ff031508ffe1329c2f178731db956d82bf015d1212b02ec0ec69d7477c1ae954cbc06689f6a359894c0adebbf6b4e8020005aaa95551'
1203
1199
  ),