Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,6 @@ members = [
"scrypt",
"sha-crypt"
]

[patch.crates-io]
password-hash = { git = "https://github.com/rustcrypto/traits.git" }
21 changes: 13 additions & 8 deletions argon2/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
//! let argon2 = Argon2::default();
//!
//! // Hash password to PHC string ($argon2id$v=19$...)
//! let password_hash = argon2.hash_password_simple(password, salt.as_ref()).unwrap().to_string();
//! let password_hash = argon2.hash_password(password, salt.as_ref()).unwrap().to_string();
//!
//! // Verify password against PHC string
//! let parsed_hash = PasswordHash::new(&password_hash).unwrap();
Expand Down Expand Up @@ -106,7 +106,7 @@ use core::convert::TryFrom;
#[cfg(feature = "password-hash")]
use {
core::convert::TryInto,
password_hash::{Ident, Salt},
password_hash::{Decimal, Ident, Salt},
};

/// Minimum and maximum number of lanes (degree of parallelism)
Expand Down Expand Up @@ -395,7 +395,7 @@ impl<'key> Argon2<'key> {
impl PasswordHasher for Argon2<'_> {
type Params = Params;

fn hash_password_simple<'a, S>(
fn hash_password<'a, S>(
&self,
password: &[u8],
salt: &'a S,
Expand Down Expand Up @@ -426,10 +426,11 @@ impl PasswordHasher for Argon2<'_> {
})
}

fn hash_password<'a>(
fn hash_password_customized<'a>(
&self,
password: &[u8],
alg_id: Option<Ident<'a>>,
version: Option<Decimal>,
params: Params,
salt: impl Into<Salt<'a>>,
) -> password_hash::Result<PasswordHash<'a>> {
Expand All @@ -445,14 +446,17 @@ impl PasswordHasher for Argon2<'_> {
params.t_cost,
params.m_cost,
params.p_cost,
params.version,
version
.map(Version::try_from)
.transpose()?
.unwrap_or_else(|| params.version),
)?;

// TODO(tarcieri): pass these via `Params` when `Argon::new` accepts `Params`
hasher.algorithm = Some(algorithm);
hasher.output_size = Some(params.output_size);

hasher.hash_password_simple(password, salt.as_str())
hasher.hash_password(password, salt.as_str())
}
}

Expand Down Expand Up @@ -498,7 +502,8 @@ mod tests {
// Too short after decoding
let salt = Salt::new("somesalt").unwrap();

let res = argon2.hash_password(EXAMPLE_PASSWORD, None, Params::default(), salt);
let res =
argon2.hash_password_customized(EXAMPLE_PASSWORD, None, None, Params::default(), salt);
assert_eq!(
res,
Err(password_hash::Error::SaltInvalid(
Expand All @@ -517,7 +522,7 @@ mod tests {

let hasher = Argon2::new(None, t_cost, m_cost, p_cost, version).unwrap();
let hash = hasher
.hash_password_simple(EXAMPLE_PASSWORD, EXAMPLE_SALT)
.hash_password(EXAMPLE_PASSWORD, EXAMPLE_SALT)
.unwrap();

assert_eq!(hash.version.unwrap(), version.into());
Expand Down
2 changes: 1 addition & 1 deletion pbkdf2/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
//! let salt = SaltString::generate(&mut OsRng);
//!
//! // Hash password to PHC string ($pbkdf2-sha256$...)
//! let password_hash = Pbkdf2.hash_password_simple(password, salt.as_ref()).unwrap().to_string();
//! let password_hash = Pbkdf2.hash_password(password, salt.as_ref()).unwrap().to_string();
//!
//! // Verify password against PHC string
//! let parsed_hash = PasswordHash::new(&password_hash).unwrap();
Expand Down
11 changes: 9 additions & 2 deletions pbkdf2/src/simple.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use core::{
};
use hmac::Hmac;
use password_hash::{
errors::InvalidValue, Error, Ident, McfHasher, Output, ParamsString, PasswordHash,
errors::InvalidValue, Decimal, Error, Ident, McfHasher, Output, ParamsString, PasswordHash,
PasswordHasher, Result, Salt,
};
use sha2::{Sha256, Sha512};
Expand All @@ -36,14 +36,21 @@ pub struct Pbkdf2;
impl PasswordHasher for Pbkdf2 {
type Params = Params;

fn hash_password<'a>(
fn hash_password_customized<'a>(
&self,
password: &[u8],
alg_id: Option<Ident<'a>>,
version: Option<Decimal>,
params: Params,
salt: impl Into<Salt<'a>>,
) -> Result<PasswordHash<'a>> {
let algorithm = Algorithm::try_from(alg_id.unwrap_or(PBKDF2_SHA256))?;

// Versions unsupported
if version.is_some() {
return Err(Error::Version);
}

let salt = salt.into();
let mut salt_arr = [0u8; 64];
let salt_bytes = salt.b64_decode(&mut salt_arr)?;
Expand Down
2 changes: 1 addition & 1 deletion pbkdf2/tests/simple.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ fn hash_with_default_algorithm() {
};

let hash = Pbkdf2
.hash_password(PASSWORD.as_bytes(), None, params, salt)
.hash_password_customized(PASSWORD.as_bytes(), None, None, params, salt)
.unwrap();

assert_eq!(hash.algorithm, Algorithm::Pbkdf2Sha256.ident());
Expand Down
2 changes: 1 addition & 1 deletion scrypt/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
//! let salt = SaltString::generate(&mut OsRng);
//!
//! // Hash password to PHC string ($scrypt$...)
//! let password_hash = Scrypt.hash_password_simple(password, salt.as_ref()).unwrap().to_string();
//! let password_hash = Scrypt.hash_password(password, salt.as_ref()).unwrap().to_string();
//!
//! // Verify password against PHC string
//! let parsed_hash = PasswordHash::new(&password_hash).unwrap();
Expand Down
17 changes: 11 additions & 6 deletions scrypt/src/simple.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ use crate::{scrypt, Params};
use base64ct::{Base64, Encoding};
use core::convert::TryInto;
use password_hash::{
errors::InvalidValue, Error, Ident, McfHasher, Output, PasswordHash, PasswordHasher, Result,
Salt,
errors::InvalidValue, Decimal, Error, Ident, McfHasher, Output, PasswordHash, PasswordHasher,
Result, Salt,
};

/// Algorithm identifier
Expand All @@ -19,16 +19,21 @@ pub struct Scrypt;
impl PasswordHasher for Scrypt {
type Params = Params;

fn hash_password<'a>(
fn hash_password_customized<'a>(
&self,
password: &[u8],
alg_id: Option<Ident<'a>>,
version: Option<Decimal>,
params: Params,
salt: impl Into<Salt<'a>>,
) -> Result<PasswordHash<'a>> {
match alg_id {
Some(ALG_ID) | None => (),
_ => return Err(Error::Algorithm),
if !matches!(alg_id, Some(ALG_ID) | None) {
return Err(Error::Algorithm);
}

// Versions unsupported
if version.is_some() {
return Err(Error::Version);
}

let salt = salt.into();
Expand Down