use async_trait::async_trait;
use crate::Result;
use crate::encryption::SensitiveBytes;
pub struct GeneratedKey {
key: SensitiveBytes,
wrapped_key: Vec<u8>,
}
impl GeneratedKey {
pub fn new(key: SensitiveBytes, wrapped_key: Vec<u8>) -> Self {
Self { key, wrapped_key }
}
pub fn key(&self) -> &SensitiveBytes {
&self.key
}
pub fn wrapped_key(&self) -> &[u8] {
&self.wrapped_key
}
}
#[async_trait]
pub trait KeyManagementClient: Send + Sync + std::fmt::Debug {
async fn wrap_key(&self, key: &[u8], wrapping_key_id: &str) -> Result<Vec<u8>>;
async fn unwrap_key(&self, wrapped_key: &[u8], wrapping_key_id: &str)
-> Result<SensitiveBytes>;
fn supports_key_generation(&self) -> bool;
async fn generate_key(&self, wrapping_key_id: &str) -> Result<GeneratedKey>;
}
#[async_trait]
impl<T: AsRef<dyn KeyManagementClient> + Send + Sync + std::fmt::Debug> KeyManagementClient for T {
async fn wrap_key(&self, key: &[u8], wrapping_key_id: &str) -> Result<Vec<u8>> {
self.as_ref().wrap_key(key, wrapping_key_id).await
}
async fn unwrap_key(
&self,
wrapped_key: &[u8],
wrapping_key_id: &str,
) -> Result<SensitiveBytes> {
self.as_ref().unwrap_key(wrapped_key, wrapping_key_id).await
}
fn supports_key_generation(&self) -> bool {
self.as_ref().supports_key_generation()
}
async fn generate_key(&self, wrapping_key_id: &str) -> Result<GeneratedKey> {
self.as_ref().generate_key(wrapping_key_id).await
}
}