use argon2::{Variant, Version};
use crate::{Hasher, PasswordWorker, PasswordWorkerError};
#[derive(Clone, Copy, Debug)]
pub enum Argon2id {}
impl Hasher for Argon2id {
type Config = Argon2idConfig;
type Error = argon2::Error;
fn hash(data: impl AsRef<[u8]>, config: &Self::Config) -> Result<String, Self::Error> {
let mut argon_config = argon2::Config::default();
argon_config.variant = Variant::Argon2id;
argon_config.version = Version::Version13;
argon_config.time_cost = config.time_cost;
argon_config.mem_cost = config.mem_cost;
argon_config.hash_length = config.hash_length;
argon2::hash_encoded(data.as_ref(), &config.salt, &argon_config)
}
fn verify(data: impl AsRef<[u8]>, hash: &str) -> Result<bool, Self::Error> {
argon2::verify_encoded(hash, data.as_ref())
}
}
#[derive(Clone)]
pub struct Argon2idConfig {
pub salt: Vec<u8>,
pub time_cost: u32,
pub mem_cost: u32,
pub hash_length: u32,
}
impl Default for Argon2idConfig {
fn default() -> Self {
Self {
salt: Vec::new(),
time_cost: 3,
mem_cost: 4096,
hash_length: 32,
}
}
}
impl PasswordWorker<Argon2id> {
pub fn new_argon2id(max_threads: usize) -> Result<Self, PasswordWorkerError<Argon2id>> {
PasswordWorker::<Argon2id>::new(max_threads)
}
}