Skip to content

Commit

Permalink
md5: Implement SerializableState for Md5Core
Browse files Browse the repository at this point in the history
  • Loading branch information
Ruslan Piasetskyi committed Sep 4, 2022
1 parent 144e14f commit a878eb2
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 2 deletions.
41 changes: 39 additions & 2 deletions md5/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,19 @@ pub use digest::{self, Digest};

use compress::compress;

use core::{fmt, slice::from_ref};
use core::{convert::TryInto, fmt, slice::from_ref};
use digest::{
block_buffer::Eager,
core_api::{
AlgorithmName, Block, BlockSizeUser, Buffer, BufferKindUser, CoreWrapper, FixedOutputCore,
OutputSizeUser, Reset, UpdateCore,
},
typenum::{Unsigned, U16, U64},
crypto_common::{DeserializeStateError, SerializableState, SerializedState},
generic_array::{
sequence::{Concat, Split},
GenericArray,
},
typenum::{Unsigned, U16, U24, U64, U8},
HashMarker, Output,
};
/// Core MD5 hasher state.
Expand Down Expand Up @@ -124,6 +129,38 @@ impl fmt::Debug for Md5Core {
}
}

impl SerializableState for Md5Core {
type SerializedStateSize = U24;

fn serialize(&self) -> SerializedState<Self> {
let mut serialized_state = GenericArray::<u8, U16>::default();

for (i, bytes) in serialized_state.as_mut_slice().chunks_mut(4).enumerate() {
bytes.copy_from_slice(self.state[i].to_be_bytes().as_slice());
}

let serialized_block_len =
GenericArray::<u8, U8>::clone_from_slice(self.block_len.to_be_bytes().as_slice());

serialized_state.concat(serialized_block_len)
}

fn deserialize(
serialized_state: &SerializedState<Self>,
) -> Result<Self, DeserializeStateError> {
let (serialized_state, serialized_block_len) = Split::<u8, U16>::split(serialized_state);

let mut state = [0; 4];
for (i, bytes) in serialized_state.chunks(4).enumerate() {
state[i] = u32::from_be_bytes(bytes.try_into().unwrap());
}

let block_len = u64::from_be_bytes(serialized_block_len.as_slice().try_into().unwrap());

Ok(Self { state, block_len })
}
}

/// MD5 hasher state.
pub type Md5 = CoreWrapper<Md5Core>;

Expand Down
3 changes: 3 additions & 0 deletions md5/tests/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,6 @@ fn md5_rand() {
hex!("61aec26f1b909578ef638ae02dac0977")[..]
);
}

digest::hash_serialization_test!(md5_serialization, Md5,
hex!("e5ca2295db93d6dd07ab990fcad2219e00000000000000010113000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"));

0 comments on commit a878eb2

Please sign in to comment.