use crate::{Hasher, HasherError, Poseidon};
pub fn create_hash_chain_from_array<const T: usize>(
inputs: [[u8; 32]; T],
) -> Result<[u8; 32], HasherError> {
create_hash_chain_from_slice(&inputs)
}
pub fn create_hash_chain_from_slice(inputs: &[[u8; 32]]) -> Result<[u8; 32], HasherError> {
if inputs.is_empty() {
return Ok([0u8; 32]);
}
let mut hash_chain = inputs[0];
for input in inputs.iter().skip(1) {
hash_chain = Poseidon::hashv(&[&hash_chain, input])?;
}
Ok(hash_chain)
}
pub fn create_two_inputs_hash_chain(
hashes_first: &[[u8; 32]],
hashes_second: &[[u8; 32]],
) -> Result<[u8; 32], HasherError> {
let first_len = hashes_first.len();
if first_len != hashes_second.len() {
return Err(HasherError::InvalidInputLength(
first_len,
hashes_second.len(),
));
}
if hashes_first.is_empty() {
return Ok([0u8; 32]);
}
let mut hash_chain = Poseidon::hashv(&[&hashes_first[0], &hashes_second[0]])?;
if first_len == 1 {
return Ok(hash_chain);
}
for i in 1..first_len {
hash_chain = Poseidon::hashv(&[&hash_chain, &hashes_first[i], &hashes_second[i]])?;
}
Ok(hash_chain)
}