cas_lib/password_hashers/
scrypt.rs1use 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}