@noble/curves 0.7.2 → 0.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 +32 -13
- package/_shortw_utils.js +8 -13
- package/_shortw_utils.js.map +1 -1
- package/abstract/bls.js +12 -16
- package/abstract/bls.js.map +1 -1
- package/abstract/curve.js +7 -12
- package/abstract/curve.js.map +1 -1
- package/abstract/edwards.js +16 -20
- package/abstract/edwards.js.map +1 -1
- package/abstract/hash-to-curve.d.ts +16 -5
- package/abstract/hash-to-curve.d.ts.map +1 -1
- package/abstract/hash-to-curve.js +51 -56
- package/abstract/hash-to-curve.js.map +1 -1
- package/abstract/modular.d.ts.map +1 -1
- package/abstract/modular.js +25 -44
- package/abstract/modular.js.map +1 -1
- package/abstract/montgomery.js +11 -15
- package/abstract/montgomery.js.map +1 -1
- package/abstract/poseidon.js +6 -12
- package/abstract/poseidon.js.map +1 -1
- package/abstract/utils.js +19 -41
- package/abstract/utils.js.map +1 -1
- package/abstract/weierstrass.d.ts.map +1 -1
- package/abstract/weierstrass.js +25 -37
- package/abstract/weierstrass.js.map +1 -1
- package/bls12-381.js +63 -66
- package/bls12-381.js.map +1 -1
- package/bn.js +7 -10
- package/bn.js.map +1 -1
- package/ed25519.d.ts +3 -0
- package/ed25519.d.ts.map +1 -1
- package/ed25519.js +81 -74
- package/ed25519.js.map +1 -1
- package/ed448.js +37 -41
- package/ed448.js.map +1 -1
- package/jubjub.js +17 -22
- package/jubjub.js.map +1 -1
- package/p256.js +13 -17
- package/p256.js.map +1 -1
- package/p384.js +13 -17
- package/p384.js.map +1 -1
- package/p521.js +13 -17
- package/p521.js.map +1 -1
- package/package.json +4 -26
- package/pasta.js +16 -19
- package/pasta.js.map +1 -1
- package/secp256k1.d.ts +0 -6
- package/secp256k1.d.ts.map +1 -1
- package/secp256k1.js +58 -63
- package/secp256k1.js.map +1 -1
- package/src/abstract/hash-to-curve.ts +49 -47
- package/src/abstract/modular.ts +1 -0
- package/src/abstract/weierstrass.ts +4 -10
- package/src/ed25519.ts +17 -1
- package/src/secp256k1.ts +7 -7
- package/src/stark.ts +50 -27
- package/stark.d.ts +17 -19
- package/stark.d.ts.map +1 -1
- package/stark.js +76 -72
- package/stark.js.map +1 -1
- package/esm/_shortw_utils.js +0 -17
- package/esm/_shortw_utils.js.map +0 -1
- package/esm/abstract/bls.js +0 -226
- package/esm/abstract/bls.js.map +0 -1
- package/esm/abstract/curve.js +0 -152
- package/esm/abstract/curve.js.map +0 -1
- package/esm/abstract/edwards.js +0 -409
- package/esm/abstract/edwards.js.map +0 -1
- package/esm/abstract/hash-to-curve.js +0 -163
- package/esm/abstract/hash-to-curve.js.map +0 -1
- package/esm/abstract/modular.js +0 -345
- package/esm/abstract/modular.js.map +0 -1
- package/esm/abstract/montgomery.js +0 -157
- package/esm/abstract/montgomery.js.map +0 -1
- package/esm/abstract/poseidon.js +0 -110
- package/esm/abstract/poseidon.js.map +0 -1
- package/esm/abstract/utils.js +0 -222
- package/esm/abstract/utils.js.map +0 -1
- package/esm/abstract/weierstrass.js +0 -1016
- package/esm/abstract/weierstrass.js.map +0 -1
- package/esm/bls12-381.js +0 -1173
- package/esm/bls12-381.js.map +0 -1
- package/esm/bn.js +0 -22
- package/esm/bn.js.map +0 -1
- package/esm/ed25519.js +0 -385
- package/esm/ed25519.js.map +0 -1
- package/esm/ed448.js +0 -213
- package/esm/ed448.js.map +0 -1
- package/esm/index.js +0 -3
- package/esm/index.js.map +0 -1
- package/esm/jubjub.js +0 -54
- package/esm/jubjub.js.map +0 -1
- package/esm/p256.js +0 -42
- package/esm/p256.js.map +0 -1
- package/esm/p384.js +0 -47
- package/esm/p384.js.map +0 -1
- package/esm/p521.js +0 -48
- package/esm/p521.js.map +0 -1
- package/esm/package.json +0 -7
- package/esm/pasta.js +0 -30
- package/esm/pasta.js.map +0 -1
- package/esm/secp256k1.js +0 -253
- package/esm/secp256k1.js.map +0 -1
- package/esm/stark.js +0 -251
- package/esm/stark.js.map +0 -1
package/esm/abstract/bls.js
DELETED
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
import { hashToPrivateScalar } from './modular.js';
|
|
2
|
-
import { bitLen, bitGet, ensureBytes } from './utils.js';
|
|
3
|
-
import * as htf from './hash-to-curve.js';
|
|
4
|
-
import { weierstrassPoints, } from './weierstrass.js';
|
|
5
|
-
export function bls(CURVE) {
|
|
6
|
-
// Fields looks pretty specific for curve, so for now we need to pass them with opts
|
|
7
|
-
const { Fp, Fr, Fp2, Fp6, Fp12 } = CURVE;
|
|
8
|
-
const BLS_X_LEN = bitLen(CURVE.x);
|
|
9
|
-
const groupLen = 32; // TODO: calculate; hardcoded for now
|
|
10
|
-
// Pre-compute coefficients for sparse multiplication
|
|
11
|
-
// Point addition and point double calculations is reused for coefficients
|
|
12
|
-
function calcPairingPrecomputes(p) {
|
|
13
|
-
const { x, y } = p;
|
|
14
|
-
// prettier-ignore
|
|
15
|
-
const Qx = x, Qy = y, Qz = Fp2.ONE;
|
|
16
|
-
// prettier-ignore
|
|
17
|
-
let Rx = Qx, Ry = Qy, Rz = Qz;
|
|
18
|
-
let ell_coeff = [];
|
|
19
|
-
for (let i = BLS_X_LEN - 2; i >= 0; i--) {
|
|
20
|
-
// Double
|
|
21
|
-
let t0 = Fp2.sqr(Ry); // Ry²
|
|
22
|
-
let t1 = Fp2.sqr(Rz); // Rz²
|
|
23
|
-
let t2 = Fp2.multiplyByB(Fp2.mul(t1, 3n)); // 3 * T1 * B
|
|
24
|
-
let t3 = Fp2.mul(t2, 3n); // 3 * T2
|
|
25
|
-
let t4 = Fp2.sub(Fp2.sub(Fp2.sqr(Fp2.add(Ry, Rz)), t1), t0); // (Ry + Rz)² - T1 - T0
|
|
26
|
-
ell_coeff.push([
|
|
27
|
-
Fp2.sub(t2, t0),
|
|
28
|
-
Fp2.mul(Fp2.sqr(Rx), 3n),
|
|
29
|
-
Fp2.neg(t4), // -T4
|
|
30
|
-
]);
|
|
31
|
-
Rx = Fp2.div(Fp2.mul(Fp2.mul(Fp2.sub(t0, t3), Rx), Ry), 2n); // ((T0 - T3) * Rx * Ry) / 2
|
|
32
|
-
Ry = Fp2.sub(Fp2.sqr(Fp2.div(Fp2.add(t0, t3), 2n)), Fp2.mul(Fp2.sqr(t2), 3n)); // ((T0 + T3) / 2)² - 3 * T2²
|
|
33
|
-
Rz = Fp2.mul(t0, t4); // T0 * T4
|
|
34
|
-
if (bitGet(CURVE.x, i)) {
|
|
35
|
-
// Addition
|
|
36
|
-
let t0 = Fp2.sub(Ry, Fp2.mul(Qy, Rz)); // Ry - Qy * Rz
|
|
37
|
-
let t1 = Fp2.sub(Rx, Fp2.mul(Qx, Rz)); // Rx - Qx * Rz
|
|
38
|
-
ell_coeff.push([
|
|
39
|
-
Fp2.sub(Fp2.mul(t0, Qx), Fp2.mul(t1, Qy)),
|
|
40
|
-
Fp2.neg(t0),
|
|
41
|
-
t1, // T1
|
|
42
|
-
]);
|
|
43
|
-
let t2 = Fp2.sqr(t1); // T1²
|
|
44
|
-
let t3 = Fp2.mul(t2, t1); // T2 * T1
|
|
45
|
-
let t4 = Fp2.mul(t2, Rx); // T2 * Rx
|
|
46
|
-
let t5 = Fp2.add(Fp2.sub(t3, Fp2.mul(t4, 2n)), Fp2.mul(Fp2.sqr(t0), Rz)); // T3 - 2 * T4 + T0² * Rz
|
|
47
|
-
Rx = Fp2.mul(t1, t5); // T1 * T5
|
|
48
|
-
Ry = Fp2.sub(Fp2.mul(Fp2.sub(t4, t5), t0), Fp2.mul(t3, Ry)); // (T4 - T5) * T0 - T3 * Ry
|
|
49
|
-
Rz = Fp2.mul(Rz, t3); // Rz * T3
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return ell_coeff;
|
|
53
|
-
}
|
|
54
|
-
function millerLoop(ell, g1) {
|
|
55
|
-
const { x } = CURVE;
|
|
56
|
-
const Px = g1[0];
|
|
57
|
-
const Py = g1[1];
|
|
58
|
-
let f12 = Fp12.ONE;
|
|
59
|
-
for (let j = 0, i = BLS_X_LEN - 2; i >= 0; i--, j++) {
|
|
60
|
-
const E = ell[j];
|
|
61
|
-
f12 = Fp12.multiplyBy014(f12, E[0], Fp2.mul(E[1], Px), Fp2.mul(E[2], Py));
|
|
62
|
-
if (bitGet(x, i)) {
|
|
63
|
-
j += 1;
|
|
64
|
-
const F = ell[j];
|
|
65
|
-
f12 = Fp12.multiplyBy014(f12, F[0], Fp2.mul(F[1], Px), Fp2.mul(F[2], Py));
|
|
66
|
-
}
|
|
67
|
-
if (i !== 0)
|
|
68
|
-
f12 = Fp12.sqr(f12);
|
|
69
|
-
}
|
|
70
|
-
return Fp12.conjugate(f12);
|
|
71
|
-
}
|
|
72
|
-
const utils = {
|
|
73
|
-
randomPrivateKey: () => {
|
|
74
|
-
return Fr.toBytes(hashToPrivateScalar(CURVE.randomBytes(groupLen + 8), CURVE.r));
|
|
75
|
-
},
|
|
76
|
-
};
|
|
77
|
-
// Point on G1 curve: (x, y)
|
|
78
|
-
const G1_ = weierstrassPoints({ n: Fr.ORDER, ...CURVE.G1 });
|
|
79
|
-
const G1 = Object.assign(G1_, htf.createHasher(G1_.ProjectivePoint, CURVE.G1.mapToCurve, {
|
|
80
|
-
...CURVE.htfDefaults,
|
|
81
|
-
...CURVE.G1.htfDefaults,
|
|
82
|
-
}));
|
|
83
|
-
function pairingPrecomputes(point) {
|
|
84
|
-
const p = point;
|
|
85
|
-
if (p._PPRECOMPUTES)
|
|
86
|
-
return p._PPRECOMPUTES;
|
|
87
|
-
p._PPRECOMPUTES = calcPairingPrecomputes(point.toAffine());
|
|
88
|
-
return p._PPRECOMPUTES;
|
|
89
|
-
}
|
|
90
|
-
// TODO: export
|
|
91
|
-
// function clearPairingPrecomputes(point: G2) {
|
|
92
|
-
// const p = point as G2 & withPairingPrecomputes;
|
|
93
|
-
// p._PPRECOMPUTES = undefined;
|
|
94
|
-
// }
|
|
95
|
-
// Point on G2 curve (complex numbers): (x₁, x₂+i), (y₁, y₂+i)
|
|
96
|
-
const G2_ = weierstrassPoints({ n: Fr.ORDER, ...CURVE.G2 });
|
|
97
|
-
const G2 = Object.assign(G2_, htf.createHasher(G2_.ProjectivePoint, CURVE.G2.mapToCurve, {
|
|
98
|
-
...CURVE.htfDefaults,
|
|
99
|
-
...CURVE.G2.htfDefaults,
|
|
100
|
-
}));
|
|
101
|
-
const { Signature } = CURVE.G2;
|
|
102
|
-
// Calculates bilinear pairing
|
|
103
|
-
function pairing(Q, P, withFinalExponent = true) {
|
|
104
|
-
if (Q.equals(G1.ProjectivePoint.ZERO) || P.equals(G2.ProjectivePoint.ZERO))
|
|
105
|
-
throw new Error('pairing is not available for ZERO point');
|
|
106
|
-
Q.assertValidity();
|
|
107
|
-
P.assertValidity();
|
|
108
|
-
// Performance: 9ms for millerLoop and ~14ms for exp.
|
|
109
|
-
const Qa = Q.toAffine();
|
|
110
|
-
const looped = millerLoop(pairingPrecomputes(P), [Qa.x, Qa.y]);
|
|
111
|
-
return withFinalExponent ? Fp12.finalExponentiate(looped) : looped;
|
|
112
|
-
}
|
|
113
|
-
function normP1(point) {
|
|
114
|
-
return point instanceof G1.ProjectivePoint ? point : G1.ProjectivePoint.fromHex(point);
|
|
115
|
-
}
|
|
116
|
-
function normP2(point) {
|
|
117
|
-
return point instanceof G2.ProjectivePoint ? point : Signature.decode(point);
|
|
118
|
-
}
|
|
119
|
-
function normP2Hash(point, htfOpts) {
|
|
120
|
-
return point instanceof G2.ProjectivePoint
|
|
121
|
-
? point
|
|
122
|
-
: G2.hashToCurve(ensureBytes('point', point), htfOpts);
|
|
123
|
-
}
|
|
124
|
-
// Multiplies generator by private key.
|
|
125
|
-
// P = pk x G
|
|
126
|
-
function getPublicKey(privateKey) {
|
|
127
|
-
return G1.ProjectivePoint.fromPrivateKey(privateKey).toRawBytes(true);
|
|
128
|
-
}
|
|
129
|
-
function sign(message, privateKey, htfOpts) {
|
|
130
|
-
const msgPoint = normP2Hash(message, htfOpts);
|
|
131
|
-
msgPoint.assertValidity();
|
|
132
|
-
const sigPoint = msgPoint.multiply(G1.normPrivateKeyToScalar(privateKey));
|
|
133
|
-
if (message instanceof G2.ProjectivePoint)
|
|
134
|
-
return sigPoint;
|
|
135
|
-
return Signature.encode(sigPoint);
|
|
136
|
-
}
|
|
137
|
-
// Checks if pairing of public key & hash is equal to pairing of generator & signature.
|
|
138
|
-
// e(P, H(m)) == e(G, S)
|
|
139
|
-
function verify(signature, message, publicKey, htfOpts) {
|
|
140
|
-
const P = normP1(publicKey);
|
|
141
|
-
const Hm = normP2Hash(message, htfOpts);
|
|
142
|
-
const G = G1.ProjectivePoint.BASE;
|
|
143
|
-
const S = normP2(signature);
|
|
144
|
-
// Instead of doing 2 exponentiations, we use property of billinear maps
|
|
145
|
-
// and do one exp after multiplying 2 points.
|
|
146
|
-
const ePHm = pairing(P.negate(), Hm, false);
|
|
147
|
-
const eGS = pairing(G, S, false);
|
|
148
|
-
const exp = Fp12.finalExponentiate(Fp12.mul(eGS, ePHm));
|
|
149
|
-
return Fp12.eql(exp, Fp12.ONE);
|
|
150
|
-
}
|
|
151
|
-
function aggregatePublicKeys(publicKeys) {
|
|
152
|
-
if (!publicKeys.length)
|
|
153
|
-
throw new Error('Expected non-empty array');
|
|
154
|
-
const agg = publicKeys.map(normP1).reduce((sum, p) => sum.add(p), G1.ProjectivePoint.ZERO);
|
|
155
|
-
const aggAffine = agg; //.toAffine();
|
|
156
|
-
if (publicKeys[0] instanceof G1.ProjectivePoint) {
|
|
157
|
-
aggAffine.assertValidity();
|
|
158
|
-
return aggAffine;
|
|
159
|
-
}
|
|
160
|
-
// toRawBytes ensures point validity
|
|
161
|
-
return aggAffine.toRawBytes(true);
|
|
162
|
-
}
|
|
163
|
-
function aggregateSignatures(signatures) {
|
|
164
|
-
if (!signatures.length)
|
|
165
|
-
throw new Error('Expected non-empty array');
|
|
166
|
-
const agg = signatures.map(normP2).reduce((sum, s) => sum.add(s), G2.ProjectivePoint.ZERO);
|
|
167
|
-
const aggAffine = agg; //.toAffine();
|
|
168
|
-
if (signatures[0] instanceof G2.ProjectivePoint) {
|
|
169
|
-
aggAffine.assertValidity();
|
|
170
|
-
return aggAffine;
|
|
171
|
-
}
|
|
172
|
-
return Signature.encode(aggAffine);
|
|
173
|
-
}
|
|
174
|
-
// https://ethresear.ch/t/fast-verification-of-multiple-bls-signatures/5407
|
|
175
|
-
// e(G, S) = e(G, SUM(n)(Si)) = MUL(n)(e(G, Si))
|
|
176
|
-
function verifyBatch(signature, messages, publicKeys, htfOpts) {
|
|
177
|
-
// @ts-ignore
|
|
178
|
-
// console.log('verifyBatch', bytesToHex(signature as any), messages, publicKeys.map(bytesToHex));
|
|
179
|
-
if (!messages.length)
|
|
180
|
-
throw new Error('Expected non-empty messages array');
|
|
181
|
-
if (publicKeys.length !== messages.length)
|
|
182
|
-
throw new Error('Pubkey count should equal msg count');
|
|
183
|
-
const sig = normP2(signature);
|
|
184
|
-
const nMessages = messages.map((i) => normP2Hash(i, htfOpts));
|
|
185
|
-
const nPublicKeys = publicKeys.map(normP1);
|
|
186
|
-
try {
|
|
187
|
-
const paired = [];
|
|
188
|
-
for (const message of new Set(nMessages)) {
|
|
189
|
-
const groupPublicKey = nMessages.reduce((groupPublicKey, subMessage, i) => subMessage === message ? groupPublicKey.add(nPublicKeys[i]) : groupPublicKey, G1.ProjectivePoint.ZERO);
|
|
190
|
-
// const msg = message instanceof PointG2 ? message : await PointG2.hashToCurve(message);
|
|
191
|
-
// Possible to batch pairing for same msg with different groupPublicKey here
|
|
192
|
-
paired.push(pairing(groupPublicKey, message, false));
|
|
193
|
-
}
|
|
194
|
-
paired.push(pairing(G1.ProjectivePoint.BASE.negate(), sig, false));
|
|
195
|
-
const product = paired.reduce((a, b) => Fp12.mul(a, b), Fp12.ONE);
|
|
196
|
-
const exp = Fp12.finalExponentiate(product);
|
|
197
|
-
return Fp12.eql(exp, Fp12.ONE);
|
|
198
|
-
}
|
|
199
|
-
catch {
|
|
200
|
-
return false;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
G1.ProjectivePoint.BASE._setWindowSize(4);
|
|
204
|
-
return {
|
|
205
|
-
CURVE,
|
|
206
|
-
Fr,
|
|
207
|
-
Fp,
|
|
208
|
-
Fp2,
|
|
209
|
-
Fp6,
|
|
210
|
-
Fp12,
|
|
211
|
-
G1,
|
|
212
|
-
G2,
|
|
213
|
-
Signature,
|
|
214
|
-
millerLoop,
|
|
215
|
-
calcPairingPrecomputes,
|
|
216
|
-
pairing,
|
|
217
|
-
getPublicKey,
|
|
218
|
-
sign,
|
|
219
|
-
verify,
|
|
220
|
-
aggregatePublicKeys,
|
|
221
|
-
aggregateSignatures,
|
|
222
|
-
verifyBatch,
|
|
223
|
-
utils,
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
//# sourceMappingURL=bls.js.map
|
package/esm/abstract/bls.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bls.js","sourceRoot":"","sources":["../../src/abstract/bls.ts"],"names":[],"mappings":"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"}
|
package/esm/abstract/curve.js
DELETED
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
2
|
-
// Abelian group utilities
|
|
3
|
-
import { validateField, nLength } from './modular.js';
|
|
4
|
-
import { validateObject } from './utils.js';
|
|
5
|
-
const _0n = BigInt(0);
|
|
6
|
-
const _1n = BigInt(1);
|
|
7
|
-
// Elliptic curve multiplication of Point by scalar. Fragile.
|
|
8
|
-
// Scalars should always be less than curve order: this should be checked inside of a curve itself.
|
|
9
|
-
// Creates precomputation tables for fast multiplication:
|
|
10
|
-
// - private scalar is split by fixed size windows of W bits
|
|
11
|
-
// - every window point is collected from window's table & added to accumulator
|
|
12
|
-
// - since windows are different, same point inside tables won't be accessed more than once per calc
|
|
13
|
-
// - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)
|
|
14
|
-
// - +1 window is neccessary for wNAF
|
|
15
|
-
// - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication
|
|
16
|
-
// TODO: Research returning 2d JS array of windows, instead of a single window. This would allow
|
|
17
|
-
// windows to be in different memory locations
|
|
18
|
-
export function wNAF(c, bits) {
|
|
19
|
-
const constTimeNegate = (condition, item) => {
|
|
20
|
-
const neg = item.negate();
|
|
21
|
-
return condition ? neg : item;
|
|
22
|
-
};
|
|
23
|
-
const opts = (W) => {
|
|
24
|
-
const windows = Math.ceil(bits / W) + 1; // +1, because
|
|
25
|
-
const windowSize = 2 ** (W - 1); // -1 because we skip zero
|
|
26
|
-
return { windows, windowSize };
|
|
27
|
-
};
|
|
28
|
-
return {
|
|
29
|
-
constTimeNegate,
|
|
30
|
-
// non-const time multiplication ladder
|
|
31
|
-
unsafeLadder(elm, n) {
|
|
32
|
-
let p = c.ZERO;
|
|
33
|
-
let d = elm;
|
|
34
|
-
while (n > _0n) {
|
|
35
|
-
if (n & _1n)
|
|
36
|
-
p = p.add(d);
|
|
37
|
-
d = d.double();
|
|
38
|
-
n >>= _1n;
|
|
39
|
-
}
|
|
40
|
-
return p;
|
|
41
|
-
},
|
|
42
|
-
/**
|
|
43
|
-
* Creates a wNAF precomputation window. Used for caching.
|
|
44
|
-
* Default window size is set by `utils.precompute()` and is equal to 8.
|
|
45
|
-
* Number of precomputed points depends on the curve size:
|
|
46
|
-
* 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:
|
|
47
|
-
* - 𝑊 is the window size
|
|
48
|
-
* - 𝑛 is the bitlength of the curve order.
|
|
49
|
-
* For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.
|
|
50
|
-
* @returns precomputed point tables flattened to a single array
|
|
51
|
-
*/
|
|
52
|
-
precomputeWindow(elm, W) {
|
|
53
|
-
const { windows, windowSize } = opts(W);
|
|
54
|
-
const points = [];
|
|
55
|
-
let p = elm;
|
|
56
|
-
let base = p;
|
|
57
|
-
for (let window = 0; window < windows; window++) {
|
|
58
|
-
base = p;
|
|
59
|
-
points.push(base);
|
|
60
|
-
// =1, because we skip zero
|
|
61
|
-
for (let i = 1; i < windowSize; i++) {
|
|
62
|
-
base = base.add(p);
|
|
63
|
-
points.push(base);
|
|
64
|
-
}
|
|
65
|
-
p = base.double();
|
|
66
|
-
}
|
|
67
|
-
return points;
|
|
68
|
-
},
|
|
69
|
-
/**
|
|
70
|
-
* Implements ec multiplication using precomputed tables and w-ary non-adjacent form.
|
|
71
|
-
* @param W window size
|
|
72
|
-
* @param precomputes precomputed tables
|
|
73
|
-
* @param n scalar (we don't check here, but should be less than curve order)
|
|
74
|
-
* @returns real and fake (for const-time) points
|
|
75
|
-
*/
|
|
76
|
-
wNAF(W, precomputes, n) {
|
|
77
|
-
// TODO: maybe check that scalar is less than group order? wNAF behavious is undefined otherwise
|
|
78
|
-
// But need to carefully remove other checks before wNAF. ORDER == bits here
|
|
79
|
-
const { windows, windowSize } = opts(W);
|
|
80
|
-
let p = c.ZERO;
|
|
81
|
-
let f = c.BASE;
|
|
82
|
-
const mask = BigInt(2 ** W - 1); // Create mask with W ones: 0b1111 for W=4 etc.
|
|
83
|
-
const maxNumber = 2 ** W;
|
|
84
|
-
const shiftBy = BigInt(W);
|
|
85
|
-
for (let window = 0; window < windows; window++) {
|
|
86
|
-
const offset = window * windowSize;
|
|
87
|
-
// Extract W bits.
|
|
88
|
-
let wbits = Number(n & mask);
|
|
89
|
-
// Shift number by W bits.
|
|
90
|
-
n >>= shiftBy;
|
|
91
|
-
// If the bits are bigger than max size, we'll split those.
|
|
92
|
-
// +224 => 256 - 32
|
|
93
|
-
if (wbits > windowSize) {
|
|
94
|
-
wbits -= maxNumber;
|
|
95
|
-
n += _1n;
|
|
96
|
-
}
|
|
97
|
-
// This code was first written with assumption that 'f' and 'p' will never be infinity point:
|
|
98
|
-
// since each addition is multiplied by 2 ** W, it cannot cancel each other. However,
|
|
99
|
-
// there is negate now: it is possible that negated element from low value
|
|
100
|
-
// would be the same as high element, which will create carry into next window.
|
|
101
|
-
// It's not obvious how this can fail, but still worth investigating later.
|
|
102
|
-
// Check if we're onto Zero point.
|
|
103
|
-
// Add random point inside current window to f.
|
|
104
|
-
const offset1 = offset;
|
|
105
|
-
const offset2 = offset + Math.abs(wbits) - 1; // -1 because we skip zero
|
|
106
|
-
const cond1 = window % 2 !== 0;
|
|
107
|
-
const cond2 = wbits < 0;
|
|
108
|
-
if (wbits === 0) {
|
|
109
|
-
// The most important part for const-time getPublicKey
|
|
110
|
-
f = f.add(constTimeNegate(cond1, precomputes[offset1]));
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
p = p.add(constTimeNegate(cond2, precomputes[offset2]));
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
// JIT-compiler should not eliminate f here, since it will later be used in normalizeZ()
|
|
117
|
-
// Even if the variable is still unused, there are some checks which will
|
|
118
|
-
// throw an exception, so compiler needs to prove they won't happen, which is hard.
|
|
119
|
-
// At this point there is a way to F be infinity-point even if p is not,
|
|
120
|
-
// which makes it less const-time: around 1 bigint multiply.
|
|
121
|
-
return { p, f };
|
|
122
|
-
},
|
|
123
|
-
wNAFCached(P, precomputesMap, n, transform) {
|
|
124
|
-
// @ts-ignore
|
|
125
|
-
const W = P._WINDOW_SIZE || 1;
|
|
126
|
-
// Calculate precomputes on a first run, reuse them after
|
|
127
|
-
let comp = precomputesMap.get(P);
|
|
128
|
-
if (!comp) {
|
|
129
|
-
comp = this.precomputeWindow(P, W);
|
|
130
|
-
if (W !== 1) {
|
|
131
|
-
precomputesMap.set(P, transform(comp));
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
return this.wNAF(W, comp, n);
|
|
135
|
-
},
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
export function validateBasic(curve) {
|
|
139
|
-
validateField(curve.Fp);
|
|
140
|
-
validateObject(curve, {
|
|
141
|
-
n: 'bigint',
|
|
142
|
-
h: 'bigint',
|
|
143
|
-
Gx: 'field',
|
|
144
|
-
Gy: 'field',
|
|
145
|
-
}, {
|
|
146
|
-
nBitLength: 'isSafeInteger',
|
|
147
|
-
nByteLength: 'isSafeInteger',
|
|
148
|
-
});
|
|
149
|
-
// Set defaults
|
|
150
|
-
return Object.freeze({ ...nLength(curve.n, curve.nBitLength), ...curve });
|
|
151
|
-
}
|
|
152
|
-
//# sourceMappingURL=curve.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"curve.js","sourceRoot":"","sources":["../../src/abstract/curve.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,0BAA0B;AAC1B,OAAO,EAAS,aAAa,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACtB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAsBtB,6DAA6D;AAC7D,mGAAmG;AACnG,yDAAyD;AACzD,4DAA4D;AAC5D,+EAA+E;AAC/E,oGAAoG;AACpG,oGAAoG;AACpG,qCAAqC;AACrC,kGAAkG;AAClG,gGAAgG;AAChG,8CAA8C;AAC9C,MAAM,UAAU,IAAI,CAAqB,CAAsB,EAAE,IAAY;IAC3E,MAAM,eAAe,GAAG,CAAC,SAAkB,EAAE,IAAO,EAAK,EAAE;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAChC,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc;QACvD,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,0BAA0B;QAC3D,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IACjC,CAAC,CAAC;IACF,OAAO;QACL,eAAe;QACf,uCAAuC;QACvC,YAAY,CAAC,GAAM,EAAE,CAAS;YAC5B,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACf,IAAI,CAAC,GAAM,GAAG,CAAC;YACf,OAAO,CAAC,GAAG,GAAG,EAAE;gBACd,IAAI,CAAC,GAAG,GAAG;oBAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC1B,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;gBACf,CAAC,KAAK,GAAG,CAAC;aACX;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QAED;;;;;;;;;WASG;QACH,gBAAgB,CAAC,GAAM,EAAE,CAAS;YAChC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,MAAM,GAAQ,EAAE,CAAC;YACvB,IAAI,CAAC,GAAM,GAAG,CAAC;YACf,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC/C,IAAI,GAAG,CAAC,CAAC;gBACT,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClB,2BAA2B;gBAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACnC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACnB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBACnB;gBACD,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;aACnB;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED;;;;;;WAMG;QACH,IAAI,CAAC,CAAS,EAAE,WAAgB,EAAE,CAAS;YACzC,gGAAgG;YAChG,4EAA4E;YAC5E,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAExC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YAEf,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,+CAA+C;YAChF,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAE1B,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC/C,MAAM,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;gBACnC,kBAAkB;gBAClB,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBAE7B,0BAA0B;gBAC1B,CAAC,KAAK,OAAO,CAAC;gBAEd,2DAA2D;gBAC3D,mBAAmB;gBACnB,IAAI,KAAK,GAAG,UAAU,EAAE;oBACtB,KAAK,IAAI,SAAS,CAAC;oBACnB,CAAC,IAAI,GAAG,CAAC;iBACV;gBAED,6FAA6F;gBAC7F,qFAAqF;gBACrF,0EAA0E;gBAC1E,+EAA+E;gBAC/E,2EAA2E;gBAE3E,kCAAkC;gBAClC,+CAA+C;gBAC/C,MAAM,OAAO,GAAG,MAAM,CAAC;gBACvB,MAAM,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,0BAA0B;gBACxE,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;gBACxB,IAAI,KAAK,KAAK,CAAC,EAAE;oBACf,sDAAsD;oBACtD,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;iBACzD;qBAAM;oBACL,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;iBACzD;aACF;YACD,wFAAwF;YACxF,yEAAyE;YACzE,mFAAmF;YACnF,wEAAwE;YACxE,4DAA4D;YAC5D,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAClB,CAAC;QAED,UAAU,CAAC,CAAI,EAAE,cAA2B,EAAE,CAAS,EAAE,SAAoB;YAC3E,aAAa;YACb,MAAM,CAAC,GAAW,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC;YACtC,yDAAyD;YACzD,IAAI,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,EAAE;gBACT,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAQ,CAAC;gBAC1C,IAAI,CAAC,KAAK,CAAC,EAAE;oBACX,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;iBACxC;aACF;YACD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/B,CAAC;KACF,CAAC;AACJ,CAAC;AAgBD,MAAM,UAAU,aAAa,CAAQ,KAAyB;IAC5D,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACxB,cAAc,CACZ,KAAK,EACL;QACE,CAAC,EAAE,QAAQ;QACX,CAAC,EAAE,QAAQ;QACX,EAAE,EAAE,OAAO;QACX,EAAE,EAAE,OAAO;KACZ,EACD;QACE,UAAU,EAAE,eAAe;QAC3B,WAAW,EAAE,eAAe;KAC7B,CACF,CAAC;IACF,eAAe;IACf,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,KAAK,EAAW,CAAC,CAAC;AACrF,CAAC"}
|