//! Elliptic curve arithmetic traits. use crate::{ ops::{Invert, LinearCombination, MulByGenerator, Reduce, ShrAssign}, point::AffineCoordinates, scalar::{FromUintUnchecked, IsHigh}, Curve, FieldBytes, PrimeCurve, ScalarPrimitive, }; use core::fmt::Debug; use subtle::{ConditionallySelectable, ConstantTimeEq, CtOption}; use zeroize::DefaultIsZeroes; /// Elliptic curve with an arithmetic implementation. pub trait CurveArithmetic: Curve { /// Elliptic curve point in affine coordinates. type AffinePoint: 'static + AffineCoordinates> + Copy + ConditionallySelectable + ConstantTimeEq + Debug + Default + DefaultIsZeroes + Eq + PartialEq + Sized + Send + Sync; /// Elliptic curve point in projective coordinates. /// /// Note: the following bounds are provided by [`group::Group`]: /// - `'static` /// - [`Copy`] /// - [`Clone`] /// - [`Debug`] /// - [`Eq`] /// - [`Sized`] /// - [`Send`] /// - [`Sync`] type ProjectivePoint: ConditionallySelectable + ConstantTimeEq + Default + DefaultIsZeroes + From + Into + LinearCombination + MulByGenerator + group::Curve + group::Group; /// Scalar field modulo this curve's order. /// /// Note: the following bounds are provided by [`ff::Field`]: /// - `'static` /// - [`Copy`] /// - [`Clone`] /// - [`ConditionallySelectable`] /// - [`ConstantTimeEq`] /// - [`Debug`] /// - [`Default`] /// - [`Send`] /// - [`Sync`] type Scalar: AsRef + DefaultIsZeroes + From> + FromUintUnchecked + Into> + Into> + Into + Invert> + IsHigh + PartialOrd + Reduce> + ShrAssign + ff::Field + ff::PrimeField>; } /// Prime order elliptic curve with projective arithmetic implementation. pub trait PrimeCurveArithmetic: PrimeCurve + CurveArithmetic { /// Prime order elliptic curve group. type CurveGroup: group::prime::PrimeCurve::AffinePoint>; }