From 209b29b4d6828175afdc71b73db1a3c2c0b9c7b0 Mon Sep 17 00:00:00 2001 From: Mike Mulchrone Date: Tue, 9 Dec 2025 20:00:05 -0500 Subject: [PATCH 1/2] accpect parameters for argon 2 --- src/password_hashers/argon2.rs | 16 +++++++++++++++- tests/password_hashers.rs | 8 ++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/password_hashers/argon2.rs b/src/password_hashers/argon2.rs index 6ea96cc..c3ab92e 100644 --- a/src/password_hashers/argon2.rs +++ b/src/password_hashers/argon2.rs @@ -1,6 +1,6 @@ use argon2::{ password_hash::{rand_core::OsRng, SaltString}, - Argon2, PasswordHash, PasswordHasher, PasswordVerifier, + Argon2, PasswordHash, PasswordHasher, PasswordVerifier, Params }; use rand::RngCore; @@ -9,6 +9,20 @@ pub struct CASArgon; impl CASArgon { + /// Hashes a password using Argon2 with custom parameters. + /// Returns the hashed password as a string. + /// Parameters: + /// - memory_cost: Memory cost in kibibytes. + /// - iterations: Number of iterations. + /// - parallelism: Degree of parallelism. + /// - password_to_hash: The password to be hashed. + pub fn hash_password_parameters(memory_cost: u32, iterations: u32, parallelism: u32, password_to_hash: String) -> String { + let params = Params::new(memory_cost * 1024, iterations, parallelism, None).unwrap(); + let argon2 = Argon2::new(argon2::Algorithm::Argon2id, argon2::Version::V0x13, params); + let salt = SaltString::generate(&mut OsRng); + let hash = argon2.hash_password(password_to_hash.as_bytes(), &salt).unwrap(); + hash.to_string() + } /// Derives a 128-bit AES key from a password using Argon2. /// Returns the derived key as a vector of bytes. pub fn derive_aes_128_key(password: Vec) -> Vec { diff --git a/tests/password_hashers.rs b/tests/password_hashers.rs index 83bdc4e..ffc1ae7 100644 --- a/tests/password_hashers.rs +++ b/tests/password_hashers.rs @@ -3,6 +3,14 @@ mod password_hashers { use std::path::Path; use cas_lib::{password_hashers::{argon2::CASArgon, bcrypt::CASBCrypt, cas_password_hasher::CASPasswordHasher, scrypt::CASScrypt}, symmetric::{aes::{CASAES128, CASAES256}, cas_symmetric_encryption::{CASAES128Encryption, CASAES256Encryption}}}; + #[test] + pub fn argon2_hash_with_parameters() { + let password = "BadPassword".to_string(); + let hash = CASArgon::hash_password_parameters(1024, 5, 5, password.clone()); + let verification = CASArgon::verify_password(hash, password); + assert_eq!(true, verification); + } + #[test] pub fn argon2_derive_aes_128_and_encrypt() { let password = b"BadPassword".to_vec(); // do not use this as a password. From 72b7dd45435f3ec04f55de516580ede4525ddeee Mon Sep 17 00:00:00 2001 From: Mike Mulchrone Date: Tue, 9 Dec 2025 20:00:18 -0500 Subject: [PATCH 2/2] version bump --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 5f24576..ae1dff6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cas-lib" -version = "0.2.67" +version = "0.2.68" edition = "2021" description = "A function wrapper layer for RustCrypto and Dalek-Cryptography. Intended to be used in FFI situations with a global heap deallactor at the top level project." license = "Apache-2.0"