wrapper_argon2/
wrapper.rs

1use argon2::{
2    password_hash::{rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString},
3    Argon2,
4};
5
6use darth_rust::DarthRust;
7
8#[derive(Debug, DarthRust, Clone)]
9pub struct WrapperArgon2 {
10    pub password: String,
11    pub hash: Option<String>,
12}
13
14pub trait Argon2Trait {
15    fn default_encode(&self) -> Result<String, String>;
16    fn default_verify_password(&self) -> Result<bool, String>;
17}
18
19impl Argon2Trait for WrapperArgon2 {
20    fn default_encode(&self) -> Result<String, String> {
21        let password = &self.password;
22        let salt = SaltString::generate(&mut OsRng);
23        let argon2 = Argon2::default();
24        let password_hash = argon2.hash_password(password.as_bytes(), &salt);
25        match password_hash {
26            Ok(hash) => Ok(hash.to_string()),
27            Err(err) => Err(err.to_string()),
28        }
29    }
30    fn default_verify_password(&self) -> Result<bool, String> {
31        let original_password = &self.password;
32        let encoded_hash = &self.hash.as_ref().expect("hash must be provided");
33        let parsed_hash = PasswordHash::new(encoded_hash.as_str())
34            .map_err(|e| format!("Invalid hash format: {}", e))?;
35        let argon2 = Argon2::default();
36        argon2
37            .verify_password(original_password.as_bytes(), &parsed_hash)
38            .map_err(|_| "Password verification failed".to_string())
39            .map(|_| true)
40    }
41}