ark_ec/models/twisted_edwards/
mod.rs1use ark_serialize::{
2 CanonicalDeserialize, CanonicalDeserializeWithFlags, CanonicalSerialize,
3 CanonicalSerializeWithFlags, Compress, SerializationError, Valid, Validate,
4};
5use ark_std::io::{Read, Write};
6
7use crate::{
8 scalar_mul::{double_and_add, double_and_add_affine, variable_base::VariableBaseMSM},
9 AffineRepr,
10};
11use num_traits::Zero;
12
13use ark_ff::fields::Field;
14
15mod affine;
16pub use affine::*;
17
18mod group;
19pub use group::*;
20
21mod serialization_flags;
22pub use serialization_flags::*;
23
24pub trait TECurveConfig: super::CurveConfig {
29 const COEFF_A: Self::BaseField;
31 const COEFF_D: Self::BaseField;
33 const GENERATOR: Affine<Self>;
35
36 type MontCurveConfig: MontCurveConfig<BaseField = Self::BaseField>;
39
40 #[inline(always)]
46 fn mul_by_a(elem: Self::BaseField) -> Self::BaseField {
47 elem * Self::COEFF_A
48 }
49
50 fn is_in_correct_subgroup_assuming_on_curve(item: &Affine<Self>) -> bool {
53 double_and_add_affine(item, Self::ScalarField::characteristic()).is_zero()
56 }
57
58 fn clear_cofactor(item: &Affine<Self>) -> Affine<Self> {
63 item.mul_by_cofactor()
64 }
65
66 fn mul_projective(base: &Projective<Self>, scalar: &[u64]) -> Projective<Self> {
68 double_and_add(base, scalar)
69 }
70
71 fn mul_affine(base: &Affine<Self>, scalar: &[u64]) -> Projective<Self> {
73 double_and_add_affine(base, scalar)
74 }
75
76 fn msm(
78 bases: &[Affine<Self>],
79 scalars: &[Self::ScalarField],
80 ) -> Result<Projective<Self>, usize> {
81 (bases.len() == scalars.len())
82 .then(|| VariableBaseMSM::msm_unchecked(bases, scalars))
83 .ok_or_else(|| bases.len().min(scalars.len()))
84 }
85
86 #[inline]
89 fn serialize_with_mode<W: Write>(
90 item: &Affine<Self>,
91 mut writer: W,
92 compress: ark_serialize::Compress,
93 ) -> Result<(), SerializationError> {
94 let flags = TEFlags::from_x_coordinate(item.x);
95 match compress {
96 Compress::Yes => item.y.serialize_with_flags(writer, flags),
97 Compress::No => {
98 item.x.serialize_uncompressed(&mut writer)?;
99 item.y.serialize_uncompressed(&mut writer)
100 },
101 }
102 }
103
104 fn deserialize_with_mode<R: Read>(
108 mut reader: R,
109 compress: Compress,
110 validate: Validate,
111 ) -> Result<Affine<Self>, SerializationError> {
112 let (x, y) = match compress {
113 Compress::Yes => {
114 let (y, flags): (_, TEFlags) =
115 CanonicalDeserializeWithFlags::deserialize_with_flags(reader)?;
116 let (x, neg_x) = Affine::<Self>::get_xs_from_y_unchecked(y)
117 .ok_or(SerializationError::InvalidData)?;
118 if flags.is_negative() {
119 (neg_x, y)
120 } else {
121 (x, y)
122 }
123 },
124 Compress::No => {
125 let x: Self::BaseField =
126 CanonicalDeserialize::deserialize_uncompressed(&mut reader)?;
127 let y: Self::BaseField =
128 CanonicalDeserialize::deserialize_uncompressed(&mut reader)?;
129 (x, y)
130 },
131 };
132 let point = Affine::new_unchecked(x, y);
133 if validate == Validate::Yes {
134 point.check()?;
135 }
136 Ok(point)
137 }
138
139 #[inline]
140 fn serialized_size(compress: Compress) -> usize {
141 let zero = Self::BaseField::zero();
142 match compress {
143 Compress::Yes => zero.serialized_size_with_flags::<TEFlags>(),
144 Compress::No => zero.uncompressed_size() + zero.uncompressed_size(),
145 }
146 }
147}
148
149pub trait MontCurveConfig: super::CurveConfig {
154 const COEFF_A: Self::BaseField;
156 const COEFF_B: Self::BaseField;
158
159 type TECurveConfig: TECurveConfig<BaseField = Self::BaseField>;
162}
163
164