use super::kupyna_kmac::{Kupyna256Kmac, Kupyna384Kmac, Kupyna512Kmac};
macro_rules! kdf_variant {
($name:ident, $kmac:ty, $key_len:literal) => {
pub struct $name;
impl $name {
#[doc = concat!("[`", stringify!($kmac), "::mac`].")]
#[must_use]
pub fn derive_subkey(
master_key: &[u8; $key_len],
subkey_id: u64,
context: &[u8; 8],
) -> [u8; $key_len] {
let mut message = [0u8; 16];
message[..8].copy_from_slice(context);
message[8..].copy_from_slice(&subkey_id.to_le_bytes());
<$kmac>::mac(master_key, &message)
.expect("master_key's length always matches this KMAC variant's mac_len")
}
}
};
}
kdf_variant!(Kupyna256Kdf, Kupyna256Kmac, 32);
kdf_variant!(Kupyna384Kdf, Kupyna384Kmac, 48);
kdf_variant!(Kupyna512Kdf, Kupyna512Kmac, 64);