Skip to content

Commit 5d24b6a

Browse files
authored
argon2: error handling improvements (RustCrypto#180)
Adds a proper conversion between argon2::Error and password_hash::Error and uses it when hashing the password.
1 parent 02fcc37 commit 5d24b6a

File tree

2 files changed

+27
-12
lines changed

2 files changed

+27
-12
lines changed

argon2/src/error.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use core::fmt;
44

55
/// Error type.
6-
// TODO(tarcieri): finer-grained context-specific errors?
6+
// TODO(tarcieri): consolidate/replace with `password_hash::Error`
77
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
88
pub enum Error {
99
/// Associated data is too long
@@ -77,3 +77,28 @@ impl fmt::Display for Error {
7777
})
7878
}
7979
}
80+
81+
#[cfg(feature = "password-hash")]
82+
#[cfg_attr(docsrs, doc(cfg(feature = "password-hash")))]
83+
impl From<Error> for password_hash::Error {
84+
fn from(err: Error) -> password_hash::Error {
85+
match err {
86+
Error::AdTooLong => password_hash::Error::ParamValueInvalid,
87+
Error::AlgorithmInvalid => password_hash::Error::Algorithm,
88+
Error::LanesTooFew => password_hash::Error::ParamValueInvalid,
89+
Error::LanesTooMany => password_hash::Error::ParamValueInvalid,
90+
Error::MemoryTooLittle => password_hash::Error::ParamValueInvalid,
91+
Error::MemoryTooMuch => password_hash::Error::ParamValueInvalid,
92+
Error::PwdTooLong => password_hash::Error::Password,
93+
Error::OutputTooShort => password_hash::Error::OutputTooShort,
94+
Error::OutputTooLong => password_hash::Error::OutputTooLong,
95+
Error::SaltTooShort => password_hash::Error::SaltTooLong,
96+
Error::SaltTooLong => password_hash::Error::SaltTooLong,
97+
Error::SecretTooLong => password_hash::Error::ParamValueInvalid,
98+
Error::ThreadsTooFew => password_hash::Error::ParamValueInvalid,
99+
Error::ThreadsTooMany => password_hash::Error::ParamValueInvalid,
100+
Error::TimeTooSmall => password_hash::Error::ParamValueInvalid,
101+
Error::VersionInvalid => password_hash::Error::Version,
102+
}
103+
}
104+
}

argon2/src/lib.rs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -533,17 +533,7 @@ impl PasswordHasher for Argon2<'_> {
533533

534534
// TODO(tarcieri): improve this API to eliminate redundant checks above
535535
let output = password_hash::Output::init_with(params.output_size, |out| {
536-
hasher
537-
.hash_password_into(algorithm, password, salt_bytes, ad, out)
538-
.map_err(|e| {
539-
match e {
540-
Error::OutputTooShort => password_hash::Error::OutputTooShort,
541-
Error::OutputTooLong => password_hash::Error::OutputTooLong,
542-
// Other cases are not returned from `hash_password_into`
543-
// TODO(tarcieri): finer-grained error types?
544-
_ => panic!("unhandled error type: {}", e),
545-
}
546-
})
536+
Ok(hasher.hash_password_into(algorithm, password, salt_bytes, ad, out)?)
547537
})?;
548538

549539
let res = Ok(PasswordHash {

0 commit comments

Comments
 (0)