@@ -11,7 +11,7 @@ use digest::{
1111 common:: hazmat:: { DeserializeStateError , SerializableState , SerializedState } ,
1212 typenum:: { IsLessOrEqual , True , U0 , U200 } ,
1313} ;
14- use keccak:: KeccakP1600 ;
14+ use keccak:: { Keccak , State1600 } ;
1515
1616pub use crate :: cshake:: { CShake128Core , CShake256Core } ;
1717
@@ -26,7 +26,8 @@ pub struct Sha3HasherCore<
2626 Rate : BlockSizes + IsLessOrEqual < U200 , Output = True > ,
2727 OutputSize : ArraySize + IsLessOrEqual < U200 , Output = True > ,
2828{
29- state : KeccakP1600 ,
29+ state : State1600 ,
30+ keccak : Keccak ,
3031 _pd : PhantomData < ( Rate , OutputSize ) > ,
3132}
3233
@@ -73,10 +74,12 @@ where
7374{
7475 #[ inline]
7576 fn update_blocks ( & mut self , blocks : & [ Block < Self > ] ) {
76- for block in blocks {
77- xor_block ( self . state . as_mut ( ) , block) ;
78- self . state . p1600 ( ROUNDS ) ;
79- }
77+ self . keccak . with_p1600 :: < ROUNDS > ( |p1600| {
78+ for block in blocks {
79+ xor_block ( & mut self . state , block) ;
80+ p1600 ( & mut self . state ) ;
81+ }
82+ } ) ;
8083 }
8184}
8285
@@ -94,12 +97,14 @@ where
9497 let n = block. len ( ) ;
9598 block[ n - 1 ] |= 0x80 ;
9699
97- xor_block ( self . state . as_mut ( ) , & block) ;
98- self . state . p1600 ( ROUNDS ) ;
100+ self . keccak . with_p1600 :: < ROUNDS > ( |p1600| {
101+ xor_block ( & mut self . state , & block) ;
102+ p1600 ( & mut self . state ) ;
99103
100- for ( o, s) in out. chunks_mut ( 8 ) . zip ( self . state . as_mut ( ) . iter ( ) ) {
101- o. copy_from_slice ( & s. to_le_bytes ( ) [ ..o. len ( ) ] ) ;
102- }
104+ for ( o, s) in out. chunks_mut ( 8 ) . zip ( self . state . as_mut ( ) . iter ( ) ) {
105+ o. copy_from_slice ( & s. to_le_bytes ( ) [ ..o. len ( ) ] ) ;
106+ }
107+ } ) ;
103108 }
104109}
105110
@@ -118,10 +123,12 @@ where
118123 let n = block. len ( ) ;
119124 block[ n - 1 ] |= 0x80 ;
120125
121- xor_block ( self . state . as_mut ( ) , & block) ;
122- self . state . p1600 ( ROUNDS ) ;
126+ self . keccak . with_p1600 :: < ROUNDS > ( |p1600| {
127+ xor_block ( & mut self . state , & block) ;
128+ p1600 ( & mut self . state ) ;
129+ } ) ;
123130
124- Sha3ReaderCore :: new ( self . state . as_ref ( ) )
131+ Sha3ReaderCore :: new ( & self . state , self . keccak )
125132 }
126133}
127134
@@ -135,6 +142,7 @@ where
135142 fn default ( ) -> Self {
136143 Self {
137144 state : Default :: default ( ) ,
145+ keccak : Keccak :: new ( ) ,
138146 _pd : PhantomData ,
139147 }
140148 }
@@ -219,14 +227,15 @@ where
219227 fn deserialize (
220228 serialized_state : & SerializedState < Self > ,
221229 ) -> Result < Self , DeserializeStateError > {
222- let mut state = [ 0 ; PLEN ] ;
230+ let mut state = State1600 :: default ( ) ;
223231 let chunks = serialized_state. chunks_exact ( 8 ) ;
224232 for ( val, chunk) in state. iter_mut ( ) . zip ( chunks) {
225233 * val = u64:: from_le_bytes ( chunk. try_into ( ) . unwrap ( ) ) ;
226234 }
227235
228236 Ok ( Self {
229- state : KeccakP1600 :: from ( state) ,
237+ state,
238+ keccak : Keccak :: new ( ) ,
230239 _pd : PhantomData ,
231240 } )
232241 }
@@ -238,19 +247,18 @@ pub struct Sha3ReaderCore<Rate, const ROUNDS: usize = DEFAULT_ROUND_COUNT>
238247where
239248 Rate : BlockSizes + IsLessOrEqual < U200 , Output = True > ,
240249{
241- state : [ u64 ; PLEN ] ,
250+ state : State1600 ,
251+ keccak : Keccak ,
242252 _pd : PhantomData < Rate > ,
243253}
244254
245255impl < Rate , const ROUNDS : usize > Sha3ReaderCore < Rate , ROUNDS >
246256where
247257 Rate : BlockSizes + IsLessOrEqual < U200 , Output = True > ,
248258{
249- pub ( crate ) fn new ( state : & [ u64 ; PLEN ] ) -> Self {
250- Self {
251- state : * state,
252- _pd : PhantomData ,
253- }
259+ pub ( crate ) fn new ( & state: & [ u64 ; PLEN ] , keccak : Keccak ) -> Self {
260+ let _pd = PhantomData ;
261+ Self { state, keccak, _pd }
254262 }
255263}
256264
@@ -271,7 +279,8 @@ where
271279 for ( src, dst) in self . state . iter ( ) . zip ( block. chunks_mut ( 8 ) ) {
272280 dst. copy_from_slice ( & src. to_le_bytes ( ) [ ..dst. len ( ) ] ) ;
273281 }
274- keccak:: p1600 ( & mut self . state , ROUNDS ) ;
282+ self . keccak
283+ . with_p1600 :: < ROUNDS > ( |p1600| p1600 ( & mut self . state ) ) ;
275284 block
276285 }
277286}
0 commit comments