crypto_common/
hazmat.rs

1use crate::array::{
2    self, Array, ArraySize,
3    typenum::{Diff, Prod, Sum, U1, U2, U4, U8, U16, Unsigned},
4};
5use core::{convert::TryInto, default::Default, fmt};
6
7/// Serialized internal state.
8pub type SerializedState<T> = Array<u8, <T as SerializableState>::SerializedStateSize>;
9
10/// Alias for `AddSerializedStateSize<T, S> = Sum<T, S::SerializedStateSize>`
11pub type AddSerializedStateSize<T, S> = Sum<T, <S as SerializableState>::SerializedStateSize>;
12
13/// Alias for `SubSerializedStateSize<T, S> = Diff<T, S::SerializedStateSize>`
14pub type SubSerializedStateSize<T, S> = Diff<T, <S as SerializableState>::SerializedStateSize>;
15
16/// The error type returned when an object cannot be deserialized from the state.
17#[derive(Copy, Clone, Eq, PartialEq, Debug)]
18pub struct DeserializeStateError;
19
20impl fmt::Display for DeserializeStateError {
21    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
22        f.write_str("Deserialization error")
23    }
24}
25
26impl core::error::Error for DeserializeStateError {}
27
28/// Types which can serialize the internal state and be restored from it.
29///
30/// # Compatibility
31///
32/// Serialized state can be assumed to be stable across backwards compatible
33/// versions of an implementation crate, i.e. any `0.x.y` version of a crate
34/// should be able to decode data serialized with any other `0.x.z` version,
35/// but it may not be able to correctly decode data serialized with a non-`x`
36/// version.
37///
38/// This guarantee is a subject to issues such as security fixes.
39///
40/// # SECURITY WARNING
41///
42/// Serialized state may contain sensitive data.
43pub trait SerializableState
44where
45    Self: Sized,
46{
47    /// Size of serialized internal state.
48    type SerializedStateSize: ArraySize;
49
50    /// Serialize and return internal state.
51    fn serialize(&self) -> SerializedState<Self>;
52    /// Create an object from serialized internal state.
53    fn deserialize(serialized_state: &SerializedState<Self>)
54    -> Result<Self, DeserializeStateError>;
55}
56
57macro_rules! impl_seializable_state_unsigned {
58    ($type: ty, $type_size: ty) => {
59        impl SerializableState for $type {
60            type SerializedStateSize = $type_size;
61
62            fn serialize(&self) -> SerializedState<Self> {
63                self.to_le_bytes().into()
64            }
65
66            fn deserialize(
67                serialized_state: &SerializedState<Self>,
68            ) -> Result<Self, DeserializeStateError> {
69                Ok(<$type>::from_le_bytes((*serialized_state).into()))
70            }
71        }
72    };
73}
74
75impl_seializable_state_unsigned!(u8, U1);
76impl_seializable_state_unsigned!(u16, U2);
77impl_seializable_state_unsigned!(u32, U4);
78impl_seializable_state_unsigned!(u64, U8);
79impl_seializable_state_unsigned!(u128, U16);
80
81macro_rules! impl_serializable_state_u8_array {
82    ($($n: ty),*) => {
83        $(
84            impl SerializableState for [u8; <$n>::USIZE] {
85                type SerializedStateSize = $n;
86
87                fn serialize(&self) -> SerializedState<Self> {
88                    (*self).into()
89                }
90
91                fn deserialize(
92                    serialized_state: &SerializedState<Self>,
93                ) -> Result<Self, DeserializeStateError> {
94                    Ok((*serialized_state).into())
95                }
96            }
97        )*
98    };
99}
100
101macro_rules! impl_serializable_state_type_array {
102    ($type: ty, $type_size: ty, $n: ty) => {
103        impl SerializableState for [$type; <$n>::USIZE] {
104            type SerializedStateSize = Prod<$n, $type_size>;
105
106            fn serialize(&self) -> SerializedState<Self> {
107                let mut serialized_state = SerializedState::<Self>::default();
108                for (val, chunk) in self
109                    .iter()
110                    .zip(serialized_state.chunks_exact_mut(<$type_size>::USIZE))
111                {
112                    chunk.copy_from_slice(&val.to_le_bytes());
113                }
114
115                serialized_state
116            }
117
118            fn deserialize(
119                serialized_state: &SerializedState<Self>,
120            ) -> Result<Self, DeserializeStateError> {
121                let mut array = [0; <$n>::USIZE];
122                for (val, chunk) in array
123                    .iter_mut()
124                    .zip(serialized_state.chunks_exact(<$type_size>::USIZE))
125                {
126                    *val = <$type>::from_le_bytes(chunk.try_into().unwrap());
127                }
128                Ok(array)
129            }
130        }
131    };
132}
133
134macro_rules! impl_serializable_state_u16_array {
135    ($($n: ty),*) => {
136        $(
137            impl_serializable_state_type_array!(u16, U2, $n);
138        )*
139    };
140}
141
142macro_rules! impl_serializable_state_u32_array {
143    ($($n: ty),*) => {
144        $(
145            impl_serializable_state_type_array!(u32, U4, $n);
146        )*
147    };
148}
149
150macro_rules! impl_serializable_state_u64_array {
151    ($($n: ty),*) => {
152        $(
153            impl_serializable_state_type_array!(u64, U8, $n);
154        )*
155    };
156}
157
158macro_rules! impl_serializable_state_u128_array {
159    ($($n: ty),*) => {
160        $(
161            impl_serializable_state_type_array!(u128, U8, $n);
162        )*
163    };
164}
165
166impl_serializable_state_u8_array! {
167    array::typenum::U1,
168    array::typenum::U2,
169    array::typenum::U3,
170    array::typenum::U4,
171    array::typenum::U5,
172    array::typenum::U6,
173    array::typenum::U7,
174    array::typenum::U8,
175    array::typenum::U9,
176    array::typenum::U10,
177    array::typenum::U11,
178    array::typenum::U12,
179    array::typenum::U13,
180    array::typenum::U14,
181    array::typenum::U15,
182    array::typenum::U16,
183    array::typenum::U17,
184    array::typenum::U18,
185    array::typenum::U19,
186    array::typenum::U20,
187    array::typenum::U21,
188    array::typenum::U22,
189    array::typenum::U23,
190    array::typenum::U24,
191    array::typenum::U25,
192    array::typenum::U26,
193    array::typenum::U27,
194    array::typenum::U28,
195    array::typenum::U29,
196    array::typenum::U30,
197    array::typenum::U31,
198    array::typenum::U32,
199    array::typenum::U33,
200    array::typenum::U34,
201    array::typenum::U35,
202    array::typenum::U36,
203    array::typenum::U37,
204    array::typenum::U38,
205    array::typenum::U39,
206    array::typenum::U40,
207    array::typenum::U41,
208    array::typenum::U42,
209    array::typenum::U43,
210    array::typenum::U44,
211    array::typenum::U45,
212    array::typenum::U46,
213    array::typenum::U47,
214    array::typenum::U48,
215    array::typenum::U49,
216    array::typenum::U50,
217    array::typenum::U51,
218    array::typenum::U52,
219    array::typenum::U53,
220    array::typenum::U54,
221    array::typenum::U55,
222    array::typenum::U56,
223    array::typenum::U57,
224    array::typenum::U58,
225    array::typenum::U59,
226    array::typenum::U60,
227    array::typenum::U61,
228    array::typenum::U62,
229    array::typenum::U63,
230    array::typenum::U64,
231    array::typenum::U96,
232    array::typenum::U128,
233    array::typenum::U192,
234    array::typenum::U256,
235    array::typenum::U384,
236    array::typenum::U448,
237    array::typenum::U512,
238    array::typenum::U768,
239    array::typenum::U896,
240    array::typenum::U1024,
241    array::typenum::U2048,
242    array::typenum::U4096,
243    array::typenum::U8192
244}
245
246impl_serializable_state_u16_array! {
247    array::typenum::U1,
248    array::typenum::U2,
249    array::typenum::U3,
250    array::typenum::U4,
251    array::typenum::U5,
252    array::typenum::U6,
253    array::typenum::U7,
254    array::typenum::U8,
255    array::typenum::U9,
256    array::typenum::U10,
257    array::typenum::U11,
258    array::typenum::U12,
259    array::typenum::U13,
260    array::typenum::U14,
261    array::typenum::U15,
262    array::typenum::U16,
263    array::typenum::U17,
264    array::typenum::U18,
265    array::typenum::U19,
266    array::typenum::U20,
267    array::typenum::U21,
268    array::typenum::U22,
269    array::typenum::U23,
270    array::typenum::U24,
271    array::typenum::U25,
272    array::typenum::U26,
273    array::typenum::U27,
274    array::typenum::U28,
275    array::typenum::U29,
276    array::typenum::U30,
277    array::typenum::U31,
278    array::typenum::U32,
279    array::typenum::U48,
280    array::typenum::U96,
281    array::typenum::U128,
282    array::typenum::U192,
283    array::typenum::U256,
284    array::typenum::U384,
285    array::typenum::U448,
286    array::typenum::U512,
287    array::typenum::U2048,
288    array::typenum::U4096
289}
290
291impl_serializable_state_u32_array! {
292    array::typenum::U1,
293    array::typenum::U2,
294    array::typenum::U3,
295    array::typenum::U4,
296    array::typenum::U5,
297    array::typenum::U6,
298    array::typenum::U7,
299    array::typenum::U8,
300    array::typenum::U9,
301    array::typenum::U10,
302    array::typenum::U11,
303    array::typenum::U12,
304    array::typenum::U13,
305    array::typenum::U14,
306    array::typenum::U15,
307    array::typenum::U16,
308    array::typenum::U24,
309    array::typenum::U32,
310    array::typenum::U48,
311    array::typenum::U64,
312    array::typenum::U96,
313    array::typenum::U128,
314    array::typenum::U192,
315    array::typenum::U256,
316    array::typenum::U512,
317    array::typenum::U1024,
318    array::typenum::U2048
319}
320
321impl_serializable_state_u64_array! {
322    array::typenum::U1,
323    array::typenum::U2,
324    array::typenum::U3,
325    array::typenum::U4,
326    array::typenum::U5,
327    array::typenum::U6,
328    array::typenum::U7,
329    array::typenum::U8,
330    array::typenum::U12,
331    array::typenum::U16,
332    array::typenum::U24,
333    array::typenum::U32,
334    array::typenum::U48,
335    array::typenum::U64,
336    array::typenum::U96,
337    array::typenum::U128,
338    array::typenum::U256,
339    array::typenum::U512,
340    array::typenum::U1024
341}
342
343impl_serializable_state_u128_array! {
344    array::typenum::U1,
345    array::typenum::U2,
346    array::typenum::U3,
347    array::typenum::U4,
348    array::typenum::U6,
349    array::typenum::U8,
350    array::typenum::U12,
351    array::typenum::U16,
352    array::typenum::U24,
353    array::typenum::U32,
354    array::typenum::U48,
355    array::typenum::U64,
356    array::typenum::U128,
357    array::typenum::U256,
358    array::typenum::U512
359}