pub mod audit;
pub mod cell;
pub(crate) mod crypto;
pub mod edge;
pub mod error;
pub mod keys;
pub mod partition;
pub mod stack;
use keys::MasterKey;
#[must_use = "discarding a master key is likely a bug"]
pub fn generate_master_key() -> Result<MasterKey, error::HexvaultError> {
let bytes = crypto::generate_random_key()?;
Ok(MasterKey::from_bytes(bytes))
}
use audit::AuditLog;
use cell::Cell;
use partition::Partition;
use stack::{Layer, TokenResolver};
use std::sync::Arc;
pub struct Vault {
master_key: MasterKey,
audit_log: AuditLog,
token_resolver: Arc<dyn TokenResolver>,
}
impl Vault {
pub fn new(master_key: MasterKey, token_resolver: Arc<dyn TokenResolver>) -> Self {
Self {
master_key,
audit_log: AuditLog::new(),
token_resolver,
}
}
pub fn get_partition(&self, id: &str) -> Result<Partition, error::HexvaultError> {
let key = keys::derive_partition_key(&self.master_key, id)?;
Ok(Partition::new(
id.to_string(),
key,
Arc::clone(&self.token_resolver),
))
}
#[allow(clippy::too_many_arguments)]
pub fn traverse(
&mut self,
source_partition: &Partition,
source: &Cell,
dest_partition: &Partition,
dest: &mut Cell,
key: &str,
target_layer: Layer,
source_token: &str,
dest_token: &str,
) -> Result<(), error::HexvaultError> {
let source_ctx = self.token_resolver.resolve(source_token)?;
let dest_ctx = self.token_resolver.resolve(dest_token)?;
edge::traverse(
&mut self.audit_log,
edge::TraversalRequest {
source_partition_key: source_partition.key(),
dest_partition_key: dest_partition.key(),
source,
dest,
key,
target_layer,
source_ctx: &source_ctx,
dest_ctx: &dest_ctx,
},
)
}
pub fn audit_log(&self) -> &AuditLog {
&self.audit_log
}
pub fn add_audit_sink(&mut self, sink: Box<dyn audit::AuditSink>) {
self.audit_log.add_forward_sink(sink);
}
pub fn audit_log_len(&self) -> usize {
self.audit_log.len()
}
}