arnaucube
arnaucube/shockwave-plusPublic Self-hosted repository
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}