51 lines
1.6 KiB
Rust
51 lines
1.6 KiB
Rust
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<AffineRepr = <Self as PrimeCurve>::Affine> + PrimeGroup {
|
|
type Affine: PrimeCurveAffine<Curve = Self, Scalar = Self::Scalar>
|
|
+ Mul<Self::Scalar, Output = Self>
|
|
+ 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<Output = Self>
|
|
+ Mul<<Self as PrimeCurveAffine>::Scalar, Output = <Self as PrimeCurveAffine>::Curve>
|
|
+ for<'r> Mul<&'r <Self as PrimeCurveAffine>::Scalar, Output = <Self as PrimeCurveAffine>::Curve>
|
|
{
|
|
type Scalar: PrimeField;
|
|
type Curve: PrimeCurve<Affine = Self, Scalar = Self::Scalar>;
|
|
|
|
/// 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;
|
|
}
|