arnaucube
arnaucube/ark-curves-cherry-pickedPublic Self-hosted repository
ark-curves-cherry-picked/curve25519/src/curves/mod.rs
curve25519/src/curves/mod.rsRaw
 1use crate::{Fq, Fr};
 2use ark_ec::{
 3    models::CurveConfig,
 4    twisted_edwards::{Affine, MontCurveConfig, MontgomeryAffine, Projective, TECurveConfig},
 5};
 6use ark_ff::MontFp;
 7
 8#[cfg(test)]
 9mod tests;
10
11pub type EdwardsAffine = Affine<Curve25519Config>;
12pub type EdwardsProjective = Projective<Curve25519Config>;
13pub type NonZeroMontgomeryAffine = MontgomeryAffine<Curve25519Config>;
14
15#[derive(Clone, Default, PartialEq, Eq)]
16pub struct Curve25519Config;
17
18impl CurveConfig for Curve25519Config {
19    type BaseField = Fq;
20    type ScalarField = Fr;
21
22    /// COFACTOR = 8
23    const COFACTOR: &'static [u64] = &[8];
24
25    /// COFACTOR_INV (mod r) =
26    /// 2713877091499598330239944961141122840321418634767465352250731601857045344121
27    const COFACTOR_INV: Fr =
28        MontFp!("2713877091499598330239944961141122840321418634767465352250731601857045344121");
29}
30
31// We want to emphasize that this twisted Edwards curve is not ed25519.
32// Ed25519 has COEFF_A = -1 and COEFF_D = -121665 / 121666.
33impl TECurveConfig for Curve25519Config {
34    /// COEFF_A = 486664
35    const COEFF_A: Fq = MontFp!("486664");
36
37    /// COEFF_D = 486660
38    const COEFF_D: Fq = MontFp!("486660");
39
40    /// Standard generators from <https://neuromancer.sk/std/other/Curve25519>.
41    /// The Montgomery form is
42    ///     x = 0x09,
43    ///     y = 0x20ae19a1b8a086b4e01edd2c7748d14c923d4d7e6d7c61b229e9c5a27eced3d9
44    /// The twisted Edwards form is
45    ///     x = 0x547c4350219f5e19dd26a3d6668b74346a8eb726eb2396e1228cfa397ffe6bd4
46    ///     y = 0x6666666666666666666666666666666666666666666666666666666666666658
47    const GENERATOR: EdwardsAffine = EdwardsAffine::new_unchecked(GENERATOR_X, GENERATOR_Y);
48
49    type MontCurveConfig = Curve25519Config;
50}
51
52impl MontCurveConfig for Curve25519Config {
53    /// COEFF_A = 486662
54    const COEFF_A: Fq = MontFp!("486662");
55
56    /// COEFF_B = 1
57    const COEFF_B: Fq = MontFp!("1");
58
59    type TECurveConfig = Curve25519Config;
60}
61
62/// GENERATOR_X =
63/// 38213832894368730265794714087330135568483813637251082400757400312561599933396
64pub const GENERATOR_X: Fq =
65    MontFp!("38213832894368730265794714087330135568483813637251082400757400312561599933396");
66
67/// GENERATOR_Y =
68/// (4/5)
69/// 46316835694926478169428394003475163141307993866256225615783033603165251855960
70pub const GENERATOR_Y: Fq =
71    MontFp!("46316835694926478169428394003475163141307993866256225615783033603165251855960");