use std::path::PathBuf;
use super::aws_kms::AwsKmsProvider;
use super::file::FileKeyProvider;
use super::provider::KeyProvider;
use super::vault::VaultKeyProvider;
use crate::Result;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum KeyDerivation {
File {
key_path: PathBuf,
},
Vault {
addr: String,
token_path: PathBuf,
key_name: String,
mount: String,
ciphertext_blob_path: PathBuf,
},
AwsKms {
key_id: String,
region: String,
ciphertext_blob_path: PathBuf,
},
}
impl KeyDerivation {
pub async fn into_provider(self) -> Result<Box<dyn KeyProvider + Send + Sync>> {
match self {
KeyDerivation::File { key_path } => Ok(Box::new(FileKeyProvider { key_path })),
KeyDerivation::Vault {
addr,
token_path,
key_name,
mount,
ciphertext_blob_path,
} => Ok(Box::new(VaultKeyProvider::new(
addr,
token_path,
key_name,
mount,
ciphertext_blob_path,
))),
KeyDerivation::AwsKms {
key_id,
region,
ciphertext_blob_path,
} => Ok(Box::new(
AwsKmsProvider::new(key_id, region, ciphertext_blob_path).await?,
)),
}
}
}