cas_lib/password_hashers/
scrypt.rs

1use std::sync::mpsc;
2
3
4
5use scrypt::{
6    password_hash::{rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString},
7    Scrypt,
8};
9
10use super::cas_password_hasher::CASPasswordHasher;
11
12pub struct CASScrypt;
13
14impl CASPasswordHasher for CASScrypt {
15    fn hash_password(password_to_hash: String) -> String {
16        let salt = SaltString::generate(&mut OsRng);
17        return Scrypt
18            .hash_password(password_to_hash.as_bytes(), &salt)
19            .unwrap()
20            .to_string();
21    }
22
23    fn verify_password(hashed_password: String, password_to_verify: String) -> bool {
24        let parsed_hash = PasswordHash::new(&hashed_password).unwrap();
25        return Scrypt
26            .verify_password(password_to_verify.as_bytes(), &parsed_hash)
27            .is_ok();
28    }
29
30    fn hash_password_threadpool(password: String) -> String {
31        let (sender, receiver) = mpsc::channel();
32        rayon::spawn(move || {
33            let hash = Self::hash_password(password);
34            sender.send(hash).unwrap();
35        });
36        let hash = receiver.recv().unwrap();
37        hash
38    }
39
40    fn verify_password_threadpool(hashed_password: String, password_to_verify: String) -> bool {
41        let (sender, receiver) = mpsc::channel();
42        rayon::spawn(move || {
43            let hash = Self::verify_password(hashed_password, password_to_verify);
44            sender.send(hash).unwrap();
45        });
46        let hash = receiver.recv().unwrap();
47        hash
48    }
49}