4 use rand_core::{CryptoRng, RngCore};
7 // TODO(tarcieri): replace with `group` crate?
12 /// Base field element
19 fn name() -> &'static str;
22 fn const_m() -> Self::Element;
25 fn const_n() -> Self::Element;
28 fn const_s() -> Self::Element;
31 fn hash_to_scalar(s: &[u8]) -> Self::Scalar;
33 /// Generate a random scalar
34 fn random_scalar<T>(cspring: &mut T) -> Self::Scalar
36 T: RngCore + CryptoRng;
39 fn scalar_neg(s: &Self::Scalar) -> Self::Scalar;
41 /// Convert base field element to bytes
42 fn element_to_bytes(e: &Self::Element) -> Vec<u8>;
44 /// Convert bytes to base field element
45 fn bytes_to_element(b: &[u8]) -> Option<Self::Element>;
47 /// Length of a base field element
48 fn element_length() -> usize;
50 /// Fixed-base scalar multiplication
51 fn basepoint_mult(s: &Self::Scalar) -> Self::Element;
53 /// Variable-base scalar multiplication
54 fn scalarmult(e: &Self::Element, s: &Self::Scalar) -> Self::Element;
57 fn add(a: &Self::Element, b: &Self::Element) -> Self::Element;