addressed comments

This commit is contained in:
Nicholas Ward 2022-12-12 16:38:40 -08:00
parent 29143fe5d3
commit 24d6627a62
9 changed files with 156 additions and 243 deletions

View File

@ -47,7 +47,6 @@ pub(crate) fn combined_kernel() -> Kernel {
include_str!("asm/hash/blake2b/ops.asm"),
include_str!("asm/hash/blake2b/permutations.asm"),
include_str!("asm/hash/blake2b/store.asm"),
include_str!("asm/hash/blake2b/util.asm"),
include_str!("asm/hash/ripemd/box.asm"),
include_str!("asm/hash/ripemd/compression.asm"),
include_str!("asm/hash/ripemd/constants.asm"),

View File

@ -67,7 +67,7 @@ compression_loop:
// stack: cur_message_addr, cur_block_byte, ...
DUP2
// stack: cur_block_byte, cur_message_addr, cur_block_byte, ...
%mload_blake2b_word_from_bytes
%mload_kernel_general_u64_LE
// stack: m_i, cur_message_addr, cur_block_byte, ...
DUP2
// stack: cur_message_addr, m_i, cur_message_addr, cur_block_byte, ...
@ -233,35 +233,40 @@ compression_loop:
%jump(compression_loop)
compression_end:
// stack: h_0', h_1', h_2', h_3', h_4', h_5', h_6', h_7', cur_block + 1, retdest
PUSH 0
// stack: dummy=0, h_0', h_1', h_2', h_3', h_4', h_5', h_6', h_7', cur_block + 1, retdest
// Invert the bytes of each hash value.
%reverse_bytes_u64_blake
// stack: h_0'', h_1', h_2', h_3', h_4', h_5', h_6', h_7', cur_block + 1, retdest
SWAP1
%invert_bytes_blake2b_word
SWAP1
SWAP2
%invert_bytes_blake2b_word
// stack: h_1', h_0'', h_2', h_3', h_4', h_5', h_6', h_7', cur_block + 1, retdest
%reverse_bytes_u64_blake
// stack: h_1'', h_0'', h_2', h_3', h_4', h_5', h_6', h_7', cur_block + 1, retdest
SWAP2
// stack: h_2', h_0'', h_1'', h_3', h_4', h_5', h_6', h_7', cur_block + 1, retdest
%reverse_bytes_u64_blake
// stack: h_2'', h_0'', h_1'', h_3', h_4', h_5', h_6', h_7', cur_block + 1, retdest
SWAP3
%invert_bytes_blake2b_word
SWAP3
SWAP4
%invert_bytes_blake2b_word
// stack: h_3', h_0'', h_1'', h_2'', h_4', h_5', h_6', h_7', cur_block + 1, retdest
%reverse_bytes_u64_blake
// stack: h_3'', h_0'', h_1'', h_2'', h_4', h_5', h_6', h_7', cur_block + 1, retdest
SWAP4
// stack: h_4', h_0'', h_1'', h_2'', h_3'', h_5', h_6', h_7', cur_block + 1, retdest
%reverse_bytes_u64_blake
// stack: h_4'', h_0'', h_1'', h_2'', h_3'', h_5', h_6', h_7', cur_block + 1, retdest
SWAP5
%invert_bytes_blake2b_word
SWAP5
SWAP6
%invert_bytes_blake2b_word
// stack: h_5', h_0'', h_1'', h_2'', h_3'', h_4'', h_6', h_7', cur_block + 1, retdest
%reverse_bytes_u64_blake
// stack: h_5'', h_0'', h_1'', h_2'', h_3'', h_4'', h_6', h_7', cur_block + 1, retdest
SWAP6
// stack: h_6', h_0'', h_1'', h_2'', h_3'', h_4'', h_5'', h_7', cur_block + 1, retdest
%reverse_bytes_u64_blake
// stack: h_6'', h_0'', h_1'', h_2'', h_3'', h_4'', h_5'', h_7', cur_block + 1, retdest
SWAP7
%invert_bytes_blake2b_word
SWAP7
SWAP8
%invert_bytes_blake2b_word
SWAP8
POP
// stack: h_7', h_0'', h_1'', h_2'', h_3'', h_4'', h_5'', h_6'', cur_block + 1, retdest
%reverse_bytes_u64_blake
// stack: h_7'', h_0'', h_1'', h_2'', h_3'', h_4'', h_5'', h_6'', cur_block + 1, retdest
%stack (h_7, h_s: 7) -> (h_s, h_7)
// stack: h_0'', h_1'', h_2'', h_3'', h_4'', h_5'', h_6'', h_7'', cur_block + 1, retdest
// Combine hash values.
%shl_const(64)
@ -270,16 +275,16 @@ compression_end:
OR
%shl_const(64)
OR
// stack: h_0' || h_1' || h_2' || h_3', h_4', h_5', h_6', h_7', cur_block + 1, retdest
// stack: h_0'' || h_1'' || h_2'' || h_3'', h_4'', h_5'', h_6'', h_7'', cur_block + 1, retdest
%stack (first, second: 4, cur) -> (second, first)
// stack: h_4', h_5', h_6', h_7', h_0' || h_1' || h_2' || h_3', retdest
// stack: h_4'', h_5'', h_6'', h_7'', h_0'' || h_1'' || h_2'' || h_3'', retdest
%shl_const(64)
OR
%shl_const(64)
OR
%shl_const(64)
OR
// stack: hash_second = h_4' || h_5' || h_6' || h_7', hash_first = h_0' || h_1' || h_2' || h_3', retdest
// stack: hash_second = h_4'' || h_5'' || h_6'' || h_7'', hash_first = h_0'' || h_1'' || h_2'' || h_3'', retdest
%stack (second, first, ret) -> (ret, second, first)
// stack: retdest, hash_first, hash_second
JUMP

View File

@ -123,4 +123,4 @@
// stack: a, b, c, d, m[s[x_idx]], m[s[y_idx]], start, round, start
%blake2b_g_function
// stack: round, start
%endmacro
%endmacro

View File

@ -1,7 +1,3 @@
%macro as_u64
%and_const(0xffffffffffffffff)
%endmacro
// 64-bit right rotation
%macro rotr_64(rot)
// stack: value

View File

@ -1,182 +1,62 @@
global permutation_0_constants:
BYTES 0
BYTES 1
BYTES 2
BYTES 3
BYTES 4
BYTES 5
BYTES 6
BYTES 7
BYTES 8
BYTES 9
BYTES 10
BYTES 11
BYTES 12
BYTES 13
BYTES 14
BYTES 15
BYTES 0, 1, 2, 3
BYTES 4, 5, 6, 7
BYTES 8, 9, 10, 11
BYTES 12, 13, 14, 15
global permutation_1_constants:
BYTES 14
BYTES 10
BYTES 4
BYTES 8
BYTES 9
BYTES 15
BYTES 13
BYTES 6
BYTES 1
BYTES 12
BYTES 0
BYTES 2
BYTES 11
BYTES 7
BYTES 5
BYTES 3
BYTES 14, 10, 4, 8
BYTES 9, 15, 13, 6
BYTES 1, 12, 0, 2
BYTES 11, 7, 5, 3
global permutation_2_constants:
BYTES 11
BYTES 8
BYTES 12
BYTES 0
BYTES 5
BYTES 2
BYTES 15
BYTES 13
BYTES 10
BYTES 14
BYTES 3
BYTES 6
BYTES 7
BYTES 1
BYTES 9
BYTES 4
BYTES 11, 8, 12, 0
BYTES 5, 2, 15, 13
BYTES 10, 4, 3, 6
BYTES 7, 1, 9, 4
global permutation_3_constants:
BYTES 7
BYTES 9
BYTES 3
BYTES 1
BYTES 13
BYTES 12
BYTES 11
BYTES 14
BYTES 2
BYTES 6
BYTES 5
BYTES 10
BYTES 4
BYTES 0
BYTES 15
BYTES 8
BYTES 7, 9, 3, 1
BYTES 13, 2, 11, 14
BYTES 2, 6, 5, 10
BYTES 4, 0, 15, 8
global permutation_4_constants:
BYTES 9
BYTES 0
BYTES 5
BYTES 7
BYTES 2
BYTES 4
BYTES 10
BYTES 15
BYTES 14
BYTES 1
BYTES 11
BYTES 12
BYTES 6
BYTES 8
BYTES 3
BYTES 13
BYTES 9, 0, 5, 7
BYTES 2, 4, 10, 15
BYTES 14, 1, 11, 12
BYTES 6, 8, 3, 13
global permutation_5_constants:
BYTES 2
BYTES 12
BYTES 6
BYTES 10
BYTES 0
BYTES 11
BYTES 8
BYTES 3
BYTES 4
BYTES 13
BYTES 7
BYTES 5
BYTES 15
BYTES 14
BYTES 1
BYTES 9
BYTES 2, 2, 6, 10
BYTES 0, 1, 8, 3
BYTES 4, 3, 7, 5
BYTES 15, 4, 1, 9
global permutation_6_constants:
BYTES 12
BYTES 5
BYTES 1
BYTES 15
BYTES 14
BYTES 13
BYTES 4
BYTES 10
BYTES 0
BYTES 7
BYTES 6
BYTES 3
BYTES 9
BYTES 2
BYTES 8
BYTES 11
BYTES 12, 5, 1, 15
BYTES 14, 3, 4, 10
BYTES 0, 7, 6, 3
BYTES 9, 2, 8, 11
global permutation_7_constants:
BYTES 13
BYTES 11
BYTES 7
BYTES 14
BYTES 12
BYTES 1
BYTES 3
BYTES 9
BYTES 5
BYTES 0
BYTES 15
BYTES 4
BYTES 8
BYTES 6
BYTES 2
BYTES 10
BYTES 13, 11, 7, 14
BYTES 12, 1, 3, 9
BYTES 5, 0, 15, 4
BYTES 8, 6, 2, 10
global permutation_8_constants:
BYTES 6
BYTES 15
BYTES 14
BYTES 9
BYTES 11
BYTES 3
BYTES 0
BYTES 8
BYTES 12
BYTES 2
BYTES 13
BYTES 7
BYTES 1
BYTES 4
BYTES 10
BYTES 5
BYTES 6, 15, 14, 9
BYTES 11, 3, 0, 8
BYTES 12, 2, 13, 7
BYTES 1, 4, 10, 5
global permutation_9_constants:
BYTES 10
BYTES 2
BYTES 8
BYTES 4
BYTES 7
BYTES 6
BYTES 1
BYTES 5
BYTES 15
BYTES 11
BYTES 9
BYTES 14
BYTES 3
BYTES 12
BYTES 13
BYTES 0
BYTES 10, 2, 8, 4
BYTES 7, 6, 1, 5
BYTES 15, 11, 9, 14
BYTES 3, 12, 13, 0
%macro blake2b_permutation
// stack: round, i

View File

@ -1,47 +0,0 @@
// Load a 64-bit word from kernel general memory.
%macro mload_blake2b_word_from_bytes
// stack: offset
DUP1
%mload_kernel_general_u32_LE
// stack: lo, offset
SWAP1
// stack: offset, lo
%add_const(4)
%mload_kernel_general_u32_LE
// stack: hi, lo
%shl_const(32)
// stack: hi << 32, lo
OR
// stack: (hi << 32) | lo
%endmacro
// Invert the order of the four bytes in a word.
%macro invert_four_byte_word
// stack: word
%mul_const(0x1000000010000000100)
%and_const(0xff0000ff00ff00000000ff0000)
%mod_const(0xffffffffffff)
// stack: word_inverted
%endmacro
// Invert the order of the eight bytes in a Blake word.
%macro invert_bytes_blake2b_word
// stack: word
DUP1
// stack: word, word
%and_const(0xffffffff)
// stack: word_lo, word
SWAP1
// stack: word, word_lo
%shr_const(32)
// stack: word_hi, word_lo
%invert_four_byte_word
// stack: word_hi_inverted, word_lo
SWAP1
// stack: word_lo, word_hi_inverted
%invert_four_byte_word
// stack: word_lo_inverted, word_hi_inverted
%shl_const(32)
OR
// stack: word_inverted
%endmacro

View File

@ -97,7 +97,7 @@
// stack: (((((c_3 << 8) | c_2) << 8) | c_1) << 8) | c_0
%endmacro
// Load from the kernel a little-endian u32, consisting of 4 bytes (c_0, c_1, c_2, c_3)
// Load from the kernel a little-endian u32, consisting of 4 bytes (c_0, c_1, c_2, c_3).
%macro mload_kernel_u32_LE(segment)
// stack: offset
DUP1
@ -123,6 +123,24 @@
// stack: c0 | (c1 << 8) | (c2 << 16) | (c3 << 24)
%endmacro
// Load from the kernel a little-endian u64, consisting of 8 bytes
// (c_0, c_1, c_2, c_3, c_4, c_5, c_6, c_7).
%macro mload_kernel_u64_LE(segment)
// stack: offset
DUP1
%mload_kernel_u32_LE($segment)
// stack: lo, offset
SWAP1
// stack: offset, lo
%add_const(4)
%mload_kernel_u32_LE($segment)
// stack: hi, lo
%shl_const(32)
// stack: hi << 32, lo
OR
// stack: (hi << 32) | lo
%endmacro
// Load a u256 (big-endian) from the kernel.
%macro mload_kernel_u256(segment)
// stack: offset
@ -292,7 +310,7 @@
// stack: value
%endmacro
// Load a little-endian u32, consisting of 4 bytes (c_3, c_2, c_1, c_0),
// Load a little-endian u32, consisting of 4 bytes (c_0, c_1, c_2, c_3),
// from kernel general memory.
%macro mload_kernel_general_u32_LE
// stack: offset
@ -300,6 +318,14 @@
// stack: value
%endmacro
// Load a little-endian u64, consisting of 8 bytes
// (c_0, c_1, c_2, c_3, c_4, c_5, c_6, c_7), from kernel general memory.
%macro mload_kernel_general_u64_LE
// stack: offset
%mload_kernel_u64_LE(@SEGMENT_KERNEL_GENERAL)
// stack: value
%endmacro
// Load a u256 (big-endian) from kernel code.
%macro mload_kernel_code_u256
// stack: offset

View File

@ -240,6 +240,10 @@
%and_const(0xffffffff)
%endmacro
%macro as_u64
%and_const(0xffffffffffffffff)
%endmacro
%macro not_u32
// stack: x
PUSH 0xffffffff
@ -310,3 +314,56 @@
OR
// stack: dcba
%endmacro
%macro reverse_bytes_u64
// stack: word
DUP1
// stack: word, word
%and_const(0xffffffff)
// stack: word_lo, word
SWAP1
// stack: word, word_lo
%shr_const(32)
// stack: word_hi, word_lo
%reverse_bytes_u32
// stack: word_hi_inverted, word_lo
SWAP1
// stack: word_lo, word_hi_inverted
%reverse_bytes_u32
// stack: word_lo_inverted, word_hi_inverted
%shl_const(32)
OR
// stack: word_inverted
%endmacro
// Invert the order of the four bytes in a word.
%macro invert_four_byte_word
// stack: word
%mul_const(0x1000000010000000100)
%and_const(0xff0000ff00ff00000000ff0000)
%mod_const(0xffffffffffff)
// stack: word_inverted
%endmacro
// Invert the order of the eight bytes in a Blake word.
%macro reverse_bytes_u64_blake
// stack: word
DUP1
// stack: word, word
%and_const(0xffffffff)
// stack: word_lo, word
SWAP1
// stack: word, word_lo
%shr_const(32)
// stack: word_hi, word_lo
%invert_four_byte_word
// stack: word_hi_inverted, word_lo
SWAP1
// stack: word_lo, word_hi_inverted
%invert_four_byte_word
// stack: word_lo_inverted, word_hi_inverted
%shl_const(32)
OR
// stack: word_inverted
%endmacro

View File

@ -58,10 +58,7 @@ fn make_input_stack(message: Vec<u8>) -> Vec<U256> {
fn combine_u256s(hi: U256, lo: U256) -> U512 {
let mut result = U512::from(hi);
result *= U512::from_big_endian(&[
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0,
]);
result <<= 256;
result += U512::from(lo);
result
}