use sha2::{Digest, Sha256};
use crate::error::Error;
pub fn hash_public_inputs(public_inputs: &[u8]) -> [u8; 32] {
hash_public_inputs_with_fn(public_inputs, sha256_hash)
}
pub fn hash_public_inputs_with_fn<F>(public_inputs: &[u8], hasher: F) -> [u8; 32]
where
F: Fn(&[u8]) -> [u8; 32],
{
let mut result = hasher(public_inputs);
result[0] &= 0x1F;
result
}
pub fn sha256_hash(inputs: &[u8]) -> [u8; 32] {
Sha256::digest(inputs).into()
}
pub fn blake3_hash(inputs: &[u8]) -> [u8; 32] {
*blake3::hash(inputs).as_bytes()
}
pub fn decode_sp1_vkey_hash(sp1_vkey_hash: &str) -> Result<[u8; 32], Error> {
if sp1_vkey_hash.len() < 2 {
return Err(Error::InvalidProgramVkeyHash);
}
let bytes = hex::decode(&sp1_vkey_hash[2..]).map_err(|_| Error::InvalidProgramVkeyHash)?;
bytes.try_into().map_err(|_| Error::InvalidProgramVkeyHash)
}