@noble/curves 0.8.0 → 0.8.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 +12 -17
- package/_shortw_utils.js +13 -8
- package/_shortw_utils.js.map +1 -1
- package/abstract/bls.js +16 -12
- package/abstract/bls.js.map +1 -1
- package/abstract/curve.js +12 -7
- package/abstract/curve.js.map +1 -1
- package/abstract/edwards.js +20 -16
- package/abstract/edwards.js.map +1 -1
- package/abstract/hash-to-curve.js +26 -18
- package/abstract/hash-to-curve.js.map +1 -1
- package/abstract/modular.js +44 -24
- package/abstract/modular.js.map +1 -1
- package/abstract/montgomery.js +15 -11
- package/abstract/montgomery.js.map +1 -1
- package/abstract/poseidon.js +12 -6
- package/abstract/poseidon.js.map +1 -1
- package/abstract/utils.js +41 -19
- package/abstract/utils.js.map +1 -1
- package/abstract/weierstrass.js +28 -21
- package/abstract/weierstrass.js.map +1 -1
- package/bls12-381.js +66 -63
- package/bls12-381.js.map +1 -1
- package/bn.js +10 -7
- package/bn.js.map +1 -1
- package/ed25519.js +78 -72
- package/ed25519.js.map +1 -1
- package/ed448.js +41 -37
- package/ed448.js.map +1 -1
- package/esm/_shortw_utils.js +17 -0
- package/esm/_shortw_utils.js.map +1 -0
- package/esm/abstract/bls.js +226 -0
- package/esm/abstract/bls.js.map +1 -0
- package/esm/abstract/curve.js +152 -0
- package/esm/abstract/curve.js.map +1 -0
- package/esm/abstract/edwards.js +409 -0
- package/esm/abstract/edwards.js.map +1 -0
- package/esm/abstract/hash-to-curve.js +166 -0
- package/esm/abstract/hash-to-curve.js.map +1 -0
- package/esm/abstract/modular.js +346 -0
- package/esm/abstract/modular.js.map +1 -0
- package/esm/abstract/montgomery.js +157 -0
- package/esm/abstract/montgomery.js.map +1 -0
- package/esm/abstract/poseidon.js +110 -0
- package/esm/abstract/poseidon.js.map +1 -0
- package/esm/abstract/utils.js +222 -0
- package/esm/abstract/utils.js.map +1 -0
- package/esm/abstract/weierstrass.js +1011 -0
- package/esm/abstract/weierstrass.js.map +1 -0
- package/esm/bls12-381.js +1173 -0
- package/esm/bls12-381.js.map +1 -0
- package/esm/bn.js +22 -0
- package/esm/bn.js.map +1 -0
- package/esm/ed25519.js +397 -0
- package/esm/ed25519.js.map +1 -0
- package/esm/ed448.js +213 -0
- package/esm/ed448.js.map +1 -0
- package/esm/index.js +3 -0
- package/esm/index.js.map +1 -0
- package/esm/jubjub.js +54 -0
- package/esm/jubjub.js.map +1 -0
- package/esm/p256.js +42 -0
- package/esm/p256.js.map +1 -0
- package/esm/p384.js +47 -0
- package/esm/p384.js.map +1 -0
- package/esm/p521.js +48 -0
- package/esm/p521.js.map +1 -0
- package/esm/package.json +7 -0
- package/esm/pasta.js +30 -0
- package/esm/pasta.js.map +1 -0
- package/esm/secp256k1.js +252 -0
- package/esm/secp256k1.js.map +1 -0
- package/jubjub.js +22 -17
- package/jubjub.js.map +1 -1
- package/p256.js +17 -13
- package/p256.js.map +1 -1
- package/p384.js +17 -13
- package/p384.js.map +1 -1
- package/p521.js +17 -13
- package/p521.js.map +1 -1
- package/package.json +27 -9
- package/pasta.js +19 -16
- package/pasta.js.map +1 -1
- package/secp256k1.js +57 -53
- package/secp256k1.js.map +1 -1
- package/src/stark.ts +0 -341
- package/stark.d.ts +0 -81
- package/stark.d.ts.map +0 -1
- package/stark.js +0 -277
- package/stark.js.map +0 -1
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
2
|
+
// Utilities for modular arithmetics and finite fields
|
|
3
|
+
import { bitMask, numberToBytesBE, numberToBytesLE, bytesToNumberBE, bytesToNumberLE, ensureBytes, validateObject, } from './utils.js';
|
|
4
|
+
// prettier-ignore
|
|
5
|
+
const _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3);
|
|
6
|
+
// prettier-ignore
|
|
7
|
+
const _4n = BigInt(4), _5n = BigInt(5), _8n = BigInt(8);
|
|
8
|
+
// prettier-ignore
|
|
9
|
+
const _9n = BigInt(9), _16n = BigInt(16);
|
|
10
|
+
// Calculates a modulo b
|
|
11
|
+
export function mod(a, b) {
|
|
12
|
+
const result = a % b;
|
|
13
|
+
return result >= _0n ? result : b + result;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Efficiently exponentiate num to power and do modular division.
|
|
17
|
+
* Unsafe in some contexts: uses ladder, so can expose bigint bits.
|
|
18
|
+
* @example
|
|
19
|
+
* powMod(2n, 6n, 11n) // 64n % 11n == 9n
|
|
20
|
+
*/
|
|
21
|
+
// TODO: use field version && remove
|
|
22
|
+
export function pow(num, power, modulo) {
|
|
23
|
+
if (modulo <= _0n || power < _0n)
|
|
24
|
+
throw new Error('Expected power/modulo > 0');
|
|
25
|
+
if (modulo === _1n)
|
|
26
|
+
return _0n;
|
|
27
|
+
let res = _1n;
|
|
28
|
+
while (power > _0n) {
|
|
29
|
+
if (power & _1n)
|
|
30
|
+
res = (res * num) % modulo;
|
|
31
|
+
num = (num * num) % modulo;
|
|
32
|
+
power >>= _1n;
|
|
33
|
+
}
|
|
34
|
+
return res;
|
|
35
|
+
}
|
|
36
|
+
// Does x ^ (2 ^ power) mod p. pow2(30, 4) == 30 ^ (2 ^ 4)
|
|
37
|
+
export function pow2(x, power, modulo) {
|
|
38
|
+
let res = x;
|
|
39
|
+
while (power-- > _0n) {
|
|
40
|
+
res *= res;
|
|
41
|
+
res %= modulo;
|
|
42
|
+
}
|
|
43
|
+
return res;
|
|
44
|
+
}
|
|
45
|
+
// Inverses number over modulo
|
|
46
|
+
export function invert(number, modulo) {
|
|
47
|
+
if (number === _0n || modulo <= _0n) {
|
|
48
|
+
throw new Error(`invert: expected positive integers, got n=${number} mod=${modulo}`);
|
|
49
|
+
}
|
|
50
|
+
// Eucledian GCD https://brilliant.org/wiki/extended-euclidean-algorithm/
|
|
51
|
+
// Fermat's little theorem "CT-like" version inv(n) = n^(m-2) mod m is 30x slower.
|
|
52
|
+
let a = mod(number, modulo);
|
|
53
|
+
let b = modulo;
|
|
54
|
+
// prettier-ignore
|
|
55
|
+
let x = _0n, y = _1n, u = _1n, v = _0n;
|
|
56
|
+
while (a !== _0n) {
|
|
57
|
+
// JIT applies optimization if those two lines follow each other
|
|
58
|
+
const q = b / a;
|
|
59
|
+
const r = b % a;
|
|
60
|
+
const m = x - u * q;
|
|
61
|
+
const n = y - v * q;
|
|
62
|
+
// prettier-ignore
|
|
63
|
+
b = a, a = r, x = u, y = v, u = m, v = n;
|
|
64
|
+
}
|
|
65
|
+
const gcd = b;
|
|
66
|
+
if (gcd !== _1n)
|
|
67
|
+
throw new Error('invert: does not exist');
|
|
68
|
+
return mod(x, modulo);
|
|
69
|
+
}
|
|
70
|
+
// Tonelli-Shanks algorithm
|
|
71
|
+
// Paper 1: https://eprint.iacr.org/2012/685.pdf (page 12)
|
|
72
|
+
// Paper 2: Square Roots from 1; 24, 51, 10 to Dan Shanks
|
|
73
|
+
export function tonelliShanks(P) {
|
|
74
|
+
// Legendre constant: used to calculate Legendre symbol (a | p),
|
|
75
|
+
// which denotes the value of a^((p-1)/2) (mod p).
|
|
76
|
+
// (a | p) ≡ 1 if a is a square (mod p)
|
|
77
|
+
// (a | p) ≡ -1 if a is not a square (mod p)
|
|
78
|
+
// (a | p) ≡ 0 if a ≡ 0 (mod p)
|
|
79
|
+
const legendreC = (P - _1n) / _2n;
|
|
80
|
+
let Q, S, Z;
|
|
81
|
+
// Step 1: By factoring out powers of 2 from p - 1,
|
|
82
|
+
// find q and s such that p - 1 = q*(2^s) with q odd
|
|
83
|
+
for (Q = P - _1n, S = 0; Q % _2n === _0n; Q /= _2n, S++)
|
|
84
|
+
;
|
|
85
|
+
// Step 2: Select a non-square z such that (z | p) ≡ -1 and set c ≡ zq
|
|
86
|
+
for (Z = _2n; Z < P && pow(Z, legendreC, P) !== P - _1n; Z++)
|
|
87
|
+
;
|
|
88
|
+
// Fast-path
|
|
89
|
+
if (S === 1) {
|
|
90
|
+
const p1div4 = (P + _1n) / _4n;
|
|
91
|
+
return function tonelliFast(Fp, n) {
|
|
92
|
+
const root = Fp.pow(n, p1div4);
|
|
93
|
+
if (!Fp.eql(Fp.sqr(root), n))
|
|
94
|
+
throw new Error('Cannot find square root');
|
|
95
|
+
return root;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
// Slow-path
|
|
99
|
+
const Q1div2 = (Q + _1n) / _2n;
|
|
100
|
+
return function tonelliSlow(Fp, n) {
|
|
101
|
+
// Step 0: Check that n is indeed a square: (n | p) should not be ≡ -1
|
|
102
|
+
if (Fp.pow(n, legendreC) === Fp.neg(Fp.ONE))
|
|
103
|
+
throw new Error('Cannot find square root');
|
|
104
|
+
let r = S;
|
|
105
|
+
// TODO: will fail at Fp2/etc
|
|
106
|
+
let g = Fp.pow(Fp.mul(Fp.ONE, Z), Q); // will update both x and b
|
|
107
|
+
let x = Fp.pow(n, Q1div2); // first guess at the square root
|
|
108
|
+
let b = Fp.pow(n, Q); // first guess at the fudge factor
|
|
109
|
+
while (!Fp.eql(b, Fp.ONE)) {
|
|
110
|
+
if (Fp.eql(b, Fp.ZERO))
|
|
111
|
+
return Fp.ZERO; // https://en.wikipedia.org/wiki/Tonelli%E2%80%93Shanks_algorithm (4. If t = 0, return r = 0)
|
|
112
|
+
// Find m such b^(2^m)==1
|
|
113
|
+
let m = 1;
|
|
114
|
+
for (let t2 = Fp.sqr(b); m < r; m++) {
|
|
115
|
+
if (Fp.eql(t2, Fp.ONE))
|
|
116
|
+
break;
|
|
117
|
+
t2 = Fp.sqr(t2); // t2 *= t2
|
|
118
|
+
}
|
|
119
|
+
// NOTE: r-m-1 can be bigger than 32, need to convert to bigint before shift, otherwise there will be overflow
|
|
120
|
+
const ge = Fp.pow(g, _1n << BigInt(r - m - 1)); // ge = 2^(r-m-1)
|
|
121
|
+
g = Fp.sqr(ge); // g = ge * ge
|
|
122
|
+
x = Fp.mul(x, ge); // x *= ge
|
|
123
|
+
b = Fp.mul(b, g); // b *= g
|
|
124
|
+
r = m;
|
|
125
|
+
}
|
|
126
|
+
return x;
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
export function FpSqrt(P) {
|
|
130
|
+
// NOTE: different algorithms can give different roots, it is up to user to decide which one they want.
|
|
131
|
+
// For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).
|
|
132
|
+
// P ≡ 3 (mod 4)
|
|
133
|
+
// √n = n^((P+1)/4)
|
|
134
|
+
if (P % _4n === _3n) {
|
|
135
|
+
// Not all roots possible!
|
|
136
|
+
// const ORDER =
|
|
137
|
+
// 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaabn;
|
|
138
|
+
// const NUM = 72057594037927816n;
|
|
139
|
+
const p1div4 = (P + _1n) / _4n;
|
|
140
|
+
return function sqrt3mod4(Fp, n) {
|
|
141
|
+
const root = Fp.pow(n, p1div4);
|
|
142
|
+
// Throw if root**2 != n
|
|
143
|
+
if (!Fp.eql(Fp.sqr(root), n))
|
|
144
|
+
throw new Error('Cannot find square root');
|
|
145
|
+
return root;
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
// Atkin algorithm for q ≡ 5 (mod 8), https://eprint.iacr.org/2012/685.pdf (page 10)
|
|
149
|
+
if (P % _8n === _5n) {
|
|
150
|
+
const c1 = (P - _5n) / _8n;
|
|
151
|
+
return function sqrt5mod8(Fp, n) {
|
|
152
|
+
const n2 = Fp.mul(n, _2n);
|
|
153
|
+
const v = Fp.pow(n2, c1);
|
|
154
|
+
const nv = Fp.mul(n, v);
|
|
155
|
+
const i = Fp.mul(Fp.mul(nv, _2n), v);
|
|
156
|
+
const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));
|
|
157
|
+
if (!Fp.eql(Fp.sqr(root), n))
|
|
158
|
+
throw new Error('Cannot find square root');
|
|
159
|
+
return root;
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
// P ≡ 9 (mod 16)
|
|
163
|
+
if (P % _16n === _9n) {
|
|
164
|
+
// NOTE: tonelli is too slow for bls-Fp2 calculations even on start
|
|
165
|
+
// Means we cannot use sqrt for constants at all!
|
|
166
|
+
//
|
|
167
|
+
// const c1 = Fp.sqrt(Fp.negate(Fp.ONE)); // 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F
|
|
168
|
+
// const c2 = Fp.sqrt(c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F
|
|
169
|
+
// const c3 = Fp.sqrt(Fp.negate(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F
|
|
170
|
+
// const c4 = (P + _7n) / _16n; // 4. c4 = (q + 7) / 16 # Integer arithmetic
|
|
171
|
+
// sqrt = (x) => {
|
|
172
|
+
// let tv1 = Fp.pow(x, c4); // 1. tv1 = x^c4
|
|
173
|
+
// let tv2 = Fp.mul(c1, tv1); // 2. tv2 = c1 * tv1
|
|
174
|
+
// const tv3 = Fp.mul(c2, tv1); // 3. tv3 = c2 * tv1
|
|
175
|
+
// let tv4 = Fp.mul(c3, tv1); // 4. tv4 = c3 * tv1
|
|
176
|
+
// const e1 = Fp.equals(Fp.square(tv2), x); // 5. e1 = (tv2^2) == x
|
|
177
|
+
// const e2 = Fp.equals(Fp.square(tv3), x); // 6. e2 = (tv3^2) == x
|
|
178
|
+
// tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x
|
|
179
|
+
// tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x
|
|
180
|
+
// const e3 = Fp.equals(Fp.square(tv2), x); // 9. e3 = (tv2^2) == x
|
|
181
|
+
// return Fp.cmov(tv1, tv2, e3); // 10. z = CMOV(tv1, tv2, e3) # Select the sqrt from tv1 and tv2
|
|
182
|
+
// }
|
|
183
|
+
}
|
|
184
|
+
// Other cases: Tonelli-Shanks algorithm
|
|
185
|
+
return tonelliShanks(P);
|
|
186
|
+
}
|
|
187
|
+
// Little-endian check for first LE bit (last BE bit);
|
|
188
|
+
export const isNegativeLE = (num, modulo) => (mod(num, modulo) & _1n) === _1n;
|
|
189
|
+
// prettier-ignore
|
|
190
|
+
const FIELD_FIELDS = [
|
|
191
|
+
'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',
|
|
192
|
+
'eql', 'add', 'sub', 'mul', 'pow', 'div',
|
|
193
|
+
'addN', 'subN', 'mulN', 'sqrN'
|
|
194
|
+
];
|
|
195
|
+
export function validateField(field) {
|
|
196
|
+
const initial = {
|
|
197
|
+
ORDER: 'bigint',
|
|
198
|
+
MASK: 'bigint',
|
|
199
|
+
BYTES: 'isSafeInteger',
|
|
200
|
+
BITS: 'isSafeInteger',
|
|
201
|
+
};
|
|
202
|
+
const opts = FIELD_FIELDS.reduce((map, val) => {
|
|
203
|
+
map[val] = 'function';
|
|
204
|
+
return map;
|
|
205
|
+
}, initial);
|
|
206
|
+
return validateObject(field, opts);
|
|
207
|
+
}
|
|
208
|
+
// Generic field functions
|
|
209
|
+
export function FpPow(f, num, power) {
|
|
210
|
+
// Should have same speed as pow for bigints
|
|
211
|
+
// TODO: benchmark!
|
|
212
|
+
if (power < _0n)
|
|
213
|
+
throw new Error('Expected power > 0');
|
|
214
|
+
if (power === _0n)
|
|
215
|
+
return f.ONE;
|
|
216
|
+
if (power === _1n)
|
|
217
|
+
return num;
|
|
218
|
+
let p = f.ONE;
|
|
219
|
+
let d = num;
|
|
220
|
+
while (power > _0n) {
|
|
221
|
+
if (power & _1n)
|
|
222
|
+
p = f.mul(p, d);
|
|
223
|
+
d = f.sqr(d);
|
|
224
|
+
power >>= 1n;
|
|
225
|
+
}
|
|
226
|
+
return p;
|
|
227
|
+
}
|
|
228
|
+
export function FpInvertBatch(f, nums) {
|
|
229
|
+
const tmp = new Array(nums.length);
|
|
230
|
+
// Walk from first to last, multiply them by each other MOD p
|
|
231
|
+
const lastMultiplied = nums.reduce((acc, num, i) => {
|
|
232
|
+
if (f.is0(num))
|
|
233
|
+
return acc;
|
|
234
|
+
tmp[i] = acc;
|
|
235
|
+
return f.mul(acc, num);
|
|
236
|
+
}, f.ONE);
|
|
237
|
+
// Invert last element
|
|
238
|
+
const inverted = f.inv(lastMultiplied);
|
|
239
|
+
// Walk from last to first, multiply them by inverted each other MOD p
|
|
240
|
+
nums.reduceRight((acc, num, i) => {
|
|
241
|
+
if (f.is0(num))
|
|
242
|
+
return acc;
|
|
243
|
+
tmp[i] = f.mul(acc, tmp[i]);
|
|
244
|
+
return f.mul(acc, num);
|
|
245
|
+
}, inverted);
|
|
246
|
+
return tmp;
|
|
247
|
+
}
|
|
248
|
+
export function FpDiv(f, lhs, rhs) {
|
|
249
|
+
return f.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, f.ORDER) : f.inv(rhs));
|
|
250
|
+
}
|
|
251
|
+
// This function returns True whenever the value x is a square in the field F.
|
|
252
|
+
export function FpIsSquare(f) {
|
|
253
|
+
const legendreConst = (f.ORDER - _1n) / _2n; // Integer arithmetic
|
|
254
|
+
return (x) => {
|
|
255
|
+
const p = f.pow(x, legendreConst);
|
|
256
|
+
return f.eql(p, f.ZERO) || f.eql(p, f.ONE);
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
// CURVE.n lengths
|
|
260
|
+
export function nLength(n, nBitLength) {
|
|
261
|
+
// Bit size, byte size of CURVE.n
|
|
262
|
+
const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;
|
|
263
|
+
const nByteLength = Math.ceil(_nBitLength / 8);
|
|
264
|
+
return { nBitLength: _nBitLength, nByteLength };
|
|
265
|
+
}
|
|
266
|
+
export function Fp(ORDER, bitLen, isLE = false, redef = {}) {
|
|
267
|
+
if (ORDER <= _0n)
|
|
268
|
+
throw new Error(`Expected Fp ORDER > 0, got ${ORDER}`);
|
|
269
|
+
const { nBitLength: BITS, nByteLength: BYTES } = nLength(ORDER, bitLen);
|
|
270
|
+
if (BYTES > 2048)
|
|
271
|
+
throw new Error('Field lengths over 2048 bytes are not supported');
|
|
272
|
+
const sqrtP = FpSqrt(ORDER);
|
|
273
|
+
const f = Object.freeze({
|
|
274
|
+
ORDER,
|
|
275
|
+
BITS,
|
|
276
|
+
BYTES,
|
|
277
|
+
MASK: bitMask(BITS),
|
|
278
|
+
ZERO: _0n,
|
|
279
|
+
ONE: _1n,
|
|
280
|
+
create: (num) => mod(num, ORDER),
|
|
281
|
+
isValid: (num) => {
|
|
282
|
+
if (typeof num !== 'bigint')
|
|
283
|
+
throw new Error(`Invalid field element: expected bigint, got ${typeof num}`);
|
|
284
|
+
return _0n <= num && num < ORDER; // 0 is valid element, but it's not invertible
|
|
285
|
+
},
|
|
286
|
+
is0: (num) => num === _0n,
|
|
287
|
+
isOdd: (num) => (num & _1n) === _1n,
|
|
288
|
+
neg: (num) => mod(-num, ORDER),
|
|
289
|
+
eql: (lhs, rhs) => lhs === rhs,
|
|
290
|
+
sqr: (num) => mod(num * num, ORDER),
|
|
291
|
+
add: (lhs, rhs) => mod(lhs + rhs, ORDER),
|
|
292
|
+
sub: (lhs, rhs) => mod(lhs - rhs, ORDER),
|
|
293
|
+
mul: (lhs, rhs) => mod(lhs * rhs, ORDER),
|
|
294
|
+
pow: (num, power) => FpPow(f, num, power),
|
|
295
|
+
div: (lhs, rhs) => mod(lhs * invert(rhs, ORDER), ORDER),
|
|
296
|
+
// Same as above, but doesn't normalize
|
|
297
|
+
sqrN: (num) => num * num,
|
|
298
|
+
addN: (lhs, rhs) => lhs + rhs,
|
|
299
|
+
subN: (lhs, rhs) => lhs - rhs,
|
|
300
|
+
mulN: (lhs, rhs) => lhs * rhs,
|
|
301
|
+
inv: (num) => invert(num, ORDER),
|
|
302
|
+
sqrt: redef.sqrt || ((n) => sqrtP(f, n)),
|
|
303
|
+
invertBatch: (lst) => FpInvertBatch(f, lst),
|
|
304
|
+
// TODO: do we really need constant cmov?
|
|
305
|
+
// We don't have const-time bigints anyway, so probably will be not very useful
|
|
306
|
+
cmov: (a, b, c) => (c ? b : a),
|
|
307
|
+
toBytes: (num) => (isLE ? numberToBytesLE(num, BYTES) : numberToBytesBE(num, BYTES)),
|
|
308
|
+
fromBytes: (bytes) => {
|
|
309
|
+
if (bytes.length !== BYTES)
|
|
310
|
+
throw new Error(`Fp.fromBytes: expected ${BYTES}, got ${bytes.length}`);
|
|
311
|
+
return isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);
|
|
312
|
+
},
|
|
313
|
+
});
|
|
314
|
+
return Object.freeze(f);
|
|
315
|
+
}
|
|
316
|
+
export function FpSqrtOdd(Fp, elm) {
|
|
317
|
+
if (!Fp.isOdd)
|
|
318
|
+
throw new Error(`Field doesn't have isOdd`);
|
|
319
|
+
const root = Fp.sqrt(elm);
|
|
320
|
+
return Fp.isOdd(root) ? root : Fp.neg(root);
|
|
321
|
+
}
|
|
322
|
+
export function FpSqrtEven(Fp, elm) {
|
|
323
|
+
if (!Fp.isOdd)
|
|
324
|
+
throw new Error(`Field doesn't have isOdd`);
|
|
325
|
+
const root = Fp.sqrt(elm);
|
|
326
|
+
return Fp.isOdd(root) ? Fp.neg(root) : root;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* FIPS 186 B.4.1-compliant "constant-time" private key generation utility.
|
|
330
|
+
* Can take (n+8) or more bytes of uniform input e.g. from CSPRNG or KDF
|
|
331
|
+
* and convert them into private scalar, with the modulo bias being neglible.
|
|
332
|
+
* Needs at least 40 bytes of input for 32-byte private key.
|
|
333
|
+
* https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/
|
|
334
|
+
* @param hash hash output from SHA3 or a similar function
|
|
335
|
+
* @returns valid private scalar
|
|
336
|
+
*/
|
|
337
|
+
export function hashToPrivateScalar(hash, groupOrder, isLE = false) {
|
|
338
|
+
hash = ensureBytes('privateHash', hash);
|
|
339
|
+
const hashLen = hash.length;
|
|
340
|
+
const minLen = nLength(groupOrder).nByteLength + 8;
|
|
341
|
+
if (minLen < 24 || hashLen < minLen || hashLen > 1024)
|
|
342
|
+
throw new Error(`hashToPrivateScalar: expected ${minLen}-1024 bytes of input, got ${hashLen}`);
|
|
343
|
+
const num = isLE ? bytesToNumberLE(hash) : bytesToNumberBE(hash);
|
|
344
|
+
return mod(num, groupOrder - _1n) + _1n;
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=modular.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modular.js","sourceRoot":"","sources":["../../src/abstract/modular.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,sDAAsD;AACtD,OAAO,EACL,OAAO,EACP,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,WAAW,EACX,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,kBAAkB;AAClB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACzE,kBAAkB;AAClB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACxD,kBAAkB;AAClB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;AAEzC,wBAAwB;AACxB,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,CAAS;IACtC,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,OAAO,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;AAC7C,CAAC;AACD;;;;;GAKG;AACH,oCAAoC;AACpC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,MAAc;IAC5D,IAAI,MAAM,IAAI,GAAG,IAAI,KAAK,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/E,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC;IAC/B,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,OAAO,KAAK,GAAG,GAAG,EAAE;QAClB,IAAI,KAAK,GAAG,GAAG;YAAE,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC;QAC5C,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC;QAC3B,KAAK,KAAK,GAAG,CAAC;KACf;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,IAAI,CAAC,CAAS,EAAE,KAAa,EAAE,MAAc;IAC3D,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,OAAO,KAAK,EAAE,GAAG,GAAG,EAAE;QACpB,GAAG,IAAI,GAAG,CAAC;QACX,GAAG,IAAI,MAAM,CAAC;KACf;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,MAAM,CAAC,MAAc,EAAE,MAAc;IACnD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE;QACnC,MAAM,IAAI,KAAK,CAAC,6CAA6C,MAAM,QAAQ,MAAM,EAAE,CAAC,CAAC;KACtF;IACD,yEAAyE;IACzE,kFAAkF;IAClF,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG,MAAM,CAAC;IACf,kBAAkB;IAClB,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;IACvC,OAAO,CAAC,KAAK,GAAG,EAAE;QAChB,gEAAgE;QAChE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,kBAAkB;QAClB,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;KAC1C;IACD,MAAM,GAAG,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,KAAK,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACxB,CAAC;AAED,2BAA2B;AAC3B,0DAA0D;AAC1D,yDAAyD;AACzD,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,gEAAgE;IAChE,kDAAkD;IAClD,0CAA0C;IAC1C,8CAA8C;IAC9C,kCAAkC;IAClC,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IAElC,IAAI,CAAS,EAAE,CAAS,EAAE,CAAS,CAAC;IACpC,mDAAmD;IACnD,oDAAoD;IACpD,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,KAAK,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE;QAAC,CAAC;IAEzD,sEAAsE;IACtE,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;QAAC,CAAC;IAE9D,YAAY;IACZ,IAAI,CAAC,KAAK,CAAC,EAAE;QACX,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC/B,OAAO,SAAS,WAAW,CAAI,EAAY,EAAE,CAAI;YAC/C,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAC/B,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACzE,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;KACH;IAED,YAAY;IACZ,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IAC/B,OAAO,SAAS,WAAW,CAAI,EAAY,EAAE,CAAI;QAC/C,sEAAsE;QACtE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACxF,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,6BAA6B;QAC7B,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,2BAA2B;QACjE,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,iCAAiC;QAC5D,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,kCAAkC;QAExD,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE;YACzB,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;gBAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,6FAA6F;YACrI,yBAAyB;YACzB,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBACnC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC;oBAAE,MAAM;gBAC9B,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW;aAC7B;YACD,8GAA8G;YAC9G,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB;YACjE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc;YAC9B,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU;YAC7B,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YAC3B,CAAC,GAAG,CAAC,CAAC;SACP;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,CAAS;IAC9B,uGAAuG;IACvG,sGAAsG;IAEtG,gBAAgB;IAChB,mBAAmB;IACnB,IAAI,CAAC,GAAG,GAAG,KAAK,GAAG,EAAE;QACnB,0BAA0B;QAC1B,gBAAgB;QAChB,yGAAyG;QACzG,kCAAkC;QAClC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC/B,OAAO,SAAS,SAAS,CAAI,EAAY,EAAE,CAAI;YAC7C,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAC/B,wBAAwB;YACxB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACzE,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;KACH;IAED,oFAAoF;IACpF,IAAI,CAAC,GAAG,GAAG,KAAK,GAAG,EAAE;QACnB,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC3B,OAAO,SAAS,SAAS,CAAI,EAAY,EAAE,CAAI;YAC7C,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC1B,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACzB,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACzE,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;KACH;IAED,iBAAiB;IACjB,IAAI,CAAC,GAAG,IAAI,KAAK,GAAG,EAAE;QACpB,mEAAmE;QACnE,iDAAiD;QACjD,EAAE;QACF,4FAA4F;QAC5F,4FAA4F;QAC5F,8FAA8F;QAC9F,8FAA8F;QAC9F,kBAAkB;QAClB,2DAA2D;QAC3D,+DAA+D;QAC/D,+DAA+D;QAC/D,+DAA+D;QAC/D,uEAAuE;QACvE,uEAAuE;QACvE,+FAA+F;QAC/F,+FAA+F;QAC/F,uEAAuE;QACvE,sGAAsG;QACtG,IAAI;KACL;IAED,wCAAwC;IACxC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,sDAAsD;AACtD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,MAAc,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC;AA+C9F,kBAAkB;AAClB,MAAM,YAAY,GAAG;IACnB,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK;IACvD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IACxC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CACtB,CAAC;AACX,MAAM,UAAU,aAAa,CAAI,KAAe;IAC9C,MAAM,OAAO,GAAG;QACd,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,eAAe;KACI,CAAC;IAC5B,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAW,EAAE,EAAE;QACpD,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;QACtB,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,OAAO,CAAC,CAAC;IACZ,OAAO,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,0BAA0B;AAC1B,MAAM,UAAU,KAAK,CAAI,CAAW,EAAE,GAAM,EAAE,KAAa;IACzD,4CAA4C;IAC5C,mBAAmB;IACnB,IAAI,KAAK,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACvD,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC;IAChC,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;IACd,IAAI,CAAC,GAAG,GAAG,CAAC;IACZ,OAAO,KAAK,GAAG,GAAG,EAAE;QAClB,IAAI,KAAK,GAAG,GAAG;YAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACb,KAAK,KAAK,EAAE,CAAC;KACd;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,aAAa,CAAI,CAAW,EAAE,IAAS;IACrD,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,6DAA6D;IAC7D,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QACjD,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;QAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACb,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACzB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACV,sBAAsB;IACtB,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACvC,sEAAsE;IACtE,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QAC/B,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;QAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACzB,CAAC,EAAE,QAAQ,CAAC,CAAC;IACb,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,KAAK,CAAI,CAAW,EAAE,GAAM,EAAE,GAAe;IAC3D,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,UAAU,CAAI,CAAW;IACvC,MAAM,aAAa,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,qBAAqB;IAClE,OAAO,CAAC,CAAI,EAAW,EAAE;QACvB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QAClC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC,CAAC;AACJ,CAAC;AAED,kBAAkB;AAClB,MAAM,UAAU,OAAO,CAAC,CAAS,EAAE,UAAmB;IACpD,iCAAiC;IACjC,MAAM,WAAW,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACjF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;IAC/C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AAClD,CAAC;AAOD,MAAM,UAAU,EAAE,CAChB,KAAa,EACb,MAAe,EACf,IAAI,GAAG,KAAK,EACZ,QAAgC,EAAE;IAElC,IAAI,KAAK,IAAI,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;IACzE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxE,IAAI,KAAK,GAAG,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAsB,MAAM,CAAC,MAAM,CAAC;QACzC,KAAK;QACL,IAAI;QACJ,KAAK;QACL,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;QACnB,IAAI,EAAE,GAAG;QACT,GAAG,EAAE,GAAG;QACR,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;QAChC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACf,IAAI,OAAO,GAAG,KAAK,QAAQ;gBACzB,MAAM,IAAI,KAAK,CAAC,+CAA+C,OAAO,GAAG,EAAE,CAAC,CAAC;YAC/E,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,8CAA8C;QAClF,CAAC;QACD,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG;QACzB,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG;QACnC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC;QAC9B,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG;QAE9B,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,KAAK,CAAC;QACnC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,KAAK,CAAC;QACxC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,KAAK,CAAC;QACxC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,KAAK,CAAC;QACxC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC;QACzC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC;QAEvD,uCAAuC;QACvC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG;QACxB,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG;QAC7B,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG;QAC7B,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG;QAE7B,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;QAChC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC;QAC3C,yCAAyC;QACzC,+EAA+E;QAC/E,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpF,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YACnB,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK;gBACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1E,OAAO,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC;KACS,CAAC,CAAC;IACd,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,SAAS,CAAI,EAAY,EAAE,GAAM;IAC/C,IAAI,CAAC,EAAE,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,UAAU,CAAI,EAAY,EAAE,GAAM;IAChD,IAAI,CAAC,EAAE,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAyB,EACzB,UAAkB,EAClB,IAAI,GAAG,KAAK;IAEZ,IAAI,GAAG,WAAW,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC;IACnD,IAAI,MAAM,GAAG,EAAE,IAAI,OAAO,GAAG,MAAM,IAAI,OAAO,GAAG,IAAI;QACnD,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,6BAA6B,OAAO,EAAE,CAAC,CAAC;IACjG,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACjE,OAAO,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
2
|
+
import { mod, pow } from './modular.js';
|
|
3
|
+
import { bytesToNumberLE, ensureBytes, numberToBytesLE, validateObject } from './utils.js';
|
|
4
|
+
const _0n = BigInt(0);
|
|
5
|
+
const _1n = BigInt(1);
|
|
6
|
+
function validateOpts(curve) {
|
|
7
|
+
validateObject(curve, {
|
|
8
|
+
a: 'bigint',
|
|
9
|
+
}, {
|
|
10
|
+
montgomeryBits: 'isSafeInteger',
|
|
11
|
+
nByteLength: 'isSafeInteger',
|
|
12
|
+
adjustScalarBytes: 'function',
|
|
13
|
+
domain: 'function',
|
|
14
|
+
powPminus2: 'function',
|
|
15
|
+
Gu: 'bigint',
|
|
16
|
+
});
|
|
17
|
+
// Set defaults
|
|
18
|
+
return Object.freeze({ ...curve });
|
|
19
|
+
}
|
|
20
|
+
// NOTE: not really montgomery curve, just bunch of very specific methods for X25519/X448 (RFC 7748, https://www.rfc-editor.org/rfc/rfc7748)
|
|
21
|
+
// Uses only one coordinate instead of two
|
|
22
|
+
export function montgomery(curveDef) {
|
|
23
|
+
const CURVE = validateOpts(curveDef);
|
|
24
|
+
const { P } = CURVE;
|
|
25
|
+
const modP = (n) => mod(n, P);
|
|
26
|
+
const montgomeryBits = CURVE.montgomeryBits;
|
|
27
|
+
const montgomeryBytes = Math.ceil(montgomeryBits / 8);
|
|
28
|
+
const fieldLen = CURVE.nByteLength;
|
|
29
|
+
const adjustScalarBytes = CURVE.adjustScalarBytes || ((bytes) => bytes);
|
|
30
|
+
const powPminus2 = CURVE.powPminus2 || ((x) => pow(x, P - BigInt(2), P));
|
|
31
|
+
// cswap from RFC7748. But it is not from RFC7748!
|
|
32
|
+
/*
|
|
33
|
+
cswap(swap, x_2, x_3):
|
|
34
|
+
dummy = mask(swap) AND (x_2 XOR x_3)
|
|
35
|
+
x_2 = x_2 XOR dummy
|
|
36
|
+
x_3 = x_3 XOR dummy
|
|
37
|
+
Return (x_2, x_3)
|
|
38
|
+
Where mask(swap) is the all-1 or all-0 word of the same length as x_2
|
|
39
|
+
and x_3, computed, e.g., as mask(swap) = 0 - swap.
|
|
40
|
+
*/
|
|
41
|
+
function cswap(swap, x_2, x_3) {
|
|
42
|
+
const dummy = modP(swap * (x_2 - x_3));
|
|
43
|
+
x_2 = modP(x_2 - dummy);
|
|
44
|
+
x_3 = modP(x_3 + dummy);
|
|
45
|
+
return [x_2, x_3];
|
|
46
|
+
}
|
|
47
|
+
// Accepts 0 as well
|
|
48
|
+
function assertFieldElement(n) {
|
|
49
|
+
if (typeof n === 'bigint' && _0n <= n && n < P)
|
|
50
|
+
return n;
|
|
51
|
+
throw new Error('Expected valid scalar 0 < scalar < CURVE.P');
|
|
52
|
+
}
|
|
53
|
+
// x25519 from 4
|
|
54
|
+
// The constant a24 is (486662 - 2) / 4 = 121665 for curve25519/X25519
|
|
55
|
+
const a24 = (CURVE.a - BigInt(2)) / BigInt(4);
|
|
56
|
+
/**
|
|
57
|
+
*
|
|
58
|
+
* @param pointU u coordinate (x) on Montgomery Curve 25519
|
|
59
|
+
* @param scalar by which the point would be multiplied
|
|
60
|
+
* @returns new Point on Montgomery curve
|
|
61
|
+
*/
|
|
62
|
+
function montgomeryLadder(pointU, scalar) {
|
|
63
|
+
const u = assertFieldElement(pointU);
|
|
64
|
+
// Section 5: Implementations MUST accept non-canonical values and process them as
|
|
65
|
+
// if they had been reduced modulo the field prime.
|
|
66
|
+
const k = assertFieldElement(scalar);
|
|
67
|
+
const x_1 = u;
|
|
68
|
+
let x_2 = _1n;
|
|
69
|
+
let z_2 = _0n;
|
|
70
|
+
let x_3 = u;
|
|
71
|
+
let z_3 = _1n;
|
|
72
|
+
let swap = _0n;
|
|
73
|
+
let sw;
|
|
74
|
+
for (let t = BigInt(montgomeryBits - 1); t >= _0n; t--) {
|
|
75
|
+
const k_t = (k >> t) & _1n;
|
|
76
|
+
swap ^= k_t;
|
|
77
|
+
sw = cswap(swap, x_2, x_3);
|
|
78
|
+
x_2 = sw[0];
|
|
79
|
+
x_3 = sw[1];
|
|
80
|
+
sw = cswap(swap, z_2, z_3);
|
|
81
|
+
z_2 = sw[0];
|
|
82
|
+
z_3 = sw[1];
|
|
83
|
+
swap = k_t;
|
|
84
|
+
const A = x_2 + z_2;
|
|
85
|
+
const AA = modP(A * A);
|
|
86
|
+
const B = x_2 - z_2;
|
|
87
|
+
const BB = modP(B * B);
|
|
88
|
+
const E = AA - BB;
|
|
89
|
+
const C = x_3 + z_3;
|
|
90
|
+
const D = x_3 - z_3;
|
|
91
|
+
const DA = modP(D * A);
|
|
92
|
+
const CB = modP(C * B);
|
|
93
|
+
const dacb = DA + CB;
|
|
94
|
+
const da_cb = DA - CB;
|
|
95
|
+
x_3 = modP(dacb * dacb);
|
|
96
|
+
z_3 = modP(x_1 * modP(da_cb * da_cb));
|
|
97
|
+
x_2 = modP(AA * BB);
|
|
98
|
+
z_2 = modP(E * (AA + modP(a24 * E)));
|
|
99
|
+
}
|
|
100
|
+
// (x_2, x_3) = cswap(swap, x_2, x_3)
|
|
101
|
+
sw = cswap(swap, x_2, x_3);
|
|
102
|
+
x_2 = sw[0];
|
|
103
|
+
x_3 = sw[1];
|
|
104
|
+
// (z_2, z_3) = cswap(swap, z_2, z_3)
|
|
105
|
+
sw = cswap(swap, z_2, z_3);
|
|
106
|
+
z_2 = sw[0];
|
|
107
|
+
z_3 = sw[1];
|
|
108
|
+
// z_2^(p - 2)
|
|
109
|
+
const z2 = powPminus2(z_2);
|
|
110
|
+
// Return x_2 * (z_2^(p - 2))
|
|
111
|
+
return modP(x_2 * z2);
|
|
112
|
+
}
|
|
113
|
+
function encodeUCoordinate(u) {
|
|
114
|
+
return numberToBytesLE(modP(u), montgomeryBytes);
|
|
115
|
+
}
|
|
116
|
+
function decodeUCoordinate(uEnc) {
|
|
117
|
+
// Section 5: When receiving such an array, implementations of X25519
|
|
118
|
+
// MUST mask the most significant bit in the final byte.
|
|
119
|
+
// This is very ugly way, but it works because fieldLen-1 is outside of bounds for X448, so this becomes NOOP
|
|
120
|
+
// fieldLen - scalaryBytes = 1 for X448 and = 0 for X25519
|
|
121
|
+
const u = ensureBytes('u coordinate', uEnc, montgomeryBytes);
|
|
122
|
+
// u[fieldLen-1] crashes QuickJS (TypeError: out-of-bound numeric index)
|
|
123
|
+
if (fieldLen === montgomeryBytes)
|
|
124
|
+
u[fieldLen - 1] &= 127; // 0b0111_1111
|
|
125
|
+
return bytesToNumberLE(u);
|
|
126
|
+
}
|
|
127
|
+
function decodeScalar(n) {
|
|
128
|
+
const bytes = ensureBytes('scalar', n);
|
|
129
|
+
if (bytes.length !== montgomeryBytes && bytes.length !== fieldLen)
|
|
130
|
+
throw new Error(`Expected ${montgomeryBytes} or ${fieldLen} bytes, got ${bytes.length}`);
|
|
131
|
+
return bytesToNumberLE(adjustScalarBytes(bytes));
|
|
132
|
+
}
|
|
133
|
+
function scalarMult(scalar, u) {
|
|
134
|
+
const pointU = decodeUCoordinate(u);
|
|
135
|
+
const _scalar = decodeScalar(scalar);
|
|
136
|
+
const pu = montgomeryLadder(pointU, _scalar);
|
|
137
|
+
// The result was not contributory
|
|
138
|
+
// https://cr.yp.to/ecdh.html#validate
|
|
139
|
+
if (pu === _0n)
|
|
140
|
+
throw new Error('Invalid private or public key received');
|
|
141
|
+
return encodeUCoordinate(pu);
|
|
142
|
+
}
|
|
143
|
+
// Computes public key from private. By doing scalar multiplication of base point.
|
|
144
|
+
const GuBytes = encodeUCoordinate(CURVE.Gu);
|
|
145
|
+
function scalarMultBase(scalar) {
|
|
146
|
+
return scalarMult(scalar, GuBytes);
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
scalarMult,
|
|
150
|
+
scalarMultBase,
|
|
151
|
+
getSharedSecret: (privateKey, publicKey) => scalarMult(privateKey, publicKey),
|
|
152
|
+
getPublicKey: (privateKey) => scalarMultBase(privateKey),
|
|
153
|
+
utils: { randomPrivateKey: () => CURVE.randomBytes(CURVE.nByteLength) },
|
|
154
|
+
GuBytes: GuBytes,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=montgomery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"montgomery.js","sourceRoot":"","sources":["../../src/abstract/montgomery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
2
|
+
// Poseidon Hash: https://eprint.iacr.org/2019/458.pdf, https://www.poseidon-hash.info
|
|
3
|
+
import { FpPow, validateField } from './modular.js';
|
|
4
|
+
export function validateOpts(opts) {
|
|
5
|
+
const { Fp } = opts;
|
|
6
|
+
validateField(Fp);
|
|
7
|
+
for (const i of ['t', 'roundsFull', 'roundsPartial']) {
|
|
8
|
+
if (typeof opts[i] !== 'number' || !Number.isSafeInteger(opts[i]))
|
|
9
|
+
throw new Error(`Poseidon: invalid param ${i}=${opts[i]} (${typeof opts[i]})`);
|
|
10
|
+
}
|
|
11
|
+
if (opts.reversePartialPowIdx !== undefined && typeof opts.reversePartialPowIdx !== 'boolean')
|
|
12
|
+
throw new Error(`Poseidon: invalid param reversePartialPowIdx=${opts.reversePartialPowIdx}`);
|
|
13
|
+
// Default is 5, but by some reasons stark uses 3
|
|
14
|
+
let sboxPower = opts.sboxPower;
|
|
15
|
+
if (sboxPower === undefined)
|
|
16
|
+
sboxPower = 5;
|
|
17
|
+
if (typeof sboxPower !== 'number' || !Number.isSafeInteger(sboxPower))
|
|
18
|
+
throw new Error(`Poseidon wrong sboxPower=${sboxPower}`);
|
|
19
|
+
const _sboxPower = BigInt(sboxPower);
|
|
20
|
+
let sboxFn = (n) => FpPow(Fp, n, _sboxPower);
|
|
21
|
+
// Unwrapped sbox power for common cases (195->142μs)
|
|
22
|
+
if (sboxPower === 3)
|
|
23
|
+
sboxFn = (n) => Fp.mul(Fp.sqrN(n), n);
|
|
24
|
+
else if (sboxPower === 5)
|
|
25
|
+
sboxFn = (n) => Fp.mul(Fp.sqrN(Fp.sqrN(n)), n);
|
|
26
|
+
if (opts.roundsFull % 2 !== 0)
|
|
27
|
+
throw new Error(`Poseidon roundsFull is not even: ${opts.roundsFull}`);
|
|
28
|
+
const rounds = opts.roundsFull + opts.roundsPartial;
|
|
29
|
+
if (!Array.isArray(opts.roundConstants) || opts.roundConstants.length !== rounds)
|
|
30
|
+
throw new Error('Poseidon: wrong round constants');
|
|
31
|
+
const roundConstants = opts.roundConstants.map((rc) => {
|
|
32
|
+
if (!Array.isArray(rc) || rc.length !== opts.t)
|
|
33
|
+
throw new Error(`Poseidon wrong round constants: ${rc}`);
|
|
34
|
+
return rc.map((i) => {
|
|
35
|
+
if (typeof i !== 'bigint' || !Fp.isValid(i))
|
|
36
|
+
throw new Error(`Poseidon wrong round constant=${i}`);
|
|
37
|
+
return Fp.create(i);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
// MDS is TxT matrix
|
|
41
|
+
if (!Array.isArray(opts.mds) || opts.mds.length !== opts.t)
|
|
42
|
+
throw new Error('Poseidon: wrong MDS matrix');
|
|
43
|
+
const mds = opts.mds.map((mdsRow) => {
|
|
44
|
+
if (!Array.isArray(mdsRow) || mdsRow.length !== opts.t)
|
|
45
|
+
throw new Error(`Poseidon MDS matrix row: ${mdsRow}`);
|
|
46
|
+
return mdsRow.map((i) => {
|
|
47
|
+
if (typeof i !== 'bigint')
|
|
48
|
+
throw new Error(`Poseidon MDS matrix value=${i}`);
|
|
49
|
+
return Fp.create(i);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
return Object.freeze({ ...opts, rounds, sboxFn, roundConstants, mds });
|
|
53
|
+
}
|
|
54
|
+
export function splitConstants(rc, t) {
|
|
55
|
+
if (typeof t !== 'number')
|
|
56
|
+
throw new Error('poseidonSplitConstants: wrong t');
|
|
57
|
+
if (!Array.isArray(rc) || rc.length % t)
|
|
58
|
+
throw new Error('poseidonSplitConstants: wrong rc');
|
|
59
|
+
const res = [];
|
|
60
|
+
let tmp = [];
|
|
61
|
+
for (let i = 0; i < rc.length; i++) {
|
|
62
|
+
tmp.push(rc[i]);
|
|
63
|
+
if (tmp.length === t) {
|
|
64
|
+
res.push(tmp);
|
|
65
|
+
tmp = [];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return res;
|
|
69
|
+
}
|
|
70
|
+
export function poseidon(opts) {
|
|
71
|
+
const { t, Fp, rounds, sboxFn, reversePartialPowIdx } = validateOpts(opts);
|
|
72
|
+
const halfRoundsFull = Math.floor(opts.roundsFull / 2);
|
|
73
|
+
const partialIdx = reversePartialPowIdx ? t - 1 : 0;
|
|
74
|
+
const poseidonRound = (values, isFull, idx) => {
|
|
75
|
+
values = values.map((i, j) => Fp.add(i, opts.roundConstants[idx][j]));
|
|
76
|
+
if (isFull)
|
|
77
|
+
values = values.map((i) => sboxFn(i));
|
|
78
|
+
else
|
|
79
|
+
values[partialIdx] = sboxFn(values[partialIdx]);
|
|
80
|
+
// Matrix multiplication
|
|
81
|
+
values = opts.mds.map((i) => i.reduce((acc, i, j) => Fp.add(acc, Fp.mulN(i, values[j])), Fp.ZERO));
|
|
82
|
+
return values;
|
|
83
|
+
};
|
|
84
|
+
const poseidonHash = function poseidonHash(values) {
|
|
85
|
+
if (!Array.isArray(values) || values.length !== t)
|
|
86
|
+
throw new Error(`Poseidon: wrong values (expected array of bigints with length ${t})`);
|
|
87
|
+
values = values.map((i) => {
|
|
88
|
+
if (typeof i !== 'bigint')
|
|
89
|
+
throw new Error(`Poseidon: wrong value=${i} (${typeof i})`);
|
|
90
|
+
return Fp.create(i);
|
|
91
|
+
});
|
|
92
|
+
let round = 0;
|
|
93
|
+
// Apply r_f/2 full rounds.
|
|
94
|
+
for (let i = 0; i < halfRoundsFull; i++)
|
|
95
|
+
values = poseidonRound(values, true, round++);
|
|
96
|
+
// Apply r_p partial rounds.
|
|
97
|
+
for (let i = 0; i < opts.roundsPartial; i++)
|
|
98
|
+
values = poseidonRound(values, false, round++);
|
|
99
|
+
// Apply r_f/2 full rounds.
|
|
100
|
+
for (let i = 0; i < halfRoundsFull; i++)
|
|
101
|
+
values = poseidonRound(values, true, round++);
|
|
102
|
+
if (round !== rounds)
|
|
103
|
+
throw new Error(`Poseidon: wrong number of rounds: last round=${round}, total=${rounds}`);
|
|
104
|
+
return values;
|
|
105
|
+
};
|
|
106
|
+
// For verification in tests
|
|
107
|
+
poseidonHash.roundConstants = opts.roundConstants;
|
|
108
|
+
return poseidonHash;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=poseidon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poseidon.js","sourceRoot":"","sources":["../../src/abstract/poseidon.ts"],"names":[],"mappings":"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"}
|