@noble/curves 2.0.0 → 2.2.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 +214 -122
- package/abstract/bls.d.ts +299 -16
- package/abstract/bls.d.ts.map +1 -1
- package/abstract/bls.js +89 -24
- package/abstract/bls.js.map +1 -1
- package/abstract/curve.d.ts +274 -27
- package/abstract/curve.d.ts.map +1 -1
- package/abstract/curve.js +177 -23
- package/abstract/curve.js.map +1 -1
- package/abstract/edwards.d.ts +166 -30
- package/abstract/edwards.d.ts.map +1 -1
- package/abstract/edwards.js +221 -86
- package/abstract/edwards.js.map +1 -1
- package/abstract/fft.d.ts +327 -10
- package/abstract/fft.d.ts.map +1 -1
- package/abstract/fft.js +155 -12
- package/abstract/fft.js.map +1 -1
- package/abstract/frost.d.ts +293 -0
- package/abstract/frost.d.ts.map +1 -0
- package/abstract/frost.js +704 -0
- package/abstract/frost.js.map +1 -0
- package/abstract/hash-to-curve.d.ts +173 -24
- package/abstract/hash-to-curve.d.ts.map +1 -1
- package/abstract/hash-to-curve.js +170 -31
- package/abstract/hash-to-curve.js.map +1 -1
- package/abstract/modular.d.ts +429 -37
- package/abstract/modular.d.ts.map +1 -1
- package/abstract/modular.js +414 -119
- package/abstract/modular.js.map +1 -1
- package/abstract/montgomery.d.ts +83 -12
- package/abstract/montgomery.d.ts.map +1 -1
- package/abstract/montgomery.js +32 -7
- package/abstract/montgomery.js.map +1 -1
- package/abstract/oprf.d.ts +164 -91
- package/abstract/oprf.d.ts.map +1 -1
- package/abstract/oprf.js +88 -29
- package/abstract/oprf.js.map +1 -1
- package/abstract/poseidon.d.ts +138 -7
- package/abstract/poseidon.d.ts.map +1 -1
- package/abstract/poseidon.js +178 -15
- package/abstract/poseidon.js.map +1 -1
- package/abstract/tower.d.ts +122 -3
- package/abstract/tower.d.ts.map +1 -1
- package/abstract/tower.js +323 -139
- package/abstract/tower.js.map +1 -1
- package/abstract/weierstrass.d.ts +339 -76
- package/abstract/weierstrass.d.ts.map +1 -1
- package/abstract/weierstrass.js +395 -205
- package/abstract/weierstrass.js.map +1 -1
- package/bls12-381.d.ts +16 -2
- package/bls12-381.d.ts.map +1 -1
- package/bls12-381.js +199 -209
- package/bls12-381.js.map +1 -1
- package/bn254.d.ts +11 -2
- package/bn254.d.ts.map +1 -1
- package/bn254.js +93 -38
- package/bn254.js.map +1 -1
- package/ed25519.d.ts +135 -14
- package/ed25519.d.ts.map +1 -1
- package/ed25519.js +207 -41
- package/ed25519.js.map +1 -1
- package/ed448.d.ts +108 -14
- package/ed448.d.ts.map +1 -1
- package/ed448.js +194 -42
- package/ed448.js.map +1 -1
- package/index.js +7 -1
- package/index.js.map +1 -1
- package/misc.d.ts +106 -7
- package/misc.d.ts.map +1 -1
- package/misc.js +141 -32
- package/misc.js.map +1 -1
- package/nist.d.ts +112 -11
- package/nist.d.ts.map +1 -1
- package/nist.js +139 -17
- package/nist.js.map +1 -1
- package/package.json +34 -6
- package/secp256k1.d.ts +92 -15
- package/secp256k1.d.ts.map +1 -1
- package/secp256k1.js +211 -28
- package/secp256k1.js.map +1 -1
- package/src/abstract/bls.ts +356 -69
- package/src/abstract/curve.ts +327 -44
- package/src/abstract/edwards.ts +367 -143
- package/src/abstract/fft.ts +371 -36
- package/src/abstract/frost.ts +1092 -0
- package/src/abstract/hash-to-curve.ts +255 -56
- package/src/abstract/modular.ts +591 -144
- package/src/abstract/montgomery.ts +114 -30
- package/src/abstract/oprf.ts +383 -194
- package/src/abstract/poseidon.ts +235 -35
- package/src/abstract/tower.ts +428 -159
- package/src/abstract/weierstrass.ts +710 -312
- package/src/bls12-381.ts +239 -236
- package/src/bn254.ts +107 -46
- package/src/ed25519.ts +234 -56
- package/src/ed448.ts +227 -57
- package/src/index.ts +7 -1
- package/src/misc.ts +154 -35
- package/src/nist.ts +143 -20
- package/src/secp256k1.ts +284 -41
- package/src/utils.ts +583 -81
- package/src/webcrypto.ts +302 -73
- package/utils.d.ts +457 -24
- package/utils.d.ts.map +1 -1
- package/utils.js +410 -53
- package/utils.js.map +1 -1
- package/webcrypto.d.ts +167 -25
- package/webcrypto.d.ts.map +1 -1
- package/webcrypto.js +165 -58
- package/webcrypto.js.map +1 -1
package/abstract/bls.d.ts
CHANGED
|
@@ -1,60 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BLS != BLS.
|
|
3
|
+
* The file implements BLS (Boneh-Lynn-Shacham) signatures.
|
|
4
|
+
* Used in both BLS (Barreto-Lynn-Scott) and BN (Barreto-Naehrig)
|
|
5
|
+
* families of pairing-friendly curves.
|
|
6
|
+
* Consists of two curves: G1 and G2:
|
|
7
|
+
* - G1 is a subgroup of (x, y) E(Fq) over y² = x³ + 4.
|
|
8
|
+
* - G2 is a subgroup of ((x₁, x₂+i), (y₁, y₂+i)) E(Fq²) over y² = x³ + 4(1 + i) where i is √-1
|
|
9
|
+
* - Gt, created by bilinear (ate) pairing e(G1, G2), consists of p-th roots of unity in
|
|
10
|
+
* Fq^k where k is embedding degree. Only degree 12 is currently supported, 24 is not.
|
|
11
|
+
* Pairing is used to aggregate and verify signatures.
|
|
12
|
+
* There are two modes of operation:
|
|
13
|
+
* - Long signatures: X-byte keys + 2X-byte sigs (G1 keys + G2 sigs).
|
|
14
|
+
* - Short signatures: 2X-byte keys + X-byte sigs (G2 keys + G1 sigs).
|
|
15
|
+
* @module
|
|
16
|
+
**/
|
|
17
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
18
|
+
import { type TArg, type TRet } from '../utils.ts';
|
|
1
19
|
import { type CurveLengths } from './curve.ts';
|
|
2
|
-
import { type H2CHasher, type
|
|
20
|
+
import { type H2CHasher, type H2COpts, type MapToCurve } from './hash-to-curve.ts';
|
|
3
21
|
import { type IField } from './modular.ts';
|
|
4
22
|
import type { Fp12, Fp12Bls, Fp2, Fp2Bls, Fp6Bls } from './tower.ts';
|
|
5
23
|
import { type WeierstrassPoint, type WeierstrassPointCons } from './weierstrass.ts';
|
|
6
24
|
type Fp = bigint;
|
|
25
|
+
/**
|
|
26
|
+
* Twist convention used by the pairing formulas for a concrete curve family.
|
|
27
|
+
* BLS12-381 uses a multiplicative twist, while BN254 uses a divisive one.
|
|
28
|
+
*/
|
|
7
29
|
export type BlsTwistType = 'multiplicative' | 'divisive';
|
|
30
|
+
/**
|
|
31
|
+
* Codec exposed as `curve.shortSignatures.Signature`.
|
|
32
|
+
* Use it to parse or serialize G1 signatures in short-signature mode.
|
|
33
|
+
* In this mode, public keys live in G2.
|
|
34
|
+
*/
|
|
8
35
|
export type BlsShortSignatureCoder<Fp> = {
|
|
9
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Parse a compressed signature from raw bytes.
|
|
38
|
+
* @param bytes - Compressed signature bytes.
|
|
39
|
+
* @returns Parsed signature point.
|
|
40
|
+
*/
|
|
41
|
+
fromBytes(bytes: TArg<Uint8Array>): WeierstrassPoint<Fp>;
|
|
42
|
+
/**
|
|
43
|
+
* Parse a compressed signature from a hex string.
|
|
44
|
+
* @param hex - Compressed signature hex string.
|
|
45
|
+
* @returns Parsed signature point.
|
|
46
|
+
*/
|
|
10
47
|
fromHex(hex: string): WeierstrassPoint<Fp>;
|
|
11
|
-
|
|
48
|
+
/**
|
|
49
|
+
* Encode a signature point into compressed bytes.
|
|
50
|
+
* @param point - Signature point.
|
|
51
|
+
* @returns Compressed signature bytes.
|
|
52
|
+
*/
|
|
53
|
+
toBytes(point: WeierstrassPoint<Fp>): TRet<Uint8Array>;
|
|
54
|
+
/**
|
|
55
|
+
* Encode a signature point into a hex string.
|
|
56
|
+
* @param point - Signature point.
|
|
57
|
+
* @returns Compressed signature hex.
|
|
58
|
+
*/
|
|
12
59
|
toHex(point: WeierstrassPoint<Fp>): string;
|
|
13
60
|
};
|
|
61
|
+
/**
|
|
62
|
+
* Codec exposed as `curve.longSignatures.Signature`.
|
|
63
|
+
* Use it to parse or serialize G2 signatures in long-signature mode.
|
|
64
|
+
* In this mode, public keys live in G1.
|
|
65
|
+
*/
|
|
14
66
|
export type BlsLongSignatureCoder<Fp> = {
|
|
15
|
-
|
|
67
|
+
/**
|
|
68
|
+
* Parse a compressed signature from raw bytes.
|
|
69
|
+
* @param bytes - Compressed signature bytes.
|
|
70
|
+
* @returns Parsed signature point.
|
|
71
|
+
*/
|
|
72
|
+
fromBytes(bytes: TArg<Uint8Array>): WeierstrassPoint<Fp>;
|
|
73
|
+
/**
|
|
74
|
+
* Parse a compressed signature from a hex string.
|
|
75
|
+
* @param hex - Compressed signature hex string.
|
|
76
|
+
* @returns Parsed signature point.
|
|
77
|
+
*/
|
|
16
78
|
fromHex(hex: string): WeierstrassPoint<Fp>;
|
|
17
|
-
|
|
79
|
+
/**
|
|
80
|
+
* Encode a signature point into compressed bytes.
|
|
81
|
+
* @param point - Signature point.
|
|
82
|
+
* @returns Compressed signature bytes.
|
|
83
|
+
*/
|
|
84
|
+
toBytes(point: WeierstrassPoint<Fp>): TRet<Uint8Array>;
|
|
85
|
+
/**
|
|
86
|
+
* Encode a signature point into a hex string.
|
|
87
|
+
* @param point - Signature point.
|
|
88
|
+
* @returns Compressed signature hex.
|
|
89
|
+
*/
|
|
18
90
|
toHex(point: WeierstrassPoint<Fp>): string;
|
|
19
91
|
};
|
|
92
|
+
/** Tower fields needed by pairing code, hash-to-curve, and subgroup arithmetic. */
|
|
20
93
|
export type BlsFields = {
|
|
94
|
+
/** Base field of G1 coordinates. */
|
|
21
95
|
Fp: IField<Fp>;
|
|
96
|
+
/** Scalar field used for secret scalars and subgroup order arithmetic. */
|
|
22
97
|
Fr: IField<bigint>;
|
|
98
|
+
/** Quadratic extension field used by G2. */
|
|
23
99
|
Fp2: Fp2Bls;
|
|
100
|
+
/** Sextic extension field used inside pairing arithmetic. */
|
|
24
101
|
Fp6: Fp6Bls;
|
|
102
|
+
/** Degree-12 extension field that contains the GT target group. */
|
|
25
103
|
Fp12: Fp12Bls;
|
|
26
104
|
};
|
|
105
|
+
/**
|
|
106
|
+
* Callback used by pairing post-processing hooks to add one more G2 point to the Miller-loop state.
|
|
107
|
+
* @param Rx - Current projective X coordinate.
|
|
108
|
+
* @param Ry - Current projective Y coordinate.
|
|
109
|
+
* @param Rz - Current projective Z coordinate.
|
|
110
|
+
* @param Qx - G2 affine x coordinate.
|
|
111
|
+
* @param Qy - G2 affine y coordinate.
|
|
112
|
+
* @returns Updated projective accumulator coordinates.
|
|
113
|
+
*/
|
|
27
114
|
export type BlsPostPrecomputePointAddFn = (Rx: Fp2, Ry: Fp2, Rz: Fp2, Qx: Fp2, Qy: Fp2) => {
|
|
28
115
|
Rx: Fp2;
|
|
29
116
|
Ry: Fp2;
|
|
30
117
|
Rz: Fp2;
|
|
31
118
|
};
|
|
119
|
+
/**
|
|
120
|
+
* Hook for curve-specific pairing cleanup after the Miller loop precomputes are built.
|
|
121
|
+
* @param Rx - Current projective X coordinate.
|
|
122
|
+
* @param Ry - Current projective Y coordinate.
|
|
123
|
+
* @param Rz - Current projective Z coordinate.
|
|
124
|
+
* @param Qx - G2 affine x coordinate.
|
|
125
|
+
* @param Qy - G2 affine y coordinate.
|
|
126
|
+
* @param pointAdd - Callback used to fold one more point into the accumulator.
|
|
127
|
+
*/
|
|
32
128
|
export type BlsPostPrecomputeFn = (Rx: Fp2, Ry: Fp2, Rz: Fp2, Qx: Fp2, Qy: Fp2, pointAdd: BlsPostPrecomputePointAddFn) => void;
|
|
129
|
+
/** Low-level pairing helpers shared by BLS curve bundles. */
|
|
33
130
|
export type BlsPairing = {
|
|
131
|
+
/** Byte lengths for keys and signatures exposed by this pairing family. */
|
|
34
132
|
lengths: CurveLengths;
|
|
133
|
+
/** Scalar field used by the pairing and signing helpers. */
|
|
35
134
|
Fr: IField<bigint>;
|
|
135
|
+
/** Target field used for the GT result of pairings. */
|
|
36
136
|
Fp12: Fp12Bls;
|
|
137
|
+
/**
|
|
138
|
+
* Build Miller-loop precomputes for one G2 point.
|
|
139
|
+
* @param p - G2 point to precompute.
|
|
140
|
+
* @returns Pairing precompute table.
|
|
141
|
+
*/
|
|
37
142
|
calcPairingPrecomputes: (p: WeierstrassPoint<Fp2>) => Precompute;
|
|
143
|
+
/**
|
|
144
|
+
* Evaluate a batch of Miller loops from precomputed line coefficients.
|
|
145
|
+
* @param pairs - Precomputed Miller-loop inputs.
|
|
146
|
+
* @returns Accumulated GT value before or after final exponentiation.
|
|
147
|
+
*/
|
|
38
148
|
millerLoopBatch: (pairs: [Precompute, Fp, Fp][]) => Fp12;
|
|
149
|
+
/**
|
|
150
|
+
* Pair one G1 point with one G2 point.
|
|
151
|
+
* @param P - G1 point.
|
|
152
|
+
* @param Q - G2 point.
|
|
153
|
+
* @param withFinalExponent - Whether to apply the final exponentiation step.
|
|
154
|
+
* @returns GT pairing result.
|
|
155
|
+
* @throws If either point is the point at infinity. {@link Error}
|
|
156
|
+
*/
|
|
39
157
|
pairing: (P: WeierstrassPoint<Fp>, Q: WeierstrassPoint<Fp2>, withFinalExponent?: boolean) => Fp12;
|
|
158
|
+
/**
|
|
159
|
+
* Pair many G1/G2 pairs in one batch.
|
|
160
|
+
* @param pairs - Point pairs to accumulate.
|
|
161
|
+
* @param withFinalExponent - Whether to apply the final exponentiation step.
|
|
162
|
+
* @returns GT pairing result. Empty input returns the multiplicative identity in GT.
|
|
163
|
+
*/
|
|
40
164
|
pairingBatch: (pairs: {
|
|
41
165
|
g1: WeierstrassPoint<Fp>;
|
|
42
166
|
g2: WeierstrassPoint<Fp2>;
|
|
43
167
|
}[], withFinalExponent?: boolean) => Fp12;
|
|
44
|
-
|
|
168
|
+
/**
|
|
169
|
+
* Generate a random secret key for this pairing family.
|
|
170
|
+
* @param seed - Optional seed material.
|
|
171
|
+
* @returns Secret key bytes.
|
|
172
|
+
*/
|
|
173
|
+
randomSecretKey: (seed?: TArg<Uint8Array>) => TRet<Uint8Array>;
|
|
45
174
|
};
|
|
175
|
+
/**
|
|
176
|
+
* Parameters that define the Miller-loop shape and twist handling
|
|
177
|
+
* for a concrete pairing family.
|
|
178
|
+
*/
|
|
46
179
|
export type BlsPairingParams = {
|
|
180
|
+
/** Signed loop parameter used by the Miller loop. */
|
|
47
181
|
ateLoopSize: bigint;
|
|
182
|
+
/** Whether the signed Miller-loop parameter is negative. */
|
|
48
183
|
xNegative: boolean;
|
|
184
|
+
/**
|
|
185
|
+
* Twist convention used by the pairing formulas.
|
|
186
|
+
* BLS12-381 is multiplicative; BN254 is divisive.
|
|
187
|
+
*/
|
|
49
188
|
twistType: BlsTwistType;
|
|
50
|
-
|
|
189
|
+
/**
|
|
190
|
+
* Optional RNG override used by helper constructors.
|
|
191
|
+
* Receives the requested byte length and returns random bytes.
|
|
192
|
+
*/
|
|
193
|
+
randomBytes?: (len?: number) => TRet<Uint8Array>;
|
|
194
|
+
/**
|
|
195
|
+
* Optional hook for curve-specific untwisting after precomputation.
|
|
196
|
+
* Used by BN254 after the Miller loop.
|
|
197
|
+
*/
|
|
51
198
|
postPrecompute?: BlsPostPrecomputeFn;
|
|
52
199
|
};
|
|
200
|
+
/** Hash-to-curve settings shared by the G1 and G2 hashers inside a BLS curve bundle. */
|
|
53
201
|
export type BlsHasherParams = {
|
|
202
|
+
/**
|
|
203
|
+
* Optional map-to-curve override for G1.
|
|
204
|
+
* Receives the hash-to-field tuple and returns one affine G1 point.
|
|
205
|
+
*/
|
|
54
206
|
mapToG1?: MapToCurve<Fp>;
|
|
207
|
+
/**
|
|
208
|
+
* Optional map-to-curve override for G2.
|
|
209
|
+
* Receives the hash-to-field tuple and returns one affine G2 point.
|
|
210
|
+
*/
|
|
55
211
|
mapToG2?: MapToCurve<Fp2>;
|
|
212
|
+
/** Shared baseline hash-to-curve options. */
|
|
56
213
|
hasherOpts: H2COpts;
|
|
214
|
+
/** G1-specific hash-to-curve options merged on top of `hasherOpts`. */
|
|
57
215
|
hasherOptsG1: H2COpts;
|
|
216
|
+
/** G2-specific hash-to-curve options merged on top of `hasherOpts`. */
|
|
58
217
|
hasherOptsG2: H2COpts;
|
|
59
218
|
};
|
|
60
219
|
type PrecomputeSingle = [Fp2, Fp2, Fp2][];
|
|
@@ -65,16 +224,39 @@ type Precompute = PrecomputeSingle[];
|
|
|
65
224
|
* - G2 is a subgroup of ((x₁, x₂+i), (y₁, y₂+i)) E(Fq²) over y² = x³ + 4(1 + i) where i is √-1
|
|
66
225
|
*/
|
|
67
226
|
export interface BlsCurvePair {
|
|
227
|
+
/** Byte lengths for keys and signatures exposed by this curve family. */
|
|
68
228
|
lengths: CurveLengths;
|
|
229
|
+
/**
|
|
230
|
+
* Shared Miller-loop batch evaluator.
|
|
231
|
+
* @param pairs - Precomputed Miller-loop inputs.
|
|
232
|
+
* @returns Accumulated GT value.
|
|
233
|
+
*/
|
|
69
234
|
millerLoopBatch: BlsPairing['millerLoopBatch'];
|
|
235
|
+
/**
|
|
236
|
+
* Pair one G1 point with one G2 point.
|
|
237
|
+
* @param P - G1 point.
|
|
238
|
+
* @param Q - G2 point.
|
|
239
|
+
* @param withFinalExponent - Whether to apply the final exponentiation step.
|
|
240
|
+
* @returns GT pairing result.
|
|
241
|
+
* @throws If either point is the point at infinity. {@link Error}
|
|
242
|
+
*/
|
|
70
243
|
pairing: BlsPairing['pairing'];
|
|
244
|
+
/**
|
|
245
|
+
* Pair many G1/G2 pairs in one batch.
|
|
246
|
+
* @param pairs - Point pairs to accumulate.
|
|
247
|
+
* @param withFinalExponent - Whether to apply the final exponentiation step.
|
|
248
|
+
* @returns GT pairing result. Empty input returns the multiplicative identity in GT.
|
|
249
|
+
*/
|
|
71
250
|
pairingBatch: BlsPairing['pairingBatch'];
|
|
251
|
+
/** G1 point constructor for the base field subgroup. */
|
|
72
252
|
G1: {
|
|
73
253
|
Point: WeierstrassPointCons<Fp>;
|
|
74
254
|
};
|
|
255
|
+
/** G2 point constructor for the twist subgroup. */
|
|
75
256
|
G2: {
|
|
76
257
|
Point: WeierstrassPointCons<Fp2>;
|
|
77
258
|
};
|
|
259
|
+
/** Tower fields exposed by the pairing implementation. */
|
|
78
260
|
fields: {
|
|
79
261
|
Fp: IField<Fp>;
|
|
80
262
|
Fp2: Fp2Bls;
|
|
@@ -82,47 +264,148 @@ export interface BlsCurvePair {
|
|
|
82
264
|
Fp12: Fp12Bls;
|
|
83
265
|
Fr: IField<bigint>;
|
|
84
266
|
};
|
|
267
|
+
/** Utility helpers shared by hashers and signers. */
|
|
85
268
|
utils: {
|
|
86
|
-
randomSecretKey: (seed?: Uint8Array) => Uint8Array
|
|
269
|
+
randomSecretKey: (seed?: TArg<Uint8Array>) => TRet<Uint8Array>;
|
|
87
270
|
calcPairingPrecomputes: BlsPairing['calcPairingPrecomputes'];
|
|
88
271
|
};
|
|
272
|
+
/** Public pairing parameters exposed for introspection. */
|
|
89
273
|
params: {
|
|
90
274
|
ateLoopSize: bigint;
|
|
91
275
|
twistType: BlsTwistType;
|
|
92
276
|
};
|
|
93
277
|
}
|
|
278
|
+
/** BLS curve bundle extended with hash-to-curve helpers for G1 and G2. */
|
|
94
279
|
export interface BlsCurvePairWithHashers extends BlsCurvePair {
|
|
280
|
+
/** G1 hasher bundle with RFC 9380 helpers. */
|
|
95
281
|
G1: H2CHasher<WeierstrassPointCons<Fp>>;
|
|
282
|
+
/** G2 hasher bundle with RFC 9380 helpers. */
|
|
96
283
|
G2: H2CHasher<WeierstrassPointCons<Fp2>>;
|
|
97
284
|
}
|
|
285
|
+
/** BLS curve bundle extended with both hashers and signature helpers. */
|
|
98
286
|
export interface BlsCurvePairWithSignatures extends BlsCurvePairWithHashers {
|
|
287
|
+
/** Long-signature mode: G1 public keys and G2 signatures. */
|
|
99
288
|
longSignatures: BlsSigs<bigint, Fp2>;
|
|
289
|
+
/** Short-signature mode: G2 public keys and G1 signatures. */
|
|
100
290
|
shortSignatures: BlsSigs<Fp2, bigint>;
|
|
101
291
|
}
|
|
102
|
-
type BLSInput = Uint8Array
|
|
292
|
+
type BLSInput = TArg<Uint8Array>;
|
|
293
|
+
/** BLS signer helpers for one signature mode. */
|
|
103
294
|
export interface BlsSigs<P, S> {
|
|
295
|
+
/** Byte lengths for secret keys, public keys, and signatures. */
|
|
104
296
|
lengths: CurveLengths;
|
|
105
|
-
|
|
106
|
-
|
|
297
|
+
/**
|
|
298
|
+
* Generate a secret/public key pair for this signature mode.
|
|
299
|
+
* @param seed - Optional seed material.
|
|
300
|
+
* @returns Secret and public key pair.
|
|
301
|
+
*/
|
|
302
|
+
keygen(seed?: TArg<Uint8Array>): {
|
|
303
|
+
secretKey: TRet<Uint8Array>;
|
|
107
304
|
publicKey: WeierstrassPoint<P>;
|
|
108
305
|
};
|
|
109
|
-
|
|
110
|
-
|
|
306
|
+
/**
|
|
307
|
+
* Derive the public key from a secret key.
|
|
308
|
+
* @param secretKey - Secret key bytes.
|
|
309
|
+
* @returns Public-key point.
|
|
310
|
+
*/
|
|
311
|
+
getPublicKey(secretKey: TArg<Uint8Array>): WeierstrassPoint<P>;
|
|
312
|
+
/**
|
|
313
|
+
* Sign a message already hashed onto the signature subgroup.
|
|
314
|
+
* @param hashedMessage - Message mapped to the signature subgroup.
|
|
315
|
+
* @param secretKey - Secret key bytes.
|
|
316
|
+
* @returns Signature point.
|
|
317
|
+
*/
|
|
318
|
+
sign(hashedMessage: WeierstrassPoint<S>, secretKey: TArg<Uint8Array>): WeierstrassPoint<S>;
|
|
319
|
+
/**
|
|
320
|
+
* Verify one signature against one public key and hashed message.
|
|
321
|
+
* @param signature - Signature point or encoded signature.
|
|
322
|
+
* @param message - Hashed message point.
|
|
323
|
+
* @param publicKey - Public-key point or encoded key.
|
|
324
|
+
* @returns Whether the signature is valid.
|
|
325
|
+
*/
|
|
111
326
|
verify(signature: WeierstrassPoint<S> | BLSInput, message: WeierstrassPoint<S>, publicKey: WeierstrassPoint<P> | BLSInput): boolean;
|
|
327
|
+
/**
|
|
328
|
+
* Verify one aggregated signature against many `(message, publicKey)` pairs.
|
|
329
|
+
* @param signature - Aggregated signature.
|
|
330
|
+
* @param items - Message/public-key pairs.
|
|
331
|
+
* @returns Whether the aggregated signature is valid. Same-message aggregate verification still
|
|
332
|
+
* requires proof of possession or another rogue-key defense from the caller.
|
|
333
|
+
*/
|
|
112
334
|
verifyBatch: (signature: WeierstrassPoint<S> | BLSInput, items: {
|
|
113
335
|
message: WeierstrassPoint<S>;
|
|
114
336
|
publicKey: WeierstrassPoint<P> | BLSInput;
|
|
115
337
|
}[]) => boolean;
|
|
338
|
+
/**
|
|
339
|
+
* Add many public keys into one aggregate point.
|
|
340
|
+
* @param publicKeys - Public keys to aggregate.
|
|
341
|
+
* @returns Aggregated public-key point. This is raw point addition and does not add proof of
|
|
342
|
+
* possession or rogue-key protection on its own.
|
|
343
|
+
*/
|
|
116
344
|
aggregatePublicKeys(publicKeys: (WeierstrassPoint<P> | BLSInput)[]): WeierstrassPoint<P>;
|
|
345
|
+
/**
|
|
346
|
+
* Add many signatures into one aggregate point.
|
|
347
|
+
* @param signatures - Signatures to aggregate.
|
|
348
|
+
* @returns Aggregated signature point. This is raw point addition and does not change the proof
|
|
349
|
+
* of possession requirements of the aggregate-verification scheme.
|
|
350
|
+
*/
|
|
117
351
|
aggregateSignatures(signatures: (WeierstrassPoint<S> | BLSInput)[]): WeierstrassPoint<S>;
|
|
118
|
-
|
|
352
|
+
/**
|
|
353
|
+
* Hash an arbitrary message onto the signature subgroup.
|
|
354
|
+
* @param message - Message bytes.
|
|
355
|
+
* @param DST - Optional domain separation tag.
|
|
356
|
+
* @returns Curve point on the signature subgroup.
|
|
357
|
+
*/
|
|
358
|
+
hash(message: TArg<Uint8Array>, DST?: TArg<string | Uint8Array>): WeierstrassPoint<S>;
|
|
359
|
+
/** Signature codec for this mode. */
|
|
119
360
|
Signature: BlsLongSignatureCoder<S>;
|
|
120
361
|
}
|
|
121
362
|
type BlsSignatureCoders = Partial<{
|
|
122
363
|
LongSignature: BlsLongSignatureCoder<Fp2>;
|
|
123
364
|
ShortSignature: BlsShortSignatureCoder<Fp>;
|
|
124
365
|
}>;
|
|
125
|
-
|
|
126
|
-
|
|
366
|
+
/**
|
|
367
|
+
* @param fields - Tower field implementations.
|
|
368
|
+
* @param G1_Point - G1 point constructor.
|
|
369
|
+
* @param G2_Point - G2 point constructor.
|
|
370
|
+
* @param params - Pairing parameters. See {@link BlsPairingParams}.
|
|
371
|
+
* @returns Pairing-only BLS helpers. The returned pairing surface rejects infinity inputs, while
|
|
372
|
+
* empty `pairingBatch(...)` calls return the multiplicative identity in GT. This keeps the
|
|
373
|
+
* low-level pairing API fail-closed for BLS-style callers, where identity points usually signal
|
|
374
|
+
* broken hash / wiring instead of an intentionally neutral pairing term. This also eagerly
|
|
375
|
+
* precomputes the G1 base-point table as a performance side effect.
|
|
376
|
+
* @throws If the pairing parameters or underlying curve helpers are inconsistent. {@link Error}
|
|
377
|
+
* @example
|
|
378
|
+
* ```ts
|
|
379
|
+
* import { blsBasic } from '@noble/curves/abstract/bls.js';
|
|
380
|
+
* import { bn254 } from '@noble/curves/bn254.js';
|
|
381
|
+
* // Pair a G1 point with a G2 point without the higher-level signer helpers.
|
|
382
|
+
* const gt = bn254.pairing(bn254.G1.Point.BASE, bn254.G2.Point.BASE);
|
|
383
|
+
* ```
|
|
384
|
+
*/
|
|
385
|
+
export declare function blsBasic(fields: TArg<BlsFields>, G1_Point: WeierstrassPointCons<Fp>, G2_Point: WeierstrassPointCons<Fp2>, params: TArg<BlsPairingParams>): BlsCurvePair;
|
|
386
|
+
/**
|
|
387
|
+
* @param fields - Tower field implementations.
|
|
388
|
+
* @param G1_Point - G1 point constructor.
|
|
389
|
+
* @param G2_Point - G2 point constructor.
|
|
390
|
+
* @param params - Pairing parameters. See {@link BlsPairingParams}.
|
|
391
|
+
* @param hasherParams - Hash-to-curve configuration. See {@link BlsHasherParams}.
|
|
392
|
+
* @param signatureCoders - Signature codecs.
|
|
393
|
+
* @returns BLS helpers with signers. The inherited pairing surface still rejects infinity inputs,
|
|
394
|
+
* and empty `pairingBatch(...)` calls still return the multiplicative identity in GT. Aggregate
|
|
395
|
+
* verification still requires proof of possession or another rogue-key defense from the caller.
|
|
396
|
+
* @throws If the pairing, hashing, or signature helpers are configured inconsistently. {@link Error}
|
|
397
|
+
* @example
|
|
398
|
+
* ```ts
|
|
399
|
+
* import { bls } from '@noble/curves/abstract/bls.js';
|
|
400
|
+
* import { bls12_381 } from '@noble/curves/bls12-381.js';
|
|
401
|
+
* const sigs = bls12_381.longSignatures;
|
|
402
|
+
* // Use the full BLS helper set when you need hashing, keygen, signing, and verification.
|
|
403
|
+
* const { secretKey, publicKey } = sigs.keygen();
|
|
404
|
+
* const msg = sigs.hash(new TextEncoder().encode('hello noble'));
|
|
405
|
+
* const sig = sigs.sign(msg, secretKey);
|
|
406
|
+
* const isValid = sigs.verify(sig, msg, publicKey);
|
|
407
|
+
* ```
|
|
408
|
+
*/
|
|
409
|
+
export declare function bls(fields: TArg<BlsFields>, G1_Point: WeierstrassPointCons<Fp>, G2_Point: WeierstrassPointCons<Fp2>, params: TArg<BlsPairingParams>, hasherParams: TArg<BlsHasherParams>, signatureCoders: BlsSignatureCoders): BlsCurvePairWithSignatures;
|
|
127
410
|
export {};
|
|
128
411
|
//# sourceMappingURL=bls.d.ts.map
|
package/abstract/bls.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bls.d.ts","sourceRoot":"","sources":["../src/abstract/bls.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bls.d.ts","sourceRoot":"","sources":["../src/abstract/bls.ts"],"names":[],"mappings":"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"}
|