@noble/curves 1.9.0 → 1.9.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/README.md +78 -34
- package/_shortw_utils.d.ts +7 -5
- package/_shortw_utils.d.ts.map +1 -1
- package/_shortw_utils.js +2 -8
- package/_shortw_utils.js.map +1 -1
- package/abstract/bls.d.ts +60 -24
- package/abstract/bls.d.ts.map +1 -1
- package/abstract/bls.js +158 -109
- package/abstract/bls.js.map +1 -1
- package/abstract/curve.d.ts +44 -9
- package/abstract/curve.d.ts.map +1 -1
- package/abstract/curve.js +99 -11
- package/abstract/curve.js.map +1 -1
- package/abstract/edwards.d.ts +112 -25
- package/abstract/edwards.d.ts.map +1 -1
- package/abstract/edwards.js +141 -92
- package/abstract/edwards.js.map +1 -1
- package/abstract/fft.d.ts +122 -0
- package/abstract/fft.d.ts.map +1 -0
- package/abstract/fft.js +438 -0
- package/abstract/fft.js.map +1 -0
- package/abstract/hash-to-curve.d.ts +25 -11
- package/abstract/hash-to-curve.d.ts.map +1 -1
- package/abstract/hash-to-curve.js +17 -14
- package/abstract/hash-to-curve.js.map +1 -1
- package/abstract/modular.d.ts +28 -17
- package/abstract/modular.d.ts.map +1 -1
- package/abstract/modular.js +156 -139
- package/abstract/modular.js.map +1 -1
- package/abstract/montgomery.d.ts +3 -8
- package/abstract/montgomery.d.ts.map +1 -1
- package/abstract/montgomery.js +73 -93
- package/abstract/montgomery.js.map +1 -1
- package/abstract/poseidon.d.ts +5 -13
- package/abstract/poseidon.d.ts.map +1 -1
- package/abstract/poseidon.js +12 -7
- package/abstract/poseidon.js.map +1 -1
- package/abstract/tower.d.ts +20 -46
- package/abstract/tower.d.ts.map +1 -1
- package/abstract/tower.js +10 -4
- package/abstract/tower.js.map +1 -1
- package/abstract/utils.d.ts +1 -115
- package/abstract/utils.d.ts.map +1 -1
- package/abstract/utils.js +17 -371
- package/abstract/utils.js.map +1 -1
- package/abstract/weierstrass.d.ts +152 -73
- package/abstract/weierstrass.d.ts.map +1 -1
- package/abstract/weierstrass.js +487 -404
- package/abstract/weierstrass.js.map +1 -1
- package/bls12-381.d.ts +2 -0
- package/bls12-381.d.ts.map +1 -1
- package/bls12-381.js +504 -480
- package/bls12-381.js.map +1 -1
- package/bn254.d.ts +2 -0
- package/bn254.d.ts.map +1 -1
- package/bn254.js +44 -32
- package/bn254.js.map +1 -1
- package/ed25519.d.ts +25 -9
- package/ed25519.d.ts.map +1 -1
- package/ed25519.js +89 -65
- package/ed25519.js.map +1 -1
- package/ed448.d.ts +29 -10
- package/ed448.d.ts.map +1 -1
- package/ed448.js +116 -81
- package/ed448.js.map +1 -1
- package/esm/_shortw_utils.d.ts +7 -5
- package/esm/_shortw_utils.d.ts.map +1 -1
- package/esm/_shortw_utils.js +2 -8
- package/esm/_shortw_utils.js.map +1 -1
- package/esm/abstract/bls.d.ts +60 -24
- package/esm/abstract/bls.d.ts.map +1 -1
- package/esm/abstract/bls.js +158 -109
- package/esm/abstract/bls.js.map +1 -1
- package/esm/abstract/curve.d.ts +44 -9
- package/esm/abstract/curve.d.ts.map +1 -1
- package/esm/abstract/curve.js +96 -12
- package/esm/abstract/curve.js.map +1 -1
- package/esm/abstract/edwards.d.ts +112 -25
- package/esm/abstract/edwards.d.ts.map +1 -1
- package/esm/abstract/edwards.js +141 -94
- package/esm/abstract/edwards.js.map +1 -1
- package/esm/abstract/fft.d.ts +122 -0
- package/esm/abstract/fft.d.ts.map +1 -0
- package/esm/abstract/fft.js +425 -0
- package/esm/abstract/fft.js.map +1 -0
- package/esm/abstract/hash-to-curve.d.ts +25 -11
- package/esm/abstract/hash-to-curve.d.ts.map +1 -1
- package/esm/abstract/hash-to-curve.js +17 -14
- package/esm/abstract/hash-to-curve.js.map +1 -1
- package/esm/abstract/modular.d.ts +28 -17
- package/esm/abstract/modular.d.ts.map +1 -1
- package/esm/abstract/modular.js +155 -138
- package/esm/abstract/modular.js.map +1 -1
- package/esm/abstract/montgomery.d.ts +3 -8
- package/esm/abstract/montgomery.d.ts.map +1 -1
- package/esm/abstract/montgomery.js +74 -94
- package/esm/abstract/montgomery.js.map +1 -1
- package/esm/abstract/poseidon.d.ts +5 -13
- package/esm/abstract/poseidon.d.ts.map +1 -1
- package/esm/abstract/poseidon.js +12 -7
- package/esm/abstract/poseidon.js.map +1 -1
- package/esm/abstract/tower.d.ts +20 -46
- package/esm/abstract/tower.d.ts.map +1 -1
- package/esm/abstract/tower.js +10 -4
- package/esm/abstract/tower.js.map +1 -1
- package/esm/abstract/utils.d.ts +1 -115
- package/esm/abstract/utils.d.ts.map +1 -1
- package/esm/abstract/utils.js +3 -344
- package/esm/abstract/utils.js.map +1 -1
- package/esm/abstract/weierstrass.d.ts +152 -73
- package/esm/abstract/weierstrass.d.ts.map +1 -1
- package/esm/abstract/weierstrass.js +485 -406
- package/esm/abstract/weierstrass.js.map +1 -1
- package/esm/bls12-381.d.ts +2 -0
- package/esm/bls12-381.d.ts.map +1 -1
- package/esm/bls12-381.js +503 -479
- package/esm/bls12-381.js.map +1 -1
- package/esm/bn254.d.ts +2 -0
- package/esm/bn254.d.ts.map +1 -1
- package/esm/bn254.js +41 -29
- package/esm/bn254.js.map +1 -1
- package/esm/ed25519.d.ts +25 -9
- package/esm/ed25519.d.ts.map +1 -1
- package/esm/ed25519.js +84 -60
- package/esm/ed25519.js.map +1 -1
- package/esm/ed448.d.ts +29 -10
- package/esm/ed448.d.ts.map +1 -1
- package/esm/ed448.js +113 -78
- package/esm/ed448.js.map +1 -1
- package/esm/jubjub.d.ts +4 -0
- package/esm/jubjub.d.ts.map +1 -1
- package/esm/jubjub.js +4 -0
- package/esm/jubjub.js.map +1 -1
- package/esm/misc.d.ts.map +1 -1
- package/esm/misc.js +31 -26
- package/esm/misc.js.map +1 -1
- package/esm/nist.d.ts +8 -16
- package/esm/nist.d.ts.map +1 -1
- package/esm/nist.js +87 -97
- package/esm/nist.js.map +1 -1
- package/esm/p256.d.ts +3 -3
- package/esm/p384.d.ts +3 -3
- package/esm/p521.d.ts +3 -3
- package/esm/pasta.d.ts +4 -0
- package/esm/pasta.d.ts.map +1 -1
- package/esm/pasta.js +4 -0
- package/esm/pasta.js.map +1 -1
- package/esm/secp256k1.d.ts +6 -6
- package/esm/secp256k1.d.ts.map +1 -1
- package/esm/secp256k1.js +44 -41
- package/esm/secp256k1.js.map +1 -1
- package/esm/utils.d.ts +96 -0
- package/esm/utils.d.ts.map +1 -0
- package/esm/utils.js +279 -0
- package/esm/utils.js.map +1 -0
- package/jubjub.d.ts +4 -0
- package/jubjub.d.ts.map +1 -1
- package/jubjub.js +4 -0
- package/jubjub.js.map +1 -1
- package/misc.d.ts.map +1 -1
- package/misc.js +35 -30
- package/misc.js.map +1 -1
- package/nist.d.ts +8 -16
- package/nist.d.ts.map +1 -1
- package/nist.js +87 -97
- package/nist.js.map +1 -1
- package/p256.d.ts +3 -3
- package/p384.d.ts +3 -3
- package/p521.d.ts +3 -3
- package/package.json +26 -8
- package/pasta.d.ts +4 -0
- package/pasta.d.ts.map +1 -1
- package/pasta.js +4 -0
- package/pasta.js.map +1 -1
- package/secp256k1.d.ts +6 -6
- package/secp256k1.d.ts.map +1 -1
- package/secp256k1.js +47 -44
- package/secp256k1.js.map +1 -1
- package/src/_shortw_utils.ts +5 -15
- package/src/abstract/bls.ts +260 -145
- package/src/abstract/curve.ts +125 -18
- package/src/abstract/edwards.ts +282 -127
- package/src/abstract/fft.ts +519 -0
- package/src/abstract/hash-to-curve.ts +51 -27
- package/src/abstract/modular.ts +156 -143
- package/src/abstract/montgomery.ts +81 -111
- package/src/abstract/poseidon.ts +22 -18
- package/src/abstract/tower.ts +37 -68
- package/src/abstract/utils.ts +3 -378
- package/src/abstract/weierstrass.ts +752 -461
- package/src/bls12-381.ts +542 -507
- package/src/bn254.ts +47 -35
- package/src/ed25519.ts +104 -76
- package/src/ed448.ts +156 -105
- package/src/jubjub.ts +4 -0
- package/src/misc.ts +39 -34
- package/src/nist.ts +138 -126
- package/src/p256.ts +3 -3
- package/src/p384.ts +3 -3
- package/src/p521.ts +3 -3
- package/src/pasta.ts +5 -1
- package/src/secp256k1.ts +59 -47
- package/src/utils.ts +328 -0
- package/utils.d.ts +96 -0
- package/utils.d.ts.map +1 -0
- package/utils.js +313 -0
- package/utils.js.map +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash-to-curve.js","sourceRoot":"","sources":["../src/abstract/hash-to-curve.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"hash-to-curve.js","sourceRoot":"","sources":["../src/abstract/hash-to-curve.ts"],"names":[],"mappings":"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"}
|
package/abstract/modular.d.ts
CHANGED
|
@@ -2,7 +2,6 @@ export declare function mod(a: bigint, b: bigint): bigint;
|
|
|
2
2
|
/**
|
|
3
3
|
* Efficiently raise num to power and do modular division.
|
|
4
4
|
* Unsafe in some contexts: uses ladder, so can expose bigint bits.
|
|
5
|
-
* TODO: remove.
|
|
6
5
|
* @example
|
|
7
6
|
* pow(2n, 6n, 11n) // 64n % 11n == 9n
|
|
8
7
|
*/
|
|
@@ -23,12 +22,11 @@ export declare function invert(number: bigint, modulo: bigint): bigint;
|
|
|
23
22
|
*/
|
|
24
23
|
export declare function tonelliShanks(P: bigint): <T>(Fp: IField<T>, n: T) => T;
|
|
25
24
|
/**
|
|
26
|
-
* Square root for a finite field.
|
|
25
|
+
* Square root for a finite field. Will try optimized versions first:
|
|
27
26
|
*
|
|
28
27
|
* 1. P ≡ 3 (mod 4)
|
|
29
28
|
* 2. P ≡ 5 (mod 8)
|
|
30
|
-
* 3.
|
|
31
|
-
* 4. Tonelli-Shanks algorithm
|
|
29
|
+
* 3. Tonelli-Shanks algorithm
|
|
32
30
|
*
|
|
33
31
|
* Different algorithms can give different roots, it is up to user to decide which one they want.
|
|
34
32
|
* For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).
|
|
@@ -47,6 +45,7 @@ export interface IField<T> {
|
|
|
47
45
|
create: (num: T) => T;
|
|
48
46
|
isValid: (num: T) => boolean;
|
|
49
47
|
is0: (num: T) => boolean;
|
|
48
|
+
isValidNot0: (num: T) => boolean;
|
|
50
49
|
neg(num: T): T;
|
|
51
50
|
inv(num: T): T;
|
|
52
51
|
sqrt(num: T): T;
|
|
@@ -62,7 +61,6 @@ export interface IField<T> {
|
|
|
62
61
|
mulN(lhs: T, rhs: T | bigint): T;
|
|
63
62
|
sqrN(num: T): T;
|
|
64
63
|
isOdd?(num: T): boolean;
|
|
65
|
-
pow(lhs: T, power: bigint): T;
|
|
66
64
|
invertBatch: (lst: T[]) => T[];
|
|
67
65
|
toBytes(num: T): Uint8Array;
|
|
68
66
|
fromBytes(bytes: Uint8Array): T;
|
|
@@ -84,35 +82,48 @@ export declare function FpDiv<T>(Fp: IField<T>, lhs: T, rhs: T | bigint): T;
|
|
|
84
82
|
/**
|
|
85
83
|
* Legendre symbol.
|
|
86
84
|
* Legendre constant is used to calculate Legendre symbol (a | p)
|
|
87
|
-
* which denotes the value of a^((p-1)/2) (mod p)
|
|
85
|
+
* which denotes the value of a^((p-1)/2) (mod p).
|
|
88
86
|
*
|
|
89
87
|
* * (a | p) ≡ 1 if a is a square (mod p), quadratic residue
|
|
90
88
|
* * (a | p) ≡ -1 if a is not a square (mod p), quadratic non residue
|
|
91
89
|
* * (a | p) ≡ 0 if a ≡ 0 (mod p)
|
|
92
90
|
*/
|
|
93
|
-
export declare function FpLegendre<T>(Fp: IField<T>, n: T):
|
|
91
|
+
export declare function FpLegendre<T>(Fp: IField<T>, n: T): -1 | 0 | 1;
|
|
94
92
|
export declare function FpIsSquare<T>(Fp: IField<T>, n: T): boolean;
|
|
95
|
-
export
|
|
96
|
-
nBitLength: number;
|
|
93
|
+
export type NLength = {
|
|
97
94
|
nByteLength: number;
|
|
95
|
+
nBitLength: number;
|
|
98
96
|
};
|
|
97
|
+
export declare function nLength(n: bigint, nBitLength?: number): NLength;
|
|
99
98
|
type FpField = IField<bigint> & Required<Pick<IField<bigint>, 'isOdd'>>;
|
|
99
|
+
type SqrtFn = (n: bigint) => bigint;
|
|
100
|
+
type FieldOpts = Partial<{
|
|
101
|
+
sqrt: SqrtFn;
|
|
102
|
+
isLE: boolean;
|
|
103
|
+
BITS: number;
|
|
104
|
+
}>;
|
|
100
105
|
/**
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
* *
|
|
104
|
-
* *
|
|
105
|
-
* * c) Object.freeze
|
|
106
|
+
* Creates a finite field. Major performance optimizations:
|
|
107
|
+
* * 1. Denormalized operations like mulN instead of mul.
|
|
108
|
+
* * 2. Identical object shape: never add or remove keys.
|
|
109
|
+
* * 3. `Object.freeze`.
|
|
106
110
|
* Fragile: always run a benchmark on a change.
|
|
107
111
|
* Security note: operations don't check 'isValid' for all elements for performance reasons,
|
|
108
112
|
* it is caller responsibility to check this.
|
|
109
113
|
* This is low-level code, please make sure you know what you're doing.
|
|
110
|
-
*
|
|
114
|
+
*
|
|
115
|
+
* Note about field properties:
|
|
116
|
+
* * CHARACTERISTIC p = prime number, number of elements in main subgroup.
|
|
117
|
+
* * ORDER q = similar to cofactor in curves, may be composite `q = p^m`.
|
|
118
|
+
*
|
|
119
|
+
* @param ORDER field order, probably prime, or could be composite
|
|
111
120
|
* @param bitLen how many bits the field consumes
|
|
112
|
-
* @param isLE (
|
|
121
|
+
* @param isLE (default: false) if encoding / decoding should be in little-endian
|
|
113
122
|
* @param redef optional faster redefinitions of sqrt and other methods
|
|
114
123
|
*/
|
|
115
|
-
export declare function Field(ORDER: bigint,
|
|
124
|
+
export declare function Field(ORDER: bigint, bitLenOrOpts?: number | FieldOpts, isLE?: boolean, opts?: {
|
|
125
|
+
sqrt?: SqrtFn;
|
|
126
|
+
}): Readonly<FpField>;
|
|
116
127
|
export declare function FpSqrtOdd<T>(Fp: IField<T>, elm: T): T;
|
|
117
128
|
export declare function FpSqrtEven<T>(Fp: IField<T>, elm: T): T;
|
|
118
129
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modular.d.ts","sourceRoot":"","sources":["../src/abstract/modular.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"modular.d.ts","sourceRoot":"","sources":["../src/abstract/modular.ts"],"names":[],"mappings":"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"}
|
package/abstract/modular.js
CHANGED
|
@@ -22,20 +22,18 @@ exports.getFieldBytesLength = getFieldBytesLength;
|
|
|
22
22
|
exports.getMinHashLength = getMinHashLength;
|
|
23
23
|
exports.mapHashToField = mapHashToField;
|
|
24
24
|
/**
|
|
25
|
-
* Utils for modular division and
|
|
26
|
-
*
|
|
25
|
+
* Utils for modular division and fields.
|
|
26
|
+
* Field over 11 is a finite (Galois) field is integer number operations `mod 11`.
|
|
27
27
|
* There is no division: it is replaced by modular multiplicative inverse.
|
|
28
28
|
* @module
|
|
29
29
|
*/
|
|
30
30
|
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
31
|
-
const
|
|
32
|
-
const utils_ts_1 = require("./utils.js");
|
|
31
|
+
const utils_ts_1 = require("../utils.js");
|
|
33
32
|
// prettier-ignore
|
|
34
33
|
const _0n = BigInt(0), _1n = BigInt(1), _2n = /* @__PURE__ */ BigInt(2), _3n = /* @__PURE__ */ BigInt(3);
|
|
35
34
|
// prettier-ignore
|
|
36
|
-
const _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5)
|
|
37
|
-
|
|
38
|
-
const _9n = /* @__PURE__ */ BigInt(9), _16n = /* @__PURE__ */ BigInt(16);
|
|
35
|
+
const _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5);
|
|
36
|
+
const _8n = /* @__PURE__ */ BigInt(8);
|
|
39
37
|
// Calculates a modulo b
|
|
40
38
|
function mod(a, b) {
|
|
41
39
|
const result = a % b;
|
|
@@ -44,25 +42,11 @@ function mod(a, b) {
|
|
|
44
42
|
/**
|
|
45
43
|
* Efficiently raise num to power and do modular division.
|
|
46
44
|
* Unsafe in some contexts: uses ladder, so can expose bigint bits.
|
|
47
|
-
* TODO: remove.
|
|
48
45
|
* @example
|
|
49
46
|
* pow(2n, 6n, 11n) // 64n % 11n == 9n
|
|
50
47
|
*/
|
|
51
48
|
function pow(num, power, modulo) {
|
|
52
|
-
|
|
53
|
-
throw new Error('invalid exponent, negatives unsupported');
|
|
54
|
-
if (modulo <= _0n)
|
|
55
|
-
throw new Error('invalid modulus');
|
|
56
|
-
if (modulo === _1n)
|
|
57
|
-
return _0n;
|
|
58
|
-
let res = _1n;
|
|
59
|
-
while (power > _0n) {
|
|
60
|
-
if (power & _1n)
|
|
61
|
-
res = (res * num) % modulo;
|
|
62
|
-
num = (num * num) % modulo;
|
|
63
|
-
power >>= _1n;
|
|
64
|
-
}
|
|
65
|
-
return res;
|
|
49
|
+
return FpPow(Field(modulo), num, power);
|
|
66
50
|
}
|
|
67
51
|
/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */
|
|
68
52
|
function pow2(x, power, modulo) {
|
|
@@ -101,6 +85,51 @@ function invert(number, modulo) {
|
|
|
101
85
|
throw new Error('invert: does not exist');
|
|
102
86
|
return mod(x, modulo);
|
|
103
87
|
}
|
|
88
|
+
// Not all roots are possible! Example which will throw:
|
|
89
|
+
// const NUM =
|
|
90
|
+
// n = 72057594037927816n;
|
|
91
|
+
// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));
|
|
92
|
+
function sqrt3mod4(Fp, n) {
|
|
93
|
+
const p1div4 = (Fp.ORDER + _1n) / _4n;
|
|
94
|
+
const root = Fp.pow(n, p1div4);
|
|
95
|
+
// Throw if root^2 != n
|
|
96
|
+
if (!Fp.eql(Fp.sqr(root), n))
|
|
97
|
+
throw new Error('Cannot find square root');
|
|
98
|
+
return root;
|
|
99
|
+
}
|
|
100
|
+
function sqrt5mod8(Fp, n) {
|
|
101
|
+
const p5div8 = (Fp.ORDER - _5n) / _8n;
|
|
102
|
+
const n2 = Fp.mul(n, _2n);
|
|
103
|
+
const v = Fp.pow(n2, p5div8);
|
|
104
|
+
const nv = Fp.mul(n, v);
|
|
105
|
+
const i = Fp.mul(Fp.mul(nv, _2n), v);
|
|
106
|
+
const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));
|
|
107
|
+
if (!Fp.eql(Fp.sqr(root), n))
|
|
108
|
+
throw new Error('Cannot find square root');
|
|
109
|
+
return root;
|
|
110
|
+
}
|
|
111
|
+
// TODO: Commented-out for now. Provide test vectors.
|
|
112
|
+
// Tonelli is too slow for extension fields Fp2.
|
|
113
|
+
// That means we can't use sqrt (c1, c2...) even for initialization constants.
|
|
114
|
+
// if (P % _16n === _9n) return sqrt9mod16;
|
|
115
|
+
// // prettier-ignore
|
|
116
|
+
// function sqrt9mod16<T>(Fp: IField<T>, n: T, p7div16?: bigint) {
|
|
117
|
+
// if (p7div16 === undefined) p7div16 = (Fp.ORDER + BigInt(7)) / _16n;
|
|
118
|
+
// const c1 = Fp.sqrt(Fp.neg(Fp.ONE)); // 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F
|
|
119
|
+
// const c2 = Fp.sqrt(c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F
|
|
120
|
+
// const c3 = Fp.sqrt(Fp.neg(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F
|
|
121
|
+
// const c4 = p7div16; // 4. c4 = (q + 7) / 16 # Integer arithmetic
|
|
122
|
+
// let tv1 = Fp.pow(n, c4); // 1. tv1 = x^c4
|
|
123
|
+
// let tv2 = Fp.mul(c1, tv1); // 2. tv2 = c1 * tv1
|
|
124
|
+
// const tv3 = Fp.mul(c2, tv1); // 3. tv3 = c2 * tv1
|
|
125
|
+
// let tv4 = Fp.mul(c3, tv1); // 4. tv4 = c3 * tv1
|
|
126
|
+
// const e1 = Fp.eql(Fp.sqr(tv2), n); // 5. e1 = (tv2^2) == x
|
|
127
|
+
// const e2 = Fp.eql(Fp.sqr(tv3), n); // 6. e2 = (tv3^2) == x
|
|
128
|
+
// tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x
|
|
129
|
+
// tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x
|
|
130
|
+
// const e3 = Fp.eql(Fp.sqr(tv2), n); // 9. e3 = (tv2^2) == x
|
|
131
|
+
// return Fp.cmov(tv1, tv2, e3); // 10. z = CMOV(tv1, tv2, e3) # Select the sqrt from tv1 and tv2
|
|
132
|
+
// }
|
|
104
133
|
/**
|
|
105
134
|
* Tonelli-Shanks square root search algorithm.
|
|
106
135
|
* 1. https://eprint.iacr.org/2012/685.pdf (page 12)
|
|
@@ -109,131 +138,89 @@ function invert(number, modulo) {
|
|
|
109
138
|
* @returns function that takes field Fp (created from P) and number n
|
|
110
139
|
*/
|
|
111
140
|
function tonelliShanks(P) {
|
|
112
|
-
//
|
|
113
|
-
//
|
|
114
|
-
|
|
141
|
+
// Initialization (precomputation).
|
|
142
|
+
// Caching initialization could boost perf by 7%.
|
|
143
|
+
if (P < BigInt(3))
|
|
144
|
+
throw new Error('sqrt is not defined for small field');
|
|
145
|
+
// Factor P - 1 = Q * 2^S, where Q is odd
|
|
115
146
|
let Q = P - _1n;
|
|
116
147
|
let S = 0;
|
|
117
148
|
while (Q % _2n === _0n) {
|
|
118
149
|
Q /= _2n;
|
|
119
150
|
S++;
|
|
120
151
|
}
|
|
121
|
-
//
|
|
152
|
+
// Find the first quadratic non-residue Z >= 2
|
|
122
153
|
let Z = _2n;
|
|
123
154
|
const _Fp = Field(P);
|
|
124
|
-
while (
|
|
155
|
+
while (FpLegendre(_Fp, Z) === 1) {
|
|
156
|
+
// Basic primality test for P. After x iterations, chance of
|
|
157
|
+
// not finding quadratic non-residue is 2^x, so 2^1000.
|
|
125
158
|
if (Z++ > 1000)
|
|
126
159
|
throw new Error('Cannot find square root: probably non-prime P');
|
|
127
160
|
}
|
|
128
|
-
// Fast-path
|
|
129
|
-
if (S === 1)
|
|
130
|
-
|
|
131
|
-
return function tonelliFast(Fp, n) {
|
|
132
|
-
const root = Fp.pow(n, p1div4);
|
|
133
|
-
if (!Fp.eql(Fp.sqr(root), n))
|
|
134
|
-
throw new Error('Cannot find square root');
|
|
135
|
-
return root;
|
|
136
|
-
};
|
|
137
|
-
}
|
|
161
|
+
// Fast-path; usually done before Z, but we do "primality test".
|
|
162
|
+
if (S === 1)
|
|
163
|
+
return sqrt3mod4;
|
|
138
164
|
// Slow-path
|
|
165
|
+
// TODO: test on Fp2 and others
|
|
166
|
+
let cc = _Fp.pow(Z, Q); // c = z^Q
|
|
139
167
|
const Q1div2 = (Q + _1n) / _2n;
|
|
140
168
|
return function tonelliSlow(Fp, n) {
|
|
141
|
-
|
|
142
|
-
|
|
169
|
+
if (Fp.is0(n))
|
|
170
|
+
return n;
|
|
171
|
+
// Check if n is a quadratic residue using Legendre symbol
|
|
172
|
+
if (FpLegendre(Fp, n) !== 1)
|
|
143
173
|
throw new Error('Cannot find square root');
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
let
|
|
147
|
-
let
|
|
148
|
-
let
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if (Fp.
|
|
153
|
-
return Fp.ZERO;
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
174
|
+
// Initialize variables for the main loop
|
|
175
|
+
let M = S;
|
|
176
|
+
let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp
|
|
177
|
+
let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor
|
|
178
|
+
let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root
|
|
179
|
+
// Main loop
|
|
180
|
+
// while t != 1
|
|
181
|
+
while (!Fp.eql(t, Fp.ONE)) {
|
|
182
|
+
if (Fp.is0(t))
|
|
183
|
+
return Fp.ZERO; // if t=0 return R=0
|
|
184
|
+
let i = 1;
|
|
185
|
+
// Find the smallest i >= 1 such that t^(2^i) ≡ 1 (mod P)
|
|
186
|
+
let t_tmp = Fp.sqr(t); // t^(2^1)
|
|
187
|
+
while (!Fp.eql(t_tmp, Fp.ONE)) {
|
|
188
|
+
i++;
|
|
189
|
+
t_tmp = Fp.sqr(t_tmp); // t^(2^2)...
|
|
190
|
+
if (i === M)
|
|
191
|
+
throw new Error('Cannot find square root');
|
|
160
192
|
}
|
|
161
|
-
//
|
|
162
|
-
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
193
|
+
// Calculate the exponent for b: 2^(M - i - 1)
|
|
194
|
+
const exponent = _1n << BigInt(M - i - 1); // bigint is important
|
|
195
|
+
const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)
|
|
196
|
+
// Update variables
|
|
197
|
+
M = i;
|
|
198
|
+
c = Fp.sqr(b); // c = b^2
|
|
199
|
+
t = Fp.mul(t, c); // t = (t * b^2)
|
|
200
|
+
R = Fp.mul(R, b); // R = R*b
|
|
168
201
|
}
|
|
169
|
-
return
|
|
202
|
+
return R;
|
|
170
203
|
};
|
|
171
204
|
}
|
|
172
205
|
/**
|
|
173
|
-
* Square root for a finite field.
|
|
206
|
+
* Square root for a finite field. Will try optimized versions first:
|
|
174
207
|
*
|
|
175
208
|
* 1. P ≡ 3 (mod 4)
|
|
176
209
|
* 2. P ≡ 5 (mod 8)
|
|
177
|
-
* 3.
|
|
178
|
-
* 4. Tonelli-Shanks algorithm
|
|
210
|
+
* 3. Tonelli-Shanks algorithm
|
|
179
211
|
*
|
|
180
212
|
* Different algorithms can give different roots, it is up to user to decide which one they want.
|
|
181
213
|
* For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).
|
|
182
214
|
*/
|
|
183
215
|
function FpSqrt(P) {
|
|
184
|
-
// P ≡ 3 (mod 4)
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
const p1div4 = (P + _1n) / _4n;
|
|
193
|
-
const root = Fp.pow(n, p1div4);
|
|
194
|
-
// Throw if root**2 != n
|
|
195
|
-
if (!Fp.eql(Fp.sqr(root), n))
|
|
196
|
-
throw new Error('Cannot find square root');
|
|
197
|
-
return root;
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
// Atkin algorithm for q ≡ 5 (mod 8), https://eprint.iacr.org/2012/685.pdf (page 10)
|
|
201
|
-
if (P % _8n === _5n) {
|
|
202
|
-
return function sqrt5mod8(Fp, n) {
|
|
203
|
-
const n2 = Fp.mul(n, _2n);
|
|
204
|
-
const c1 = (P - _5n) / _8n;
|
|
205
|
-
const v = Fp.pow(n2, c1);
|
|
206
|
-
const nv = Fp.mul(n, v);
|
|
207
|
-
const i = Fp.mul(Fp.mul(nv, _2n), v);
|
|
208
|
-
const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));
|
|
209
|
-
if (!Fp.eql(Fp.sqr(root), n))
|
|
210
|
-
throw new Error('Cannot find square root');
|
|
211
|
-
return root;
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
// P ≡ 9 (mod 16)
|
|
215
|
-
if (P % _16n === _9n) {
|
|
216
|
-
// NOTE: tonelli is too slow for bls-Fp2 calculations even on start
|
|
217
|
-
// Means we cannot use sqrt for constants at all!
|
|
218
|
-
//
|
|
219
|
-
// const c1 = Fp.sqrt(Fp.negate(Fp.ONE)); // 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F
|
|
220
|
-
// const c2 = Fp.sqrt(c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F
|
|
221
|
-
// const c3 = Fp.sqrt(Fp.negate(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F
|
|
222
|
-
// const c4 = (P + _7n) / _16n; // 4. c4 = (q + 7) / 16 # Integer arithmetic
|
|
223
|
-
// sqrt = (x) => {
|
|
224
|
-
// let tv1 = Fp.pow(x, c4); // 1. tv1 = x^c4
|
|
225
|
-
// let tv2 = Fp.mul(c1, tv1); // 2. tv2 = c1 * tv1
|
|
226
|
-
// const tv3 = Fp.mul(c2, tv1); // 3. tv3 = c2 * tv1
|
|
227
|
-
// let tv4 = Fp.mul(c3, tv1); // 4. tv4 = c3 * tv1
|
|
228
|
-
// const e1 = Fp.equals(Fp.square(tv2), x); // 5. e1 = (tv2^2) == x
|
|
229
|
-
// const e2 = Fp.equals(Fp.square(tv3), x); // 6. e2 = (tv3^2) == x
|
|
230
|
-
// tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x
|
|
231
|
-
// tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x
|
|
232
|
-
// const e3 = Fp.equals(Fp.square(tv2), x); // 9. e3 = (tv2^2) == x
|
|
233
|
-
// return Fp.cmov(tv1, tv2, e3); // 10. z = CMOV(tv1, tv2, e3) # Select the sqrt from tv1 and tv2
|
|
234
|
-
// }
|
|
235
|
-
}
|
|
236
|
-
// Other cases: Tonelli-Shanks algorithm
|
|
216
|
+
// P ≡ 3 (mod 4) => √n = n^((P+1)/4)
|
|
217
|
+
if (P % _4n === _3n)
|
|
218
|
+
return sqrt3mod4;
|
|
219
|
+
// P ≡ 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf
|
|
220
|
+
if (P % _8n === _5n)
|
|
221
|
+
return sqrt5mod8;
|
|
222
|
+
// P ≡ 9 (mod 16) not implemented, see above
|
|
223
|
+
// Tonelli-Shanks algorithm
|
|
237
224
|
return tonelliShanks(P);
|
|
238
225
|
}
|
|
239
226
|
// Little-endian check for first LE bit (last BE bit);
|
|
@@ -249,14 +236,18 @@ function validateField(field) {
|
|
|
249
236
|
const initial = {
|
|
250
237
|
ORDER: 'bigint',
|
|
251
238
|
MASK: 'bigint',
|
|
252
|
-
BYTES: '
|
|
253
|
-
BITS: '
|
|
239
|
+
BYTES: 'number',
|
|
240
|
+
BITS: 'number',
|
|
254
241
|
};
|
|
255
242
|
const opts = FIELD_FIELDS.reduce((map, val) => {
|
|
256
243
|
map[val] = 'function';
|
|
257
244
|
return map;
|
|
258
245
|
}, initial);
|
|
259
|
-
|
|
246
|
+
(0, utils_ts_1._validateObject)(field, opts);
|
|
247
|
+
// const max = 16384;
|
|
248
|
+
// if (field.BYTES < 1 || field.BYTES > max) throw new Error('invalid field');
|
|
249
|
+
// if (field.BITS < 1 || field.BITS > 8 * max) throw new Error('invalid field');
|
|
250
|
+
return field;
|
|
260
251
|
}
|
|
261
252
|
// Generic field functions
|
|
262
253
|
/**
|
|
@@ -270,7 +261,6 @@ function FpPow(Fp, num, power) {
|
|
|
270
261
|
return Fp.ONE;
|
|
271
262
|
if (power === _1n)
|
|
272
263
|
return num;
|
|
273
|
-
// @ts-ignore
|
|
274
264
|
let p = Fp.ONE;
|
|
275
265
|
let d = num;
|
|
276
266
|
while (power > _0n) {
|
|
@@ -313,55 +303,80 @@ function FpDiv(Fp, lhs, rhs) {
|
|
|
313
303
|
/**
|
|
314
304
|
* Legendre symbol.
|
|
315
305
|
* Legendre constant is used to calculate Legendre symbol (a | p)
|
|
316
|
-
* which denotes the value of a^((p-1)/2) (mod p)
|
|
306
|
+
* which denotes the value of a^((p-1)/2) (mod p).
|
|
317
307
|
*
|
|
318
308
|
* * (a | p) ≡ 1 if a is a square (mod p), quadratic residue
|
|
319
309
|
* * (a | p) ≡ -1 if a is not a square (mod p), quadratic non residue
|
|
320
310
|
* * (a | p) ≡ 0 if a ≡ 0 (mod p)
|
|
321
311
|
*/
|
|
322
312
|
function FpLegendre(Fp, n) {
|
|
323
|
-
|
|
324
|
-
|
|
313
|
+
// We can use 3rd argument as optional cache of this value
|
|
314
|
+
// but seems unneeded for now. The operation is very fast.
|
|
315
|
+
const p1mod2 = (Fp.ORDER - _1n) / _2n;
|
|
316
|
+
const powered = Fp.pow(n, p1mod2);
|
|
325
317
|
const yes = Fp.eql(powered, Fp.ONE);
|
|
326
318
|
const zero = Fp.eql(powered, Fp.ZERO);
|
|
327
319
|
const no = Fp.eql(powered, Fp.neg(Fp.ONE));
|
|
328
320
|
if (!yes && !zero && !no)
|
|
329
|
-
throw new Error('
|
|
321
|
+
throw new Error('invalid Legendre symbol result');
|
|
330
322
|
return yes ? 1 : zero ? 0 : -1;
|
|
331
323
|
}
|
|
332
324
|
// This function returns True whenever the value x is a square in the field F.
|
|
333
325
|
function FpIsSquare(Fp, n) {
|
|
334
326
|
const l = FpLegendre(Fp, n);
|
|
335
|
-
return l ===
|
|
327
|
+
return l === 1;
|
|
336
328
|
}
|
|
337
329
|
// CURVE.n lengths
|
|
338
330
|
function nLength(n, nBitLength) {
|
|
339
331
|
// Bit size, byte size of CURVE.n
|
|
340
332
|
if (nBitLength !== undefined)
|
|
341
|
-
(0,
|
|
333
|
+
(0, utils_ts_1.anumber)(nBitLength);
|
|
342
334
|
const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;
|
|
343
335
|
const nByteLength = Math.ceil(_nBitLength / 8);
|
|
344
336
|
return { nBitLength: _nBitLength, nByteLength };
|
|
345
337
|
}
|
|
346
338
|
/**
|
|
347
|
-
*
|
|
348
|
-
*
|
|
349
|
-
* *
|
|
350
|
-
* *
|
|
351
|
-
* * c) Object.freeze
|
|
339
|
+
* Creates a finite field. Major performance optimizations:
|
|
340
|
+
* * 1. Denormalized operations like mulN instead of mul.
|
|
341
|
+
* * 2. Identical object shape: never add or remove keys.
|
|
342
|
+
* * 3. `Object.freeze`.
|
|
352
343
|
* Fragile: always run a benchmark on a change.
|
|
353
344
|
* Security note: operations don't check 'isValid' for all elements for performance reasons,
|
|
354
345
|
* it is caller responsibility to check this.
|
|
355
346
|
* This is low-level code, please make sure you know what you're doing.
|
|
356
|
-
*
|
|
347
|
+
*
|
|
348
|
+
* Note about field properties:
|
|
349
|
+
* * CHARACTERISTIC p = prime number, number of elements in main subgroup.
|
|
350
|
+
* * ORDER q = similar to cofactor in curves, may be composite `q = p^m`.
|
|
351
|
+
*
|
|
352
|
+
* @param ORDER field order, probably prime, or could be composite
|
|
357
353
|
* @param bitLen how many bits the field consumes
|
|
358
|
-
* @param isLE (
|
|
354
|
+
* @param isLE (default: false) if encoding / decoding should be in little-endian
|
|
359
355
|
* @param redef optional faster redefinitions of sqrt and other methods
|
|
360
356
|
*/
|
|
361
|
-
function Field(ORDER,
|
|
357
|
+
function Field(ORDER, bitLenOrOpts, isLE = false, opts = {}) {
|
|
362
358
|
if (ORDER <= _0n)
|
|
363
359
|
throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);
|
|
364
|
-
|
|
360
|
+
let _nbitLength = undefined;
|
|
361
|
+
let _sqrt = undefined;
|
|
362
|
+
if (typeof bitLenOrOpts === 'object' && bitLenOrOpts != null) {
|
|
363
|
+
if (opts.sqrt || isLE)
|
|
364
|
+
throw new Error('cannot specify opts in two arguments');
|
|
365
|
+
const _opts = bitLenOrOpts;
|
|
366
|
+
if (_opts.BITS)
|
|
367
|
+
_nbitLength = _opts.BITS;
|
|
368
|
+
if (_opts.sqrt)
|
|
369
|
+
_sqrt = _opts.sqrt;
|
|
370
|
+
if (typeof _opts.isLE === 'boolean')
|
|
371
|
+
isLE = _opts.isLE;
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
if (typeof bitLenOrOpts === 'number')
|
|
375
|
+
_nbitLength = bitLenOrOpts;
|
|
376
|
+
if (opts.sqrt)
|
|
377
|
+
_sqrt = opts.sqrt;
|
|
378
|
+
}
|
|
379
|
+
const { nBitLength: BITS, nByteLength: BYTES } = nLength(ORDER, _nbitLength);
|
|
365
380
|
if (BYTES > 2048)
|
|
366
381
|
throw new Error('invalid field: expected ORDER of <= 2048 bytes');
|
|
367
382
|
let sqrtP; // cached sqrtP
|
|
@@ -380,6 +395,8 @@ function Field(ORDER, bitLen, isLE = false, redef = {}) {
|
|
|
380
395
|
return _0n <= num && num < ORDER; // 0 is valid element, but it's not invertible
|
|
381
396
|
},
|
|
382
397
|
is0: (num) => num === _0n,
|
|
398
|
+
// is valid and invertible
|
|
399
|
+
isValidNot0: (num) => !f.is0(num) && f.isValid(num),
|
|
383
400
|
isOdd: (num) => (num & _1n) === _1n,
|
|
384
401
|
neg: (num) => mod(-num, ORDER),
|
|
385
402
|
eql: (lhs, rhs) => lhs === rhs,
|
|
@@ -395,7 +412,7 @@ function Field(ORDER, bitLen, isLE = false, redef = {}) {
|
|
|
395
412
|
subN: (lhs, rhs) => lhs - rhs,
|
|
396
413
|
mulN: (lhs, rhs) => lhs * rhs,
|
|
397
414
|
inv: (num) => invert(num, ORDER),
|
|
398
|
-
sqrt:
|
|
415
|
+
sqrt: _sqrt ||
|
|
399
416
|
((n) => {
|
|
400
417
|
if (!sqrtP)
|
|
401
418
|
sqrtP = FpSqrt(ORDER);
|