bitwarden_crypto/keys/
key_encryptable.rs1use 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}