use crate::engines::EngineBLS;
use alloc::borrow::ToOwned;
use ark_ff::PrimeField;
use ark_serialize::CanonicalSerialize;
use ark_std::vec::Vec;
use sha2::Digest;
pub fn sha256(b: &[u8]) -> Vec<u8> {
let mut hasher = sha2::Sha256::new();
hasher.update(b);
hasher.finalize().to_vec()
}
pub fn cross_product_32(a: &[u8], b: &[u8]) -> Vec<u8> {
let mut o = a.to_owned();
for (i, ri) in o.iter_mut().enumerate().take(32) {
*ri ^= b[i];
}
o.to_vec()
}
pub fn h2<G: CanonicalSerialize>(g: G) -> Vec<u8> {
let mut out = Vec::new();
g.serialize_compressed(&mut out)
.expect("Enough space has been allocated in the buffer");
sha256(&out)
}
pub fn h3<E: EngineBLS>(a: &[u8], b: &[u8]) -> E::Scalar {
let mut input = Vec::new();
input.extend_from_slice(a);
input.extend_from_slice(b);
let hash = sha256(&input);
E::Scalar::from_be_bytes_mod_order(&hash)
}
pub fn h4(a: &[u8]) -> Vec<u8> {
let o = sha256(a);
o[..a.len()].to_vec()
}
#[cfg(test)]
mod test {
use alloc::vec;
#[test]
fn utils_can_calc_sha256() {
let actual = crate::ibe::utils::sha256(b"test");
let expected = vec![
159, 134, 208, 129, 136, 76, 125, 101, 154, 47, 234, 160, 197, 90, 208, 21, 163, 191,
79, 27, 43, 11, 130, 44, 209, 93, 108, 21, 176, 240, 10, 8,
];
assert_eq!(actual, expected);
}
}