a great many fixes

This commit is contained in:
Nicholas Ward 2022-08-01 16:29:57 -07:00
parent 05eb70f908
commit e4521c481f
7 changed files with 58 additions and 43 deletions

View File

@ -48,10 +48,11 @@ pub(crate) fn combined_kernel() -> Kernel {
include_str!("asm/secp256k1/moddiv.asm"), include_str!("asm/secp256k1/moddiv.asm"),
include_str!("asm/secp256k1/lift_x.asm"), include_str!("asm/secp256k1/lift_x.asm"),
include_str!("asm/secp256k1/inverse_scalar.asm"), include_str!("asm/secp256k1/inverse_scalar.asm"),
include_str!("asm/sha2.asm"), include_str!("asm/sha2/constants.asm"),
include_str!("asm/sha2_constants.asm"), include_str!("asm/sha2/memory.asm"),
include_str!("asm/sha2_memory.asm"), include_str!("asm/sha2/ops.asm"),
include_str!("asm/sha2_ops.asm"), include_str!("asm/sha2/sha2.asm"),
include_str!("asm/sha2/write_length.asm"),
include_str!("asm/ecrecover.asm"), include_str!("asm/ecrecover.asm"),
include_str!("asm/rlp/encode.asm"), include_str!("asm/rlp/encode.asm"),
include_str!("asm/rlp/decode.asm"), include_str!("asm/rlp/decode.asm"),

View File

@ -94,6 +94,9 @@
%mload_kernel_general_u32 %mload_kernel_general_u32
OR OR
// stack: (c_7 << 224) | (c_6 << 192) | (c_5 << 160) | (c_4 << 128) | (c_3 << 96) | (c_2 << 64) | (c_1 << 32) | c_0, offset // stack: (c_7 << 224) | (c_6 << 192) | (c_5 << 160) | (c_4 << 128) | (c_3 << 96) | (c_2 << 64) | (c_1 << 32) | c_0, offset
swap1
pop
// stack: (c_7 << 224) | (c_6 << 192) | (c_5 << 160) | (c_4 << 128) | (c_3 << 96) | (c_2 << 64) | (c_1 << 32) | c_0
%endmacro %endmacro
// Store a single byte to kernel general memory. // Store a single byte to kernel general memory.

View File

@ -40,36 +40,36 @@ sha2_store_end:
//JUMP //JUMP
%jump(sha2_pad) %jump(sha2_pad)
global test_sha2_read: //global test_sha2_read:
JUMPDEST // JUMPDEST
// stack: retdest // // stack: retdest
push 0 // push 0
// stack: 0, retdest // // stack: 0, retdest
%mload_kernel_general // %mload_kernel_general
// stack: counter=num_bytes, retdest // // stack: counter=num_bytes, retdest
test_sha2_read_loop: //test_sha2_read_loop:
JUMPDEST // JUMPDEST
// stack: counter, retdest, [stack] // // stack: counter, retdest, [stack]
dup1 // dup1
// stack: addr=counter, counter, retdest, [stack] // // stack: addr=counter, counter, retdest, [stack]
%mload_kernel_general // %mload_kernel_general
// stack: value, counter, retdest, [stack] // // stack: value, counter, retdest, [stack]
swap2 // swap2
// stack: retdest, counter, value, [stack] // // stack: retdest, counter, value, [stack]
swap1 // swap1
// stack: counter, retdest, value, [stack] // // stack: counter, retdest, value, [stack]
%decrement // %decrement
// stack: counter-1, retdest, value, [stack] // // stack: counter-1, retdest, value, [stack]
dup1 // dup1
iszero // iszero
%jumpi(test_sha2_read_end) // %jumpi(test_sha2_read_end)
%jump(test_sha2_read_loop) // %jump(test_sha2_read_loop)
test_sha2_read_end: //test_sha2_read_end:
// stack: counter=0, retdest, [stack] // // stack: counter=0, retdest, [stack]
JUMPDEST // JUMPDEST
pop // pop
// stack: retdest, [stack] // // stack: retdest, [stack]
JUMP // JUMP
// Precodition: input is in memory, starting at 0 of kernel general segment, of the form // Precodition: input is in memory, starting at 0 of kernel general segment, of the form
// num_bytes, x[0], x[1], ..., x[num_bytes - 1] // num_bytes, x[0], x[1], ..., x[num_bytes - 1]
@ -120,7 +120,10 @@ global sha2_pad:
push 0 push 0
%mstore_kernel_general %mstore_kernel_general
// stack: retdest // stack: retdest
JUMP //JUMP
push 100
push 1
%jump(sha2_gen_message_schedule_from_block)
// Precodition: stack contains address of one message block, followed by output address // Precodition: stack contains address of one message block, followed by output address
// Postcondition: 256 addresses starting at given output address, contain 32-bit chunks // Postcondition: 256 addresses starting at given output address, contain 32-bit chunks
@ -321,11 +324,16 @@ sha2_gen_message_schedule_remaining_loop:
// stack: counter, output_addr + 4, block[0], block[1], retdest // stack: counter, output_addr + 4, block[0], block[1], retdest
%decrement %decrement
// stack: counter - 1, output_addr + 4, block[0], block[1], retdest // stack: counter - 1, output_addr + 4, block[0], block[1], retdest
dup1
iszero iszero
%jumpi(sha2_gen_message_schedule_remaining_end) %jumpi(sha2_gen_message_schedule_remaining_end)
%jump(sha2_gen_message_schedule_remaining_loop) %jump(sha2_gen_message_schedule_remaining_loop)
sha2_gen_message_schedule_remaining_end: sha2_gen_message_schedule_remaining_end:
JUMPDEST JUMPDEST
// stack: counter=0, output_addr, block[0], block[1], retdest
%pop4
STOP
JUMP
global sha2_gen_all_message_schedules: //global sha2_gen_all_message_schedules:
JUMPDEST // JUMPDEST

View File

@ -1,16 +1,20 @@
%macro sha2_write_length %macro sha2_write_length
// stack: last_addr, length
swap1
// stack: length, last_addr // stack: length, last_addr
push 1 push 1
push 8 push 8
shl shl
// stack: 1 << 8, length, last_addr // stack: 1 << 8, length, last_addr
dup2 dup1
// stack: length, 1 << 8, length, last_addr // stack: 1 << 8, 1 << 8, length, last_addr
mod
// stack: length % (1 << 8), length, last_addr
dup3 dup3
// stack: last_addr, length % (1 << 8), length, last_addr // stack: length, 1 << 8, 1 << 8, length, last_addr
mod
// stack: length % (1 << 8), 1 << 8, length, last_addr
dup3
// stack: last_addr, length % (1 << 8), 1 << 8, length, last_addr
%mstore_kernel_general %mstore_kernel_general
// stack: 1 << 8, length, last_addr // stack: 1 << 8, length, last_addr

View File

@ -40,7 +40,6 @@ fn test_sha2_store() -> Result<()> {
let memory_after_storing = after_storing.memory; let memory_after_storing = after_storing.memory;
dbg!(memory_after_storing); dbg!(memory_after_storing);
// let load_initial_stack = vec![U256::from_str("0xdeadbeef").unwrap()]; // let load_initial_stack = vec![U256::from_str("0xdeadbeef").unwrap()];
// let stack_after_loading = run(&kernel.code, test_sha2_read, load_initial_stack)?.stack; // let stack_after_loading = run(&kernel.code, test_sha2_read, load_initial_stack)?.stack;
// dbg!(stack_after_loading); // dbg!(stack_after_loading);