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