use num_bigint::BigInt;
use sha2::{Digest, Sha256};
pub trait Group: Clone + Send + Sync {
type Scalar: Clone + Eq + std::fmt::Debug + Send + Sync;
type Element: Clone + Eq + std::fmt::Debug + Send + Sync;
fn order(&self) -> &Self::Scalar;
fn subgroup_order(&self) -> &Self::Scalar;
fn generator(&self) -> Self::Element;
fn subgroup_generator(&self) -> Self::Element;
fn identity(&self) -> Self::Element;
fn exp(&self, base: &Self::Element, scalar: &Self::Scalar)
-> Self::Element;
fn mul(&self, a: &Self::Element, b: &Self::Element) -> Self::Element;
fn scalar_inverse(&self, x: &Self::Scalar) -> Option<Self::Scalar>;
fn element_inverse(&self, x: &Self::Element) -> Option<Self::Element>;
fn hash_to_scalar(&self, data: &[u8]) -> Self::Scalar;
fn element_to_bytes(&self, elem: &Self::Element) -> Vec<u8>;
fn bytes_to_element(&self, bytes: &[u8]) -> Option<Self::Element>;
fn scalar_to_bytes(&self, scalar: &Self::Scalar) -> Vec<u8>;
fn generate_private_key(&self) -> Self::Scalar;
fn generate_public_key(&self, private_key: &Self::Scalar) -> Self::Element;
fn scalar_mul(&self, a: &Self::Scalar, b: &Self::Scalar) -> Self::Scalar;
fn scalar_sub(&self, a: &Self::Scalar, b: &Self::Scalar) -> Self::Scalar;
fn modulus(&self) -> Option<&BigInt> {
None
}
}
pub fn hash_multiple(inputs: &[&[u8]]) -> Vec<u8> {
let mut hasher = Sha256::new();
for input in inputs {
hasher.update(input);
}
hasher.finalize().to_vec()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_hash_multiple() {
let result = hash_multiple(&[b"hello", b" ", b"world"]);
let expected = Sha256::digest(b"hello world").to_vec();
assert_eq!(result, expected);
}
}