pub trait HostFunctionsProvider {
fn sha2_256(message: &[u8]) -> [u8; 32];
fn sha2_512(message: &[u8]) -> [u8; 64];
fn sha2_512_truncated(message: &[u8]) -> [u8; 32];
fn keccak_256(message: &[u8]) -> [u8; 32];
fn ripemd160(message: &[u8]) -> [u8; 20];
fn blake2b_512(message: &[u8]) -> [u8; 64];
fn blake2s_256(message: &[u8]) -> [u8; 32];
fn blake3(message: &[u8]) -> [u8; 32];
}
#[cfg(any(feature = "host-functions", test))]
pub mod host_functions_impl {
use crate::host_functions::HostFunctionsProvider;
use blake2::{Blake2b512, Blake2s256};
use ripemd::Ripemd160;
use sha2::{Digest, Sha256, Sha512, Sha512_256};
use sha3::Keccak256;
pub struct HostFunctionsManager;
impl HostFunctionsProvider for HostFunctionsManager {
fn sha2_256(message: &[u8]) -> [u8; 32] {
let digest = Sha256::digest(message);
let mut buf = [0u8; 32];
buf.copy_from_slice(&digest);
buf
}
fn sha2_512(message: &[u8]) -> [u8; 64] {
let digest = Sha512::digest(message);
let mut buf = [0u8; 64];
buf.copy_from_slice(&digest);
buf
}
fn sha2_512_truncated(message: &[u8]) -> [u8; 32] {
let digest = Sha512_256::digest(message);
let mut buf = [0u8; 32];
buf.copy_from_slice(&digest);
buf
}
fn keccak_256(message: &[u8]) -> [u8; 32] {
let digest = Keccak256::digest(message);
let mut buf = [0u8; 32];
buf.copy_from_slice(&digest);
buf
}
fn ripemd160(message: &[u8]) -> [u8; 20] {
let digest = Ripemd160::digest(message);
let mut buf = [0u8; 20];
buf.copy_from_slice(&digest);
buf
}
fn blake2b_512(message: &[u8]) -> [u8; 64] {
let digest = Blake2b512::digest(message);
let mut buf = [0u8; 64];
buf.copy_from_slice(&digest);
buf
}
fn blake2s_256(message: &[u8]) -> [u8; 32] {
let digest = Blake2s256::digest(message);
let mut buf = [0u8; 32];
buf.copy_from_slice(&digest);
buf
}
fn blake3(message: &[u8]) -> [u8; 32] {
blake3::hash(message).into()
}
}
}