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//!
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//! //
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//!
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" ) ]
163163pub 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
168170use crate :: blake2b_long:: blake2b_long;
@@ -171,7 +173,7 @@ use core::fmt;
171173use 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" ) ]
177179use 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+
683686impl 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) ]
697700mod 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
0 commit comments