11use crate :: SHA2Params ;
2- use bouncycastle_core:: errors:: HashError ;
3- use bouncycastle_core:: traits:: { Hash , SecurityStrength } ;
2+ use bouncycastle_core:: errors:: { CoreError , HashError } ;
3+ use bouncycastle_core:: serializable_state:: { add_lib_ver, check_lib_ver} ;
4+ use bouncycastle_core:: traits:: { Hash , SecurityStrength , SerializableState } ;
45use bouncycastle_utils:: min;
56use core:: slice;
67
@@ -45,11 +46,9 @@ fn theta1(x: u32) -> u32 {
4546 x. rotate_right ( 17 ) ^ x. rotate_right ( 19 ) ^ ( x >> 10 )
4647}
4748
48- // todo -- cleanup
49- // #[derive(Clone, Copy)]
5049#[ derive( Clone ) ]
5150pub ( crate ) struct Sha256State < PARAMS : SHA2Params > {
52- _params : std :: marker:: PhantomData < PARAMS > ,
51+ _params : core :: marker:: PhantomData < PARAMS > ,
5352 h : [ u32 ; 8 ] ,
5453}
5554
@@ -63,7 +62,7 @@ impl<PARAMS: SHA2Params> Sha256State<PARAMS> {
6362 pub ( crate ) fn new ( ) -> Self {
6463 match PARAMS :: OUTPUT_LEN * 8 {
6564 224 => Self {
66- _params : std :: marker:: PhantomData ,
65+ _params : core :: marker:: PhantomData ,
6766 h : [
6867 0xC1059ED8 , 0x367CD507 , 0x3070DD17 , 0xF70E5939 , 0xFFC00B31 , 0x68581511 ,
6968 0x64F98FA7 , 0xBEFA4FA4 ,
@@ -145,11 +144,9 @@ impl<PARAMS: SHA2Params> Sha256State<PARAMS> {
145144 }
146145}
147146
148- // todo -- cleanup
149- // #[derive(Clone, Copy)]
150147#[ derive( Clone ) ]
151148pub struct SHA256Internal < PARAMS : SHA2Params > {
152- _params : std :: marker:: PhantomData < PARAMS > ,
149+ _params : core :: marker:: PhantomData < PARAMS > ,
153150 state : Sha256State < PARAMS > ,
154151 byte_count : u64 ,
155152 x_buf : [ u8 ; 64 ] ,
@@ -166,7 +163,7 @@ impl<PARAMS: SHA2Params> Drop for SHA256Internal<PARAMS> {
166163impl < PARAMS : SHA2Params > SHA256Internal < PARAMS > {
167164 pub fn new ( ) -> Self {
168165 Self {
169- _params : std :: marker:: PhantomData ,
166+ _params : core :: marker:: PhantomData ,
170167 state : Sha256State :: < PARAMS > :: new ( ) ,
171168 byte_count : 0 ,
172169 x_buf : [ 0 ; 64 ] ,
@@ -306,3 +303,67 @@ impl<PARAMS: SHA2Params> Hash for SHA256Internal<PARAMS> {
306303 SecurityStrength :: from_bytes ( PARAMS :: OUTPUT_LEN / 2 )
307304 }
308305}
306+
307+ impl < PARAMS : SHA2Params > SerializableState < 108 > for SHA256Internal < PARAMS > {
308+ fn serialize_state ( & self ) -> [ u8 ; 108 ] {
309+ let mut out_to_return = [ 0u8 ; 108 ] ;
310+
311+ // insert the version tag
312+ let out: & mut [ u8 ; 105 ] = add_lib_ver ( & mut out_to_return) . try_into ( ) . unwrap ( ) ;
313+
314+ // state.h: [u32; 8]
315+ // 4 * 8 = 32
316+ for i in 0 ..8 {
317+ out[ i * 4 ..( i * 4 ) + 4 ] . copy_from_slice ( & self . state . h [ i] . to_le_bytes ( ) ) ;
318+ }
319+
320+ // byte_count: u64
321+ out[ 32 ..40 ] . copy_from_slice ( & self . byte_count . to_le_bytes ( ) ) ;
322+
323+ // x_buf: [u8; 64]
324+ out[ 40 ..104 ] . copy_from_slice ( & self . x_buf ) ;
325+
326+ // x_buf_off: usize
327+ // in general, a usize should be serialized into a u64, but in this case, it can't ever be larger than 64
328+ debug_assert ! ( self . x_buf_off < 64 ) ;
329+ out[ 104 ] = self . x_buf_off as u8 ;
330+
331+ out_to_return
332+ }
333+
334+ fn from_serialized_state ( serialized_state : [ u8 ; 108 ] ) -> Result < Self , CoreError > {
335+ // check the version tag
336+ // At the moment, we have no not_before version to specify.
337+ let input: & [ u8 ; 105 ] = check_lib_ver ( & serialized_state, None ) ?. try_into ( ) . unwrap ( ) ;
338+
339+ // state.h: [u32; 8]
340+ // 4 * 8 = 32
341+ let mut h = [ 0u32 ; 8 ] ;
342+ for i in 0 ..8 {
343+ h[ i] = u32:: from_le_bytes ( input[ i * 4 ..( i * 4 ) + 4 ] . try_into ( ) . unwrap ( ) ) ;
344+ }
345+
346+ // byte_count: u64
347+ let byte_count: u64 = u64:: from_le_bytes ( input[ 32 ..40 ] . try_into ( ) . unwrap ( ) ) ;
348+
349+ // x_buf: [u8; 64]
350+ let x_buf: [ u8 ; 64 ] = input[ 40 ..104 ] . try_into ( ) . unwrap ( ) ;
351+
352+ // x_buf_off: usize
353+ // in general, a usize should be serialized into a u64, but in this case, it can't ever be larger than 64
354+ let x_buf_off: usize = input[ 104 ] as usize ;
355+ if x_buf_off >= 64 {
356+ return Err ( CoreError :: InvalidData ) ;
357+ }
358+
359+ // Construct the object
360+ let state = Sha256State { _params : core:: marker:: PhantomData , h } ;
361+ Ok ( SHA256Internal {
362+ _params : core:: marker:: PhantomData ,
363+ state,
364+ byte_count,
365+ x_buf,
366+ x_buf_off,
367+ } )
368+ }
369+ }
0 commit comments