1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
use std::io::Result;
use std::sync::Arc;
use crate::raw::Env;
use encryption::{self, DataKeyManager};
use engine_traits::{EncryptionKeyManager, EncryptionMethod, FileEncryptionInfo};
use rocksdb::{
DBEncryptionMethod, EncryptionKeyManager as DBEncryptionKeyManager,
FileEncryptionInfo as DBFileEncryptionInfo,
};
pub fn get_env(
key_manager: Option<Arc<DataKeyManager>>,
base_env: Option<Arc<Env>>,
) -> encryption::Result<Arc<Env>> {
let base_env = base_env.unwrap_or_else(|| Arc::new(Env::default()));
if let Some(manager) = key_manager {
Ok(Arc::new(Env::new_key_managed_encrypted_env(
base_env,
WrappedEncryptionKeyManager { manager },
)?))
} else {
Ok(base_env)
}
}
pub struct WrappedEncryptionKeyManager<T: EncryptionKeyManager> {
manager: Arc<T>,
}
impl<T: EncryptionKeyManager> DBEncryptionKeyManager for WrappedEncryptionKeyManager<T> {
fn get_file(&self, fname: &str) -> Result<DBFileEncryptionInfo> {
self.manager
.get_file(fname)
.map(convert_file_encryption_info)
}
fn new_file(&self, fname: &str) -> Result<DBFileEncryptionInfo> {
self.manager
.new_file(fname)
.map(convert_file_encryption_info)
}
fn delete_file(&self, fname: &str) -> Result<()> {
self.manager.delete_file(fname)
}
fn link_file(&self, src_fname: &str, dst_fname: &str) -> Result<()> {
self.manager.link_file(src_fname, dst_fname)
}
}
fn convert_file_encryption_info(input: FileEncryptionInfo) -> DBFileEncryptionInfo {
DBFileEncryptionInfo {
method: convert_encryption_method(input.method),
key: input.key,
iv: input.iv,
}
}
fn convert_encryption_method(input: EncryptionMethod) -> DBEncryptionMethod {
match input {
EncryptionMethod::Plaintext => DBEncryptionMethod::Plaintext,
EncryptionMethod::Aes128Ctr => DBEncryptionMethod::Aes128Ctr,
EncryptionMethod::Aes192Ctr => DBEncryptionMethod::Aes192Ctr,
EncryptionMethod::Aes256Ctr => DBEncryptionMethod::Aes256Ctr,
EncryptionMethod::Unknown => DBEncryptionMethod::Unknown,
}
}