@@ -41,27 +41,7 @@ pub fn keccak256<let N: u32>(input: [u8; N], message_size: u32) -> [u8; 32] {
4141 let state = apply_keccak_permutations (block_array , real_max_blocks );
4242
4343 //3. sponge_squeeze
44- let mut result = [0 ; 32 ];
45- unroll_loop !(
46- 0 u32 ,
47- 4 u32 ,
48- |i : u32 | {
49- quote {
50- let lane = state [$i ] as Field ;
51- let lane_le : [u8 ; 8 ] = lane .to_le_bytes ();
52- result [8 * $i ] = lane_le [0 ];
53- result [8 * $i + 1 ] = lane_le [1 ];
54- result [8 * $i + 2 ] = lane_le [2 ];
55- result [8 * $i + 3 ] = lane_le [3 ];
56- result [8 * $i + 4 ] = lane_le [4 ];
57- result [8 * $i + 5 ] = lane_le [5 ];
58- result [8 * $i + 6 ] = lane_le [6 ];
59- result [8 * $i + 7 ] = lane_le [7 ];
60- }
61- },
62- );
63-
64- result
44+ read_hash_from_state (state )
6545}
6646
6747fn convert_to_u64_array <let N : u32 >(input : [u8 ; N ]) -> [u64 ; N / WORD_SIZE ] {
@@ -132,7 +112,8 @@ fn apply_keccak_permutations<let N: u32>(
132112 for i in 1 ..max_blocks {
133113 let mut previous_state = intermediate_states [i - 1 ];
134114 for j in 0 ..LIMBS_PER_BLOCK {
135- previous_state [j ] = previous_state [j ] ^ flattened_blocks_array [i * LIMBS_PER_BLOCK + j ];
115+ previous_state [j ] =
116+ previous_state [j ] ^ flattened_blocks_array [i * LIMBS_PER_BLOCK + j ];
136117 }
137118 intermediate_states [i ] = keccakf1600 (previous_state );
138119 }
@@ -162,8 +143,32 @@ pub(crate) fn apply_keccak_padding<let BLOCK_BYTES: u32>(
162143 }
163144}
164145
146+ fn read_hash_from_state (state : [u64 ; NUM_KECCAK_LANES ]) -> [u8 ; 32 ] {
147+ let mut result = [0 ; 32 ];
148+ unroll_loop !(
149+ 0 u32 ,
150+ 4 u32 ,
151+ |i : u32 | {
152+ quote {
153+ let lane = state [$i ] as Field ;
154+ let lane_le : [u8 ; 8 ] = lane .to_le_bytes ();
155+ result [8 * $i ] = lane_le [0 ];
156+ result [8 * $i + 1 ] = lane_le [1 ];
157+ result [8 * $i + 2 ] = lane_le [2 ];
158+ result [8 * $i + 3 ] = lane_le [3 ];
159+ result [8 * $i + 4 ] = lane_le [4 ];
160+ result [8 * $i + 5 ] = lane_le [5 ];
161+ result [8 * $i + 6 ] = lane_le [6 ];
162+ result [8 * $i + 7 ] = lane_le [7 ];
163+ }
164+ },
165+ );
166+
167+ result
168+ }
169+
165170comptime fn unroll_loop (start : u32 , end : u32 , body : fn (u32 ) -> Quoted ) -> Quoted {
166- let mut iterations : [Quoted ] = @ [];
171+ let mut iterations : [Quoted ] = & [];
167172 for i in start ..end {
168173 iterations = iterations .push_back (body (i ));
169174 }
0 commit comments