pub mod cache;
pub mod cmk;
pub mod dek;
pub mod error;
mod held_data;
mod builder;
pub use builder::*;
pub use held_data::*;
use crate::dek::generator::DEKGenerator;
use crate::dek::persistence::DEKPersistService;
use crate::dek::scope::WithScope;
use crate::dek::DEK;
use crate::encryption::EncryptionStrategy;
use crate::error::encryption::EncryptionError;
use crate::error::generator::PersistError;
use futures_util::TryFutureExt;
use std::sync::Arc;
pub struct HYOKService<S: EncryptionStrategy> {
pub(crate) persist_service: Arc<DEKPersistService>,
pub(crate) generator: DEKGenerator,
pub(crate) strategy: S,
}
impl<S: EncryptionStrategy<EncryptionData = ED> + Send + Sync, ED: Send> HYOKService<S> {
pub fn new(
persist_service: Arc<DEKPersistService>,
generator: DEKGenerator,
strategy: S
) -> Self {
Self {
persist_service,
generator,
strategy,
}
}
pub async fn release_object<T, C>(&self, obj: &T) -> Result<C, EncryptionError>
where T: ReleaseHeldObject<C, S> + WithScope
{
let scope = obj.get_scope();
let dek = self
.prep_dek(scope)
.map_err(|e|
EncryptionError::new(format!("Could not prep DEK, Error: {:?}", e))
).await?;
let result = obj.release_object(dek.into(), &self.strategy).await;
result
}
pub async fn release_value(
&self,
val: HeldValue,
scope: String,
encryption_data: ED
) -> Result<Vec<u8>, EncryptionError> {
let dek = self
.prep_dek(scope)
.map_err(|e|
EncryptionError::new(format!("Could not prep DEK, Error: {:?}", e))
).await?;
let result = val.release(dek.into(), &self.strategy, encryption_data).await;
result
}
pub async fn hold_value(
&self,
val: Vec<u8>,
scope: String,
encryption_data: ED
) -> Result<HeldValue, EncryptionError> {
let dek = self
.prep_dek(scope)
.map_err(|e|
EncryptionError::new(format!("Could not prep DEK, Error: {:?}", e))
).await?;
Held(val, dek.into(), &self.strategy, encryption_data).await
}
pub async fn prep_dek(&self, scope: String) -> Result<DEK, PersistError> {
let fetch_result = self.persist_service.fetch_dek(scope.clone()).await;
let final_result = match fetch_result {
Ok(dek) => Ok(dek.into()),
_ => {
let dek = self.generator
.new_dek()
.map_err(|e|
PersistError::Error(format!("Could not generate key, Error: {:?}", e))
)?;
self.persist_service.save_dek(scope.clone(), dek.clone()).await?;
Ok(dek.into())
}
};
final_result
}
}