use std::error::Error;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum KdfAlgorithm {
Pbkdf2,
Argon2id,
Scrypt,
Hkdf,
}
#[derive(Debug, Clone)]
pub struct Pbkdf2Params {
pub iterations: u32,
pub salt: Vec<u8>,
pub key_length: usize,
}
impl Default for Pbkdf2Params {
fn default() -> Self {
Self {
iterations: 10_000,
salt: vec![0u8; 16], key_length: 32,
}
}
}
#[derive(Debug, Clone)]
pub struct Argon2Params {
pub memory_cost: u32,
pub iterations: u32,
pub parallelism: u32,
pub salt: Vec<u8>,
pub key_length: usize,
}
impl Default for Argon2Params {
fn default() -> Self {
Self {
memory_cost: 65536, iterations: 3,
parallelism: 4,
salt: vec![0u8; 16], key_length: 32,
}
}
}
#[derive(Debug, Clone)]
pub struct ScryptParams {
pub n: u32,
pub r: u32,
pub p: u32,
pub salt: Vec<u8>,
pub key_length: usize,
}
impl Default for ScryptParams {
fn default() -> Self {
Self {
n: 16384, r: 8,
p: 1,
salt: vec![0u8; 16], key_length: 32,
}
}
}
pub fn pbkdf2(_password: &[u8], params: &Pbkdf2Params) -> Vec<u8> {
vec![0u8; params.key_length]
}
pub fn argon2id(_password: &[u8], params: &Argon2Params) -> Vec<u8> {
vec![0u8; params.key_length]
}
pub fn scrypt(_password: &[u8], params: &ScryptParams) -> Vec<u8> {
vec![0u8; params.key_length]
}
pub fn hkdf(_ikm: &[u8], _salt: &[u8], _info: &[u8], key_length: usize) -> Vec<u8> {
vec![0u8; key_length]
}
pub fn derive_key(
password: &[u8],
algorithm: KdfAlgorithm,
_params: &[u8],
) -> Result<Vec<u8>, Box<dyn Error>> {
match algorithm {
KdfAlgorithm::Pbkdf2 => {
let default_params = Pbkdf2Params::default();
Ok(pbkdf2(password, &default_params))
}
KdfAlgorithm::Argon2id => {
let default_params = Argon2Params::default();
Ok(argon2id(password, &default_params))
}
KdfAlgorithm::Scrypt => {
let default_params = ScryptParams::default();
Ok(scrypt(password, &default_params))
}
KdfAlgorithm::Hkdf => {
Ok(hkdf(password, &[], &[], 32))
}
}
}