use aes_gcm::{Key, KeySizeUser};
use async_trait::async_trait;
use zeroize::{Zeroize, ZeroizeOnDrop};
use crate::errors::{KeyDecryptionError, KeyGenerationError};
#[derive(Debug, Clone, Zeroize, ZeroizeOnDrop)]
pub struct DataKey<S: KeySizeUser> {
pub key: Key<S>,
pub encrypted_key: Vec<u8>,
pub key_id: String,
}
#[async_trait]
pub trait KeyProvider: Send + Sync {
type Cipher: KeySizeUser;
async fn generate_data_key(
&self,
bytes_to_encrypt: usize,
aad: Option<&str>,
) -> Result<DataKey<Self::Cipher>, KeyGenerationError>;
async fn decrypt_data_key(
&self,
encrypted_key: &[u8],
aad: Option<&str>,
) -> Result<Key<Self::Cipher>, KeyDecryptionError>;
}
#[async_trait]
impl<S: KeySizeUser> KeyProvider for Box<dyn KeyProvider<Cipher = S>> {
type Cipher = S;
async fn generate_data_key(
&self,
bytes_to_encrypt: usize,
aad: Option<&str>,
) -> Result<DataKey<S>, KeyGenerationError> {
(**self).generate_data_key(bytes_to_encrypt, aad).await
}
async fn decrypt_data_key(
&self,
encrypted_key: &[u8],
aad: Option<&str>,
) -> Result<Key<S>, KeyDecryptionError> {
(**self).decrypt_data_key(encrypted_key, aad).await
}
}