#![cfg(feature = "azure")]
use std::sync::Arc;
use async_trait::async_trait;
use azure_security_keyvault::{
prelude::{CryptographParamtersEncryption, DecryptParameters, EncryptParameters},
KeyvaultClient,
};
use crate::cmk::CMKTrait;
use crate::error::cmk::CMKError;
#[derive(Debug, Clone)]
pub struct AzureCMK {
pub(crate) client: Arc<KeyvaultClient>,
pub(crate) key_name: String,
pub(crate) params: CryptographParamtersEncryption,
}
impl AzureCMK {
pub fn new(
client: Arc<KeyvaultClient>,
key_name: String,
params: CryptographParamtersEncryption
) -> AzureCMK {
AzureCMK {
client,
key_name,
params,
}
}
}
#[async_trait]
impl CMKTrait for AzureCMK {
async fn encrypt(&self, plaintext: Vec<u8>) -> Result<Vec<u8>, CMKError> {
let key_client = self.client.key_client();
let encrypt_params = EncryptParameters {
plaintext: plaintext,
encrypt_parameters_encryption: self.params.clone(),
};
key_client
.encrypt(self.key_name.clone(), encrypt_params).await
.map(|result| result.result)
.map_err(|e| CMKError(format!("Error encrypting using azure keyvault, Error: {:?}", e)))
}
async fn decrypt(&self, ciphertext: Vec<u8>) -> Result<Vec<u8>, CMKError> {
let key_client = self.client.key_client();
let decrypt_params = DecryptParameters {
ciphertext: ciphertext,
decrypt_parameters_encryption: self.params.clone(),
};
key_client
.decrypt(self.key_name.clone(), decrypt_params).await
.map(|result| result.result)
.map_err(|e| CMKError(format!("Error encrypting using azure keyvault, Error: {:?}", e)))
}
}