soph_hash/support/
hash.rs1use 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}