use crate::{generate_raw_hash, verify_password, GenerateHashError};
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct FirebaseScrypt {
salt_separator: String,
signer_key: String,
rounds: u32,
mem_cost: u32,
}
impl FirebaseScrypt {
pub fn new(salt_separator: &str, signer_key: &str, rounds: u32, mem_cost: u32) -> Self {
Self {
salt_separator: salt_separator.to_string(),
signer_key: signer_key.to_string(),
rounds,
mem_cost,
}
}
pub fn verify_password(
&self,
password: &str,
salt: &str,
known_hash: &str,
) -> Result<bool, GenerateHashError> {
verify_password(
password,
known_hash,
salt,
self.salt_separator.as_str(),
self.signer_key.as_str(),
self.rounds,
self.mem_cost,
)
}
pub fn verify_password_bool(&self, password: &str, salt: &str, known_hash: &str) -> bool {
if let Ok(result) = self.verify_password(password, salt, known_hash) {
result
} else {
false
}
}
pub fn generate_base64_hash(
&self,
password: &str,
salt: &str,
) -> Result<String, GenerateHashError> {
let hash = generate_raw_hash(
password,
salt,
self.salt_separator.as_str(),
self.signer_key.as_str(),
self.rounds,
self.mem_cost,
)?;
Ok(base64::encode(hash))
}
}
#[cfg(test)]
mod tests {
const SALT_SEPARATOR: &str = "Bw==";
const SIGNER_KEY: &str =
"jxspr8Ki0RYycVU8zykbdLGjFQ3McFUH0uiiTvC8pVMXAn210wjLNmdZJzxUECKbm0QsEmYUSDzZvpjeJ9WmXA==";
const ROUNDS: u32 = 8;
const MEM_COST: u32 = 14;
const PASSWORD: &str = "user1password";
const SALT: &str = "42xEC+ixf3L2lw==";
const PASSWORD_HASH: &str =
"lSrfV15cpx95/sZS2W9c9Kp6i/LVgQNDNC/qzrCnh1SAyZvqmZqAjTdn3aoItz+VHjoZilo78198JAdRuid5lQ==";
use super::*;
#[test]
fn verify_password_with_simple_works() {
let firebase_scrypt = FirebaseScrypt::new(SALT_SEPARATOR, SIGNER_KEY, ROUNDS, MEM_COST);
assert!(firebase_scrypt
.verify_password(PASSWORD, SALT, PASSWORD_HASH,)
.unwrap())
}
#[test]
fn generate_hash_with_simple_works() {
let firebase_scrypt = FirebaseScrypt::new(SALT_SEPARATOR, SIGNER_KEY, ROUNDS, MEM_COST);
assert_eq!(
firebase_scrypt
.generate_base64_hash(PASSWORD, SALT,)
.unwrap(),
PASSWORD_HASH
)
}
}