bitwarden_crypto/keys/
key_encryptable.rs

1use std::{collections::HashMap, hash::Hash, sync::Arc};
2
3use rayon::prelude::*;
4use uuid::Uuid;
5
6use crate::{error::Result, CryptoError, SymmetricCryptoKey};
7
8#[allow(missing_docs)]
9pub trait KeyContainer: Send + Sync {
10    fn get_key(&self, org_id: &Option<Uuid>) -> Result<&SymmetricCryptoKey, CryptoError>;
11}
12
13impl<T: KeyContainer> KeyContainer for Arc<T> {
14    fn get_key(&self, org_id: &Option<Uuid>) -> Result<&SymmetricCryptoKey, CryptoError> {
15        self.as_ref().get_key(org_id)
16    }
17}
18
19#[allow(missing_docs)]
20pub trait CryptoKey {}
21
22#[allow(missing_docs)]
23pub trait KeyEncryptable<Key: CryptoKey, Output> {
24    fn encrypt_with_key(self, key: &Key) -> Result<Output>;
25}
26
27#[allow(missing_docs)]
28pub trait KeyDecryptable<Key: CryptoKey, Output> {
29    fn decrypt_with_key(&self, key: &Key) -> Result<Output>;
30}
31
32impl<T: KeyEncryptable<Key, Output>, Key: CryptoKey, Output> KeyEncryptable<Key, Option<Output>>
33    for Option<T>
34{
35    fn encrypt_with_key(self, key: &Key) -> Result<Option<Output>> {
36        self.map(|e| e.encrypt_with_key(key)).transpose()
37    }
38}
39
40impl<T: KeyDecryptable<Key, Output>, Key: CryptoKey, Output> KeyDecryptable<Key, Option<Output>>
41    for Option<T>
42{
43    fn decrypt_with_key(&self, key: &Key) -> Result<Option<Output>> {
44        self.as_ref().map(|e| e.decrypt_with_key(key)).transpose()
45    }
46}
47
48impl<T: KeyEncryptable<Key, Output>, Key: CryptoKey, Output> KeyEncryptable<Key, Output>
49    for Box<T>
50{
51    fn encrypt_with_key(self, key: &Key) -> Result<Output> {
52        (*self).encrypt_with_key(key)
53    }
54}
55
56impl<T: KeyDecryptable<Key, Output>, Key: CryptoKey, Output> KeyDecryptable<Key, Output>
57    for Box<T>
58{
59    fn decrypt_with_key(&self, key: &Key) -> Result<Output> {
60        (**self).decrypt_with_key(key)
61    }
62}
63
64impl<
65        T: KeyEncryptable<Key, Output> + Send + Sync,
66        Key: CryptoKey + Send + Sync,
67        Output: Send + Sync,
68    > KeyEncryptable<Key, Vec<Output>> for Vec<T>
69{
70    fn encrypt_with_key(self, key: &Key) -> Result<Vec<Output>> {
71        self.into_par_iter()
72            .map(|e| e.encrypt_with_key(key))
73            .collect()
74    }
75}
76
77impl<
78        T: KeyDecryptable<Key, Output> + Send + Sync,
79        Key: CryptoKey + Send + Sync,
80        Output: Send + Sync,
81    > KeyDecryptable<Key, Vec<Output>> for Vec<T>
82{
83    fn decrypt_with_key(&self, key: &Key) -> Result<Vec<Output>> {
84        self.into_par_iter()
85            .map(|e| e.decrypt_with_key(key))
86            .collect()
87    }
88}
89
90impl<
91        T: KeyEncryptable<Key, Output> + Send + Sync,
92        Key: CryptoKey + Send + Sync,
93        Output: Send + Sync,
94        Id: Hash + Eq + Send + Sync,
95    > KeyEncryptable<Key, HashMap<Id, Output>> for HashMap<Id, T>
96{
97    fn encrypt_with_key(self, key: &Key) -> Result<HashMap<Id, Output>> {
98        self.into_par_iter()
99            .map(|(id, e)| Ok((id, e.encrypt_with_key(key)?)))
100            .collect()
101    }
102}
103
104impl<
105        T: KeyDecryptable<Key, Output> + Send + Sync,
106        Key: CryptoKey + Send + Sync,
107        Output: Send + Sync,
108        Id: Hash + Eq + Copy + Send + Sync,
109    > KeyDecryptable<Key, HashMap<Id, Output>> for HashMap<Id, T>
110{
111    fn decrypt_with_key(&self, key: &Key) -> Result<HashMap<Id, Output>> {
112        self.into_par_iter()
113            .map(|(id, e)| Ok((*id, e.decrypt_with_key(key)?)))
114            .collect()
115    }
116}