@ -0,0 +1 @@ |
|||||
|
pub mod secp256k1;
|
@ -0,0 +1,456 @@ |
|||||
|
use ecfft::GoodCurve;
|
||||
|
|
||||
|
type Fp = halo2curves::secp256k1::Fp;
|
||||
|
|
||||
|
const CURVE_4_A: Fp = Fp::from_raw([
|
||||
|
1924362692430828527,
|
||||
|
180888387886949819,
|
||||
|
14444912836850558493,
|
||||
|
2716763698990320170,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_4_B_SQRT: Fp = Fp::from_raw([
|
||||
|
10596826214460559417,
|
||||
|
9041891995856355984,
|
||||
|
392200829566232436,
|
||||
|
5616829616257048236,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_4_GX: Fp = Fp::from_raw([
|
||||
|
3060553808241114122,
|
||||
|
4367422627483541323,
|
||||
|
1326591990371471461,
|
||||
|
1051615568340430255,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_4_GY: Fp = Fp::from_raw([
|
||||
|
1576479964359531032,
|
||||
|
10706990284747222844,
|
||||
|
2069836301523772900,
|
||||
|
11540652371418823164,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_4_CX: Fp = Fp::from_raw([
|
||||
|
1394469693679244729,
|
||||
|
3481743377114570646,
|
||||
|
685293755929734561,
|
||||
|
9752242693766949385,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_4_CY: Fp = Fp::from_raw([
|
||||
|
11112828892610998404,
|
||||
|
11816693849252775007,
|
||||
|
3142482327686601672,
|
||||
|
2138128838908646944,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_5_A: Fp = Fp::from_raw([
|
||||
|
18402892062958705657,
|
||||
|
10955586493449255806,
|
||||
|
274692491874833279,
|
||||
|
3521647190010012104,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_5_B_SQRT: Fp = Fp::from_raw([
|
||||
|
13277815540701934041,
|
||||
|
10000316683343802069,
|
||||
|
13748514902267845339,
|
||||
|
5043980866827216326,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_5_GX: Fp = Fp::from_raw([
|
||||
|
8681597433860724212,
|
||||
|
16010850653546434744,
|
||||
|
1655308633092053542,
|
||||
|
13482638234089226570,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_5_GY: Fp = Fp::from_raw([
|
||||
|
695535688134352662,
|
||||
|
12810977243071276429,
|
||||
|
6639318313449462421,
|
||||
|
9854099205183828948,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_5_CX: Fp = Fp::from_raw([
|
||||
|
7244846058583153822,
|
||||
|
15236867482366246868,
|
||||
|
7610066066648153412,
|
||||
|
8717324474930230203,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_5_CY: Fp = Fp::from_raw([
|
||||
|
15955524643521385563,
|
||||
|
14108119042026331605,
|
||||
|
8376852394104379031,
|
||||
|
5145942493709290957,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_6_A: Fp = Fp::from_raw([
|
||||
|
11754870036548954207,
|
||||
|
1758746815041297131,
|
||||
|
5040922207106606105,
|
||||
|
6156268686419792864,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_6_B_SQRT: Fp = Fp::from_raw([
|
||||
|
16551703456907310471,
|
||||
|
7307795367003411231,
|
||||
|
9107551177630293136,
|
||||
|
3643865576794489637,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_6_GX: Fp = Fp::from_raw([
|
||||
|
3057786712414561431,
|
||||
|
3924976238282577064,
|
||||
|
1535938406046208114,
|
||||
|
4471499328874959330,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_6_GY: Fp = Fp::from_raw([
|
||||
|
7420330572426678478,
|
||||
|
11093910355894798679,
|
||||
|
8046171174582240023,
|
||||
|
16159208434053522767,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_6_CX: Fp = Fp::from_raw([
|
||||
|
15232142892107882662,
|
||||
|
2997925312254061635,
|
||||
|
875684261157844424,
|
||||
|
8054980201271915862,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_6_CY: Fp = Fp::from_raw([
|
||||
|
5573271252396838460,
|
||||
|
7659129927758801858,
|
||||
|
11224891608690076565,
|
||||
|
8114225763096549468,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_7_A: Fp = Fp::from_raw([
|
||||
|
15267998901538414419,
|
||||
|
17985868627099147199,
|
||||
|
5570198032670981398,
|
||||
|
7365202425498739811,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_7_B_SQRT: Fp = Fp::from_raw([
|
||||
|
13238569970078865336,
|
||||
|
1859729155619525190,
|
||||
|
2289004025597154627,
|
||||
|
16424324367845100069,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_7_GX: Fp = Fp::from_raw([
|
||||
|
13067803014914932854,
|
||||
|
8460655374139991694,
|
||||
|
17522879348989963876,
|
||||
|
2592776320942502074,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_7_GY: Fp = Fp::from_raw([
|
||||
|
17581244616257969879,
|
||||
|
13563260062750024799,
|
||||
|
17836667944921387338,
|
||||
|
5158385585024810784,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_7_CX: Fp = Fp::from_raw([
|
||||
|
17627362889681060942,
|
||||
|
10449394617197091758,
|
||||
|
11211669951719111062,
|
||||
|
18402164978442722259,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_7_CY: Fp = Fp::from_raw([
|
||||
|
3635904622687808257,
|
||||
|
12660024001564793695,
|
||||
|
2997578841449112866,
|
||||
|
7489869964282615463,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_8_A: Fp = Fp::from_raw([
|
||||
|
16479441517948017563,
|
||||
|
12244661565122532810,
|
||||
|
16423402461885171455,
|
||||
|
15804938408404708752,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_8_B_SQRT: Fp = Fp::from_raw([
|
||||
|
4114471407724985276,
|
||||
|
6429895848762172356,
|
||||
|
9060307719139806083,
|
||||
|
1606308100763345976,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_8_GX: Fp = Fp::from_raw([
|
||||
|
18005553174453754936,
|
||||
|
7879246565041753863,
|
||||
|
15708703128473390087,
|
||||
|
12948592289805182905,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_8_GY: Fp = Fp::from_raw([
|
||||
|
2637815016833021192,
|
||||
|
5625620963822185667,
|
||||
|
15498097759340857613,
|
||||
|
2802364189360038003,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_8_CX: Fp = Fp::from_raw([
|
||||
|
12514982531648064548,
|
||||
|
7254771947927897203,
|
||||
|
6879061275311364813,
|
||||
|
4385541459413917142,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_8_CY: Fp = Fp::from_raw([
|
||||
|
13726278170638118925,
|
||||
|
10016993418218833106,
|
||||
|
13091102901943378213,
|
||||
|
8612533232618193985,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_9_A: Fp = Fp::from_raw([
|
||||
|
2821731813563793393,
|
||||
|
3977895281010832865,
|
||||
|
8603743292399951036,
|
||||
|
4645234720790204102,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_9_B_SQRT: Fp = Fp::from_raw([
|
||||
|
15890535715675950137,
|
||||
|
7339610358409226035,
|
||||
|
12609222160720627891,
|
||||
|
12499110658591842997,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_9_GX: Fp = Fp::from_raw([
|
||||
|
6103380741459351369,
|
||||
|
14746101125474414882,
|
||||
|
12417547802268400852,
|
||||
|
7335532149994146446,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_9_GY: Fp = Fp::from_raw([
|
||||
|
4181331351064768648,
|
||||
|
16489913493464340135,
|
||||
|
7051826832725726336,
|
||||
|
887431923330984487,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_9_CX: Fp = Fp::from_raw([
|
||||
|
9670988472649099633,
|
||||
|
15261760137634294840,
|
||||
|
2288914830631271678,
|
||||
|
6241984859397428357,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_9_CY: Fp = Fp::from_raw([
|
||||
|
3996701096097868069,
|
||||
|
16808707541849580191,
|
||||
|
2008740307070264540,
|
||||
|
10234541905633632584,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_10_A: Fp = Fp::from_raw([
|
||||
|
13443933661892288238,
|
||||
|
6366097774645666914,
|
||||
|
12539700524489124232,
|
||||
|
2960403700358460234,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_10_B_SQRT: Fp = Fp::from_raw([
|
||||
|
11179334656770650694,
|
||||
|
12204828351656968056,
|
||||
|
17469374953427230415,
|
||||
|
2698602761568343027,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_10_GX: Fp = Fp::from_raw([
|
||||
|
4752429915723436981,
|
||||
|
6658961595441054005,
|
||||
|
943316193080952835,
|
||||
|
10509103062531384873,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_10_GY: Fp = Fp::from_raw([
|
||||
|
7405820527339739030,
|
||||
|
1149755149636620515,
|
||||
|
12315441721581649311,
|
||||
|
9740641083146831387,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_10_CX: Fp = Fp::from_raw([
|
||||
|
12133915190353440166,
|
||||
|
12735241419273571667,
|
||||
|
984598181344074714,
|
||||
|
4945074058633718103,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_10_CY: Fp = Fp::from_raw([
|
||||
|
7787944055361603336,
|
||||
|
16188630343349344241,
|
||||
|
1798488611520969499,
|
||||
|
15905180573830923441,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_11_A: Fp = Fp::from_raw([
|
||||
|
44690967250983077,
|
||||
|
13024355091469571869,
|
||||
|
2426866618505792061,
|
||||
|
5439410159441159777,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_11_B_SQRT: Fp = Fp::from_raw([
|
||||
|
2482839174035592440,
|
||||
|
13977599229562359858,
|
||||
|
9165253311652858048,
|
||||
|
11796280965050311461,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_11_GX: Fp = Fp::from_raw([
|
||||
|
3785100838262116535,
|
||||
|
14366163517008314631,
|
||||
|
6520093107874784461,
|
||||
|
1432940500835404998,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_11_GY: Fp = Fp::from_raw([
|
||||
|
15446934078954168044,
|
||||
|
13724149936204307181,
|
||||
|
291296515805666972,
|
||||
|
17295416299404581082,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_11_CX: Fp = Fp::from_raw([
|
||||
|
3987179730389290606,
|
||||
|
12765099312359453542,
|
||||
|
14085665078244679772,
|
||||
|
1158541383839945849,
|
||||
|
]);
|
||||
|
|
||||
|
const CURVE_11_CY: Fp = Fp::from_raw([
|
||||
|
2812404283588715887,
|
||||
|
10748530967036022352,
|
||||
|
15279323815639380689,
|
||||
|
7472866256744067949,
|
||||
|
]);
|
||||
|
|
||||
|
pub fn secp256k1_good_curve(k: usize) -> (GoodCurve<Fp>, (Fp, Fp)) {
|
||||
|
if k == 4 {
|
||||
|
(
|
||||
|
GoodCurve::new(CURVE_4_A, CURVE_4_B_SQRT, CURVE_4_GX, CURVE_4_GY, k),
|
||||
|
(CURVE_4_CX, CURVE_4_CY),
|
||||
|
)
|
||||
|
} else if k == 5 {
|
||||
|
(
|
||||
|
GoodCurve::new(CURVE_5_A, CURVE_5_B_SQRT, CURVE_5_GX, CURVE_5_GY, k),
|
||||
|
(CURVE_5_CX, CURVE_5_CY),
|
||||
|
)
|
||||
|
} else if k == 6 {
|
||||
|
(
|
||||
|
GoodCurve::new(CURVE_6_A, CURVE_6_B_SQRT, CURVE_6_GX, CURVE_6_GY, k),
|
||||
|
(CURVE_6_CX, CURVE_6_CY),
|
||||
|
)
|
||||
|
} else if k == 7 {
|
||||
|
(
|
||||
|
GoodCurve::new(CURVE_7_A, CURVE_7_B_SQRT, CURVE_7_GX, CURVE_7_GY, k),
|
||||
|
(CURVE_7_CX, CURVE_7_CY),
|
||||
|
)
|
||||
|
} else if k == 8 {
|
||||
|
(
|
||||
|
GoodCurve::new(CURVE_8_A, CURVE_8_B_SQRT, CURVE_8_GX, CURVE_8_GY, k),
|
||||
|
(CURVE_8_CX, CURVE_8_CY),
|
||||
|
)
|
||||
|
} else if k == 9 {
|
||||
|
(
|
||||
|
GoodCurve::new(CURVE_9_A, CURVE_9_B_SQRT, CURVE_9_GX, CURVE_9_GY, k),
|
||||
|
(CURVE_9_CX, CURVE_9_CY),
|
||||
|
)
|
||||
|
} else if k == 10 {
|
||||
|
(
|
||||
|
GoodCurve::new(CURVE_10_A, CURVE_10_B_SQRT, CURVE_10_GX, CURVE_10_GY, k),
|
||||
|
(CURVE_10_CX, CURVE_10_CY),
|
||||
|
)
|
||||
|
} else if k == 11 {
|
||||
|
(
|
||||
|
GoodCurve::new(CURVE_11_A, CURVE_11_B_SQRT, CURVE_11_GX, CURVE_11_GY, k),
|
||||
|
(CURVE_11_CX, CURVE_11_CY),
|
||||
|
)
|
||||
|
} else {
|
||||
|
panic!("k must be between 4 and 11")
|
||||
|
}
|
||||
|
}
|
||||
|
|
||||
|
#[cfg(test)]
|
||||
|
mod tests {
|
||||
|
use ecfft::{find_coset_offset, GoodCurve};
|
||||
|
|
||||
|
type F = halo2curves::secp256k1::Fp;
|
||||
|
|
||||
|
fn to_limbs(x: F) -> [u64; 4] {
|
||||
|
let bytes = x.to_bytes();
|
||||
|
let mut limbs = [0u64; 4];
|
||||
|
|
||||
|
for i in 0..4 {
|
||||
|
let mut limb_i = 0;
|
||||
|
for j in 0..8 {
|
||||
|
limb_i += (bytes[8 * i + j] as u64) << (8 * j);
|
||||
|
}
|
||||
|
limbs[i] = limb_i;
|
||||
|
}
|
||||
|
limbs
|
||||
|
}
|
||||
|
|
||||
|
#[test]
|
||||
|
fn find_curves() {
|
||||
|
// We expect the tensor-IOP to use a square matrix for now,
|
||||
|
// so we only need to find curves with the square of the number
|
||||
|
// of evaluations
|
||||
|
for k in 4..12 {
|
||||
|
let curve = GoodCurve::<F>::find_k(k);
|
||||
|
let (coset_offset_x, coset_offset_y) =
|
||||
|
find_coset_offset(curve.a, curve.B_sqrt.square());
|
||||
|
println!(
|
||||
|
"const CURVE_{}_A: Fp = Fp::from_raw(
|
||||
|
{:?},
|
||||
|
);
|
||||
|
|
||||
|
const CURVE_{}_B_SQRT: Fp = Fp::from_raw(
|
||||
|
{:?},
|
||||
|
);
|
||||
|
|
||||
|
const CURVE_{}_GX: Fp = Fp::from_raw(
|
||||
|
{:?},
|
||||
|
);
|
||||
|
|
||||
|
const CURVE_{}_GY: Fp = Fp::from_raw(
|
||||
|
{:?}
|
||||
|
);
|
||||
|
|
||||
|
const CURVE_{}_CX: Fp = Fp::from_raw(
|
||||
|
{:?},
|
||||
|
);
|
||||
|
|
||||
|
const CURVE_{}_CY: Fp = Fp::from_raw(
|
||||
|
{:?},
|
||||
|
);
|
||||
|
",
|
||||
|
k,
|
||||
|
to_limbs(curve.a),
|
||||
|
k,
|
||||
|
to_limbs(curve.B_sqrt),
|
||||
|
k,
|
||||
|
to_limbs(curve.gx),
|
||||
|
k,
|
||||
|
to_limbs(curve.gy),
|
||||
|
k,
|
||||
|
to_limbs(coset_offset_x),
|
||||
|
k,
|
||||
|
to_limbs(coset_offset_y),
|
||||
|
);
|
||||
|
}
|
||||
|
}
|
||||
|
}
|
@ -1,3 +1,4 @@ |
|||||
pub mod ecfft;
|
pub mod ecfft;
|
||||
|
pub mod good_curves;
|
||||
pub mod naive;
|
pub mod naive;
|
||||
pub mod smooth;
|
pub mod smooth;
|