shared_types/transcript/
utils.rs1use itertools::Itertools;
2use sha2::{Digest, Sha256};
3
4use crate::Field;
5
6pub const NUM_SHA_256_ITERATIONS: usize = 1000;
12
13pub(crate) fn sha256_hash_chain_on_field_elems<F: Field>(elems: &[F]) -> Vec<F> {
16 let elems_bytes = elems
18 .iter()
19 .flat_map(|elem| elem.to_bytes_le())
20 .collect_vec();
21
22 let mut hasher = Sha256::new();
24 hasher.update(elems_bytes);
25 let sha_256_result = hasher.finalize();
26
27 let final_iterated_bytes = (0..NUM_SHA_256_ITERATIONS).fold(sha_256_result, |acc, _| {
29 let mut hasher = Sha256::new();
30 hasher.update(acc);
31 hasher.finalize()
32 });
33
34 let mut hash_bytes_first_half = [0; 32];
39 let mut hash_bytes_second_half = [0; 32];
40
41 hash_bytes_first_half[..16].copy_from_slice(&final_iterated_bytes.to_vec()[..16]);
42 hash_bytes_second_half[..16].copy_from_slice(&final_iterated_bytes.to_vec()[16..]);
43
44 vec![
45 F::from_bytes_le(hash_bytes_first_half.as_ref()),
46 F::from_bytes_le(hash_bytes_second_half.as_ref()),
47 ]
48}