use crate::error::Result;
use crate::mechanism::DRBG;
use crate::ossl::common::osslctx;
use crate::pkcs11::CKR_RANDOM_NO_RNG;
use ossl::digest::DigestAlg;
use ossl::rand::EvpRandCtx;
#[derive(Debug)]
pub struct HmacDrbg {
ctx: EvpRandCtx,
}
impl HmacDrbg {
pub fn new(hash: &str) -> Result<HmacDrbg> {
let digest = match hash {
"HMAC DRBG SHA256" => DigestAlg::Sha2_256,
"HMAC DRBG SHA512" => DigestAlg::Sha2_512,
_ => return Err(CKR_RANDOM_NO_RNG)?,
};
Ok(HmacDrbg {
ctx: EvpRandCtx::new_hmac_drbg(osslctx(), digest, hash.as_bytes())?,
})
}
}
impl DRBG for HmacDrbg {
fn reseed(&mut self, entropy: &[u8], addtl: &[u8]) -> Result<()> {
Ok(self.ctx.reseed(entropy, addtl)?)
}
fn generate(&mut self, addtl: &[u8], output: &mut [u8]) -> Result<()> {
Ok(self.ctx.generate(addtl, output)?)
}
}
unsafe impl Send for HmacDrbg {}
unsafe impl Sync for HmacDrbg {}