use paysec_crypto::{AesCmacKeyDerivation, AesKeySize};
const AES_128_KDI_KBEK: [u8; 8] = [0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x80];
const AES_128_KDI_KBAK: [u8; 8] = [0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x80];
const AES_192_KDI_KBEK_1: [u8; 8] = [0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xC0];
const AES_192_KDI_KBEK_2: [u8; 8] = [0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xC0];
const AES_192_KDI_KBAK_1: [u8; 8] = [0x01, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0xC0];
const AES_192_KDI_KBAK_2: [u8; 8] = [0x02, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0xC0];
const AES_256_KDI_KBEK_1: [u8; 8] = [0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00];
const AES_256_KDI_KBEK_2: [u8; 8] = [0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00];
const AES_256_KDI_KBAK_1: [u8; 8] = [0x01, 0x00, 0x01, 0x00, 0x00, 0x04, 0x01, 0x00];
const AES_256_KDI_KBAK_2: [u8; 8] = [0x02, 0x00, 0x01, 0x00, 0x00, 0x04, 0x01, 0x00];
pub fn derive_keys_version_d<P, K: ?Sized>(
provider: &P,
kbpk: &K,
key_size: AesKeySize,
) -> Result<(P::DerivedKey, P::DerivedKey), P::Error>
where
P: AesCmacKeyDerivation<K>,
{
match key_size {
AesKeySize::Bits128 => {
let kbek = provider.derive_key_cmac(kbpk, &[&AES_128_KDI_KBEK], 16)?;
let kbak = provider.derive_key_cmac(kbpk, &[&AES_128_KDI_KBAK], 16)?;
Ok((kbek, kbak))
}
AesKeySize::Bits192 => {
let kbek =
provider.derive_key_cmac(kbpk, &[&AES_192_KDI_KBEK_1, &AES_192_KDI_KBEK_2], 24)?;
let kbak =
provider.derive_key_cmac(kbpk, &[&AES_192_KDI_KBAK_1, &AES_192_KDI_KBAK_2], 24)?;
Ok((kbek, kbak))
}
AesKeySize::Bits256 => {
let kbek =
provider.derive_key_cmac(kbpk, &[&AES_256_KDI_KBEK_1, &AES_256_KDI_KBEK_2], 32)?;
let kbak =
provider.derive_key_cmac(kbpk, &[&AES_256_KDI_KBAK_1, &AES_256_KDI_KBAK_2], 32)?;
Ok((kbek, kbak))
}
}
}