enigma_storage/
storage.rs1use crate::backends::SledBackend;
2use crate::crypto::{decrypt_value, encrypt_value};
3use crate::error::{EnigmaStorageError, Result};
4use crate::key_provider::{KeyProvider, MasterKey};
5
6pub struct EncryptedStore {
7 backend: SledBackend,
8 key: MasterKey,
9 namespace: String,
10}
11
12impl EncryptedStore {
13 pub fn open(path: &str, namespace: &str, provider: &dyn KeyProvider) -> Result<EncryptedStore> {
14 let backend = SledBackend::open(path)?;
15 let key = provider.get_or_create_master_key()?;
16 Ok(EncryptedStore {
17 backend,
18 key,
19 namespace: namespace.to_owned(),
20 })
21 }
22
23 pub fn put(&self, key: &str, value: &[u8]) -> Result<()> {
24 Self::validate_key(key)?;
25 let ciphertext = encrypt_value(&self.key, &self.namespace, key, value)?;
26 self.backend.insert(key, &ciphertext)
27 }
28
29 pub fn get(&self, key: &str) -> Result<Option<Vec<u8>>> {
30 Self::validate_key(key)?;
31 let stored = self.backend.get(key)?;
32 match stored {
33 Some(data) => {
34 let value = decrypt_value(&self.key, &self.namespace, key, &data)?;
35 Ok(Some(value))
36 }
37 None => Ok(None),
38 }
39 }
40
41 pub fn delete(&self, key: &str) -> Result<bool> {
42 Self::validate_key(key)?;
43 self.backend.remove(key)
44 }
45
46 pub fn flush(&self) -> Result<()> {
47 self.backend.flush()
48 }
49
50 fn validate_key(key: &str) -> Result<()> {
51 if key.is_empty() || key.len() > 256 || key.chars().any(|c| c.is_control()) {
52 return Err(EnigmaStorageError::InvalidKey);
53 }
54 Ok(())
55 }
56}