use crate::error::ProgramError;
pub type Sha256Hash = [u8; 32];
pub type Keccak256Hash = [u8; 32];
#[inline]
#[allow(unused_mut)]
pub fn sha256(inputs: &[&[u8]]) -> Result<Sha256Hash, ProgramError> {
let mut result = [0u8; 32];
#[cfg(target_os = "solana")]
{
let count = inputs.len().min(16);
let mut params: [u64; 32] = [0; 32];
let mut i = 0;
while i < count {
params[i * 2] = inputs[i].as_ptr() as u64;
params[i * 2 + 1] = inputs[i].len() as u64;
i += 1;
}
let rc = unsafe {
crate::syscalls::sol_sha256(
params.as_ptr() as *const u8,
count as u64,
result.as_mut_ptr(),
)
};
if rc != 0 {
return Err(ProgramError::InvalidArgument);
}
}
#[cfg(not(target_os = "solana"))]
{
let _ = inputs;
}
Ok(result)
}
#[inline]
pub fn sha256_single(input: &[u8]) -> Result<Sha256Hash, ProgramError> {
sha256(&[input])
}
#[inline]
#[allow(unused_mut)]
pub fn keccak256(inputs: &[&[u8]]) -> Result<Keccak256Hash, ProgramError> {
let mut result = [0u8; 32];
#[cfg(target_os = "solana")]
{
let count = inputs.len().min(16);
let mut params: [u64; 32] = [0; 32];
let mut i = 0;
while i < count {
params[i * 2] = inputs[i].as_ptr() as u64;
params[i * 2 + 1] = inputs[i].len() as u64;
i += 1;
}
let rc = unsafe {
crate::syscalls::sol_keccak256(
params.as_ptr() as *const u8,
count as u64,
result.as_mut_ptr(),
)
};
if rc != 0 {
return Err(ProgramError::InvalidArgument);
}
}
#[cfg(not(target_os = "solana"))]
{
let _ = inputs;
}
Ok(result)
}
#[inline]
pub fn keccak256_single(input: &[u8]) -> Result<Keccak256Hash, ProgramError> {
keccak256(&[input])
}