1#![no_std]
2
3#[cfg(target_os = "zkvm")]
4use core::mem::MaybeUninit;
5
6#[inline(always)]
8pub fn keccak256(input: &[u8]) -> [u8; 32] {
9 #[cfg(not(target_os = "zkvm"))]
10 {
11 let mut output = [0u8; 32];
12 set_keccak256(input, &mut output);
13 output
14 }
15 #[cfg(target_os = "zkvm")]
16 {
17 let mut output = MaybeUninit::<[u8; 32]>::uninit();
18 openvm_keccak256_guest::native_keccak256(
19 input.as_ptr(),
20 input.len(),
21 output.as_mut_ptr() as *mut u8,
22 );
23 unsafe { output.assume_init() }
24 }
25}
26
27pub fn set_keccak256(input: &[u8], output: &mut [u8; 32]) {
29 #[cfg(not(target_os = "zkvm"))]
30 {
31 use tiny_keccak::Hasher;
32 let mut hasher = tiny_keccak::Keccak::v256();
33 hasher.update(input);
34 hasher.finalize(output);
35 }
36 #[cfg(target_os = "zkvm")]
37 openvm_keccak256_guest::native_keccak256(
38 input.as_ptr(),
39 input.len(),
40 output.as_mut_ptr() as *mut u8,
41 );
42}