use crate::algorithms::{AsymmetricAlgorithm, SymmetricAlgorithm};
pub use crate::PasswordCriteria;
use crate::standards::CryptoStandard;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::fs;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum ConfigError {
#[error("Failed to read config file: {0}")]
Io(#[from] io::Error),
#[error("Failed to parse TOML config: {0}")]
Toml(#[from] toml::de::Error),
}
use std::io;
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Hash)]
pub enum DataType {
Generic,
Pii,
Biometric,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct KeyManagementConfig {
pub key_directory: String,
pub key_version: String,
#[serde(default)]
pub passphrase: Option<String>,
}
pub type DataTypeConfig = HashMap<DataType, KeyManagementConfig>;
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct SecretsConfig {
pub provider: String,
#[cfg(feature = "vault")]
#[serde(default)]
pub vault: Option<VaultConfig>,
#[serde(default)]
pub aws: Option<AwsConfig>,
#[serde(default)]
pub azure: Option<AzureConfig>,
#[cfg(feature = "gcp")]
#[serde(default)]
pub google: Option<GoogleConfig>,
#[cfg(feature = "hsm")]
#[serde(default)]
pub hsm: Option<HsmConfig>,
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct AuditConfig {
pub log_path: String,
#[serde(default)]
pub signing_key_path: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct GoogleConfig {
pub project_id: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct AzureConfig {
pub vault_uri: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct AwsConfig {
pub region: String,
}
#[cfg(feature = "hsm")]
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct HsmConfig {
pub module_path: String,
pub token_label: String,
pub pin: String,
}
#[cfg(feature = "vault")]
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct VaultConfig {
pub address: String,
pub token: String,
#[serde(default = "default_mount")]
pub mount: String,
}
#[cfg(feature = "vault")]
fn default_mount() -> String {
"secret".to_string()
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct IronCryptConfig {
#[serde(default)]
pub standard: CryptoStandard,
#[serde(default)]
pub symmetric_algorithm: SymmetricAlgorithm,
#[serde(default)]
pub asymmetric_algorithm: AsymmetricAlgorithm,
pub rsa_key_size: u32,
pub buffer_size: usize,
pub argon2_memory_cost: u32,
pub argon2_time_cost: u32,
pub argon2_parallelism: u32,
pub password_criteria: PasswordCriteria,
#[serde(default)]
pub secrets: Option<SecretsConfig>,
#[serde(default)]
pub data_type_config: Option<DataTypeConfig>,
#[serde(default)]
pub audit: Option<AuditConfig>,
}
impl IronCryptConfig {
pub fn from_file(path: &str) -> Result<Self, ConfigError> {
let contents = fs::read_to_string(path)?;
let config: Self = toml::from_str(&contents)?;
Ok(config)
}
}
impl Default for IronCryptConfig {
fn default() -> Self {
Self {
standard: CryptoStandard::default(),
symmetric_algorithm: SymmetricAlgorithm::default(),
asymmetric_algorithm: AsymmetricAlgorithm::default(),
rsa_key_size: 2048,
buffer_size: 4096,
argon2_memory_cost: 65536,
argon2_time_cost: 3,
argon2_parallelism: 1,
password_criteria: PasswordCriteria::default(),
secrets: None,
data_type_config: None,
audit: None,
}
}
}