shockwave-plus/tensor_pcs/src/rs_config/good_curves/secp256k1.rs
tensor_pcs/src/rs_config/good_curves/secp256k1.rsRaw
1use ecfft::GoodCurve;
2
3type Fp = halo2curves::secp256k1::Fp;
4
5const CURVE_4_A: Fp = Fp::from_raw([
6 1924362692430828527,
7 180888387886949819,
8 14444912836850558493,
9 2716763698990320170,
10]);
11
12const CURVE_4_B_SQRT: Fp = Fp::from_raw([
13 10596826214460559417,
14 9041891995856355984,
15 392200829566232436,
16 5616829616257048236,
17]);
18
19const CURVE_4_GX: Fp = Fp::from_raw([
20 3060553808241114122,
21 4367422627483541323,
22 1326591990371471461,
23 1051615568340430255,
24]);
25
26const CURVE_4_GY: Fp = Fp::from_raw([
27 1576479964359531032,
28 10706990284747222844,
29 2069836301523772900,
30 11540652371418823164,
31]);
32
33const CURVE_4_CX: Fp = Fp::from_raw([
34 1394469693679244729,
35 3481743377114570646,
36 685293755929734561,
37 9752242693766949385,
38]);
39
40const CURVE_4_CY: Fp = Fp::from_raw([
41 11112828892610998404,
42 11816693849252775007,
43 3142482327686601672,
44 2138128838908646944,
45]);
46
47const CURVE_5_A: Fp = Fp::from_raw([
48 18402892062958705657,
49 10955586493449255806,
50 274692491874833279,
51 3521647190010012104,
52]);
53
54const CURVE_5_B_SQRT: Fp = Fp::from_raw([
55 13277815540701934041,
56 10000316683343802069,
57 13748514902267845339,
58 5043980866827216326,
59]);
60
61const CURVE_5_GX: Fp = Fp::from_raw([
62 8681597433860724212,
63 16010850653546434744,
64 1655308633092053542,
65 13482638234089226570,
66]);
67
68const CURVE_5_GY: Fp = Fp::from_raw([
69 695535688134352662,
70 12810977243071276429,
71 6639318313449462421,
72 9854099205183828948,
73]);
74
75const CURVE_5_CX: Fp = Fp::from_raw([
76 7244846058583153822,
77 15236867482366246868,
78 7610066066648153412,
79 8717324474930230203,
80]);
81
82const CURVE_5_CY: Fp = Fp::from_raw([
83 15955524643521385563,
84 14108119042026331605,
85 8376852394104379031,
86 5145942493709290957,
87]);
88
89const CURVE_6_A: Fp = Fp::from_raw([
90 11754870036548954207,
91 1758746815041297131,
92 5040922207106606105,
93 6156268686419792864,
94]);
95
96const CURVE_6_B_SQRT: Fp = Fp::from_raw([
97 16551703456907310471,
98 7307795367003411231,
99 9107551177630293136,
100 3643865576794489637,
101]);
102
103const CURVE_6_GX: Fp = Fp::from_raw([
104 3057786712414561431,
105 3924976238282577064,
106 1535938406046208114,
107 4471499328874959330,
108]);
109
110const CURVE_6_GY: Fp = Fp::from_raw([
111 7420330572426678478,
112 11093910355894798679,
113 8046171174582240023,
114 16159208434053522767,
115]);
116
117const CURVE_6_CX: Fp = Fp::from_raw([
118 15232142892107882662,
119 2997925312254061635,
120 875684261157844424,
121 8054980201271915862,
122]);
123
124const CURVE_6_CY: Fp = Fp::from_raw([
125 5573271252396838460,
126 7659129927758801858,
127 11224891608690076565,
128 8114225763096549468,
129]);
130
131const CURVE_7_A: Fp = Fp::from_raw([
132 15267998901538414419,
133 17985868627099147199,
134 5570198032670981398,
135 7365202425498739811,
136]);
137
138const CURVE_7_B_SQRT: Fp = Fp::from_raw([
139 13238569970078865336,
140 1859729155619525190,
141 2289004025597154627,
142 16424324367845100069,
143]);
144
145const CURVE_7_GX: Fp = Fp::from_raw([
146 13067803014914932854,
147 8460655374139991694,
148 17522879348989963876,
149 2592776320942502074,
150]);
151
152const CURVE_7_GY: Fp = Fp::from_raw([
153 17581244616257969879,
154 13563260062750024799,
155 17836667944921387338,
156 5158385585024810784,
157]);
158
159const CURVE_7_CX: Fp = Fp::from_raw([
160 17627362889681060942,
161 10449394617197091758,
162 11211669951719111062,
163 18402164978442722259,
164]);
165
166const CURVE_7_CY: Fp = Fp::from_raw([
167 3635904622687808257,
168 12660024001564793695,
169 2997578841449112866,
170 7489869964282615463,
171]);
172
173const CURVE_8_A: Fp = Fp::from_raw([
174 16479441517948017563,
175 12244661565122532810,
176 16423402461885171455,
177 15804938408404708752,
178]);
179
180const CURVE_8_B_SQRT: Fp = Fp::from_raw([
181 4114471407724985276,
182 6429895848762172356,
183 9060307719139806083,
184 1606308100763345976,
185]);
186
187const CURVE_8_GX: Fp = Fp::from_raw([
188 18005553174453754936,
189 7879246565041753863,
190 15708703128473390087,
191 12948592289805182905,
192]);
193
194const CURVE_8_GY: Fp = Fp::from_raw([
195 2637815016833021192,
196 5625620963822185667,
197 15498097759340857613,
198 2802364189360038003,
199]);
200
201const CURVE_8_CX: Fp = Fp::from_raw([
202 12514982531648064548,
203 7254771947927897203,
204 6879061275311364813,
205 4385541459413917142,
206]);
207
208const CURVE_8_CY: Fp = Fp::from_raw([
209 13726278170638118925,
210 10016993418218833106,
211 13091102901943378213,
212 8612533232618193985,
213]);
214
215const CURVE_9_A: Fp = Fp::from_raw([
216 2821731813563793393,
217 3977895281010832865,
218 8603743292399951036,
219 4645234720790204102,
220]);
221
222const CURVE_9_B_SQRT: Fp = Fp::from_raw([
223 15890535715675950137,
224 7339610358409226035,
225 12609222160720627891,
226 12499110658591842997,
227]);
228
229const CURVE_9_GX: Fp = Fp::from_raw([
230 6103380741459351369,
231 14746101125474414882,
232 12417547802268400852,
233 7335532149994146446,
234]);
235
236const CURVE_9_GY: Fp = Fp::from_raw([
237 4181331351064768648,
238 16489913493464340135,
239 7051826832725726336,
240 887431923330984487,
241]);
242
243const CURVE_9_CX: Fp = Fp::from_raw([
244 9670988472649099633,
245 15261760137634294840,
246 2288914830631271678,
247 6241984859397428357,
248]);
249
250const CURVE_9_CY: Fp = Fp::from_raw([
251 3996701096097868069,
252 16808707541849580191,
253 2008740307070264540,
254 10234541905633632584,
255]);
256
257const CURVE_10_A: Fp = Fp::from_raw([
258 13443933661892288238,
259 6366097774645666914,
260 12539700524489124232,
261 2960403700358460234,
262]);
263
264const CURVE_10_B_SQRT: Fp = Fp::from_raw([
265 11179334656770650694,
266 12204828351656968056,
267 17469374953427230415,
268 2698602761568343027,
269]);
270
271const CURVE_10_GX: Fp = Fp::from_raw([
272 4752429915723436981,
273 6658961595441054005,
274 943316193080952835,
275 10509103062531384873,
276]);
277
278const CURVE_10_GY: Fp = Fp::from_raw([
279 7405820527339739030,
280 1149755149636620515,
281 12315441721581649311,
282 9740641083146831387,
283]);
284
285const CURVE_10_CX: Fp = Fp::from_raw([
286 12133915190353440166,
287 12735241419273571667,
288 984598181344074714,
289 4945074058633718103,
290]);
291
292const CURVE_10_CY: Fp = Fp::from_raw([
293 7787944055361603336,
294 16188630343349344241,
295 1798488611520969499,
296 15905180573830923441,
297]);
298
299const CURVE_11_A: Fp = Fp::from_raw([
300 44690967250983077,
301 13024355091469571869,
302 2426866618505792061,
303 5439410159441159777,
304]);
305
306const CURVE_11_B_SQRT: Fp = Fp::from_raw([
307 2482839174035592440,
308 13977599229562359858,
309 9165253311652858048,
310 11796280965050311461,
311]);
312
313const CURVE_11_GX: Fp = Fp::from_raw([
314 3785100838262116535,
315 14366163517008314631,
316 6520093107874784461,
317 1432940500835404998,
318]);
319
320const CURVE_11_GY: Fp = Fp::from_raw([
321 15446934078954168044,
322 13724149936204307181,
323 291296515805666972,
324 17295416299404581082,
325]);
326
327const CURVE_11_CX: Fp = Fp::from_raw([
328 3987179730389290606,
329 12765099312359453542,
330 14085665078244679772,
331 1158541383839945849,
332]);
333
334const CURVE_11_CY: Fp = Fp::from_raw([
335 2812404283588715887,
336 10748530967036022352,
337 15279323815639380689,
338 7472866256744067949,
339]);
340
341pub fn secp256k1_good_curve(k: usize) -> (GoodCurve<Fp>, (Fp, Fp)) {
342 if k == 4 {
343 (
344 GoodCurve::new(CURVE_4_A, CURVE_4_B_SQRT, CURVE_4_GX, CURVE_4_GY, k),
345 (CURVE_4_CX, CURVE_4_CY),
346 )
347 } else if k == 5 {
348 (
349 GoodCurve::new(CURVE_5_A, CURVE_5_B_SQRT, CURVE_5_GX, CURVE_5_GY, k),
350 (CURVE_5_CX, CURVE_5_CY),
351 )
352 } else if k == 6 {
353 (
354 GoodCurve::new(CURVE_6_A, CURVE_6_B_SQRT, CURVE_6_GX, CURVE_6_GY, k),
355 (CURVE_6_CX, CURVE_6_CY),
356 )
357 } else if k == 7 {
358 (
359 GoodCurve::new(CURVE_7_A, CURVE_7_B_SQRT, CURVE_7_GX, CURVE_7_GY, k),
360 (CURVE_7_CX, CURVE_7_CY),
361 )
362 } else if k == 8 {
363 (
364 GoodCurve::new(CURVE_8_A, CURVE_8_B_SQRT, CURVE_8_GX, CURVE_8_GY, k),
365 (CURVE_8_CX, CURVE_8_CY),
366 )
367 } else if k == 9 {
368 (
369 GoodCurve::new(CURVE_9_A, CURVE_9_B_SQRT, CURVE_9_GX, CURVE_9_GY, k),
370 (CURVE_9_CX, CURVE_9_CY),
371 )
372 } else if k == 10 {
373 (
374 GoodCurve::new(CURVE_10_A, CURVE_10_B_SQRT, CURVE_10_GX, CURVE_10_GY, k),
375 (CURVE_10_CX, CURVE_10_CY),
376 )
377 } else if k == 11 {
378 (
379 GoodCurve::new(CURVE_11_A, CURVE_11_B_SQRT, CURVE_11_GX, CURVE_11_GY, k),
380 (CURVE_11_CX, CURVE_11_CY),
381 )
382 } else {
383 panic!("k must be between 4 and 11")
384 }
385}
386
387#[cfg(test)]
388mod tests {
389 use ecfft::{find_coset_offset, GoodCurve};
390
391 type F = halo2curves::secp256k1::Fp;
392
393 fn to_limbs(x: F) -> [u64; 4] {
394 let bytes = x.to_bytes();
395 let mut limbs = [0u64; 4];
396
397 for i in 0..4 {
398 let mut limb_i = 0;
399 for j in 0..8 {
400 limb_i += (bytes[8 * i + j] as u64) << (8 * j);
401 }
402 limbs[i] = limb_i;
403 }
404 limbs
405 }
406
407 #[test]
408 fn find_curves() {
409 // We expect the tensor-IOP to use a square matrix for now,
410 // so we only need to find curves with the square of the number
411 // of evaluations
412 for k in 4..12 {
413 let curve = GoodCurve::<F>::find_k(k);
414 let (coset_offset_x, coset_offset_y) =
415 find_coset_offset(curve.a, curve.B_sqrt.square());
416 println!(
417 "const CURVE_{}_A: Fp = Fp::from_raw(
418 {:?},
419 );
420
421 const CURVE_{}_B_SQRT: Fp = Fp::from_raw(
422 {:?},
423 );
424
425 const CURVE_{}_GX: Fp = Fp::from_raw(
426 {:?},
427 );
428
429 const CURVE_{}_GY: Fp = Fp::from_raw(
430 {:?}
431 );
432
433 const CURVE_{}_CX: Fp = Fp::from_raw(
434 {:?},
435 );
436
437 const CURVE_{}_CY: Fp = Fp::from_raw(
438 {:?},
439 );
440 ",
441 k,
442 to_limbs(curve.a),
443 k,
444 to_limbs(curve.B_sqrt),
445 k,
446 to_limbs(curve.gx),
447 k,
448 to_limbs(curve.gy),
449 k,
450 to_limbs(coset_offset_x),
451 k,
452 to_limbs(coset_offset_y),
453 );
454 }
455 }
456}