use crate::seeders::{Seed, Seeder};
pub struct UnixSeeder {
secret: u128,
}
impl UnixSeeder {
pub fn new(secret: u128) -> UnixSeeder {
UnixSeeder { secret }
}
}
impl Seeder for UnixSeeder {
fn seed(&mut self) -> Seed {
let output = self.secret ^ get_system_entropy();
Seed(output)
}
fn is_available() -> bool {
cfg!(target_family = "unix")
}
}
fn get_system_entropy() -> u128 {
let mut buf = [0u8; 16];
getrandom::getrandom(&mut buf).expect("Failed to read entropy from system");
u128::from_le_bytes(buf)
}
#[cfg(test)]
mod test {
use super::*;
use crate::seeders::generic_tests::check_seeder_fixed_sequences_different;
#[test]
fn check_bounded_sequence_difference() {
check_seeder_fixed_sequences_different(UnixSeeder::new);
}
}