soph_hash/support/
hash.rs

1use crate::{Hash, HashResult};
2use argon2::{
3    password_hash::{rand_core::OsRng, SaltString},
4    Argon2, Params, PasswordHash, PasswordHasher, PasswordVerifier,
5};
6use soph_config::support::config;
7
8impl Hash {
9    pub fn new() -> HashResult<Self> {
10        let config = config().parse::<crate::config::Hash>()?;
11
12        let algorithm = Argon2::new(config.algorithm.into(), config.version.into(), Params::default());
13
14        Ok(Self { algorithm })
15    }
16
17    pub fn make(&self, value: &str) -> HashResult<String> {
18        let salt = SaltString::generate(&mut OsRng);
19
20        Ok(self.hash_password(value.as_bytes(), &salt)?.to_string())
21    }
22
23    pub fn check(&self, value: &str, hashed: &str) -> bool {
24        let Ok(hashed) = PasswordHash::new(hashed) else {
25            return false;
26        };
27
28        self.verify_password(value.as_bytes(), &hashed).is_ok()
29    }
30}
31
32impl std::ops::Deref for Hash {
33    type Target = Argon2<'static>;
34
35    fn deref(&self) -> &Self::Target {
36        &self.algorithm
37    }
38}