mod instance;
use argon2::{
password_hash::{rand_core::OsRng, SaltString},
Argon2, PasswordHash, PasswordHasher, PasswordVerifier,
};
use ayun_core::{Error, Result};
pub struct Hash {
inner: Argon2<'static>,
}
impl Hash {
fn new(inner: Argon2<'static>) -> Self {
Self { inner }
}
pub fn make(&self, value: &str) -> Result<String, Error> {
let salt = SaltString::generate(&mut OsRng);
Ok(self
.inner
.hash_password(value.as_bytes(), &salt)?
.to_string())
}
pub fn check(&self, value: &str, hashed: &str) -> bool {
let Ok(hashed) = PasswordHash::new(hashed) else {
return false;
};
self.inner
.verify_password(value.as_bytes(), &hashed)
.is_ok()
}
}
impl std::ops::Deref for Hash {
type Target = Argon2<'static>;
fn deref(&self) -> &Self::Target {
&self.inner
}
}