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
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}