use crate::profile::SecurityProfile;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct KeyDerivationParams {
pub memory_cost: u32, pub time_cost: u32, pub parallelism: u32, pub key_size: u8, }
impl KeyDerivationParams {
pub fn new(memory_cost: u32, time_cost: u32, parallelism: u32, key_size: u8) -> Self {
Self {
memory_cost,
time_cost,
parallelism,
key_size,
}
}
pub fn production_defaults() -> Self {
Self {
memory_cost: 1024 * 1024, time_cost: 10, parallelism: 4, key_size: 32, }
}
pub fn test_defaults() -> Self {
Self {
memory_cost: 1024, time_cost: 1, parallelism: 1, key_size: 32, }
}
}
impl From<SecurityProfile> for KeyDerivationParams {
fn from(profile: SecurityProfile) -> Self {
match profile {
SecurityProfile::Production => KeyDerivationParams::production_defaults(),
SecurityProfile::Test => KeyDerivationParams::test_defaults(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_key_derivation_params_defaults() {
let prod = KeyDerivationParams::production_defaults();
assert_eq!(prod.memory_cost, 1024 * 1024);
assert_eq!(prod.time_cost, 10);
assert_eq!(prod.parallelism, 4);
assert_eq!(prod.key_size, 32);
let test = KeyDerivationParams::test_defaults();
assert_eq!(test.memory_cost, 1024);
assert_eq!(test.time_cost, 1);
assert_eq!(test.parallelism, 1);
assert_eq!(test.key_size, 32);
}
#[test]
fn test_from_security_profile() {
let prod_params: KeyDerivationParams = SecurityProfile::Production.into();
let expected_prod = KeyDerivationParams::production_defaults();
assert_eq!(prod_params, expected_prod);
let test_params: KeyDerivationParams = SecurityProfile::Test.into();
let expected_test = KeyDerivationParams::test_defaults();
assert_eq!(test_params, expected_test);
}
}