1use crate::error::ProgramError;
11
12pub type Sha256Hash = [u8; 32];
14
15pub type Keccak256Hash = [u8; 32];
17
18#[inline]
29#[allow(unused_mut)]
30pub fn sha256(inputs: &[&[u8]]) -> Result<Sha256Hash, ProgramError> {
31 let mut result = [0u8; 32];
32
33 #[cfg(target_os = "solana")]
34 {
35 let count = inputs.len().min(16);
38 let mut params: [u64; 32] = [0; 32];
39 let mut i = 0;
40 while i < count {
41 params[i * 2] = inputs[i].as_ptr() as u64;
42 params[i * 2 + 1] = inputs[i].len() as u64;
43 i += 1;
44 }
45
46 let rc = unsafe {
47 crate::syscalls::sol_sha256(
48 params.as_ptr() as *const u8,
49 count as u64,
50 result.as_mut_ptr(),
51 )
52 };
53 if rc != 0 {
54 return Err(ProgramError::InvalidArgument);
55 }
56 }
57 #[cfg(not(target_os = "solana"))]
58 {
59 let _ = inputs;
60 }
63
64 Ok(result)
65}
66
67#[inline]
69pub fn sha256_single(input: &[u8]) -> Result<Sha256Hash, ProgramError> {
70 sha256(&[input])
71}
72
73#[inline]
78#[allow(unused_mut)]
79pub fn keccak256(inputs: &[&[u8]]) -> Result<Keccak256Hash, ProgramError> {
80 let mut result = [0u8; 32];
81
82 #[cfg(target_os = "solana")]
83 {
84 let count = inputs.len().min(16);
85 let mut params: [u64; 32] = [0; 32];
86 let mut i = 0;
87 while i < count {
88 params[i * 2] = inputs[i].as_ptr() as u64;
89 params[i * 2 + 1] = inputs[i].len() as u64;
90 i += 1;
91 }
92
93 let rc = unsafe {
94 crate::syscalls::sol_keccak256(
95 params.as_ptr() as *const u8,
96 count as u64,
97 result.as_mut_ptr(),
98 )
99 };
100 if rc != 0 {
101 return Err(ProgramError::InvalidArgument);
102 }
103 }
104 #[cfg(not(target_os = "solana"))]
105 {
106 let _ = inputs;
107 }
108
109 Ok(result)
110}
111
112#[inline]
114pub fn keccak256_single(input: &[u8]) -> Result<Keccak256Hash, ProgramError> {
115 keccak256(&[input])
116}