1use core::fmt;
2use core::ops::{Mul, Neg};
3use ff::PrimeField;
4use subtle::Choice;
5
6use crate::{Curve, Group, GroupEncoding};
7
8pub trait PrimeGroup: Group + GroupEncoding {}
10
11pub trait PrimeCurve: Curve<AffineRepr = <Self as PrimeCurve>::Affine> + PrimeGroup {
14 type Affine: PrimeCurveAffine<Curve = Self, Scalar = Self::Scalar>
15 + Mul<Self::Scalar, Output = Self>
16 + for<'r> Mul<&'r Self::Scalar, Output = Self>;
17}
18
19pub trait PrimeCurveAffine: GroupEncoding
22 + Copy
23 + Clone
24 + Sized
25 + Send
26 + Sync
27 + fmt::Debug
28 + PartialEq
29 + Eq
30 + 'static
31 + Neg<Output = Self>
32 + Mul<<Self as PrimeCurveAffine>::Scalar, Output = <Self as PrimeCurveAffine>::Curve>
33 + for<'r> Mul<&'r <Self as PrimeCurveAffine>::Scalar, Output = <Self as PrimeCurveAffine>::Curve>
34{
35 type Scalar: PrimeField;
36 type Curve: PrimeCurve<Affine = Self, Scalar = Self::Scalar>;
37
38 fn identity() -> Self;
40
41 fn generator() -> Self;
43
44 fn is_identity(&self) -> Choice;
47
48 fn to_curve(&self) -> Self::Curve;
50}