diff --git a/rand_chacha/Cargo.toml b/rand_chacha/Cargo.toml index 3d941af3..56ecbf7e 100644 --- a/rand_chacha/Cargo.toml +++ b/rand_chacha/Cargo.toml @@ -19,6 +19,10 @@ rand_core = { path = "../rand_core", version = "0.6.0" } ppv-lite86 = { version = "0.2.8", default-features = false, features = ["simd"] } serde = { version = "1.0", features = ["derive"], optional = true } +[dev-dependencies] +# Only to test serde1 +bincode = "1.2.1" + [features] default = ["std"] std = ["ppv-lite86/std"] diff --git a/rand_chacha/src/chacha.rs b/rand_chacha/src/chacha.rs index 76738df2..de766c50 100644 --- a/rand_chacha/src/chacha.rs +++ b/rand_chacha/src/chacha.rs @@ -351,8 +351,38 @@ chacha_impl!(ChaCha8Core, ChaCha8Rng, 4, "ChaCha with 8 rounds", abstract8); mod test { use rand_core::{RngCore, SeedableRng}; + #[cfg(feature = "serde1")] use super::{ChaCha20Rng, ChaCha12Rng, ChaCha8Rng}; + type ChaChaRng = super::ChaCha20Rng; + #[cfg(feature = "serde1")] + #[test] + fn test_chacha_serde_roundtrip() { + let seed = [ + 1, 0, 52, 0, 0, 0, 0, 0, 1, 0, 10, 0, 22, 32, 0, 0, 2, 0, 55, 49, 0, 11, 0, 0, 3, 0, 0, 0, 0, + 0, 2, 92, + ]; + let mut rng1 = ChaCha20Rng::from_seed(seed); + let mut rng2 = ChaCha12Rng::from_seed(seed); + let mut rng3 = ChaCha8Rng::from_seed(seed); + + let encoded1 = bincode::serialize(&rng1).unwrap(); + let encoded2 = bincode::serialize(&rng2).unwrap(); + let encoded3 = bincode::serialize(&rng3).unwrap(); + + let mut decoded1: ChaCha20Rng = bincode::deserialize(&encoded1).unwrap(); + let mut decoded2: ChaCha12Rng = bincode::deserialize(&encoded2).unwrap(); + let mut decoded3: ChaCha8Rng = bincode::deserialize(&encoded3).unwrap(); + + assert_eq!(rng1, decoded1); + assert_eq!(rng2, decoded2); + assert_eq!(rng3, decoded3); + + assert_eq!(rng1.next_u32(), decoded1.next_u32()); + assert_eq!(rng2.next_u32(), decoded2.next_u32()); + assert_eq!(rng3.next_u32(), decoded3.next_u32()); + } + #[test] fn test_chacha_construction() { let seed = [