diff --git a/evm/Cargo.toml b/evm/Cargo.toml index 5ee3b1ff..24e5c661 100644 --- a/evm/Cargo.toml +++ b/evm/Cargo.toml @@ -22,6 +22,7 @@ pest = "2.1.3" pest_derive = "2.1.0" rand = "0.8.5" rand_chacha = "0.3.1" +ripemd = "0.1.3" rlp = "0.5.1" serde = { version = "1.0.144", features = ["derive"] } sha2 = "0.10.2" diff --git a/evm/src/cpu/kernel/asm/ripemd/main.asm b/evm/src/cpu/kernel/asm/ripemd/main.asm index 66c409be..f9b28c94 100644 --- a/evm/src/cpu/kernel/asm/ripemd/main.asm +++ b/evm/src/cpu/kernel/asm/ripemd/main.asm @@ -82,7 +82,7 @@ global process: %reverse_bytes_u32 OR // stack: e' d' c' b' a', VARS - %stack (result, VARS: 3) -> (0xdeadbeef, result) + %stack (result, VARS: 3, retdest) -> (retdest, result) // stack: 0xdeadbeef, result JUMP diff --git a/evm/src/cpu/kernel/tests/hash.rs b/evm/src/cpu/kernel/tests/hash.rs index 3acdce2b..67ba64b2 100644 --- a/evm/src/cpu/kernel/tests/hash.rs +++ b/evm/src/cpu/kernel/tests/hash.rs @@ -3,7 +3,8 @@ use std::str::FromStr; use anyhow::Result; use ethereum_types::U256; use rand::{thread_rng, Rng}; -use sha2::{Digest, Sha256}; +use ripemd::{Digest, Ripemd160}; +use sha2::Sha256; use crate::cpu::kernel::aggregator::combined_kernel; use crate::cpu::kernel::interpreter::run_with_kernel; @@ -15,6 +16,13 @@ fn sha2(input: Vec) -> U256 { U256::from(&hasher.finalize()[..]) } +/// Standard RipeMD implementation. +fn ripemd(input: Vec) -> U256 { + let mut hasher = Ripemd160::new(); + hasher.update(input); + U256::from(&hasher.finalize()[..]) +} + fn test_hash(hash_fn_label: &str, standard_implementation: &dyn Fn(Vec) -> U256) -> Result<()> { let kernel = combined_kernel(); let mut rng = thread_rng(); @@ -48,3 +56,8 @@ fn test_hash(hash_fn_label: &str, standard_implementation: &dyn Fn(Vec) -> U fn test_sha2() -> Result<()> { test_hash("sha2", &sha2) } + +#[test] +fn test_ripemd() -> Result<()> { + test_hash("ripemd_stack", &ripemd) +} diff --git a/evm/src/cpu/kernel/tests/ripemd.rs b/evm/src/cpu/kernel/tests/ripemd.rs index de8ebfb0..d0240cf2 100644 --- a/evm/src/cpu/kernel/tests/ripemd.rs +++ b/evm/src/cpu/kernel/tests/ripemd.rs @@ -1,21 +1,24 @@ use anyhow::Result; use ethereum_types::U256; +use itertools::Itertools; use crate::cpu::kernel::aggregator::combined_kernel; use crate::cpu::kernel::interpreter::run_with_kernel; -fn make_input(word: &str) -> Vec { - let mut bytes: Vec = vec![word.len().try_into().unwrap()]; - bytes.append(&mut word.as_bytes().to_vec()); - bytes +fn make_input(word: &str) -> Vec { + let mut input: Vec = vec![word.len().try_into().unwrap()]; + input.append(&mut word.as_bytes().iter().map(|&x| x as u32).collect_vec()); + input.push(u32::from_str_radix("deadbeef", 16).unwrap()); + dbg!(input.clone()); + input } -#[test] -fn test_ripemd() -> Result<()> { +// #[test] +fn test_ripemd_reference() -> Result<()> { let reference = vec![ - ("", "0x9c1185a5c5e9fc54612808977ee8f548b2258d31"), - ("a", "0x0bdc9d2d256b3ee9daae347be6f4dc835a467ffe"), - ("abc", "0x8eb208f7e05d987a9b044a8e98c6b087f15a0bfc"), + // ("", "0x9c1185a5c5e9fc54612808977ee8f548b2258d31"), + // ("a", "0x0bdc9d2d256b3ee9daae347be6f4dc835a467ffe"), + // ("abc", "0x8eb208f7e05d987a9b044a8e98c6b087f15a0bfc"), ( "message digest", "0x5d0689ef49d2fae572b881b123a85ffa21595f36", @@ -39,7 +42,7 @@ fn test_ripemd() -> Result<()> { ]; for (x, y) in reference { - let input: Vec = make_input(x); + let input: Vec = make_input(x); let expected = U256::from(y); let kernel = combined_kernel();