diff --git a/ed448-goldilocks/src/field.rs b/ed448-goldilocks/src/field.rs index 76c809640..d8af66b3b 100644 --- a/ed448-goldilocks/src/field.rs +++ b/ed448-goldilocks/src/field.rs @@ -2,9 +2,9 @@ mod element; mod scalar; pub(crate) use element::*; -pub(crate) use scalar::CurveWithScalar; pub use scalar::{ - MODULUS_LIMBS, NZ_ORDER, ORDER, Scalar, ScalarBytes, WIDE_ORDER, WideScalarBytes, + CurveWithScalar, MODULUS_LIMBS, NZ_ORDER, ORDER, Scalar, ScalarBytes, WIDE_ORDER, + WideScalarBytes, }; use crate::curve::twedwards::extended::ExtendedPoint as TwExtendedPoint; diff --git a/ed448-goldilocks/src/field/scalar.rs b/ed448-goldilocks/src/field/scalar.rs index 0c2d9f05e..d80f766d4 100644 --- a/ed448-goldilocks/src/field/scalar.rs +++ b/ed448-goldilocks/src/field/scalar.rs @@ -41,13 +41,18 @@ pub type ScalarBytes = Array::ReprSize>; /// The number of bytes needed to represent the safely create a scalar from a random bytes pub type WideScalarBytes = Array::ReprSize, U2>>; +/// Representation of a curve scalar for either Ed448 or Decaf448 pub trait CurveWithScalar: 'static + CurveArithmetic + Send + Sync { + /// The size of the scalar for the given curve type ReprSize: ArraySize: Copy> + Mul: Copy>>; + /// Create a scalar from the wide representation fn from_bytes_mod_order_wide(input: &WideScalarBytes) -> Scalar; + /// Create a scalar from its serialization fn from_canonical_bytes(bytes: &ScalarBytes) -> CtOption>; + /// Return the serialization for a given scalar fn to_repr(scalar: &Scalar) -> ScalarBytes; } diff --git a/ed448-goldilocks/src/lib.rs b/ed448-goldilocks/src/lib.rs index ea02e2fbf..33a856f87 100644 --- a/ed448-goldilocks/src/lib.rs +++ b/ed448-goldilocks/src/lib.rs @@ -60,7 +60,7 @@ pub use edwards::{ AffinePoint, CompressedEdwardsY, EdwardsPoint, EdwardsScalar, EdwardsScalarBytes, WideEdwardsScalarBytes, }; -pub use field::{MODULUS_LIMBS, ORDER, Scalar, WIDE_ORDER}; +pub use field::{CurveWithScalar, MODULUS_LIMBS, ORDER, Scalar, WIDE_ORDER}; pub use montgomery::{MontgomeryPoint, ProjectiveMontgomeryPoint}; pub use ristretto::{CompressedRistretto, RistrettoPoint}; #[cfg(feature = "signing")]