Skip to content

Commit

Permalink
gost94: Implement SerializableState for GOST R 34.11-94 based cores
Browse files Browse the repository at this point in the history
  • Loading branch information
Ruslan Piasetskyi committed Sep 8, 2022
1 parent 9876bfc commit a96197c
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 3 deletions.
51 changes: 50 additions & 1 deletion gost94/src/gost94_core.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@ use digest::{
AlgorithmName, Block as TBlock, BlockSizeUser, Buffer, BufferKindUser, FixedOutputCore,
OutputSizeUser, Reset, UpdateCore,
},
typenum::{Unsigned, U32},
crypto_common::{DeserializeStateError, SerializableState, SerializedState},
generic_array::{
sequence::{Concat, Split},
GenericArray,
},
typenum::{Unsigned, U32, U96},
HashMarker, Output,
};

Expand Down Expand Up @@ -273,3 +278,47 @@ impl<P: Gost94Params> fmt::Debug for Gost94Core<P> {
f.write_str("Core { .. }")
}
}

impl<P: Gost94Params> SerializableState for Gost94Core<P> {
type SerializedStateSize = U96;

fn serialize(&self) -> SerializedState<Self> {
let serialized_h = GenericArray::<_, U32>::from(self.h);

let mut serialized_n = GenericArray::<_, U32>::default();
for (val, chunk) in self.n.iter().zip(serialized_n.chunks_exact_mut(8)) {
chunk.copy_from_slice(&val.to_le_bytes());
}

let mut serialized_sigma = GenericArray::<_, U32>::default();
for (val, chunk) in self.sigma.iter().zip(serialized_sigma.chunks_exact_mut(8)) {
chunk.copy_from_slice(&val.to_le_bytes());
}

serialized_h.concat(serialized_n).concat(serialized_sigma)
}

fn deserialize(
serialized_state: &SerializedState<Self>,
) -> Result<Self, DeserializeStateError> {
let (serialized_h, remaining_buffer) = Split::<_, U32>::split(serialized_state);

let (serialized_n, serialized_sigma) = Split::<_, U32>::split(remaining_buffer);
let mut n = [0; 4];
for (val, chunk) in n.iter_mut().zip(serialized_n.chunks_exact(8)) {
*val = u64::from_le_bytes(chunk.try_into().unwrap());
}

let mut sigma = [0; 4];
for (val, chunk) in sigma.iter_mut().zip(serialized_sigma.chunks_exact(8)) {
*val = u64::from_le_bytes(chunk.try_into().unwrap());
}

Ok(Self {
h: (*serialized_h).into(),
n,
sigma,
_m: core::marker::PhantomData,
})
}
}
69 changes: 67 additions & 2 deletions gost94/tests/mod.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use digest::dev::{feed_rand_16mib, fixed_reset_test};
use digest::new_test;
use gost94::{Digest, Gost94CryptoPro, Gost94Test, Gost94UA};
use digest::{hash_serialization_test, new_test};
use gost94::{Digest, Gost94CryptoPro, Gost94Test, Gost94UA, Gost94s2015};
use hex_literal::hex;

new_test!(gost94_test_main, "test", Gost94Test, fixed_reset_test);
Expand All @@ -11,6 +11,71 @@ new_test!(
fixed_reset_test
);

#[rustfmt::skip]
hash_serialization_test!(
gost94_crypto_pro_serialization,
Gost94CryptoPro,
hex!("
51aeb30f746350e15ef31472e3914b1b
4b9198e0272881ff2401cea8490e5ab2
00010000000000000000000000000000
00000000000000000000000000000000
13131313131313131313131313131313
13131313131313131313131313131313
01130000000000000000000000000000
00000000000000000000000000000000
00
")
);
#[rustfmt::skip]
hash_serialization_test!(
gost94_test_serialization,
Gost94Test,
hex!("
81bba4e852b20165ac12b2151cd38b47
821cfd45ad739fb03018021a77750754
00010000000000000000000000000000
00000000000000000000000000000000
13131313131313131313131313131313
13131313131313131313131313131313
01130000000000000000000000000000
00000000000000000000000000000000
00
")
);
#[rustfmt::skip]
hash_serialization_test!(
gost94_ua_serialization,
Gost94UA,
hex!("
7755aa3d77c2026677adf176fd722741
742a184862f353ec99b1f7928ff0eaa4
00010000000000000000000000000000
00000000000000000000000000000000
13131313131313131313131313131313
13131313131313131313131313131313
01130000000000000000000000000000
00000000000000000000000000000000
00
")
);
#[rustfmt::skip]
hash_serialization_test!(
gost94_s_2015_serialization,
Gost94s2015,
hex!("
d29b34011a22a27037ea42d36a512910
913482fdc2349ab02ca1087a50745d5b
00010000000000000000000000000000
00000000000000000000000000000000
13131313131313131313131313131313
13131313131313131313131313131313
01130000000000000000000000000000
00000000000000000000000000000000
00
")
);

#[test]
fn gost94_test_rand() {
let mut h = Gost94Test::new();
Expand Down

0 comments on commit a96197c

Please sign in to comment.