use nix::{ioctl_none, ioctl_read, ioctl_write_ptr};
use zeroize::{Zeroize, ZeroizeOnDrop};
pub const IOC_MAGIC: u8 = b'R';
pub const RNDGETENTCNT: u8 = 0x0;
pub const RNDADDTOENTCNT: u8 = 0x1;
pub const RNDADDENTROPY: u8 = 0x3;
pub const RNDZAPENTCNT: u8 = 0x4;
pub const RNDCLEARPOOL: u8 = 0x6;
pub const RNDRESEEDCRNG: u8 = 0x7;
pub const MAX_BUFFER_SIZE: usize = 2 * 1024;
#[repr(C)]
#[derive(Zeroize, ZeroizeOnDrop)]
pub struct KernelRandPoolInfoHeader {
pub entropy_bits: i32,
pub buf_size_byte: i32,
}
#[repr(C)]
#[derive(Zeroize, ZeroizeOnDrop)]
pub struct KernelRandPoolInfo {
pub header: KernelRandPoolInfoHeader,
pub buf: [u8; MAX_BUFFER_SIZE],
}
ioctl_read!(rnd_get_ent_cnt, IOC_MAGIC, RNDGETENTCNT, i32);
ioctl_write_ptr!(rnd_add_to_ent_cnt, IOC_MAGIC, RNDADDTOENTCNT, i32);
ioctl_write_ptr!(
rnd_add_entropy,
IOC_MAGIC,
RNDADDENTROPY,
KernelRandPoolInfoHeader
);
ioctl_none!(rnd_zap_ent_cnt, IOC_MAGIC, RNDZAPENTCNT);
ioctl_none!(rnd_clear_pool, IOC_MAGIC, RNDCLEARPOOL);
ioctl_none!(rnd_reseed_crng, IOC_MAGIC, RNDRESEEDCRNG);