1 use bitcoin::hashes::{Hash, HashEngine};
2 use bitcoin::hashes::hmac::{Hmac, HmacEngine};
3 use bitcoin::hashes::sha256::Hash as Sha256;
5 macro_rules! hkdf_extract_expand {
6 ($salt: expr, $ikm: expr) => {{
7 let mut hmac = HmacEngine::<Sha256>::new($salt);
9 let prk = Hmac::from_engine(hmac).into_inner();
10 let mut hmac = HmacEngine::<Sha256>::new(&prk[..]);
12 let t1 = Hmac::from_engine(hmac).into_inner();
13 let mut hmac = HmacEngine::<Sha256>::new(&prk[..]);
16 (t1, Hmac::from_engine(hmac).into_inner(), prk)
18 ($salt: expr, $ikm: expr, 2) => {{
19 let (k1, k2, _) = hkdf_extract_expand!($salt, $ikm);
22 ($salt: expr, $ikm: expr, 3) => {{
23 let (k1, k2, prk) = hkdf_extract_expand!($salt, $ikm);
25 let mut hmac = HmacEngine::<Sha256>::new(&prk[..]);
28 (k1, k2, Hmac::from_engine(hmac).into_inner())
32 pub fn hkdf_extract_expand_twice(salt: &[u8], ikm: &[u8]) -> ([u8; 32], [u8; 32]) {
33 hkdf_extract_expand!(salt, ikm, 2)
36 pub fn hkdf_extract_expand_thrice(salt: &[u8], ikm: &[u8]) -> ([u8; 32], [u8; 32], [u8; 32]) {
37 hkdf_extract_expand!(salt, ikm, 3)