openvm_keccak256/
lib.rs

1#![no_std]
2
3#[cfg(target_os = "zkvm")]
4use core::mem::MaybeUninit;
5
6/// The keccak256 cryptographic hash function.
7#[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
27/// Sets `output` to the keccak256 hash of `input`.
28pub 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}