bitwarden_crypto/keys/
pin_key.rs1use super::{
2 kdf::{Kdf, KdfDerivedKeyMaterial},
3 master_key::{decrypt_user_key, encrypt_user_key},
4 utils::stretch_key,
5};
6use crate::{
7 keys::key_encryptable::CryptoKey, EncString, KeyEncryptable, Result, SymmetricCryptoKey,
8};
9
10pub struct PinKey(KdfDerivedKeyMaterial);
14
15impl PinKey {
16 pub fn derive(password: &[u8], email: &[u8], kdf: &Kdf) -> Result<Self> {
18 KdfDerivedKeyMaterial::derive_kdf_key(password, email, kdf).map(Self)
19 }
20
21 pub fn encrypt_user_key(&self, user_key: &SymmetricCryptoKey) -> Result<EncString> {
23 encrypt_user_key(&self.0 .0, user_key)
24 }
25
26 pub fn decrypt_user_key(&self, user_key: EncString) -> Result<SymmetricCryptoKey> {
28 decrypt_user_key(&self.0 .0, user_key)
29 }
30}
31
32impl CryptoKey for PinKey {}
33
34impl KeyEncryptable<PinKey, EncString> for &[u8] {
35 fn encrypt_with_key(self, key: &PinKey) -> Result<EncString> {
36 let stretched_key = SymmetricCryptoKey::Aes256CbcHmacKey(stretch_key(&key.0 .0)?);
37 self.encrypt_with_key(&stretched_key)
38 }
39}
40
41impl KeyEncryptable<PinKey, EncString> for String {
42 fn encrypt_with_key(self, key: &PinKey) -> Result<EncString> {
43 self.as_bytes().encrypt_with_key(key)
44 }
45}