use core::fmt; use core::ops::{Mul, Neg}; use ff::PrimeField; use subtle::Choice; use crate::{Curve, Group, GroupEncoding}; /// This trait represents an element of a prime-order cryptographic group. pub trait PrimeGroup: Group + GroupEncoding {} /// Efficient representation of an elliptic curve point guaranteed to be /// in the correct prime order subgroup. pub trait PrimeCurve: Curve::Affine> + PrimeGroup { type Affine: PrimeCurveAffine + Mul + for<'r> Mul<&'r Self::Scalar, Output = Self>; } /// Affine representation of an elliptic curve point guaranteed to be /// in the correct prime order subgroup. pub trait PrimeCurveAffine: GroupEncoding + Copy + Clone + Sized + Send + Sync + fmt::Debug + PartialEq + Eq + 'static + Neg + Mul<::Scalar, Output = ::Curve> + for<'r> Mul<&'r ::Scalar, Output = ::Curve> { type Scalar: PrimeField; type Curve: PrimeCurve; /// Returns the additive identity. fn identity() -> Self; /// Returns a fixed generator of unknown exponent. fn generator() -> Self; /// Determines if this point represents the point at infinity; the /// additive identity. fn is_identity(&self) -> Choice; /// Converts this element to its curve representation. fn to_curve(&self) -> Self::Curve; }