pub trait GroupSpec: Send + Sync {
fn group_order(&self) -> Vec<u8>;
fn element_size(&self) -> usize;
fn scalar_size(&self) -> usize;
fn hash_to_group(&self, msg: &[u8], dst: &[u8]) -> Vec<u8>;
fn hash_to_scalar(&self, msg: &[u8], dst: &[u8]) -> Vec<u8>;
fn scalar_multiply(&self, scalar: &[u8], element: &[u8]) -> Result<Vec<u8>, &'static str>;
fn scalar_multiply_generator(&self, scalar: &[u8]) -> Vec<u8>;
fn serialize_scalar(&self, scalar: &[u8]) -> Vec<u8>;
fn random_scalar(&self, rng: &mut dyn rand_core::CryptoRngCore) -> Vec<u8>;
fn scalar_inverse(&self, scalar: &[u8]) -> Vec<u8>;
fn is_identity_element(&self, element: &[u8]) -> bool;
}