pub use crate::core_crypto::commons::math::random::Seeder;
#[cfg(all(target_os = "macos", not(feature = "__wasm_api")))]
pub use tfhe_csprng::seeders::AppleSecureEnclaveSeeder;
#[cfg(all(target_arch = "x86_64", not(feature = "__wasm_api")))]
pub use tfhe_csprng::seeders::RdseedSeeder;
#[cfg(all(target_family = "unix", not(feature = "__wasm_api")))]
pub use tfhe_csprng::seeders::UnixSeeder;
#[cfg(feature = "__wasm_api")]
mod wasm_seeder {
use crate::core_crypto::commons::math::random::{Seed, Seeder};
use getrandom::getrandom;
pub(super) struct WasmSeeder {}
impl Seeder for WasmSeeder {
fn seed(&mut self) -> Seed {
let mut buffer = [0u8; 16];
getrandom(&mut buffer).unwrap();
Seed(u128::from_le_bytes(buffer))
}
fn is_available() -> bool
where
Self: Sized,
{
true
}
}
}
pub fn new_seeder() -> Box<dyn Seeder> {
let mut seeder: Option<Box<dyn Seeder>> = None;
let err_msg;
#[cfg(not(feature = "__wasm_api"))]
{
#[cfg(target_arch = "x86_64")]
{
if RdseedSeeder::is_available() {
seeder = Some(Box::new(RdseedSeeder::new()));
}
}
#[cfg(target_os = "macos")]
{
if seeder.is_none() && AppleSecureEnclaveSeeder::is_available() {
seeder = Some(Box::new(AppleSecureEnclaveSeeder));
}
}
#[cfg(target_family = "unix")]
{
if seeder.is_none() && UnixSeeder::is_available() {
seeder = Some(Box::new(UnixSeeder::new(0)));
}
}
err_msg = "No compatible seeder for current machine found.";
}
#[cfg(feature = "__wasm_api")]
{
if seeder.is_none() && wasm_seeder::WasmSeeder::is_available() {
seeder = Some(Box::new(wasm_seeder::WasmSeeder {}));
}
err_msg = "No compatible seeder found. Consider changing browser or dev environment";
}
seeder.expect(err_msg)
}