diff --git a/prover/src/witness/operation.rs b/prover/src/witness/operation.rs index f7e3369a..936f5b0b 100644 --- a/prover/src/witness/operation.rs +++ b/prover/src/witness/operation.rs @@ -1123,7 +1123,7 @@ pub(crate) fn generate_keccak< let addr = MemoryAddress::new(0, Segment::Code, map_addr); let (word, mem_op) = mem_read_gp_with_log_and_fill(j, addr, state, &mut cpu_row); let bytes = word.to_be_bytes(); - let final_len = if i + 4 > len { len } else { 4 }; + let final_len = if i + 4 > len { len - i } else { 4 }; keccak_value_byte_be[i..i + final_len].copy_from_slice(&bytes[0..final_len]); keccak_data_addr.push(addr); state.traces.push_memory(mem_op); diff --git a/runtime/precompiles/src/io.rs b/runtime/precompiles/src/io.rs index ae8ec9f7..335b7d4f 100644 --- a/runtime/precompiles/src/io.rs +++ b/runtime/precompiles/src/io.rs @@ -127,7 +127,7 @@ pub fn keccak(data: &[u8]) -> [u8; 32] { // covert to u32 to align the memory for i in (0..len).step_by(4) { if i + 4 <= len { - let u32_value = u32::from_be_bytes([data[0], data[1], data[2], data[3]]); + let u32_value = u32::from_be_bytes([data[i], data[i + 1], data[i + 2], data[i + 3]]); u32_array.push(u32_value); } else { let mut padded_chunk = [0u8; 4];