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}