use bitcoin_hashes::sha256::Hash as Sha256;
use bitcoin_hashes::{Hash, HashEngine, Hmac, HmacEngine};
macro_rules! hmac_sha256 {
( $salt:expr, ($( $input:expr ),+ )) => {{
let mut engine = HmacEngine::<Sha256>::new($salt);
$(
engine.input($input);
)+
Hmac::from_engine(engine).into_inner()
}}
}
pub(super) fn derive(salt: &[u8], ikm: &[u8]) -> ([u8; 32], [u8; 32]) {
let prk = hmac_sha256!(salt, (ikm));
let t1 = hmac_sha256!(&prk, (&[1]));
let t2 = hmac_sha256!(&prk, (&t1, &[2]));
(t1, t2)
}
#[cfg(test)]
mod test {
use amplify::hex::FromHex;
use super::derive;
#[test]
fn rfc_5869_test_vector_3() {
let ikm =
Vec::<u8>::from_hex("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b")
.unwrap();
let (t1, t2) = derive(&[], &ikm);
let mut calculated_okm = t1.to_vec();
calculated_okm.extend_from_slice(&t2);
calculated_okm.truncate(42);
assert_eq!(calculated_okm, Vec::<u8>::from_hex("8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8").unwrap());
}
}