use scrypt::{
password_hash::{rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString},
Scrypt, Params
};
use crate::error::{CasError, CasResult};
pub struct CASScrypt;
impl CASScrypt {
pub fn hash_password_customized(password_to_hash: String, cpu_memory_cost: u8, block_size: u32, parallelism: u32) -> CasResult<String> {
let salt = SaltString::generate(&mut OsRng);
let params = Params::new(cpu_memory_cost, block_size, parallelism, 32)
.map_err(|_| CasError::InvalidParameters)?;
Ok(Scrypt
.hash_password_customized(password_to_hash.as_bytes(), None, None, params, &salt)
.map_err(|_| CasError::PasswordHashingFailed)?
.to_string())
}
pub fn hash_password(password_to_hash: String) -> CasResult<String> {
let salt = SaltString::generate(&mut OsRng);
Ok(Scrypt
.hash_password(password_to_hash.as_bytes(), &salt)
.map_err(|_| CasError::PasswordHashingFailed)?
.to_string())
}
pub fn verify_password(hashed_password: String, password_to_verify: String) -> CasResult<bool> {
let parsed_hash =
PasswordHash::new(&hashed_password).map_err(|_| CasError::PasswordHashingFailed)?;
Ok(Scrypt
.verify_password(password_to_verify.as_bytes(), &parsed_hash)
.is_ok())
}
}