pub use rand_chacha::*;
pub use reseeding::ReseedingRng;
use crate::matter::crypto::{CryptoRng, RngCore};
mod reseeding;
pub struct RngAdaptor<T>(T);
impl<T> RngAdaptor<T> {
pub const fn new(rng: T) -> Self {
Self(rng)
}
}
impl<T> rand_core09::RngCore for RngAdaptor<T>
where
T: RngCore,
{
fn next_u32(&mut self) -> u32 {
self.0.next_u32()
}
fn next_u64(&mut self) -> u64 {
self.0.next_u64()
}
fn fill_bytes(&mut self, dest: &mut [u8]) {
self.0.fill_bytes(dest);
}
}
impl<T> rand_core09::CryptoRng for RngAdaptor<T> where T: RngCore + CryptoRng {}
impl<T> RngCore for RngAdaptor<T>
where
T: rand_core09::RngCore,
{
fn next_u32(&mut self) -> u32 {
self.0.next_u32()
}
fn next_u64(&mut self) -> u64 {
self.0.next_u64()
}
fn fill_bytes(&mut self, dest: &mut [u8]) {
self.0.fill_bytes(dest);
}
fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand_core06::Error> {
self.0.fill_bytes(dest);
Ok(())
}
}
impl<T> CryptoRng for RngAdaptor<T> where T: rand_core09::RngCore + rand_core09::CryptoRng {}
pub fn reseeding_csprng<T: rand_core09::TryRngCore>(
trng: T,
reseed_threshold: u64,
) -> Result<RngAdaptor<ReseedingRng<ChaCha12Core, T>>, T::Error> {
Ok(RngAdaptor::new(ReseedingRng::new(reseed_threshold, trng)?))
}