ark-curves-cherry-picked/mnt6_298/src/curves/g2.rs
mnt6_298/src/curves/g2.rsRaw
1use ark_ec::{
2 mnt6,
3 mnt6::MNT6Parameters,
4 models::{short_weierstrass::SWCurveConfig, CurveConfig},
5};
6use ark_ff::{Field, MontFp};
7
8use crate::{g1, Fq, Fq3, Fr};
9
10pub type G2Affine = mnt6::G2Affine<crate::Parameters>;
11pub type G2Projective = mnt6::G2Projective<crate::Parameters>;
12pub type G2Prepared = mnt6::G2Prepared<crate::Parameters>;
13
14#[derive(Clone, Default, PartialEq, Eq)]
15pub struct Parameters;
16
17impl CurveConfig for Parameters {
18 type BaseField = Fq3;
19 type ScalarField = Fr;
20
21 /// COFACTOR =
22 /// 226502022472576270196498690498308461791828762732602586162207535351960270082712694977333372361549082214519252261735048131889018501404377856786623430385820659037970876666767495659520
23 #[rustfmt::skip]
24 const COFACTOR: &'static [u64] = &[
25 15308190245346869248,
26 10669098443577192943,
27 4561413759929581409,
28 3680089780298582849,
29 17336300687782721465,
30 10745756320947240891,
31 17479264233688728128,
32 16828697388537672097,
33 4184034152442024798,
34 915787,
35 ];
36
37 /// COFACTOR^(-1) mod r =
38 /// 79320381028210220958891541608841408590854146655427655872973753568875979721417185067925504
39 const COFACTOR_INV: Fr = MontFp!(
40 "79320381028210220958891541608841408590854146655427655872973753568875979721417185067925504"
41 );
42}
43
44/// MUL_BY_A_C0 = NONRESIDUE * COEFF_A = 5 * 11
45pub const MUL_BY_A_C0: Fq = MontFp!("55");
46
47/// MUL_BY_A_C1 = NONRESIDUE * COEFF_A
48pub const MUL_BY_A_C1: Fq = MontFp!("55");
49
50/// MUL_BY_A_C2 = COEFF_A
51pub const MUL_BY_A_C2: Fq = g1::Parameters::COEFF_A;
52
53impl SWCurveConfig for Parameters {
54 const COEFF_A: Fq3 = crate::Parameters::TWIST_COEFF_A;
55 const COEFF_B: Fq3 = Fq3::new(
56 // 5 * G1::COEFF_B
57 MontFp!("57578116384997352636487348509878309737146377454014423897662211075515354005624851787652233"),
58 Fq::ZERO,
59 Fq::ZERO,
60 );
61
62 /// AFFINE_GENERATOR_COEFFS = (G2_GENERATOR_X, G2_GENERATOR_Y)
63 const GENERATOR: G2Affine = G2Affine::new_unchecked(G2_GENERATOR_X, G2_GENERATOR_Y);
64
65 #[inline(always)]
66 fn mul_by_a(elt: Fq3) -> Fq3 {
67 Fq3::new(
68 MUL_BY_A_C0 * &elt.c1,
69 MUL_BY_A_C1 * &elt.c2,
70 MUL_BY_A_C2 * &elt.c0,
71 )
72 }
73}
74
75const G2_GENERATOR_X: Fq3 = Fq3::new(G2_GENERATOR_X_C0, G2_GENERATOR_X_C1, G2_GENERATOR_X_C2);
76const G2_GENERATOR_Y: Fq3 = Fq3::new(G2_GENERATOR_Y_C0, G2_GENERATOR_Y_C1, G2_GENERATOR_Y_C2);
77
78pub const G2_GENERATOR_X_C0: Fq = MontFp!(
79 "421456435772811846256826561593908322288509115489119907560382401870203318738334702321297427"
80);
81pub const G2_GENERATOR_X_C1: Fq = MontFp!(
82 "103072927438548502463527009961344915021167584706439945404959058962657261178393635706405114"
83);
84pub const G2_GENERATOR_X_C2: Fq = MontFp!(
85 "143029172143731852627002926324735183809768363301149009204849580478324784395590388826052558"
86);
87
88pub const G2_GENERATOR_Y_C0: Fq = MontFp!(
89 "464673596668689463130099227575639512541218133445388869383893594087634649237515554342751377"
90);
91pub const G2_GENERATOR_Y_C1: Fq = MontFp!(
92 "100642907501977375184575075967118071807821117960152743335603284583254620685343989304941678"
93);
94pub const G2_GENERATOR_Y_C2: Fq = MontFp!(
95 "123019855502969896026940545715841181300275180157288044663051565390506010149881373807142903"
96);