bash_hash/
serialize.rs

1use crate::{BashHash, OutputSize};
2use core::ops::Add;
3use digest::{
4    array::ArraySize,
5    block_buffer::BlockBuffer,
6    crypto_common::hazmat::{DeserializeStateError, SerializableState, SerializedState},
7    typenum::{Sum, U0, U192},
8};
9
10impl<OS: OutputSize> SerializableState for BashHash<OS>
11where
12    U192: Add<OS::BlockSize>,
13    OS::BlockSize: Add<U0>,
14    Sum<U192, OS::BlockSize>: ArraySize,
15    Sum<OS::BlockSize, U0>: ArraySize,
16{
17    type SerializedStateSize = Sum<U192, OS::BlockSize>;
18
19    #[inline]
20    fn serialize(&self) -> SerializedState<Self> {
21        let mut res = SerializedState::<Self>::default();
22        let (core_dst, buf_dst) = res.split_at_mut(192);
23        core_dst.copy_from_slice(&self.core.serialize());
24        buf_dst.copy_from_slice(&self.buffer.serialize());
25        res
26    }
27
28    #[inline]
29    fn deserialize(
30        serialized_state: &SerializedState<Self>,
31    ) -> Result<Self, DeserializeStateError> {
32        let (serialized_core, serialized_buf) = serialized_state.split_at(192);
33
34        let core = SerializableState::deserialize(serialized_core.try_into().unwrap())?;
35        let buffer = BlockBuffer::deserialize(serialized_buf.try_into().unwrap())
36            .map_err(|_| DeserializeStateError)?;
37
38        Ok(Self { core, buffer })
39    }
40}