1use crate::{
2 errors::HasherError,
3 zero_bytes::{sha256::ZERO_BYTES, ZeroBytes},
4 zero_indexed_leaf::sha256::ZERO_INDEXED_LEAF,
5 Hash, Hasher,
6};
7
8#[derive(Clone, Copy)] pub struct Sha256;
10
11impl Hasher for Sha256 {
12 fn hash(val: &[u8]) -> Result<Hash, HasherError> {
13 Self::hashv(&[val])
14 }
15
16 fn hashv(vals: &[&[u8]]) -> Result<Hash, HasherError> {
17 #[cfg(not(target_os = "solana"))]
18 {
19 use sha2::{Digest, Sha256};
20
21 let mut hasher = Sha256::default();
22 for val in vals {
23 hasher.update(val);
24 }
25 Ok(hasher.finalize().into())
26 }
27 #[cfg(target_os = "solana")]
29 {
30 use crate::HASH_BYTES;
31
32 let mut hash_result = [0; HASH_BYTES];
33 unsafe {
34 crate::syscalls::sol_sha256(
35 vals as *const _ as *const u8,
36 vals.len() as u64,
37 &mut hash_result as *mut _ as *mut u8,
38 );
39 }
40 Ok(hash_result)
41 }
42 }
43
44 fn zero_bytes() -> ZeroBytes {
45 ZERO_BYTES
46 }
47
48 fn zero_indexed_leaf() -> [u8; 32] {
49 ZERO_INDEXED_LEAF
50 }
51}