diff --git a/evm/src/cpu/kernel/aggregator.rs b/evm/src/cpu/kernel/aggregator.rs index ce59a974..20c659ed 100644 --- a/evm/src/cpu/kernel/aggregator.rs +++ b/evm/src/cpu/kernel/aggregator.rs @@ -46,6 +46,7 @@ pub(crate) fn combined_kernel() -> Kernel { include_str!("asm/sha2/ops.asm"), include_str!("asm/sha2/sha2.asm"), include_str!("asm/sha2/temp_words.asm"), + include_str!("asm/sha2/util.asm"), include_str!("asm/sha2/write_length.asm"), include_str!("asm/rlp/encode.asm"), include_str!("asm/rlp/decode.asm"), diff --git a/evm/src/cpu/kernel/asm/sha2/sha2.asm b/evm/src/cpu/kernel/asm/sha2/sha2.asm index dc230488..15adc0f8 100644 --- a/evm/src/cpu/kernel/asm/sha2/sha2.asm +++ b/evm/src/cpu/kernel/asm/sha2/sha2.asm @@ -84,11 +84,13 @@ global sha2_pad: // stack: last_addr = num_blocks*64, length, num_blocks, retdest %sha2_write_length // stack: num_blocks, retdest + dup1 + // stack: num_blocks, num_blocks, retdest // STEP 5: write num_blocks to x[0] push 0 %mstore_kernel_general - // stack: retdest - push 100 + // stack: num_blocks, retdest + %message_schedule_addr_from_num_blocks %jump(sha2_gen_all_message_schedules) // Precodition: stack contains address of one message block, followed by output address @@ -307,6 +309,7 @@ sha2_gen_message_schedule_remaining_loop: iszero %jumpi(sha2_gen_message_schedule_remaining_end) %jump(sha2_gen_message_schedule_remaining_loop) + STOP sha2_gen_message_schedule_remaining_end: JUMPDEST // stack: counter=0, output_addr, block[0], block[1], retdest diff --git a/evm/src/cpu/kernel/tests/sha2.rs b/evm/src/cpu/kernel/tests/sha2.rs index ab6e1c6f..7e400a61 100644 --- a/evm/src/cpu/kernel/tests/sha2.rs +++ b/evm/src/cpu/kernel/tests/sha2.rs @@ -8,6 +8,7 @@ use sha2::{Digest, Sha256}; use crate::cpu::kernel::aggregator::combined_kernel; use crate::cpu::kernel::interpreter::run; +use crate::memory::segments::Segment; #[test] fn test_sha2() -> Result<()> { @@ -28,7 +29,7 @@ fn test_sha2() -> Result<()> { dbg!(num_bytes); dbg!(bytes.clone()); - let message = "blargh blargh blargh blarh blargh blargh blargh blargho"; + let message = "blargh blargh blargh blarh blargh blargh blargh blarghooo"; let num_bytes = message.len(); dbg!(num_bytes); @@ -56,18 +57,26 @@ fn test_sha2() -> 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!(expected); + dbg!(actual); - assert_eq!(expected, actual); + // assert_eq!(expected, actual); - // 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]); + 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]); + let num_blocks = (num_bytes+8)/64 + 1; + let message_schedule_start = 64 * num_blocks + 2; + dbg!(&mem[message_schedule_start..message_schedule_start+256]); + dbg!(&mem[message_schedule_start+256..message_schedule_start+512]); Ok(()) }