f8a3f847d4348e5cbe13033fef25645125cdf6d4
[rust-lightning] / lightning / src / util / crypto.rs
1 use bitcoin::hashes::{Hash, HashEngine};
2 use bitcoin::hashes::hmac::{Hmac, HmacEngine};
3 use bitcoin::hashes::sha256::Hash as Sha256;
4
5 macro_rules! hkdf_extract_expand {
6         ($salt: expr, $ikm: expr) => {{
7                 let mut hmac = HmacEngine::<Sha256>::new($salt);
8                 hmac.input($ikm);
9                 let prk = Hmac::from_engine(hmac).into_inner();
10                 let mut hmac = HmacEngine::<Sha256>::new(&prk[..]);
11                 hmac.input(&[1; 1]);
12                 let t1 = Hmac::from_engine(hmac).into_inner();
13                 let mut hmac = HmacEngine::<Sha256>::new(&prk[..]);
14                 hmac.input(&t1);
15                 hmac.input(&[2; 1]);
16                 (t1, Hmac::from_engine(hmac).into_inner(), prk)
17         }};
18         ($salt: expr, $ikm: expr, 2) => {{
19                 let (k1, k2, _) = hkdf_extract_expand!($salt, $ikm);
20                 (k1, k2)
21         }};
22         ($salt: expr, $ikm: expr, 3) => {{
23                 let (k1, k2, prk) = hkdf_extract_expand!($salt, $ikm);
24
25                 let mut hmac = HmacEngine::<Sha256>::new(&prk[..]);
26                 hmac.input(&k2);
27                 hmac.input(&[3; 1]);
28                 (k1, k2, Hmac::from_engine(hmac).into_inner())
29         }}
30 }
31
32 pub fn hkdf_extract_expand_twice(salt: &[u8], ikm: &[u8]) -> ([u8; 32], [u8; 32]) {
33         hkdf_extract_expand!(salt, ikm, 2)
34 }
35
36 pub fn hkdf_extract_expand_thrice(salt: &[u8], ikm: &[u8]) -> ([u8; 32], [u8; 32], [u8; 32]) {
37         hkdf_extract_expand!(salt, ikm, 3)
38 }