bitwarden_crypto/keys/
utils.rs

1use std::pin::Pin;
2
3use generic_array::GenericArray;
4use typenum::U32;
5
6use super::Aes256CbcHmacKey;
7use crate::{util::hkdf_expand, Result};
8
9/// Stretch the given key using HKDF.
10/// This can be either a kdf-derived key (PIN/Master password) or
11/// a random key from key connector
12pub(super) fn stretch_key(key: &Pin<Box<GenericArray<u8, U32>>>) -> Result<Aes256CbcHmacKey> {
13    Ok(Aes256CbcHmacKey {
14        enc_key: hkdf_expand(key, Some("enc"))?,
15        mac_key: hkdf_expand(key, Some("mac"))?,
16    })
17}
18
19#[cfg(test)]
20mod tests {
21    use super::*;
22
23    #[test]
24    fn test_stretch_kdf_key() {
25        let key = Box::pin(
26            [
27                31, 79, 104, 226, 150, 71, 177, 90, 194, 80, 172, 209, 17, 129, 132, 81, 138, 167,
28                69, 167, 254, 149, 2, 27, 39, 197, 64, 42, 22, 195, 86, 75,
29            ]
30            .into(),
31        );
32        let stretched = stretch_key(&key).unwrap();
33
34        assert_eq!(
35            [
36                111, 31, 178, 45, 238, 152, 37, 114, 143, 215, 124, 83, 135, 173, 195, 23, 142,
37                134, 120, 249, 61, 132, 163, 182, 113, 197, 189, 204, 188, 21, 237, 96
38            ],
39            stretched.enc_key.as_slice()
40        );
41        assert_eq!(
42            [
43                221, 127, 206, 234, 101, 27, 202, 38, 86, 52, 34, 28, 78, 28, 185, 16, 48, 61, 127,
44                166, 209, 247, 194, 87, 232, 26, 48, 85, 193, 249, 179, 155
45            ],
46            stretched.mac_key.as_slice()
47        );
48    }
49}