torrust_tracker/shared/crypto/
keys.rs1pub mod seeds {
3 use self::detail::CURRENT_SEED;
11 use crate::shared::crypto::ephemeral_instance_keys::{Seed, RANDOM_SEED};
12
13 pub trait Keeper {
15 type Seed: Sized + Default + AsMut<[u8]>;
16
17 fn get_seed() -> &'static Self::Seed;
19 }
20
21 pub struct Instance;
24
25 pub struct Current;
29
30 impl Keeper for Instance {
31 type Seed = Seed;
32
33 fn get_seed() -> &'static Self::Seed {
34 &RANDOM_SEED
35 }
36 }
37
38 impl Keeper for Current {
39 type Seed = Seed;
40
41 #[allow(clippy::needless_borrow)]
42 fn get_seed() -> &'static Self::Seed {
43 &CURRENT_SEED
44 }
45 }
46
47 #[cfg(test)]
48 mod tests {
49 use super::detail::ZEROED_TEST_SEED;
50 use super::{Current, Instance, Keeper};
51 use crate::shared::crypto::ephemeral_instance_keys::Seed;
52
53 pub struct ZeroedTestSeed;
54
55 impl Keeper for ZeroedTestSeed {
56 type Seed = Seed;
57
58 #[allow(clippy::needless_borrow)]
59 fn get_seed() -> &'static Self::Seed {
60 &ZEROED_TEST_SEED
61 }
62 }
63
64 #[test]
65 fn the_default_seed_and_the_zeroed_seed_should_be_the_same_when_testing() {
66 assert_eq!(Current::get_seed(), ZeroedTestSeed::get_seed());
67 }
68
69 #[test]
70 fn the_default_seed_and_the_instance_seed_should_be_different_when_testing() {
71 assert_ne!(Current::get_seed(), Instance::get_seed());
72 }
73 }
74
75 mod detail {
76 use crate::shared::crypto::ephemeral_instance_keys::Seed;
77
78 #[allow(dead_code)]
79 pub const ZEROED_TEST_SEED: &Seed = &[0u8; 32];
80
81 #[cfg(test)]
82 pub use ZEROED_TEST_SEED as CURRENT_SEED;
83
84 #[cfg(not(test))]
85 pub use crate::shared::crypto::ephemeral_instance_keys::RANDOM_SEED as CURRENT_SEED;
86
87 #[cfg(test)]
88 mod tests {
89 use crate::shared::crypto::ephemeral_instance_keys::RANDOM_SEED;
90 use crate::shared::crypto::keys::seeds::detail::ZEROED_TEST_SEED;
91 use crate::shared::crypto::keys::seeds::CURRENT_SEED;
92
93 #[test]
94 fn it_should_have_a_zero_test_seed() {
95 assert_eq!(*ZEROED_TEST_SEED, [0u8; 32]);
96 }
97
98 #[test]
99 fn it_should_default_to_zeroed_seed_when_testing() {
100 assert_eq!(*CURRENT_SEED, *ZEROED_TEST_SEED);
101 }
102
103 #[test]
104 fn it_should_have_a_large_random_seed() {
105 assert!(u128::from_ne_bytes((*RANDOM_SEED)[..16].try_into().unwrap()) > u128::from(u64::MAX));
106 assert!(u128::from_ne_bytes((*RANDOM_SEED)[16..].try_into().unwrap()) > u128::from(u64::MAX));
107 }
108 }
109 }
110}