Skip to content

Commit 396e36f

Browse files
committed
Updates for password-hash API changes
Includes updates for the following: - Extract `phc` submodule (RustCrypto/traits#2103) - Extract `CustomizedPasswordHasher` trait (RustCrypto/traits#2105)
1 parent 6399655 commit 396e36f

File tree

17 files changed

+202
-147
lines changed

17 files changed

+202
-147
lines changed

Cargo.lock

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,6 @@ exclude = ["benches", "fuzz"]
1515

1616
[profile.dev]
1717
opt-level = 2
18+
19+
[patch.crates-io.password-hash]
20+
git = "https://github.com/RustCrypto/traits"

argon2/src/algorithm.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use core::{
77
};
88

99
#[cfg(feature = "password-hash")]
10-
use password_hash::Ident;
10+
use password_hash::phc::Ident;
1111

1212
/// Argon2d algorithm identifier
1313
#[cfg(feature = "password-hash")]
@@ -94,8 +94,8 @@ impl Display for Algorithm {
9494
impl FromStr for Algorithm {
9595
type Err = Error;
9696

97-
fn from_str(s: &str) -> Result<Algorithm> {
98-
match s {
97+
fn from_str(name: &str) -> Result<Algorithm> {
98+
match name {
9999
"argon2d" => Ok(Algorithm::Argon2d),
100100
"argon2i" => Ok(Algorithm::Argon2i),
101101
"argon2id" => Ok(Algorithm::Argon2id),
@@ -112,15 +112,10 @@ impl From<Algorithm> for Ident<'static> {
112112
}
113113

114114
#[cfg(feature = "password-hash")]
115-
impl<'a> TryFrom<Ident<'a>> for Algorithm {
115+
impl TryFrom<&str> for Algorithm {
116116
type Error = password_hash::Error;
117117

118-
fn try_from(ident: Ident<'a>) -> password_hash::Result<Algorithm> {
119-
match ident {
120-
ARGON2D_IDENT => Ok(Algorithm::Argon2d),
121-
ARGON2I_IDENT => Ok(Algorithm::Argon2i),
122-
ARGON2ID_IDENT => Ok(Algorithm::Argon2id),
123-
_ => Err(password_hash::Error::Algorithm),
124-
}
118+
fn try_from(name: &str) -> password_hash::Result<Algorithm> {
119+
name.parse().map_err(|_| password_hash::Error::Algorithm)
125120
}
126121
}

argon2/src/lib.rs

Lines changed: 47 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
)]
4040
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
4141
//! use argon2::{
42-
//! password_hash::{PasswordHash, PasswordHasher, PasswordVerifier, SaltString},
42+
//! password_hash::{PasswordHash, PasswordHasher, PasswordVerifier, phc::SaltString},
4343
//! Argon2
4444
//! };
4545
//!
@@ -50,7 +50,7 @@
5050
//! let argon2 = Argon2::default();
5151
//!
5252
//! // Hash password to PHC string ($argon2id$v=19$...)
53-
//! let password_hash = argon2.hash_password(password, &salt)?.to_string();
53+
//! let password_hash = argon2.hash_password(password, salt.as_ref())?.to_string();
5454
//!
5555
//! // Verify password against PHC string.
5656
//! //
@@ -73,7 +73,7 @@
7373
)]
7474
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
7575
//! use argon2::{
76-
//! password_hash::{PasswordHash, PasswordHasher, PasswordVerifier, SaltString },
76+
//! password_hash::{PasswordHash, PasswordHasher, PasswordVerifier, phc::SaltString},
7777
//! Algorithm, Argon2, Params, Version
7878
//! };
7979
//!
@@ -90,7 +90,7 @@
9090
//! .unwrap();
9191
//!
9292
//! // Hash password to PHC string ($argon2id$v=19$...)
93-
//! let password_hash = argon2.hash_password(password, &salt)?.to_string();
93+
//! let password_hash = argon2.hash_password(password, salt.as_ref())?.to_string();
9494
//!
9595
//! // Verify password against PHC string.
9696
//! //
@@ -162,7 +162,9 @@ pub use crate::{
162162
#[cfg(feature = "password-hash")]
163163
pub use {
164164
crate::algorithm::{ARGON2D_IDENT, ARGON2I_IDENT, ARGON2ID_IDENT},
165-
password_hash::{self, PasswordHash, PasswordHasher, PasswordVerifier},
165+
password_hash::{
166+
self, CustomizedPasswordHasher, PasswordHash, PasswordHasher, PasswordVerifier,
167+
},
166168
};
167169

168170
use crate::blake2b_long::blake2b_long;
@@ -171,7 +173,7 @@ use core::fmt;
171173
use memory::Memory;
172174

173175
#[cfg(all(feature = "alloc", feature = "password-hash"))]
174-
use password_hash::{Decimal, Ident, ParamsString, Salt};
176+
use password_hash::phc::{Output, ParamsString, Salt};
175177

176178
#[cfg(feature = "zeroize")]
177179
use zeroize::Zeroize;
@@ -618,43 +620,16 @@ impl<'key> Argon2<'key> {
618620
}
619621

620622
#[cfg(all(feature = "alloc", feature = "password-hash"))]
621-
impl PasswordHasher for Argon2<'_> {
623+
impl CustomizedPasswordHasher for Argon2<'_> {
622624
type Params = Params;
623625

624-
fn hash_password<'a>(
625-
&self,
626-
password: &[u8],
627-
salt: impl Into<Salt<'a>>,
628-
) -> password_hash::Result<PasswordHash<'a>> {
629-
let salt = salt.into();
630-
let mut salt_arr = [0u8; 64];
631-
let salt_bytes = salt.decode_b64(&mut salt_arr)?;
632-
633-
let output_len = self
634-
.params
635-
.output_len()
636-
.unwrap_or(Params::DEFAULT_OUTPUT_LEN);
637-
638-
let output = password_hash::Output::init_with(output_len, |out| {
639-
Ok(self.hash_password_into(password, salt_bytes, out)?)
640-
})?;
641-
642-
Ok(PasswordHash {
643-
algorithm: self.algorithm.ident(),
644-
version: Some(self.version.into()),
645-
params: ParamsString::try_from(&self.params)?,
646-
salt: Some(salt),
647-
hash: Some(output),
648-
})
649-
}
650-
651626
fn hash_password_customized<'a>(
652627
&self,
653628
password: &[u8],
654-
alg_id: Option<Ident<'a>>,
655-
version: Option<Decimal>,
629+
alg_id: Option<&'a str>,
630+
version: Option<u32>,
656631
params: Params,
657-
salt: impl Into<Salt<'a>>,
632+
salt: &'a str,
658633
) -> password_hash::Result<PasswordHash<'a>> {
659634
let algorithm = alg_id
660635
.map(Algorithm::try_from)
@@ -666,8 +641,6 @@ impl PasswordHasher for Argon2<'_> {
666641
.transpose()?
667642
.unwrap_or_default();
668643

669-
let salt = salt.into();
670-
671644
Self {
672645
secret: self.secret,
673646
algorithm,
@@ -680,6 +653,36 @@ impl PasswordHasher for Argon2<'_> {
680653
}
681654
}
682655

656+
#[cfg(all(feature = "alloc", feature = "password-hash"))]
657+
impl PasswordHasher for Argon2<'_> {
658+
fn hash_password<'a>(
659+
&self,
660+
password: &[u8],
661+
salt: &'a str,
662+
) -> password_hash::Result<PasswordHash<'a>> {
663+
let salt = Salt::from_b64(salt)?;
664+
let mut salt_arr = [0u8; 64];
665+
let salt_bytes = salt.decode_b64(&mut salt_arr)?;
666+
667+
let output_len = self
668+
.params
669+
.output_len()
670+
.unwrap_or(Params::DEFAULT_OUTPUT_LEN);
671+
672+
let output = Output::init_with(output_len, |out| {
673+
Ok(self.hash_password_into(password, salt_bytes, out)?)
674+
})?;
675+
676+
Ok(PasswordHash {
677+
algorithm: self.algorithm.ident(),
678+
version: Some(self.version.into()),
679+
params: ParamsString::try_from(&self.params)?,
680+
salt: Some(salt),
681+
hash: Some(output),
682+
})
683+
}
684+
}
685+
683686
impl From<Params> for Argon2<'_> {
684687
fn from(params: Params) -> Self {
685688
Self::new(Algorithm::default(), Version::default(), params)
@@ -695,7 +698,7 @@ impl From<&Params> for Argon2<'_> {
695698
#[cfg(all(test, feature = "alloc", feature = "password-hash"))]
696699
#[allow(clippy::unwrap_used)]
697700
mod tests {
698-
use crate::{Algorithm, Argon2, Params, PasswordHasher, Salt, Version};
701+
use crate::{Algorithm, Argon2, CustomizedPasswordHasher, Params, PasswordHasher, Version};
699702

700703
/// Example password only: don't use this as a real password!!!
701704
const EXAMPLE_PASSWORD: &[u8] = b"hunter42";
@@ -708,7 +711,7 @@ mod tests {
708711
let argon2 = Argon2::default();
709712

710713
// Too short after decoding
711-
let salt = Salt::from_b64("somesalt").unwrap();
714+
let salt = "somesalt";
712715

713716
let res =
714717
argon2.hash_password_customized(EXAMPLE_PASSWORD, None, None, Params::default(), salt);
@@ -730,8 +733,9 @@ mod tests {
730733

731734
let params = Params::new(m_cost, t_cost, p_cost, None).unwrap();
732735
let hasher = Argon2::new(Algorithm::default(), version, params);
733-
let salt = Salt::from_b64(EXAMPLE_SALT).unwrap();
734-
let hash = hasher.hash_password(EXAMPLE_PASSWORD, salt).unwrap();
736+
let hash = hasher
737+
.hash_password(EXAMPLE_PASSWORD, EXAMPLE_SALT)
738+
.unwrap();
735739

736740
assert_eq!(hash.version.unwrap(), version.into());
737741

argon2/src/params.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use base64ct::{Base64Unpadded as B64, Encoding};
55
use core::str::FromStr;
66

77
#[cfg(feature = "password-hash")]
8-
use password_hash::{ParamsString, PasswordHash};
8+
use password_hash::{PasswordHash, phc::ParamsString};
99

1010
/// Argon2 password hash parameters.
1111
///

argon2/tests/kat.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use argon2::{
1414
PasswordVerifier, Version,
1515
};
1616
use hex_literal::hex;
17-
use password_hash::SaltString;
17+
use password_hash::phc::SaltString;
1818

1919
/// Params used by the KATs.
2020
fn example_params() -> Params {
@@ -368,7 +368,10 @@ fn hashtest(
368368

369369
// Test hash encoding
370370
let salt_string = SaltString::encode_b64(salt).unwrap();
371-
let phc_hash = ctx.hash_password(pwd, &salt_string).unwrap().to_string();
371+
let phc_hash = ctx
372+
.hash_password(pwd, salt_string.as_ref())
373+
.unwrap()
374+
.to_string();
372375
assert_eq!(phc_hash, expected_phc_hash);
373376

374377
let hash = PasswordHash::new(alternative_phc_hash).unwrap();

argon2/tests/phc_strings.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ use argon2::{
99
PasswordVerifier, Version,
1010
};
1111
use password_hash::{
12-
SaltString,
1312
errors::{Error, InvalidValue},
13+
phc::SaltString,
1414
};
1515

1616
/// Valid password
@@ -217,7 +217,7 @@ fn check_hash_encoding_parameters_order() {
217217
let password = b"password";
218218
let salt_string = SaltString::encode_b64(&salt).unwrap();
219219
let password_hash = ctx
220-
.hash_password(password, &salt_string)
220+
.hash_password(password, salt_string.as_ref())
221221
.unwrap()
222222
.to_string();
223223

balloon-hash/src/algorithm.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use core::{
77
};
88

99
#[cfg(feature = "password-hash")]
10-
use password_hash::Ident;
10+
use password_hash::phc::Ident;
1111

1212
/// Balloon primitive type: variants of the algorithm.
1313
#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, PartialOrd, Ord, Default)]
@@ -87,11 +87,11 @@ impl From<Algorithm> for Ident<'static> {
8787
}
8888

8989
#[cfg(feature = "password-hash")]
90-
impl<'a> TryFrom<Ident<'a>> for Algorithm {
90+
impl<'a> TryFrom<&'a str> for Algorithm {
9191
type Error = password_hash::Error;
9292

93-
fn try_from(ident: Ident<'a>) -> password_hash::Result<Algorithm> {
94-
match ident {
93+
fn try_from(name: &'a str) -> password_hash::Result<Algorithm> {
94+
match name.try_into()? {
9595
Self::BALLOON_IDENT => Ok(Algorithm::Balloon),
9696
Self::BALLOON_M_IDENT => Ok(Algorithm::BalloonM),
9797
_ => Err(password_hash::Error::Algorithm),

0 commit comments

Comments
 (0)