use crate::{
backend::{TeeBackend, WrappedKey},
error::Result,
recovery::{BackupBundle, RecoveryStrategy},
};
use serde::{Deserialize, Serialize};
pub struct VeilContext {
backend: Box<dyn TeeBackend>,
}
#[derive(Debug, Clone)]
pub enum FallbackPolicy {
Deny,
Warn,
Software,
}
impl VeilContext {
pub fn with_backend(mut backend: Box<dyn TeeBackend>) -> Result<Self> {
backend.initialize_primary_key()?;
Ok(Self { backend })
}
pub fn protect(&mut self, data: &[u8]) -> Result<ProtectedData> {
let key = self.backend.generate_data_key()?;
let ciphertext = self.backend.seal(&key, data)?;
Ok(ProtectedData {
key,
ciphertext,
version: 1,
})
}
pub fn unprotect(&mut self, protected: &ProtectedData) -> Result<Vec<u8>> {
self.backend.unseal(&protected.key, &protected.ciphertext)
}
pub fn backup(
&self,
protected: &ProtectedData,
strategy: &dyn RecoveryStrategy,
secret: Option<&[u8]>,
) -> Result<BackupBundle> {
strategy.backup(&protected.key, secret)
}
pub fn restore(
&self,
bundle: &BackupBundle,
ciphertext: &[u8],
strategy: &dyn RecoveryStrategy,
secret: &[u8],
) -> Result<ProtectedData> {
let key = strategy.restore(bundle, secret)?;
Ok(ProtectedData {
key,
ciphertext: ciphertext.to_vec(),
version: 1,
})
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProtectedData {
key: WrappedKey,
pub ciphertext: Vec<u8>,
version: u8,
}