use super::HpkeKdf;
use alloc::vec::Vec;
pub(crate) const HPKE_VERSION: &[u8] = b"HPKE-v1";
pub(crate) fn labeled_extract(
kdf: HpkeKdf,
salt: &[u8],
suite_id: &[u8],
label: &[u8],
ikm: &[u8],
) -> Vec<u8> {
let mut labeled_ikm =
Vec::with_capacity(HPKE_VERSION.len() + suite_id.len() + label.len() + ikm.len());
labeled_ikm.extend_from_slice(HPKE_VERSION);
labeled_ikm.extend_from_slice(suite_id);
labeled_ikm.extend_from_slice(label);
labeled_ikm.extend_from_slice(ikm);
kdf.extract(salt, &labeled_ikm)
}
pub(crate) fn labeled_expand(
kdf: HpkeKdf,
prk: &[u8],
suite_id: &[u8],
label: &[u8],
info: &[u8],
out: &mut [u8],
) {
let len = out.len();
let mut labeled_info =
Vec::with_capacity(2 + HPKE_VERSION.len() + suite_id.len() + label.len() + info.len());
labeled_info.extend_from_slice(&(len as u16).to_be_bytes());
labeled_info.extend_from_slice(HPKE_VERSION);
labeled_info.extend_from_slice(suite_id);
labeled_info.extend_from_slice(label);
labeled_info.extend_from_slice(info);
kdf.expand(prk, &labeled_info, out);
}