ark-curves-cherry-picked/grumpkin/src/curves/mod.rs
grumpkin/src/curves/mod.rsRaw
1// The parameters for the curve have been taken from
2// https://github.com/AztecProtocol/barretenberg/blob/97ccf76c42db581a8b8f8bfbcffe8ca015a3dd22/cpp/src/barretenberg/ecc/curves/grumpkin/grumpkin.hpp
3
4use crate::{fq::Fq, fr::Fr};
5use ark_ec::{
6 models::CurveConfig,
7 short_weierstrass::{self as sw, SWCurveConfig},
8};
9use ark_ff::{Field, MontFp, Zero};
10
11#[cfg(test)]
12mod tests;
13
14#[derive(Copy, Clone, Default, PartialEq, Eq)]
15pub struct GrumpkinConfig;
16
17impl CurveConfig for GrumpkinConfig {
18 type BaseField = Fq;
19 type ScalarField = Fr;
20
21 /// COFACTOR = 1
22 const COFACTOR: &'static [u64] = &[0x1];
23
24 /// COFACTOR_INV = 1
25 const COFACTOR_INV: Fr = Fr::ONE;
26}
27
28pub type Affine = sw::Affine<GrumpkinConfig>;
29pub type Projective = sw::Projective<GrumpkinConfig>;
30
31impl SWCurveConfig for GrumpkinConfig {
32 /// COEFF_A = 0
33 const COEFF_A: Fq = Fq::ZERO;
34
35 /// COEFF_B = -17
36 const COEFF_B: Fq = MontFp!("-17");
37
38 /// AFFINE_GENERATOR_COEFFS = (G1_GENERATOR_X, G1_GENERATOR_Y)
39 const GENERATOR: Affine = Affine::new_unchecked(G_GENERATOR_X, G_GENERATOR_Y);
40
41 #[inline(always)]
42 fn mul_by_a(_: Self::BaseField) -> Self::BaseField {
43 Self::BaseField::zero()
44 }
45}
46
47/// G_GENERATOR_X = 1
48pub const G_GENERATOR_X: Fq = MontFp!("1");
49
50/// G_GENERATOR_Y = sqrt(-16)
51pub const G_GENERATOR_Y: Fq =
52 MontFp!("17631683881184975370165255887551781615748388533673675138860");