1use crate::{
2 backend::{TeeBackend, WrappedKey},
3 error::Result,
4 recovery::{BackupBundle, RecoveryStrategy},
5};
6use serde::{Deserialize, Serialize};
7
8pub struct VeilContext {
10 backend: Box<dyn TeeBackend>,
11}
12
13#[derive(Debug, Clone)]
14pub enum FallbackPolicy {
15 Deny,
17 Warn,
19 Software,
21}
22
23impl VeilContext {
24 pub fn with_backend(mut backend: Box<dyn TeeBackend>) -> Result<Self> {
27 backend.initialize_primary_key()?;
28 Ok(Self { backend })
29 }
30
31 pub fn protect(&mut self, data: &[u8]) -> Result<ProtectedData> {
34 let key = self.backend.generate_data_key()?;
35 let ciphertext = self.backend.seal(&key, data)?;
36 Ok(ProtectedData {
37 key,
38 ciphertext,
39 version: 1,
40 })
41 }
42
43 pub fn unprotect(&mut self, protected: &ProtectedData) -> Result<Vec<u8>> {
45 self.backend.unseal(&protected.key, &protected.ciphertext)
46 }
47
48 pub fn backup(
52 &self,
53 protected: &ProtectedData,
54 strategy: &dyn RecoveryStrategy,
55 secret: Option<&[u8]>,
56 ) -> Result<BackupBundle> {
57 strategy.backup(&protected.key, secret)
58 }
59
60 pub fn restore(
62 &self,
63 bundle: &BackupBundle,
64 ciphertext: &[u8],
65 strategy: &dyn RecoveryStrategy,
66 secret: &[u8],
67 ) -> Result<ProtectedData> {
68 let key = strategy.restore(bundle, secret)?;
69 Ok(ProtectedData {
70 key,
71 ciphertext: ciphertext.to_vec(),
72 version: 1,
73 })
74 }
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize)]
80pub struct ProtectedData {
81 key: WrappedKey,
82 pub ciphertext: Vec<u8>,
83 version: u8,
84}