From f4207e75a4d24999f22a927d7ef7c09c911cc6f5 Mon Sep 17 00:00:00 2001 From: Nicholas Ward Date: Mon, 19 Sep 2022 10:32:52 -0700 Subject: [PATCH] sha2 testing infrastructure --- evm/Cargo.toml | 5 ++- evm/src/cpu/kernel/asm/sha2/sha2.asm | 25 +++++--------- evm/src/cpu/kernel/assembler.rs | 2 +- evm/src/cpu/kernel/tests/sha2.rs | 51 ++++++++++++---------------- 4 files changed, 35 insertions(+), 48 deletions(-) diff --git a/evm/Cargo.toml b/evm/Cargo.toml index 6db81902..afddaeb6 100644 --- a/evm/Cargo.toml +++ b/evm/Cargo.toml @@ -10,12 +10,15 @@ plonky2_util = { path = "../util" } eth-trie-utils = { git = "https://github.com/mir-protocol/eth-trie-utils.git", rev = "dd3595b4ba7923f8d465450d210f17a2b4e20f96" } maybe_rayon = { path = "../maybe_rayon" } anyhow = "1.0.40" +ascii = "1.0.0" env_logger = "0.9.0" ethereum-types = "0.14.0" hex = { version = "0.4.3", optional = true } hex-literal = "0.3.4" itertools = "0.10.3" +keccak-hash = "0.9.0" log = "0.4.14" +maybe_rayon = { path = "../maybe_rayon" } once_cell = "1.13.0" pest = "2.1.3" pest_derive = "2.1.0" @@ -23,7 +26,7 @@ rand = "0.8.5" rand_chacha = "0.3.1" rlp = "0.5.1" serde = { version = "1.0.144", features = ["derive"] } -keccak-hash = "0.9.0" +sha2 = "0.10.2" tiny-keccak = "2.0.2" [dev-dependencies] diff --git a/evm/src/cpu/kernel/asm/sha2/sha2.asm b/evm/src/cpu/kernel/asm/sha2/sha2.asm index 2b5de553..dc230488 100644 --- a/evm/src/cpu/kernel/asm/sha2/sha2.asm +++ b/evm/src/cpu/kernel/asm/sha2/sha2.asm @@ -607,32 +607,25 @@ sha2_compression_end: // stack: num_blocks, a[0]+a[64], b[0]+b[64], c[0]+c[64], d[0]+d[64], e[0]+e[64], f[0]+f[64], g[0]+g[64], h[0]+h[64], message_schedule_addr, i, retdest pop // stack: a[0]+a[64], b[0]+b[64], c[0]+c[64], d[0]+d[64], e[0]+e[64], f[0]+f[64], g[0]+g[64], h[0]+h[64], message_schedule_addr, i, retdest - swap1 %shl_const(32) or - swap1 - %shl_const(64) + %shl_const(32) or - swap1 - %shl_const(96) + %shl_const(32) or - swap1 - %shl_const(128) + %shl_const(32) or - swap1 - %shl_const(160) + %shl_const(32) or - swap1 - %shl_const(192) + %shl_const(32) or - swap1 - %shl_const(224) + %shl_const(32) or - // stack: concat(h[0]+h[64], g[0]+g[64], f[0]+f[64], e[0]+e[64], d[0]+d[64], c[0]+c[64], b[0]+b[64], a[0]+a[64]), message_schedule_addr, i, retdest + // stack: concat(a[0]+a[64], b[0]+b[64], c[0]+c[64], d[0]+d[64], e[0]+e[64], f[0]+f[64], g[0]+g[64], h[0]+h[64]), message_schedule_addr, i, retdest swap2 - // stack: i, num_blocks, concat(h[0]+h[64], g[0]+g[64], f[0]+f[64], e[0]+e[64], d[0]+d[64], c[0]+c[64], b[0]+b[64], a[0]+a[64]), retdest + // stack: i, num_blocks, concat(a[0]+a[64], b[0]+b[64], c[0]+c[64], d[0]+d[64], e[0]+e[64], f[0]+f[64], g[0]+g[64], h[0]+h[64]), retdest %pop2 - // stack: sha2_result = concat(h[0]+h[64], g[0]+g[64], f[0]+f[64], e[0]+e[64], d[0]+d[64], c[0]+c[64], b[0]+b[64], a[0]+a[64]), retdest + // stack: sha2_result = concat(a[0]+a[64], b[0]+b[64], c[0]+c[64], d[0]+d[64], e[0]+e[64], f[0]+f[64], g[0]+g[64], h[0]+h[64]), retdest STOP global sha2: diff --git a/evm/src/cpu/kernel/assembler.rs b/evm/src/cpu/kernel/assembler.rs index ede60a29..5980e460 100644 --- a/evm/src/cpu/kernel/assembler.rs +++ b/evm/src/cpu/kernel/assembler.rs @@ -579,7 +579,7 @@ mod tests { ); let kernel = parse_and_assemble(&["%stack (a) -> (a)"]); - assert_eq!(kernel.code, vec![]); + assert_eq!(kernel.code, vec![] as Vec); let kernel = parse_and_assemble(&["%stack (a, b, c) -> (c, b, a)"]); assert_eq!(kernel.code, vec![swap2]); diff --git a/evm/src/cpu/kernel/tests/sha2.rs b/evm/src/cpu/kernel/tests/sha2.rs index 4a6472c2..0c65b68c 100644 --- a/evm/src/cpu/kernel/tests/sha2.rs +++ b/evm/src/cpu/kernel/tests/sha2.rs @@ -1,18 +1,19 @@ use std::str::FromStr; use anyhow::Result; +use ascii::AsciiStr; use ethereum_types::U256; use rand::{thread_rng, Rng}; +use sha2::{Sha256, Digest}; use crate::cpu::kernel::aggregator::combined_kernel; use crate::cpu::kernel::interpreter::run; use crate::memory::segments::Segment; #[test] -fn test_sha2_store() -> Result<()> { +fn test_sha2() -> Result<()> { let kernel = combined_kernel(); let sha2 = kernel.global_labels["sha2"]; - // let test_sha2_read = kernel.global_labels["test_sha2_read"]; let mut rng = thread_rng(); let num_bytes = rng.gen_range(1..17); @@ -28,14 +29,21 @@ fn test_sha2_store() -> Result<()> { dbg!(num_bytes); dbg!(bytes.clone()); - let num_bytes = 3; - let bytes: Vec = vec![97.into(), 98.into(), 99.into()]; + let message = "blargh blargh blargh"; + let num_bytes = message.len(); + + let mut hasher = Sha256::new(); + hasher.update(message); + let expected = format!("{:02X}", hasher.finalize()); + + dbg!(expected); + + let bytes: Vec = AsciiStr::from_ascii(message).unwrap().as_bytes().iter().map(|&x| U256::from(x as u32)).collect(); let mut store_initial_stack = vec![U256::from(num_bytes)]; store_initial_stack.extend(bytes); store_initial_stack.push(U256::from_str("0xdeadbeef").unwrap()); store_initial_stack.reverse(); - dbg!(store_initial_stack.clone()); let after_sha2 = run( &kernel.code, @@ -45,35 +53,18 @@ fn test_sha2_store() -> Result<()> { )?; let stack_after_storing = after_sha2.stack(); - dbg!(stack_after_storing.clone()); + let result = stack_after_storing.clone()[1]; + let actual = format!("{:02X}", result); + + dbg!(actual); - let memory_after_storing = after_sha2.memory; - let _mem = memory_after_storing.context_memory[0].segments[Segment::KernelGeneral as usize] - .content - .clone(); + // let memory_after_storing = after_sha2.memory; + // let _mem = memory_after_storing.context_memory[0].segments[Segment::KernelGeneral as usize] + // .content + // .clone(); // dbg!(&mem[0..65]); // dbg!(&mem[100..356]); Ok(()) } - -/*#[test] -fn test_sha2() -> Result<()> { - let kernel = combined_kernel(); - let sha2_store = kernel.global_labels["sha2_store"]; - let sha2_pad = kernel.global_labels["sha2_pad"]; - let mut rng = thread_rng(); - let a = U256([0; 4].map(|_| rng.gen())); - let b = U256([0; 4].map(|_| rng.gen())); - - let initial_stack = vec![U256::from_str("0xdeadbeef")?, b, a]; - let stack_with_kernel = run(&kernel.code, exp, initial_stack)?.stack; - let initial_stack = vec![b, a]; - let code = [0xa, 0x63, 0xde, 0xad, 0xbe, 0xef, 0x56]; // EXP, PUSH4 deadbeef, JUMP - - let expected_stack = todo!(); - assert_eq!(stack_with_kernel, expected_stack); - - Ok(()) -}*/