1use crypto_core::{CryptoError, RngFailureKind, RngOutputKind};
6use getrandom::{rand_core::TryRng, SysRng};
7
8pub trait SecureRandom {
10 fn fill_secure(&mut self, output: &mut [u8], kind: RngOutputKind) -> Result<(), CryptoError>;
13}
14
15#[derive(Default)]
17pub struct OsSecureRandom;
18
19impl SecureRandom for OsSecureRandom {
20 fn fill_secure(&mut self, output: &mut [u8], kind: RngOutputKind) -> Result<(), CryptoError> {
21 SysRng.try_fill_bytes(output).map_err(|_| CryptoError::Rng {
22 output: kind,
23 kind: RngFailureKind::EntropyUnavailable,
24 })
25 }
26}