use evercrypt_sys::evercrypt_bindings::*;
use crate::hmac::{tag_size, Mode};
pub fn extract(mode: Mode, salt: &[u8], ikm: &[u8]) -> Vec<u8> {
let mut prk = vec![0u8; tag_size(mode)];
unsafe {
EverCrypt_HKDF_extract(
mode as u8,
prk.as_mut_ptr(),
salt.as_ptr() as _,
salt.len() as u32,
ikm.as_ptr() as _,
ikm.len() as u32,
);
}
prk
}
pub fn expand(mode: Mode, prk: &[u8], info: &[u8], okm_len: usize) -> Vec<u8> {
if okm_len > 255 * tag_size(mode) {
return Vec::new();
}
let mut okm = vec![0u8; okm_len];
unsafe {
EverCrypt_HKDF_expand(
mode as u8,
okm.as_mut_ptr(),
prk.as_ptr() as _,
prk.len() as u32,
info.as_ptr() as _,
info.len() as u32,
okm_len as u32,
);
}
okm
}
pub fn hkdf(mode: Mode, salt: &[u8], ikm: &[u8], info: &[u8], okm_len: usize) -> Vec<u8> {
let prk = extract(mode, salt, ikm);
expand(mode, &prk, info, okm_len)
}