@noble/curves 1.6.0 → 1.8.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.
- package/README.md +78 -30
- package/_shortw_utils.d.ts +8 -54
- package/_shortw_utils.d.ts.map +1 -1
- package/_shortw_utils.js +6 -2
- package/_shortw_utils.js.map +1 -1
- package/abstract/bls.d.ts +15 -11
- package/abstract/bls.d.ts.map +1 -1
- package/abstract/bls.js +26 -10
- package/abstract/bls.js.map +1 -1
- package/abstract/curve.d.ts +42 -24
- package/abstract/curve.d.ts.map +1 -1
- package/abstract/curve.js +203 -53
- package/abstract/curve.js.map +1 -1
- package/abstract/edwards.d.ts +14 -23
- package/abstract/edwards.d.ts.map +1 -1
- package/abstract/edwards.js +25 -10
- package/abstract/edwards.js.map +1 -1
- package/abstract/hash-to-curve.d.ts +28 -8
- package/abstract/hash-to-curve.d.ts.map +1 -1
- package/abstract/hash-to-curve.js +18 -14
- package/abstract/hash-to-curve.js.map +1 -1
- package/abstract/modular.d.ts +30 -5
- package/abstract/modular.d.ts.map +1 -1
- package/abstract/modular.js +68 -37
- package/abstract/modular.js.map +1 -1
- package/abstract/montgomery.d.ts.map +1 -1
- package/abstract/montgomery.js +11 -4
- package/abstract/montgomery.js.map +1 -1
- package/abstract/poseidon.d.ts +9 -0
- package/abstract/poseidon.d.ts.map +1 -1
- package/abstract/poseidon.js +31 -23
- package/abstract/poseidon.js.map +1 -1
- package/abstract/tower.d.ts +13 -1
- package/abstract/tower.d.ts.map +1 -1
- package/abstract/tower.js +20 -17
- package/abstract/tower.js.map +1 -1
- package/abstract/utils.d.ts +10 -5
- package/abstract/utils.d.ts.map +1 -1
- package/abstract/utils.js +26 -24
- package/abstract/utils.js.map +1 -1
- package/abstract/weierstrass.d.ts +47 -80
- package/abstract/weierstrass.d.ts.map +1 -1
- package/abstract/weierstrass.js +88 -43
- package/abstract/weierstrass.js.map +1 -1
- package/bls12-381.d.ts +11 -0
- package/bls12-381.d.ts.map +1 -1
- package/bls12-381.js +80 -67
- package/bls12-381.js.map +1 -1
- package/bn254.d.ts +5 -3
- package/bn254.d.ts.map +1 -1
- package/bn254.js +33 -27
- package/bn254.js.map +1 -1
- package/ed25519.d.ts +24 -4
- package/ed25519.d.ts.map +1 -1
- package/ed25519.js +30 -6
- package/ed25519.js.map +1 -1
- package/ed448.d.ts +23 -8
- package/ed448.d.ts.map +1 -1
- package/ed448.js +31 -9
- package/ed448.js.map +1 -1
- package/esm/_shortw_utils.d.ts +8 -54
- package/esm/_shortw_utils.d.ts.map +1 -1
- package/esm/_shortw_utils.js +6 -2
- package/esm/_shortw_utils.js.map +1 -1
- package/esm/abstract/bls.d.ts +15 -11
- package/esm/abstract/bls.d.ts.map +1 -1
- package/esm/abstract/bls.js +26 -10
- package/esm/abstract/bls.js.map +1 -1
- package/esm/abstract/curve.d.ts +42 -24
- package/esm/abstract/curve.d.ts.map +1 -1
- package/esm/abstract/curve.js +202 -53
- package/esm/abstract/curve.js.map +1 -1
- package/esm/abstract/edwards.d.ts +14 -23
- package/esm/abstract/edwards.d.ts.map +1 -1
- package/esm/abstract/edwards.js +25 -10
- package/esm/abstract/edwards.js.map +1 -1
- package/esm/abstract/hash-to-curve.d.ts +28 -8
- package/esm/abstract/hash-to-curve.d.ts.map +1 -1
- package/esm/abstract/hash-to-curve.js +18 -14
- package/esm/abstract/hash-to-curve.js.map +1 -1
- package/esm/abstract/modular.d.ts +30 -5
- package/esm/abstract/modular.d.ts.map +1 -1
- package/esm/abstract/modular.js +68 -37
- package/esm/abstract/modular.js.map +1 -1
- package/esm/abstract/montgomery.d.ts.map +1 -1
- package/esm/abstract/montgomery.js +11 -4
- package/esm/abstract/montgomery.js.map +1 -1
- package/esm/abstract/poseidon.d.ts +9 -0
- package/esm/abstract/poseidon.d.ts.map +1 -1
- package/esm/abstract/poseidon.js +31 -23
- package/esm/abstract/poseidon.js.map +1 -1
- package/esm/abstract/tower.d.ts +13 -1
- package/esm/abstract/tower.d.ts.map +1 -1
- package/esm/abstract/tower.js +20 -17
- package/esm/abstract/tower.js.map +1 -1
- package/esm/abstract/utils.d.ts +10 -5
- package/esm/abstract/utils.d.ts.map +1 -1
- package/esm/abstract/utils.js +25 -23
- package/esm/abstract/utils.js.map +1 -1
- package/esm/abstract/weierstrass.d.ts +47 -80
- package/esm/abstract/weierstrass.d.ts.map +1 -1
- package/esm/abstract/weierstrass.js +86 -42
- package/esm/abstract/weierstrass.js.map +1 -1
- package/esm/bls12-381.d.ts +11 -0
- package/esm/bls12-381.d.ts.map +1 -1
- package/esm/bls12-381.js +80 -67
- package/esm/bls12-381.js.map +1 -1
- package/esm/bn254.d.ts +5 -3
- package/esm/bn254.d.ts.map +1 -1
- package/esm/bn254.js +31 -26
- package/esm/bn254.js.map +1 -1
- package/esm/ed25519.d.ts +24 -4
- package/esm/ed25519.d.ts.map +1 -1
- package/esm/ed25519.js +31 -7
- package/esm/ed25519.js.map +1 -1
- package/esm/ed448.d.ts +23 -8
- package/esm/ed448.d.ts.map +1 -1
- package/esm/ed448.js +32 -10
- package/esm/ed448.js.map +1 -1
- package/esm/index.js +4 -0
- package/esm/index.js.map +1 -1
- package/esm/jubjub.d.ts +4 -8
- package/esm/jubjub.d.ts.map +1 -1
- package/esm/jubjub.js +6 -5
- package/esm/jubjub.js.map +1 -1
- package/esm/p256.d.ts +10 -104
- package/esm/p256.d.ts.map +1 -1
- package/esm/p256.js +15 -8
- package/esm/p256.js.map +1 -1
- package/esm/p384.d.ts +10 -104
- package/esm/p384.d.ts.map +1 -1
- package/esm/p384.js +15 -8
- package/esm/p384.js.map +1 -1
- package/esm/p521.d.ts +11 -104
- package/esm/p521.d.ts.map +1 -1
- package/esm/p521.js +18 -10
- package/esm/p521.js.map +1 -1
- package/esm/pasta.d.ts +5 -2
- package/esm/pasta.d.ts.map +1 -1
- package/esm/pasta.js +6 -2
- package/esm/pasta.js.map +1 -1
- package/esm/secp256k1.d.ts +29 -57
- package/esm/secp256k1.d.ts.map +1 -1
- package/esm/secp256k1.js +41 -15
- package/esm/secp256k1.js.map +1 -1
- package/index.js +4 -0
- package/index.js.map +1 -1
- package/jubjub.d.ts +4 -8
- package/jubjub.d.ts.map +1 -1
- package/jubjub.js +6 -5
- package/jubjub.js.map +1 -1
- package/p256.d.ts +10 -104
- package/p256.d.ts.map +1 -1
- package/p256.js +15 -8
- package/p256.js.map +1 -1
- package/p384.d.ts +10 -104
- package/p384.d.ts.map +1 -1
- package/p384.js +15 -8
- package/p384.js.map +1 -1
- package/p521.d.ts +11 -104
- package/p521.d.ts.map +1 -1
- package/p521.js +18 -10
- package/p521.js.map +1 -1
- package/package.json +11 -8
- package/pasta.d.ts +5 -2
- package/pasta.d.ts.map +1 -1
- package/pasta.js +6 -2
- package/pasta.js.map +1 -1
- package/secp256k1.d.ts +29 -57
- package/secp256k1.d.ts.map +1 -1
- package/secp256k1.js +41 -15
- package/secp256k1.js.map +1 -1
- package/src/_shortw_utils.ts +18 -8
- package/src/abstract/bls.ts +42 -30
- package/src/abstract/curve.ts +237 -55
- package/src/abstract/edwards.ts +36 -15
- package/src/abstract/hash-to-curve.ts +43 -21
- package/src/abstract/modular.ts +84 -46
- package/src/abstract/montgomery.ts +12 -4
- package/src/abstract/poseidon.ts +48 -30
- package/src/abstract/tower.ts +66 -20
- package/src/abstract/utils.ts +44 -43
- package/src/abstract/weierstrass.ts +125 -70
- package/src/bls12-381.ts +80 -68
- package/src/bn254.ts +47 -30
- package/src/ed25519.ts +50 -20
- package/src/ed448.ts +49 -22
- package/src/index.ts +4 -0
- package/src/jubjub.ts +10 -10
- package/src/p256.ts +21 -15
- package/src/p384.ts +21 -15
- package/src/p521.ts +24 -17
- package/src/pasta.ts +15 -7
- package/src/secp256k1.ts +63 -21
package/esm/abstract/curve.js
CHANGED
|
@@ -1,44 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Methods for elliptic curve multiplication by scalars.
|
|
3
|
+
* Contains wNAF, pippenger
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
1
6
|
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
2
|
-
// Abelian group utilities
|
|
3
7
|
import { validateField, nLength } from './modular.js';
|
|
4
8
|
import { validateObject, bitLen } from './utils.js';
|
|
5
9
|
const _0n = BigInt(0);
|
|
6
10
|
const _1n = BigInt(1);
|
|
11
|
+
function constTimeNegate(condition, item) {
|
|
12
|
+
const neg = item.negate();
|
|
13
|
+
return condition ? neg : item;
|
|
14
|
+
}
|
|
15
|
+
function validateW(W, bits) {
|
|
16
|
+
if (!Number.isSafeInteger(W) || W <= 0 || W > bits)
|
|
17
|
+
throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);
|
|
18
|
+
}
|
|
19
|
+
function calcWOpts(W, bits) {
|
|
20
|
+
validateW(W, bits);
|
|
21
|
+
const windows = Math.ceil(bits / W) + 1; // +1, because
|
|
22
|
+
const windowSize = 2 ** (W - 1); // -1 because we skip zero
|
|
23
|
+
return { windows, windowSize };
|
|
24
|
+
}
|
|
25
|
+
function validateMSMPoints(points, c) {
|
|
26
|
+
if (!Array.isArray(points))
|
|
27
|
+
throw new Error('array expected');
|
|
28
|
+
points.forEach((p, i) => {
|
|
29
|
+
if (!(p instanceof c))
|
|
30
|
+
throw new Error('invalid point at index ' + i);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function validateMSMScalars(scalars, field) {
|
|
34
|
+
if (!Array.isArray(scalars))
|
|
35
|
+
throw new Error('array of scalars expected');
|
|
36
|
+
scalars.forEach((s, i) => {
|
|
37
|
+
if (!field.isValid(s))
|
|
38
|
+
throw new Error('invalid scalar at index ' + i);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
7
41
|
// Since points in different groups cannot be equal (different object constructor),
|
|
8
42
|
// we can have single place to store precomputes
|
|
9
43
|
const pointPrecomputes = new WeakMap();
|
|
10
44
|
const pointWindowSizes = new WeakMap(); // This allows use make points immutable (nothing changes inside)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
45
|
+
function getW(P) {
|
|
46
|
+
return pointWindowSizes.get(P) || 1;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Elliptic curve multiplication of Point by scalar. Fragile.
|
|
50
|
+
* Scalars should always be less than curve order: this should be checked inside of a curve itself.
|
|
51
|
+
* Creates precomputation tables for fast multiplication:
|
|
52
|
+
* - private scalar is split by fixed size windows of W bits
|
|
53
|
+
* - every window point is collected from window's table & added to accumulator
|
|
54
|
+
* - since windows are different, same point inside tables won't be accessed more than once per calc
|
|
55
|
+
* - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)
|
|
56
|
+
* - +1 window is neccessary for wNAF
|
|
57
|
+
* - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication
|
|
58
|
+
*
|
|
59
|
+
* @todo Research returning 2d JS array of windows, instead of a single window.
|
|
60
|
+
* This would allow windows to be in different memory locations
|
|
61
|
+
*/
|
|
22
62
|
export function wNAF(c, bits) {
|
|
23
|
-
const constTimeNegate = (condition, item) => {
|
|
24
|
-
const neg = item.negate();
|
|
25
|
-
return condition ? neg : item;
|
|
26
|
-
};
|
|
27
|
-
const validateW = (W) => {
|
|
28
|
-
if (!Number.isSafeInteger(W) || W <= 0 || W > bits)
|
|
29
|
-
throw new Error(`Wrong window size=${W}, should be [1..${bits}]`);
|
|
30
|
-
};
|
|
31
|
-
const opts = (W) => {
|
|
32
|
-
validateW(W);
|
|
33
|
-
const windows = Math.ceil(bits / W) + 1; // +1, because
|
|
34
|
-
const windowSize = 2 ** (W - 1); // -1 because we skip zero
|
|
35
|
-
return { windows, windowSize };
|
|
36
|
-
};
|
|
37
63
|
return {
|
|
38
64
|
constTimeNegate,
|
|
65
|
+
hasPrecomputes(elm) {
|
|
66
|
+
return getW(elm) !== 1;
|
|
67
|
+
},
|
|
39
68
|
// non-const time multiplication ladder
|
|
40
|
-
unsafeLadder(elm, n) {
|
|
41
|
-
let p = c.ZERO;
|
|
69
|
+
unsafeLadder(elm, n, p = c.ZERO) {
|
|
42
70
|
let d = elm;
|
|
43
71
|
while (n > _0n) {
|
|
44
72
|
if (n & _1n)
|
|
@@ -56,10 +84,12 @@ export function wNAF(c, bits) {
|
|
|
56
84
|
* - 𝑊 is the window size
|
|
57
85
|
* - 𝑛 is the bitlength of the curve order.
|
|
58
86
|
* For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.
|
|
87
|
+
* @param elm Point instance
|
|
88
|
+
* @param W window size
|
|
59
89
|
* @returns precomputed point tables flattened to a single array
|
|
60
90
|
*/
|
|
61
91
|
precomputeWindow(elm, W) {
|
|
62
|
-
const { windows, windowSize } =
|
|
92
|
+
const { windows, windowSize } = calcWOpts(W, bits);
|
|
63
93
|
const points = [];
|
|
64
94
|
let p = elm;
|
|
65
95
|
let base = p;
|
|
@@ -85,7 +115,7 @@ export function wNAF(c, bits) {
|
|
|
85
115
|
wNAF(W, precomputes, n) {
|
|
86
116
|
// TODO: maybe check that scalar is less than group order? wNAF behavious is undefined otherwise
|
|
87
117
|
// But need to carefully remove other checks before wNAF. ORDER == bits here
|
|
88
|
-
const { windows, windowSize } =
|
|
118
|
+
const { windows, windowSize } = calcWOpts(W, bits);
|
|
89
119
|
let p = c.ZERO;
|
|
90
120
|
let f = c.BASE;
|
|
91
121
|
const mask = BigInt(2 ** W - 1); // Create mask with W ones: 0b1111 for W=4 etc.
|
|
@@ -129,8 +159,44 @@ export function wNAF(c, bits) {
|
|
|
129
159
|
// which makes it less const-time: around 1 bigint multiply.
|
|
130
160
|
return { p, f };
|
|
131
161
|
},
|
|
132
|
-
|
|
133
|
-
|
|
162
|
+
/**
|
|
163
|
+
* Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.
|
|
164
|
+
* @param W window size
|
|
165
|
+
* @param precomputes precomputed tables
|
|
166
|
+
* @param n scalar (we don't check here, but should be less than curve order)
|
|
167
|
+
* @param acc accumulator point to add result of multiplication
|
|
168
|
+
* @returns point
|
|
169
|
+
*/
|
|
170
|
+
wNAFUnsafe(W, precomputes, n, acc = c.ZERO) {
|
|
171
|
+
const { windows, windowSize } = calcWOpts(W, bits);
|
|
172
|
+
const mask = BigInt(2 ** W - 1); // Create mask with W ones: 0b1111 for W=4 etc.
|
|
173
|
+
const maxNumber = 2 ** W;
|
|
174
|
+
const shiftBy = BigInt(W);
|
|
175
|
+
for (let window = 0; window < windows; window++) {
|
|
176
|
+
const offset = window * windowSize;
|
|
177
|
+
if (n === _0n)
|
|
178
|
+
break; // No need to go over empty scalar
|
|
179
|
+
// Extract W bits.
|
|
180
|
+
let wbits = Number(n & mask);
|
|
181
|
+
// Shift number by W bits.
|
|
182
|
+
n >>= shiftBy;
|
|
183
|
+
// If the bits are bigger than max size, we'll split those.
|
|
184
|
+
// +224 => 256 - 32
|
|
185
|
+
if (wbits > windowSize) {
|
|
186
|
+
wbits -= maxNumber;
|
|
187
|
+
n += _1n;
|
|
188
|
+
}
|
|
189
|
+
if (wbits === 0)
|
|
190
|
+
continue;
|
|
191
|
+
let curr = precomputes[offset + Math.abs(wbits) - 1]; // -1 because we skip zero
|
|
192
|
+
if (wbits < 0)
|
|
193
|
+
curr = curr.negate();
|
|
194
|
+
// NOTE: by re-using acc, we can save a lot of additions in case of MSM
|
|
195
|
+
acc = acc.add(curr);
|
|
196
|
+
}
|
|
197
|
+
return acc;
|
|
198
|
+
},
|
|
199
|
+
getPrecomputes(W, P, transform) {
|
|
134
200
|
// Calculate precomputes on a first run, reuse them after
|
|
135
201
|
let comp = pointPrecomputes.get(P);
|
|
136
202
|
if (!comp) {
|
|
@@ -138,62 +204,66 @@ export function wNAF(c, bits) {
|
|
|
138
204
|
if (W !== 1)
|
|
139
205
|
pointPrecomputes.set(P, transform(comp));
|
|
140
206
|
}
|
|
141
|
-
return
|
|
207
|
+
return comp;
|
|
208
|
+
},
|
|
209
|
+
wNAFCached(P, n, transform) {
|
|
210
|
+
const W = getW(P);
|
|
211
|
+
return this.wNAF(W, this.getPrecomputes(W, P, transform), n);
|
|
212
|
+
},
|
|
213
|
+
wNAFCachedUnsafe(P, n, transform, prev) {
|
|
214
|
+
const W = getW(P);
|
|
215
|
+
if (W === 1)
|
|
216
|
+
return this.unsafeLadder(P, n, prev); // For W=1 ladder is ~x2 faster
|
|
217
|
+
return this.wNAFUnsafe(W, this.getPrecomputes(W, P, transform), n, prev);
|
|
142
218
|
},
|
|
143
219
|
// We calculate precomputes for elliptic curve point multiplication
|
|
144
220
|
// using windowed method. This specifies window size and
|
|
145
221
|
// stores precomputed values. Usually only base point would be precomputed.
|
|
146
222
|
setWindowSize(P, W) {
|
|
147
|
-
validateW(W);
|
|
223
|
+
validateW(W, bits);
|
|
148
224
|
pointWindowSizes.set(P, W);
|
|
149
225
|
pointPrecomputes.delete(P);
|
|
150
226
|
},
|
|
151
227
|
};
|
|
152
228
|
}
|
|
153
229
|
/**
|
|
154
|
-
* Pippenger algorithm for multi-scalar multiplication (MSM).
|
|
155
|
-
* MSM is basically (Pa + Qb + Rc + ...).
|
|
230
|
+
* Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).
|
|
156
231
|
* 30x faster vs naive addition on L=4096, 10x faster with precomputes.
|
|
157
232
|
* For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.
|
|
158
233
|
* Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.
|
|
159
234
|
* @param c Curve Point constructor
|
|
160
|
-
* @param
|
|
235
|
+
* @param fieldN field over CURVE.N - important that it's not over CURVE.P
|
|
161
236
|
* @param points array of L curve points
|
|
162
237
|
* @param scalars array of L scalars (aka private keys / bigints)
|
|
163
238
|
*/
|
|
164
|
-
export function pippenger(c,
|
|
239
|
+
export function pippenger(c, fieldN, points, scalars) {
|
|
165
240
|
// If we split scalars by some window (let's say 8 bits), every chunk will only
|
|
166
241
|
// take 256 buckets even if there are 4096 scalars, also re-uses double.
|
|
167
242
|
// TODO:
|
|
168
243
|
// - https://eprint.iacr.org/2024/750.pdf
|
|
169
244
|
// - https://tches.iacr.org/index.php/TCHES/article/view/10287
|
|
170
245
|
// 0 is accepted in scalars
|
|
171
|
-
|
|
246
|
+
validateMSMPoints(points, c);
|
|
247
|
+
validateMSMScalars(scalars, fieldN);
|
|
248
|
+
if (points.length !== scalars.length)
|
|
172
249
|
throw new Error('arrays of points and scalars must have equal length');
|
|
173
|
-
|
|
174
|
-
if (!field.isValid(s))
|
|
175
|
-
throw new Error(`wrong scalar at index ${i}`);
|
|
176
|
-
});
|
|
177
|
-
points.forEach((p, i) => {
|
|
178
|
-
if (!(p instanceof c))
|
|
179
|
-
throw new Error(`wrong point at index ${i}`);
|
|
180
|
-
});
|
|
250
|
+
const zero = c.ZERO;
|
|
181
251
|
const wbits = bitLen(BigInt(points.length));
|
|
182
252
|
const windowSize = wbits > 12 ? wbits - 3 : wbits > 4 ? wbits - 2 : wbits ? 2 : 1; // in bits
|
|
183
253
|
const MASK = (1 << windowSize) - 1;
|
|
184
|
-
const buckets = new Array(MASK + 1).fill(
|
|
185
|
-
const lastBits = Math.floor((
|
|
186
|
-
let sum =
|
|
254
|
+
const buckets = new Array(MASK + 1).fill(zero); // +1 for zero array
|
|
255
|
+
const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;
|
|
256
|
+
let sum = zero;
|
|
187
257
|
for (let i = lastBits; i >= 0; i -= windowSize) {
|
|
188
|
-
buckets.fill(
|
|
258
|
+
buckets.fill(zero);
|
|
189
259
|
for (let j = 0; j < scalars.length; j++) {
|
|
190
260
|
const scalar = scalars[j];
|
|
191
261
|
const wbits = Number((scalar >> BigInt(i)) & BigInt(MASK));
|
|
192
262
|
buckets[wbits] = buckets[wbits].add(points[j]);
|
|
193
263
|
}
|
|
194
|
-
let resI =
|
|
264
|
+
let resI = zero; // not using this will do small speed-up, but will lose ct
|
|
195
265
|
// Skip first bucket, because it is zero
|
|
196
|
-
for (let j = buckets.length - 1, sumI =
|
|
266
|
+
for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {
|
|
197
267
|
sumI = sumI.add(buckets[j]);
|
|
198
268
|
resI = resI.add(sumI);
|
|
199
269
|
}
|
|
@@ -204,6 +274,85 @@ export function pippenger(c, field, points, scalars) {
|
|
|
204
274
|
}
|
|
205
275
|
return sum;
|
|
206
276
|
}
|
|
277
|
+
/**
|
|
278
|
+
* Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).
|
|
279
|
+
* @param c Curve Point constructor
|
|
280
|
+
* @param fieldN field over CURVE.N - important that it's not over CURVE.P
|
|
281
|
+
* @param points array of L curve points
|
|
282
|
+
* @returns function which multiplies points with scaars
|
|
283
|
+
*/
|
|
284
|
+
export function precomputeMSMUnsafe(c, fieldN, points, windowSize) {
|
|
285
|
+
/**
|
|
286
|
+
* Performance Analysis of Window-based Precomputation
|
|
287
|
+
*
|
|
288
|
+
* Base Case (256-bit scalar, 8-bit window):
|
|
289
|
+
* - Standard precomputation requires:
|
|
290
|
+
* - 31 additions per scalar × 256 scalars = 7,936 ops
|
|
291
|
+
* - Plus 255 summary additions = 8,191 total ops
|
|
292
|
+
* Note: Summary additions can be optimized via accumulator
|
|
293
|
+
*
|
|
294
|
+
* Chunked Precomputation Analysis:
|
|
295
|
+
* - Using 32 chunks requires:
|
|
296
|
+
* - 255 additions per chunk
|
|
297
|
+
* - 256 doublings
|
|
298
|
+
* - Total: (255 × 32) + 256 = 8,416 ops
|
|
299
|
+
*
|
|
300
|
+
* Memory Usage Comparison:
|
|
301
|
+
* Window Size | Standard Points | Chunked Points
|
|
302
|
+
* ------------|-----------------|---------------
|
|
303
|
+
* 4-bit | 520 | 15
|
|
304
|
+
* 8-bit | 4,224 | 255
|
|
305
|
+
* 10-bit | 13,824 | 1,023
|
|
306
|
+
* 16-bit | 557,056 | 65,535
|
|
307
|
+
*
|
|
308
|
+
* Key Advantages:
|
|
309
|
+
* 1. Enables larger window sizes due to reduced memory overhead
|
|
310
|
+
* 2. More efficient for smaller scalar counts:
|
|
311
|
+
* - 16 chunks: (16 × 255) + 256 = 4,336 ops
|
|
312
|
+
* - ~2x faster than standard 8,191 ops
|
|
313
|
+
*
|
|
314
|
+
* Limitations:
|
|
315
|
+
* - Not suitable for plain precomputes (requires 256 constant doublings)
|
|
316
|
+
* - Performance degrades with larger scalar counts:
|
|
317
|
+
* - Optimal for ~256 scalars
|
|
318
|
+
* - Less efficient for 4096+ scalars (Pippenger preferred)
|
|
319
|
+
*/
|
|
320
|
+
validateW(windowSize, fieldN.BITS);
|
|
321
|
+
validateMSMPoints(points, c);
|
|
322
|
+
const zero = c.ZERO;
|
|
323
|
+
const tableSize = 2 ** windowSize - 1; // table size (without zero)
|
|
324
|
+
const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item
|
|
325
|
+
const MASK = BigInt((1 << windowSize) - 1);
|
|
326
|
+
const tables = points.map((p) => {
|
|
327
|
+
const res = [];
|
|
328
|
+
for (let i = 0, acc = p; i < tableSize; i++) {
|
|
329
|
+
res.push(acc);
|
|
330
|
+
acc = acc.add(p);
|
|
331
|
+
}
|
|
332
|
+
return res;
|
|
333
|
+
});
|
|
334
|
+
return (scalars) => {
|
|
335
|
+
validateMSMScalars(scalars, fieldN);
|
|
336
|
+
if (scalars.length > points.length)
|
|
337
|
+
throw new Error('array of scalars must be smaller than array of points');
|
|
338
|
+
let res = zero;
|
|
339
|
+
for (let i = 0; i < chunks; i++) {
|
|
340
|
+
// No need to double if accumulator is still zero.
|
|
341
|
+
if (res !== zero)
|
|
342
|
+
for (let j = 0; j < windowSize; j++)
|
|
343
|
+
res = res.double();
|
|
344
|
+
const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);
|
|
345
|
+
for (let j = 0; j < scalars.length; j++) {
|
|
346
|
+
const n = scalars[j];
|
|
347
|
+
const curr = Number((n >> shiftBy) & MASK);
|
|
348
|
+
if (!curr)
|
|
349
|
+
continue; // skip zero scalars chunks
|
|
350
|
+
res = res.add(tables[j][curr - 1]);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return res;
|
|
354
|
+
};
|
|
355
|
+
}
|
|
207
356
|
export function validateBasic(curve) {
|
|
208
357
|
validateField(curve.Fp);
|
|
209
358
|
validateObject(curve, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"curve.js","sourceRoot":"","sources":["../../src/abstract/curve.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"curve.js","sourceRoot":"","sources":["../../src/abstract/curve.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Twisted Edwards curve. The formula is: ax² + y² = 1 + dx²y².
|
|
3
|
+
* For design rationale of types / exports, see weierstrass module documentation.
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
1
6
|
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
2
7
|
import { AffinePoint, BasicCurve, Group, GroupConstructor } from './curve.js';
|
|
3
8
|
import { FHash, Hex } from './utils.js';
|
|
9
|
+
/** Edwards curves must declare params a & d. */
|
|
4
10
|
export type CurveType = BasicCurve<bigint> & {
|
|
5
11
|
a: bigint;
|
|
6
12
|
d: bigint;
|
|
@@ -15,30 +21,12 @@ export type CurveType = BasicCurve<bigint> & {
|
|
|
15
21
|
prehash?: FHash;
|
|
16
22
|
mapToCurve?: (scalar: bigint[]) => AffinePoint<bigint>;
|
|
17
23
|
};
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
readonly Fp: import("./modular.js").IField<bigint>;
|
|
22
|
-
readonly n: bigint;
|
|
23
|
-
readonly h: bigint;
|
|
24
|
-
readonly hEff?: bigint;
|
|
25
|
-
readonly Gx: bigint;
|
|
26
|
-
readonly Gy: bigint;
|
|
27
|
-
readonly allowInfinityPoint?: boolean;
|
|
28
|
-
readonly a: bigint;
|
|
29
|
-
readonly d: bigint;
|
|
30
|
-
readonly hash: FHash;
|
|
31
|
-
readonly randomBytes: (bytesLength?: number) => Uint8Array;
|
|
32
|
-
readonly adjustScalarBytes?: (bytes: Uint8Array) => Uint8Array;
|
|
33
|
-
readonly domain?: (data: Uint8Array, ctx: Uint8Array, phflag: boolean) => Uint8Array;
|
|
34
|
-
readonly uvRatio?: (u: bigint, v: bigint) => {
|
|
35
|
-
isValid: boolean;
|
|
36
|
-
value: bigint;
|
|
37
|
-
};
|
|
38
|
-
readonly prehash?: FHash;
|
|
39
|
-
readonly mapToCurve?: (scalar: bigint[]) => AffinePoint<bigint>;
|
|
40
|
-
readonly p: bigint;
|
|
24
|
+
export type CurveTypeWithLength = Readonly<CurveType & {
|
|
25
|
+
nByteLength: number;
|
|
26
|
+
nBitLength: number;
|
|
41
27
|
}>;
|
|
28
|
+
declare function validateOpts(curve: CurveType): CurveTypeWithLength;
|
|
29
|
+
/** Instance of Extended Point with coordinates in X, Y, Z, T. */
|
|
42
30
|
export interface ExtPointType extends Group<ExtPointType> {
|
|
43
31
|
readonly ex: bigint;
|
|
44
32
|
readonly ey: bigint;
|
|
@@ -55,7 +43,9 @@ export interface ExtPointType extends Group<ExtPointType> {
|
|
|
55
43
|
toAffine(iz?: bigint): AffinePoint<bigint>;
|
|
56
44
|
toRawBytes(isCompressed?: boolean): Uint8Array;
|
|
57
45
|
toHex(isCompressed?: boolean): string;
|
|
46
|
+
_setWindowSize(windowSize: number): void;
|
|
58
47
|
}
|
|
48
|
+
/** Static methods of Extended Point with coordinates in X, Y, Z, T. */
|
|
59
49
|
export interface ExtPointConstructor extends GroupConstructor<ExtPointType> {
|
|
60
50
|
new (x: bigint, y: bigint, z: bigint, t: bigint): ExtPointType;
|
|
61
51
|
fromAffine(p: AffinePoint<bigint>): ExtPointType;
|
|
@@ -87,6 +77,7 @@ export type CurveFn = {
|
|
|
87
77
|
point: ExtPointType;
|
|
88
78
|
pointBytes: Uint8Array;
|
|
89
79
|
};
|
|
80
|
+
precompute: (windowSize?: number, point?: ExtPointType) => ExtPointType;
|
|
90
81
|
};
|
|
91
82
|
};
|
|
92
83
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edwards.d.ts","sourceRoot":"","sources":["../../src/abstract/edwards.ts"],"names":[],"mappings":"AAAA,sEAAsE;
|
|
1
|
+
{"version":3,"file":"edwards.d.ts","sourceRoot":"","sources":["../../src/abstract/edwards.ts"],"names":[],"mappings":"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"}
|
package/esm/abstract/edwards.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Twisted Edwards curve. The formula is: ax² + y² = 1 + dx²y².
|
|
3
|
+
* For design rationale of types / exports, see weierstrass module documentation.
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
1
6
|
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
2
|
-
// Twisted Edwards curve. The formula is: ax² + y² = 1 + dx²y²
|
|
3
7
|
import { validateBasic, wNAF, pippenger, } from './curve.js';
|
|
4
8
|
import { mod, Field } from './modular.js';
|
|
5
9
|
import * as ut from './utils.js';
|
|
@@ -35,6 +39,10 @@ function validateOpts(curve) {
|
|
|
35
39
|
export function twistedEdwards(curveDef) {
|
|
36
40
|
const CURVE = validateOpts(curveDef);
|
|
37
41
|
const { Fp, n: CURVE_ORDER, prehash: prehash, hash: cHash, randomBytes, nByteLength, h: cofactor, } = CURVE;
|
|
42
|
+
// Important:
|
|
43
|
+
// There are some places where Fp.BYTES is used instead of nByteLength.
|
|
44
|
+
// So far, everything has been tested with curves of Fp.BYTES == nByteLength.
|
|
45
|
+
// TODO: test and find curves which behave otherwise.
|
|
38
46
|
const MASK = _2n << (BigInt(nByteLength * 8) - _1n);
|
|
39
47
|
const modP = Fp.create; // Function overrides
|
|
40
48
|
const Fn = Field(CURVE.n, CURVE.nBitLength);
|
|
@@ -248,16 +256,15 @@ export function twistedEdwards(curveDef) {
|
|
|
248
256
|
// It's faster, but should only be used when you don't care about
|
|
249
257
|
// an exposed private key e.g. sig verification.
|
|
250
258
|
// Does NOT allow scalars higher than CURVE.n.
|
|
251
|
-
|
|
259
|
+
// Accepts optional accumulator to merge with multiply (important for sparse scalars)
|
|
260
|
+
multiplyUnsafe(scalar, acc = Point.ZERO) {
|
|
252
261
|
const n = scalar;
|
|
253
262
|
ut.aInRange('scalar', n, _0n, CURVE_ORDER); // 0 <= scalar < L
|
|
254
263
|
if (n === _0n)
|
|
255
264
|
return I;
|
|
256
|
-
if (this.
|
|
265
|
+
if (this.is0() || n === _1n)
|
|
257
266
|
return this;
|
|
258
|
-
|
|
259
|
-
return this.wNAF(n).p;
|
|
260
|
-
return wnaf.unsafeLadder(this, n);
|
|
267
|
+
return wnaf.wNAFCachedUnsafe(this, n, Point.normalizeZ, acc);
|
|
261
268
|
}
|
|
262
269
|
// Checks if point is of small order.
|
|
263
270
|
// If you add something to small order point, you will have "dirty"
|
|
@@ -293,6 +300,7 @@ export function twistedEdwards(curveDef) {
|
|
|
293
300
|
const lastByte = hex[len - 1]; // select last byte
|
|
294
301
|
normed[len - 1] = lastByte & ~0x80; // clear last bit
|
|
295
302
|
const y = ut.bytesToNumberLE(normed);
|
|
303
|
+
// zip215=true is good for consensus-critical apps. =false follows RFC8032 / NIST186-5.
|
|
296
304
|
// RFC8032 prohibits >= p, but ZIP215 doesn't
|
|
297
305
|
// zip215=true: 0 <= y < MASK (2^256 for ed25519)
|
|
298
306
|
// zip215=false: 0 <= y < P (2^255-19 for ed25519)
|
|
@@ -341,7 +349,7 @@ export function twistedEdwards(curveDef) {
|
|
|
341
349
|
}
|
|
342
350
|
/** Convenience method that creates public key and other stuff. RFC8032 5.1.5 */
|
|
343
351
|
function getExtendedPublicKey(key) {
|
|
344
|
-
const len =
|
|
352
|
+
const len = Fp.BYTES;
|
|
345
353
|
key = ensureBytes('private key', key, len);
|
|
346
354
|
// Hash private key with curve's hash function to produce uniformingly random input
|
|
347
355
|
// Check byte lengths: ensure(64, h(ensure(32, key)))
|
|
@@ -374,23 +382,29 @@ export function twistedEdwards(curveDef) {
|
|
|
374
382
|
const s = modN(r + k * scalar); // S = (r + k * s) mod L
|
|
375
383
|
ut.aInRange('signature.s', s, _0n, CURVE_ORDER); // 0 <= s < l
|
|
376
384
|
const res = ut.concatBytes(R, ut.numberToBytesLE(s, Fp.BYTES));
|
|
377
|
-
return ensureBytes('result', res,
|
|
385
|
+
return ensureBytes('result', res, Fp.BYTES * 2); // 64-byte signature
|
|
378
386
|
}
|
|
379
387
|
const verifyOpts = VERIFY_DEFAULT;
|
|
388
|
+
/**
|
|
389
|
+
* Verifies EdDSA signature against message and public key. RFC8032 5.1.7.
|
|
390
|
+
* An extended group equation is checked.
|
|
391
|
+
*/
|
|
380
392
|
function verify(sig, msg, publicKey, options = verifyOpts) {
|
|
381
393
|
const { context, zip215 } = options;
|
|
382
394
|
const len = Fp.BYTES; // Verifies EdDSA signature against message and public key. RFC8032 5.1.7.
|
|
383
395
|
sig = ensureBytes('signature', sig, 2 * len); // An extended group equation is checked.
|
|
384
396
|
msg = ensureBytes('message', msg);
|
|
397
|
+
publicKey = ensureBytes('publicKey', publicKey, len);
|
|
385
398
|
if (zip215 !== undefined)
|
|
386
399
|
abool('zip215', zip215);
|
|
387
400
|
if (prehash)
|
|
388
401
|
msg = prehash(msg); // for ed25519ph, etc
|
|
389
402
|
const s = ut.bytesToNumberLE(sig.slice(len, 2 * len));
|
|
390
|
-
// zip215: true is good for consensus-critical apps and allows points < 2^256
|
|
391
|
-
// zip215: false follows RFC8032 / NIST186-5 and restricts points to CURVE.p
|
|
392
403
|
let A, R, SB;
|
|
393
404
|
try {
|
|
405
|
+
// zip215=true is good for consensus-critical apps. =false follows RFC8032 / NIST186-5.
|
|
406
|
+
// zip215=true: 0 <= y < MASK (2^256 for ed25519)
|
|
407
|
+
// zip215=false: 0 <= y < P (2^255-19 for ed25519)
|
|
394
408
|
A = Point.fromHex(publicKey, zip215);
|
|
395
409
|
R = Point.fromHex(sig.slice(0, len), zip215);
|
|
396
410
|
SB = G.multiplyUnsafe(s); // 0 <= s < l is done inside
|
|
@@ -402,6 +416,7 @@ export function twistedEdwards(curveDef) {
|
|
|
402
416
|
return false;
|
|
403
417
|
const k = hashDomainToScalar(context, R.toRawBytes(), A.toRawBytes(), msg);
|
|
404
418
|
const RkA = R.add(A.multiplyUnsafe(k));
|
|
419
|
+
// Extended group equation
|
|
405
420
|
// [8][S]B = [8]R + [8][k]A'
|
|
406
421
|
return RkA.subtract(SB).clearCofactor().equals(Point.ZERO);
|
|
407
422
|
}
|