wrapper_argon2/
wrapper.rs1use 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}