@noble/curves 0.5.2 → 0.6.1
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 +115 -41
- package/lib/_shortw_utils.d.ts +13 -24
- package/lib/abstract/bls.d.ts +39 -32
- package/lib/abstract/bls.js +74 -73
- package/lib/abstract/{group.d.ts → curve.d.ts} +30 -1
- package/lib/abstract/{group.js → curve.js} +33 -2
- package/lib/abstract/edwards.d.ts +30 -72
- package/lib/abstract/edwards.js +206 -389
- package/lib/abstract/hash-to-curve.d.ts +25 -6
- package/lib/abstract/hash-to-curve.js +40 -12
- package/lib/abstract/modular.d.ts +21 -8
- package/lib/abstract/modular.js +72 -48
- package/lib/abstract/montgomery.js +23 -68
- package/lib/abstract/poseidon.d.ts +29 -0
- package/lib/abstract/poseidon.js +115 -0
- package/lib/abstract/utils.d.ts +9 -37
- package/lib/abstract/utils.js +61 -87
- package/lib/abstract/weierstrass.d.ts +58 -81
- package/lib/abstract/weierstrass.js +485 -679
- package/lib/bls12-381.js +63 -58
- package/lib/bn.js +1 -1
- package/lib/ed25519.d.ts +7 -5
- package/lib/ed25519.js +82 -79
- package/lib/ed448.d.ts +3 -0
- package/lib/ed448.js +86 -83
- package/lib/esm/abstract/bls.js +75 -74
- package/lib/esm/abstract/{group.js → curve.js} +31 -1
- package/lib/esm/abstract/edwards.js +204 -387
- package/lib/esm/abstract/hash-to-curve.js +38 -11
- package/lib/esm/abstract/modular.js +69 -47
- package/lib/esm/abstract/montgomery.js +24 -69
- package/lib/esm/abstract/poseidon.js +109 -0
- package/lib/esm/abstract/utils.js +58 -82
- package/lib/esm/abstract/weierstrass.js +484 -678
- package/lib/esm/bls12-381.js +75 -70
- package/lib/esm/bn.js +1 -1
- package/lib/esm/ed25519.js +80 -78
- package/lib/esm/ed448.js +84 -82
- package/lib/esm/jubjub.js +1 -1
- package/lib/esm/p224.js +1 -1
- package/lib/esm/p256.js +11 -9
- package/lib/esm/p384.js +11 -9
- package/lib/esm/p521.js +12 -23
- package/lib/esm/secp256k1.js +124 -162
- package/lib/esm/stark.js +105 -41
- package/lib/jubjub.d.ts +2 -2
- package/lib/jubjub.js +1 -1
- package/lib/p192.d.ts +26 -48
- package/lib/p224.d.ts +26 -48
- package/lib/p224.js +1 -1
- package/lib/p256.d.ts +29 -48
- package/lib/p256.js +13 -10
- package/lib/p384.d.ts +29 -48
- package/lib/p384.js +13 -10
- package/lib/p521.d.ts +37 -57
- package/lib/p521.js +14 -24
- package/lib/secp256k1.d.ts +37 -46
- package/lib/secp256k1.js +124 -162
- package/lib/stark.d.ts +39 -22
- package/lib/stark.js +108 -41
- package/package.json +15 -10
package/lib/esm/ed448.js
CHANGED
|
@@ -4,6 +4,7 @@ import { concatBytes, randomBytes, utf8ToBytes, wrapConstructor } from '@noble/h
|
|
|
4
4
|
import { twistedEdwards } from './abstract/edwards.js';
|
|
5
5
|
import { mod, pow2, Fp as Field } from './abstract/modular.js';
|
|
6
6
|
import { montgomery } from './abstract/montgomery.js';
|
|
7
|
+
import * as htf from './abstract/hash-to-curve.js';
|
|
7
8
|
/**
|
|
8
9
|
* Edwards448 (not Ed448-Goldilocks) curve with following addons:
|
|
9
10
|
* * X448 ECDH
|
|
@@ -46,79 +47,6 @@ function adjustScalarBytes(bytes) {
|
|
|
46
47
|
return bytes;
|
|
47
48
|
}
|
|
48
49
|
const Fp = Field(ed448P, 456, true);
|
|
49
|
-
// Hash To Curve Elligator2 Map
|
|
50
|
-
const ELL2_C1 = (Fp.ORDER - BigInt(3)) / BigInt(4); // 1. c1 = (q - 3) / 4 # Integer arithmetic
|
|
51
|
-
const ELL2_J = BigInt(156326);
|
|
52
|
-
function map_to_curve_elligator2_curve448(u) {
|
|
53
|
-
let tv1 = Fp.square(u); // 1. tv1 = u^2
|
|
54
|
-
let e1 = Fp.equals(tv1, Fp.ONE); // 2. e1 = tv1 == 1
|
|
55
|
-
tv1 = Fp.cmov(tv1, Fp.ZERO, e1); // 3. tv1 = CMOV(tv1, 0, e1) # If Z * u^2 == -1, set tv1 = 0
|
|
56
|
-
let xd = Fp.sub(Fp.ONE, tv1); // 4. xd = 1 - tv1
|
|
57
|
-
let x1n = Fp.negate(ELL2_J); // 5. x1n = -J
|
|
58
|
-
let tv2 = Fp.square(xd); // 6. tv2 = xd^2
|
|
59
|
-
let gxd = Fp.mul(tv2, xd); // 7. gxd = tv2 * xd # gxd = xd^3
|
|
60
|
-
let gx1 = Fp.mul(tv1, Fp.negate(ELL2_J)); // 8. gx1 = -J * tv1 # x1n + J * xd
|
|
61
|
-
gx1 = Fp.mul(gx1, x1n); // 9. gx1 = gx1 * x1n # x1n^2 + J * x1n * xd
|
|
62
|
-
gx1 = Fp.add(gx1, tv2); // 10. gx1 = gx1 + tv2 # x1n^2 + J * x1n * xd + xd^2
|
|
63
|
-
gx1 = Fp.mul(gx1, x1n); // 11. gx1 = gx1 * x1n # x1n^3 + J * x1n^2 * xd + x1n * xd^2
|
|
64
|
-
let tv3 = Fp.square(gxd); // 12. tv3 = gxd^2
|
|
65
|
-
tv2 = Fp.mul(gx1, gxd); // 13. tv2 = gx1 * gxd # gx1 * gxd
|
|
66
|
-
tv3 = Fp.mul(tv3, tv2); // 14. tv3 = tv3 * tv2 # gx1 * gxd^3
|
|
67
|
-
let y1 = Fp.pow(tv3, ELL2_C1); // 15. y1 = tv3^c1 # (gx1 * gxd^3)^((p - 3) / 4)
|
|
68
|
-
y1 = Fp.mul(y1, tv2); // 16. y1 = y1 * tv2 # gx1 * gxd * (gx1 * gxd^3)^((p - 3) / 4)
|
|
69
|
-
let x2n = Fp.mul(x1n, Fp.negate(tv1)); // 17. x2n = -tv1 * x1n # x2 = x2n / xd = -1 * u^2 * x1n / xd
|
|
70
|
-
let y2 = Fp.mul(y1, u); // 18. y2 = y1 * u
|
|
71
|
-
y2 = Fp.cmov(y2, Fp.ZERO, e1); // 19. y2 = CMOV(y2, 0, e1)
|
|
72
|
-
tv2 = Fp.square(y1); // 20. tv2 = y1^2
|
|
73
|
-
tv2 = Fp.mul(tv2, gxd); // 21. tv2 = tv2 * gxd
|
|
74
|
-
let e2 = Fp.equals(tv2, gx1); // 22. e2 = tv2 == gx1
|
|
75
|
-
let xn = Fp.cmov(x2n, x1n, e2); // 23. xn = CMOV(x2n, x1n, e2) # If e2, x = x1, else x = x2
|
|
76
|
-
let y = Fp.cmov(y2, y1, e2); // 24. y = CMOV(y2, y1, e2) # If e2, y = y1, else y = y2
|
|
77
|
-
let e3 = Fp.isOdd(y); // 25. e3 = sgn0(y) == 1 # Fix sign of y
|
|
78
|
-
y = Fp.cmov(y, Fp.negate(y), e2 !== e3); // 26. y = CMOV(y, -y, e2 XOR e3)
|
|
79
|
-
return { xn, xd, yn: y, yd: Fp.ONE }; // 27. return (xn, xd, y, 1)
|
|
80
|
-
}
|
|
81
|
-
function map_to_curve_elligator2_edwards448(u) {
|
|
82
|
-
let { xn, xd, yn, yd } = map_to_curve_elligator2_curve448(u); // 1. (xn, xd, yn, yd) = map_to_curve_elligator2_curve448(u)
|
|
83
|
-
let xn2 = Fp.square(xn); // 2. xn2 = xn^2
|
|
84
|
-
let xd2 = Fp.square(xd); // 3. xd2 = xd^2
|
|
85
|
-
let xd4 = Fp.square(xd2); // 4. xd4 = xd2^2
|
|
86
|
-
let yn2 = Fp.square(yn); // 5. yn2 = yn^2
|
|
87
|
-
let yd2 = Fp.square(yd); // 6. yd2 = yd^2
|
|
88
|
-
let xEn = Fp.sub(xn2, xd2); // 7. xEn = xn2 - xd2
|
|
89
|
-
let tv2 = Fp.sub(xEn, xd2); // 8. tv2 = xEn - xd2
|
|
90
|
-
xEn = Fp.mul(xEn, xd2); // 9. xEn = xEn * xd2
|
|
91
|
-
xEn = Fp.mul(xEn, yd); // 10. xEn = xEn * yd
|
|
92
|
-
xEn = Fp.mul(xEn, yn); // 11. xEn = xEn * yn
|
|
93
|
-
xEn = Fp.mul(xEn, 4n); // 12. xEn = xEn * 4
|
|
94
|
-
tv2 = Fp.mul(tv2, xn2); // 13. tv2 = tv2 * xn2
|
|
95
|
-
tv2 = Fp.mul(tv2, yd2); // 14. tv2 = tv2 * yd2
|
|
96
|
-
let tv3 = Fp.mul(yn2, 4n); // 15. tv3 = 4 * yn2
|
|
97
|
-
let tv1 = Fp.add(tv3, yd2); // 16. tv1 = tv3 + yd2
|
|
98
|
-
tv1 = Fp.mul(tv1, xd4); // 17. tv1 = tv1 * xd4
|
|
99
|
-
let xEd = Fp.add(tv1, tv2); // 18. xEd = tv1 + tv2
|
|
100
|
-
tv2 = Fp.mul(tv2, xn); // 19. tv2 = tv2 * xn
|
|
101
|
-
let tv4 = Fp.mul(xn, xd4); // 20. tv4 = xn * xd4
|
|
102
|
-
let yEn = Fp.sub(tv3, yd2); // 21. yEn = tv3 - yd2
|
|
103
|
-
yEn = Fp.mul(yEn, tv4); // 22. yEn = yEn * tv4
|
|
104
|
-
yEn = Fp.sub(yEn, tv2); // 23. yEn = yEn - tv2
|
|
105
|
-
tv1 = Fp.add(xn2, xd2); // 24. tv1 = xn2 + xd2
|
|
106
|
-
tv1 = Fp.mul(tv1, xd2); // 25. tv1 = tv1 * xd2
|
|
107
|
-
tv1 = Fp.mul(tv1, xd); // 26. tv1 = tv1 * xd
|
|
108
|
-
tv1 = Fp.mul(tv1, yn2); // 27. tv1 = tv1 * yn2
|
|
109
|
-
tv1 = Fp.mul(tv1, BigInt(-2)); // 28. tv1 = -2 * tv1
|
|
110
|
-
let yEd = Fp.add(tv2, tv1); // 29. yEd = tv2 + tv1
|
|
111
|
-
tv4 = Fp.mul(tv4, yd2); // 30. tv4 = tv4 * yd2
|
|
112
|
-
yEd = Fp.add(yEd, tv4); // 31. yEd = yEd + tv4
|
|
113
|
-
tv1 = Fp.mul(xEd, yEd); // 32. tv1 = xEd * yEd
|
|
114
|
-
let e = Fp.equals(tv1, Fp.ZERO); // 33. e = tv1 == 0
|
|
115
|
-
xEn = Fp.cmov(xEn, Fp.ZERO, e); // 34. xEn = CMOV(xEn, 0, e)
|
|
116
|
-
xEd = Fp.cmov(xEd, Fp.ONE, e); // 35. xEd = CMOV(xEd, 1, e)
|
|
117
|
-
yEn = Fp.cmov(yEn, Fp.ONE, e); // 36. yEn = CMOV(yEn, 1, e)
|
|
118
|
-
yEd = Fp.cmov(yEd, Fp.ONE, e); // 37. yEd = CMOV(yEd, 1, e)
|
|
119
|
-
const inv = Fp.invertBatch([xEd, yEd]); // batch division
|
|
120
|
-
return { x: Fp.mul(xEn, inv[0]), y: Fp.mul(yEn, inv[1]) }; // 38. return (xEn, xEd, yEn, yEd)
|
|
121
|
-
}
|
|
122
50
|
const ED448_DEF = {
|
|
123
51
|
// Param: a
|
|
124
52
|
a: BigInt(1),
|
|
@@ -166,15 +94,6 @@ const ED448_DEF = {
|
|
|
166
94
|
// square root exists, and the decoding fails.
|
|
167
95
|
return { isValid: mod(x2 * v, P) === u, value: x };
|
|
168
96
|
},
|
|
169
|
-
htfDefaults: {
|
|
170
|
-
DST: 'edwards448_XOF:SHAKE256_ELL2_RO_',
|
|
171
|
-
p: Fp.ORDER,
|
|
172
|
-
m: 1,
|
|
173
|
-
k: 224,
|
|
174
|
-
expand: 'xof',
|
|
175
|
-
hash: shake256,
|
|
176
|
-
},
|
|
177
|
-
mapToCurve: (scalars) => map_to_curve_elligator2_edwards448(scalars[0]),
|
|
178
97
|
};
|
|
179
98
|
export const ed448 = twistedEdwards(ED448_DEF);
|
|
180
99
|
// NOTE: there is no ed448ctx, since ed448 supports ctx by default
|
|
@@ -207,3 +126,86 @@ export const x448 = montgomery({
|
|
|
207
126
|
// return numberToBytesLE(u, 56);
|
|
208
127
|
// },
|
|
209
128
|
});
|
|
129
|
+
// Hash To Curve Elligator2 Map
|
|
130
|
+
const ELL2_C1 = (Fp.ORDER - BigInt(3)) / BigInt(4); // 1. c1 = (q - 3) / 4 # Integer arithmetic
|
|
131
|
+
const ELL2_J = BigInt(156326);
|
|
132
|
+
function map_to_curve_elligator2_curve448(u) {
|
|
133
|
+
let tv1 = Fp.sqr(u); // 1. tv1 = u^2
|
|
134
|
+
let e1 = Fp.eql(tv1, Fp.ONE); // 2. e1 = tv1 == 1
|
|
135
|
+
tv1 = Fp.cmov(tv1, Fp.ZERO, e1); // 3. tv1 = CMOV(tv1, 0, e1) # If Z * u^2 == -1, set tv1 = 0
|
|
136
|
+
let xd = Fp.sub(Fp.ONE, tv1); // 4. xd = 1 - tv1
|
|
137
|
+
let x1n = Fp.neg(ELL2_J); // 5. x1n = -J
|
|
138
|
+
let tv2 = Fp.sqr(xd); // 6. tv2 = xd^2
|
|
139
|
+
let gxd = Fp.mul(tv2, xd); // 7. gxd = tv2 * xd # gxd = xd^3
|
|
140
|
+
let gx1 = Fp.mul(tv1, Fp.neg(ELL2_J)); // 8. gx1 = -J * tv1 # x1n + J * xd
|
|
141
|
+
gx1 = Fp.mul(gx1, x1n); // 9. gx1 = gx1 * x1n # x1n^2 + J * x1n * xd
|
|
142
|
+
gx1 = Fp.add(gx1, tv2); // 10. gx1 = gx1 + tv2 # x1n^2 + J * x1n * xd + xd^2
|
|
143
|
+
gx1 = Fp.mul(gx1, x1n); // 11. gx1 = gx1 * x1n # x1n^3 + J * x1n^2 * xd + x1n * xd^2
|
|
144
|
+
let tv3 = Fp.sqr(gxd); // 12. tv3 = gxd^2
|
|
145
|
+
tv2 = Fp.mul(gx1, gxd); // 13. tv2 = gx1 * gxd # gx1 * gxd
|
|
146
|
+
tv3 = Fp.mul(tv3, tv2); // 14. tv3 = tv3 * tv2 # gx1 * gxd^3
|
|
147
|
+
let y1 = Fp.pow(tv3, ELL2_C1); // 15. y1 = tv3^c1 # (gx1 * gxd^3)^((p - 3) / 4)
|
|
148
|
+
y1 = Fp.mul(y1, tv2); // 16. y1 = y1 * tv2 # gx1 * gxd * (gx1 * gxd^3)^((p - 3) / 4)
|
|
149
|
+
let x2n = Fp.mul(x1n, Fp.neg(tv1)); // 17. x2n = -tv1 * x1n # x2 = x2n / xd = -1 * u^2 * x1n / xd
|
|
150
|
+
let y2 = Fp.mul(y1, u); // 18. y2 = y1 * u
|
|
151
|
+
y2 = Fp.cmov(y2, Fp.ZERO, e1); // 19. y2 = CMOV(y2, 0, e1)
|
|
152
|
+
tv2 = Fp.sqr(y1); // 20. tv2 = y1^2
|
|
153
|
+
tv2 = Fp.mul(tv2, gxd); // 21. tv2 = tv2 * gxd
|
|
154
|
+
let e2 = Fp.eql(tv2, gx1); // 22. e2 = tv2 == gx1
|
|
155
|
+
let xn = Fp.cmov(x2n, x1n, e2); // 23. xn = CMOV(x2n, x1n, e2) # If e2, x = x1, else x = x2
|
|
156
|
+
let y = Fp.cmov(y2, y1, e2); // 24. y = CMOV(y2, y1, e2) # If e2, y = y1, else y = y2
|
|
157
|
+
let e3 = Fp.isOdd(y); // 25. e3 = sgn0(y) == 1 # Fix sign of y
|
|
158
|
+
y = Fp.cmov(y, Fp.neg(y), e2 !== e3); // 26. y = CMOV(y, -y, e2 XOR e3)
|
|
159
|
+
return { xn, xd, yn: y, yd: Fp.ONE }; // 27. return (xn, xd, y, 1)
|
|
160
|
+
}
|
|
161
|
+
function map_to_curve_elligator2_edwards448(u) {
|
|
162
|
+
let { xn, xd, yn, yd } = map_to_curve_elligator2_curve448(u); // 1. (xn, xd, yn, yd) = map_to_curve_elligator2_curve448(u)
|
|
163
|
+
let xn2 = Fp.sqr(xn); // 2. xn2 = xn^2
|
|
164
|
+
let xd2 = Fp.sqr(xd); // 3. xd2 = xd^2
|
|
165
|
+
let xd4 = Fp.sqr(xd2); // 4. xd4 = xd2^2
|
|
166
|
+
let yn2 = Fp.sqr(yn); // 5. yn2 = yn^2
|
|
167
|
+
let yd2 = Fp.sqr(yd); // 6. yd2 = yd^2
|
|
168
|
+
let xEn = Fp.sub(xn2, xd2); // 7. xEn = xn2 - xd2
|
|
169
|
+
let tv2 = Fp.sub(xEn, xd2); // 8. tv2 = xEn - xd2
|
|
170
|
+
xEn = Fp.mul(xEn, xd2); // 9. xEn = xEn * xd2
|
|
171
|
+
xEn = Fp.mul(xEn, yd); // 10. xEn = xEn * yd
|
|
172
|
+
xEn = Fp.mul(xEn, yn); // 11. xEn = xEn * yn
|
|
173
|
+
xEn = Fp.mul(xEn, 4n); // 12. xEn = xEn * 4
|
|
174
|
+
tv2 = Fp.mul(tv2, xn2); // 13. tv2 = tv2 * xn2
|
|
175
|
+
tv2 = Fp.mul(tv2, yd2); // 14. tv2 = tv2 * yd2
|
|
176
|
+
let tv3 = Fp.mul(yn2, 4n); // 15. tv3 = 4 * yn2
|
|
177
|
+
let tv1 = Fp.add(tv3, yd2); // 16. tv1 = tv3 + yd2
|
|
178
|
+
tv1 = Fp.mul(tv1, xd4); // 17. tv1 = tv1 * xd4
|
|
179
|
+
let xEd = Fp.add(tv1, tv2); // 18. xEd = tv1 + tv2
|
|
180
|
+
tv2 = Fp.mul(tv2, xn); // 19. tv2 = tv2 * xn
|
|
181
|
+
let tv4 = Fp.mul(xn, xd4); // 20. tv4 = xn * xd4
|
|
182
|
+
let yEn = Fp.sub(tv3, yd2); // 21. yEn = tv3 - yd2
|
|
183
|
+
yEn = Fp.mul(yEn, tv4); // 22. yEn = yEn * tv4
|
|
184
|
+
yEn = Fp.sub(yEn, tv2); // 23. yEn = yEn - tv2
|
|
185
|
+
tv1 = Fp.add(xn2, xd2); // 24. tv1 = xn2 + xd2
|
|
186
|
+
tv1 = Fp.mul(tv1, xd2); // 25. tv1 = tv1 * xd2
|
|
187
|
+
tv1 = Fp.mul(tv1, xd); // 26. tv1 = tv1 * xd
|
|
188
|
+
tv1 = Fp.mul(tv1, yn2); // 27. tv1 = tv1 * yn2
|
|
189
|
+
tv1 = Fp.mul(tv1, BigInt(-2)); // 28. tv1 = -2 * tv1
|
|
190
|
+
let yEd = Fp.add(tv2, tv1); // 29. yEd = tv2 + tv1
|
|
191
|
+
tv4 = Fp.mul(tv4, yd2); // 30. tv4 = tv4 * yd2
|
|
192
|
+
yEd = Fp.add(yEd, tv4); // 31. yEd = yEd + tv4
|
|
193
|
+
tv1 = Fp.mul(xEd, yEd); // 32. tv1 = xEd * yEd
|
|
194
|
+
let e = Fp.eql(tv1, Fp.ZERO); // 33. e = tv1 == 0
|
|
195
|
+
xEn = Fp.cmov(xEn, Fp.ZERO, e); // 34. xEn = CMOV(xEn, 0, e)
|
|
196
|
+
xEd = Fp.cmov(xEd, Fp.ONE, e); // 35. xEd = CMOV(xEd, 1, e)
|
|
197
|
+
yEn = Fp.cmov(yEn, Fp.ONE, e); // 36. yEn = CMOV(yEn, 1, e)
|
|
198
|
+
yEd = Fp.cmov(yEd, Fp.ONE, e); // 37. yEd = CMOV(yEd, 1, e)
|
|
199
|
+
const inv = Fp.invertBatch([xEd, yEd]); // batch division
|
|
200
|
+
return { x: Fp.mul(xEn, inv[0]), y: Fp.mul(yEn, inv[1]) }; // 38. return (xEn, xEd, yEn, yEd)
|
|
201
|
+
}
|
|
202
|
+
const { hashToCurve, encodeToCurve } = htf.hashToCurve(ed448.ExtendedPoint, (scalars) => map_to_curve_elligator2_edwards448(scalars[0]), {
|
|
203
|
+
DST: 'edwards448_XOF:SHAKE256_ELL2_RO_',
|
|
204
|
+
encodeDST: 'edwards448_XOF:SHAKE256_ELL2_NU_',
|
|
205
|
+
p: Fp.ORDER,
|
|
206
|
+
m: 1,
|
|
207
|
+
k: 224,
|
|
208
|
+
expand: 'xof',
|
|
209
|
+
hash: shake256,
|
|
210
|
+
});
|
|
211
|
+
export { hashToCurve, encodeToCurve };
|
package/lib/esm/jubjub.js
CHANGED
|
@@ -33,7 +33,7 @@ export function groupHash(tag, personalization) {
|
|
|
33
33
|
h.update(GH_FIRST_BLOCK);
|
|
34
34
|
h.update(tag);
|
|
35
35
|
// NOTE: returns ExtendedPoint, in case it will be multiplied later
|
|
36
|
-
let p = jubjub.ExtendedPoint.
|
|
36
|
+
let p = jubjub.ExtendedPoint.fromHex(h.digest());
|
|
37
37
|
// NOTE: cannot replace with isSmallOrder, returns Point*8
|
|
38
38
|
p = p.multiply(jubjub.CURVE.h);
|
|
39
39
|
if (p.equals(jubjub.ExtendedPoint.ZERO))
|
package/lib/esm/p224.js
CHANGED
|
@@ -8,7 +8,7 @@ export const P224 = createCurve({
|
|
|
8
8
|
// Params: a, b
|
|
9
9
|
a: BigInt('0xfffffffffffffffffffffffffffffffefffffffffffffffffffffffe'),
|
|
10
10
|
b: BigInt('0xb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4'),
|
|
11
|
-
// Field over which we'll do calculations;
|
|
11
|
+
// Field over which we'll do calculations;
|
|
12
12
|
Fp: Fp(BigInt('0xffffffffffffffffffffffffffffffff000000000000000000000001')),
|
|
13
13
|
// Curve order, total count of valid points in the field
|
|
14
14
|
n: BigInt('0xffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d'),
|
package/lib/esm/p256.js
CHANGED
|
@@ -3,6 +3,7 @@ import { createCurve } from './_shortw_utils.js';
|
|
|
3
3
|
import { sha256 } from '@noble/hashes/sha256';
|
|
4
4
|
import { Fp as Field } from './abstract/modular.js';
|
|
5
5
|
import { mapToCurveSimpleSWU } from './abstract/weierstrass.js';
|
|
6
|
+
import * as htf from './abstract/hash-to-curve.js';
|
|
6
7
|
// NIST secp256r1 aka P256
|
|
7
8
|
// https://www.secg.org/sec2-v2.pdf, https://neuromancer.sk/std/nist/P-256
|
|
8
9
|
// Field over which we'll do calculations; 2n**224n * (2n**32n-1n) + 2n**192n + 2n**96n-1n
|
|
@@ -26,14 +27,15 @@ export const P256 = createCurve({
|
|
|
26
27
|
Gy: BigInt('0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5'),
|
|
27
28
|
h: BigInt(1),
|
|
28
29
|
lowS: false,
|
|
29
|
-
mapToCurve: (scalars) => mapSWU(scalars[0]),
|
|
30
|
-
htfDefaults: {
|
|
31
|
-
DST: 'P256_XMD:SHA-256_SSWU_RO_',
|
|
32
|
-
p: Fp.ORDER,
|
|
33
|
-
m: 1,
|
|
34
|
-
k: 128,
|
|
35
|
-
expand: 'xmd',
|
|
36
|
-
hash: sha256,
|
|
37
|
-
},
|
|
38
30
|
}, sha256);
|
|
39
31
|
export const secp256r1 = P256;
|
|
32
|
+
const { hashToCurve, encodeToCurve } = htf.hashToCurve(secp256r1.ProjectivePoint, (scalars) => mapSWU(scalars[0]), {
|
|
33
|
+
DST: 'P256_XMD:SHA-256_SSWU_RO_',
|
|
34
|
+
encodeDST: 'P256_XMD:SHA-256_SSWU_NU_',
|
|
35
|
+
p: Fp.ORDER,
|
|
36
|
+
m: 1,
|
|
37
|
+
k: 128,
|
|
38
|
+
expand: 'xmd',
|
|
39
|
+
hash: sha256,
|
|
40
|
+
});
|
|
41
|
+
export { hashToCurve, encodeToCurve };
|
package/lib/esm/p384.js
CHANGED
|
@@ -3,6 +3,7 @@ import { createCurve } from './_shortw_utils.js';
|
|
|
3
3
|
import { sha384 } from '@noble/hashes/sha512';
|
|
4
4
|
import { Fp as Field } from './abstract/modular.js';
|
|
5
5
|
import { mapToCurveSimpleSWU } from './abstract/weierstrass.js';
|
|
6
|
+
import * as htf from './abstract/hash-to-curve.js';
|
|
6
7
|
// NIST secp384r1 aka P384
|
|
7
8
|
// https://www.secg.org/sec2-v2.pdf, https://neuromancer.sk/std/nist/P-384
|
|
8
9
|
// Field over which we'll do calculations. 2n**384n - 2n**128n - 2n**96n + 2n**32n - 1n
|
|
@@ -31,14 +32,15 @@ export const P384 = createCurve({
|
|
|
31
32
|
Gy: BigInt('0x3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f'),
|
|
32
33
|
h: BigInt(1),
|
|
33
34
|
lowS: false,
|
|
34
|
-
mapToCurve: (scalars) => mapSWU(scalars[0]),
|
|
35
|
-
htfDefaults: {
|
|
36
|
-
DST: 'P384_XMD:SHA-384_SSWU_RO_',
|
|
37
|
-
p: Fp.ORDER,
|
|
38
|
-
m: 1,
|
|
39
|
-
k: 192,
|
|
40
|
-
expand: 'xmd',
|
|
41
|
-
hash: sha384,
|
|
42
|
-
},
|
|
43
35
|
}, sha384);
|
|
44
36
|
export const secp384r1 = P384;
|
|
37
|
+
const { hashToCurve, encodeToCurve } = htf.hashToCurve(secp384r1.ProjectivePoint, (scalars) => mapSWU(scalars[0]), {
|
|
38
|
+
DST: 'P384_XMD:SHA-384_SSWU_RO_',
|
|
39
|
+
encodeDST: 'P384_XMD:SHA-384_SSWU_NU_',
|
|
40
|
+
p: Fp.ORDER,
|
|
41
|
+
m: 1,
|
|
42
|
+
k: 192,
|
|
43
|
+
expand: 'xmd',
|
|
44
|
+
hash: sha384,
|
|
45
|
+
});
|
|
46
|
+
export { hashToCurve, encodeToCurve };
|
package/lib/esm/p521.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
2
2
|
import { createCurve } from './_shortw_utils.js';
|
|
3
3
|
import { sha512 } from '@noble/hashes/sha512';
|
|
4
|
-
import { bytesToHex } from './abstract/utils.js';
|
|
5
4
|
import { Fp as Field } from './abstract/modular.js';
|
|
6
5
|
import { mapToCurveSimpleSWU } from './abstract/weierstrass.js';
|
|
6
|
+
import * as htf from './abstract/hash-to-curve.js';
|
|
7
7
|
// NIST secp521r1 aka P521
|
|
8
8
|
// Note that it's 521, which differs from 512 of its hash function.
|
|
9
9
|
// https://www.secg.org/sec2-v2.pdf, https://neuromancer.sk/std/nist/P-521
|
|
@@ -32,27 +32,16 @@ export const P521 = createCurve({
|
|
|
32
32
|
Gy: BigInt('0x011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650'),
|
|
33
33
|
h: BigInt(1),
|
|
34
34
|
lowS: false,
|
|
35
|
-
|
|
36
|
-
// We ensure all keys are 132 bytes.
|
|
37
|
-
// Does not replace validation; invalid keys would still be rejected.
|
|
38
|
-
normalizePrivateKey(key) {
|
|
39
|
-
if (typeof key === 'bigint')
|
|
40
|
-
return key;
|
|
41
|
-
if (key instanceof Uint8Array)
|
|
42
|
-
key = bytesToHex(key);
|
|
43
|
-
if (typeof key !== 'string' || !([130, 131, 132].includes(key.length))) {
|
|
44
|
-
throw new Error('Invalid key');
|
|
45
|
-
}
|
|
46
|
-
return key.padStart(66 * 2, '0');
|
|
47
|
-
},
|
|
48
|
-
mapToCurve: (scalars) => mapSWU(scalars[0]),
|
|
49
|
-
htfDefaults: {
|
|
50
|
-
DST: 'P521_XMD:SHA-512_SSWU_RO_',
|
|
51
|
-
p: Fp.ORDER,
|
|
52
|
-
m: 1,
|
|
53
|
-
k: 256,
|
|
54
|
-
expand: 'xmd',
|
|
55
|
-
hash: sha512,
|
|
56
|
-
},
|
|
35
|
+
allowedPrivateKeyLengths: [130, 131, 132] // P521 keys are variable-length. Normalize to 132b
|
|
57
36
|
}, sha512);
|
|
58
37
|
export const secp521r1 = P521;
|
|
38
|
+
const { hashToCurve, encodeToCurve } = htf.hashToCurve(secp521r1.ProjectivePoint, (scalars) => mapSWU(scalars[0]), {
|
|
39
|
+
DST: 'P521_XMD:SHA-512_SSWU_RO_',
|
|
40
|
+
encodeDST: 'P521_XMD:SHA-512_SSWU_NU_',
|
|
41
|
+
p: Fp.ORDER,
|
|
42
|
+
m: 1,
|
|
43
|
+
k: 256,
|
|
44
|
+
expand: 'xmd',
|
|
45
|
+
hash: sha512,
|
|
46
|
+
});
|
|
47
|
+
export { hashToCurve, encodeToCurve };
|