2626//! assert!(firebase_scrypt.verify_password(password, salt, password_hash).unwrap())
2727//! ```
2828
29- use aes:: { cipher:: { KeyIvInit , StreamCipher } , Aes256 } ;
29+ use crate :: errors:: { DerivedKeyError , EncryptError , GenerateHashError } ;
30+ use aes:: {
31+ cipher:: { KeyIvInit , StreamCipher } ,
32+ Aes256 ,
33+ } ;
3034use constant_time_eq:: constant_time_eq;
3135use ctr:: Ctr128BE ;
3236use scrypt:: Params ;
33- use crate :: errors:: { DerivedKeyError , EncryptError , GenerateHashError } ;
3437
3538pub mod errors;
3639#[ cfg( feature = "simple" ) ]
@@ -64,12 +67,7 @@ fn generate_derived_key<'a>(
6467 let params = Params :: new ( log2_n as u8 , rounds, p) ?;
6568
6669 let mut result = [ 0u8 ; 64 ] ;
67- scrypt:: scrypt (
68- password,
69- salt. as_slice ( ) ,
70- & params,
71- & mut result
72- ) ?;
70+ scrypt:: scrypt ( password, salt. as_slice ( ) , & params, & mut result) ?;
7371
7472 Ok ( result)
7573}
@@ -78,8 +76,7 @@ fn encrypt(signer_key: &[u8], key: [u8; 32]) -> Result<Vec<u8>, EncryptError> {
7876 let mut cipher = Ctr128BE :: < Aes256 > :: new ( & key. into ( ) , & IV . into ( ) ) ;
7977
8078 let mut buffer = vec ! [ 0u8 ; signer_key. len( ) ] ;
81- cipher
82- . apply_keystream_b2b ( signer_key, & mut buffer) ?;
79+ cipher. apply_keystream_b2b ( signer_key, & mut buffer) ?;
8380
8481 Ok ( buffer)
8582}
@@ -123,24 +120,13 @@ pub fn verify_password(
123120 rounds : u32 ,
124121 mem_cost : u32 ,
125122) -> Result < bool , GenerateHashError > {
126- let password_hash = generate_raw_hash (
127- password,
128- salt,
129- salt_separator,
130- signer_key,
131- rounds,
132- mem_cost
133- ) ?;
134-
135- Ok (
136- constant_time_eq (
137- password_hash. as_slice ( ) ,
138- base64:: decode (
139- clean ( known_hash)
140- ) ?
141- . as_slice ( )
142- )
143- )
123+ let password_hash =
124+ generate_raw_hash ( password, salt, salt_separator, signer_key, rounds, mem_cost) ?;
125+
126+ Ok ( constant_time_eq (
127+ password_hash. as_slice ( ) ,
128+ base64:: decode ( clean ( known_hash) ) ?. as_slice ( ) ,
129+ ) )
144130}
145131
146132/// Generates a hash in the form of a [`Vec<u8>`]
@@ -182,7 +168,8 @@ pub fn generate_raw_hash(
182168 rounds : u32 ,
183169 mem_cost : u32 ,
184170) -> Result < Vec < u8 > , GenerateHashError > {
185- let derived_key = generate_derived_key ( password, & clean ( salt) , salt_separator, rounds, mem_cost) ?;
171+ let derived_key =
172+ generate_derived_key ( password, & clean ( salt) , salt_separator, rounds, mem_cost) ?;
186173 let signer_key = base64:: decode ( signer_key) ?;
187174
188175 let result = encrypt ( signer_key. as_slice ( ) , derived_key[ ..32 ] . try_into ( ) . unwrap ( ) ) ?;
@@ -192,13 +179,15 @@ pub fn generate_raw_hash(
192179#[ cfg( test) ]
193180mod tests {
194181 const SALT_SEPARATOR : & str = "Bw==" ;
195- const SIGNER_KEY : & str = "jxspr8Ki0RYycVU8zykbdLGjFQ3McFUH0uiiTvC8pVMXAn210wjLNmdZJzxUECKbm0QsEmYUSDzZvpjeJ9WmXA==" ;
182+ const SIGNER_KEY : & str =
183+ "jxspr8Ki0RYycVU8zykbdLGjFQ3McFUH0uiiTvC8pVMXAn210wjLNmdZJzxUECKbm0QsEmYUSDzZvpjeJ9WmXA==" ;
196184 const ROUNDS : u32 = 8 ;
197185 const MEM_COST : u32 = 14 ;
198186
199187 const PASSWORD : & str = "user1password" ;
200188 const SALT : & str = "42xEC+ixf3L2lw==" ;
201- const PASSWORD_HASH : & str ="lSrfV15cpx95/sZS2W9c9Kp6i/LVgQNDNC/qzrCnh1SAyZvqmZqAjTdn3aoItz+VHjoZilo78198JAdRuid5lQ==" ;
189+ const PASSWORD_HASH : & str =
190+ "lSrfV15cpx95/sZS2W9c9Kp6i/LVgQNDNC/qzrCnh1SAyZvqmZqAjTdn3aoItz+VHjoZilo78198JAdRuid5lQ==" ;
202191
203192 use super :: * ;
204193
@@ -212,27 +201,30 @@ mod tests {
212201 SIGNER_KEY ,
213202 ROUNDS ,
214203 MEM_COST
215- ) . unwrap( ) )
204+ )
205+ . unwrap( ) )
216206 }
217207
218208 #[ test]
219209 fn generate_hash_works ( ) {
220- assert_eq ! ( base64:: encode( generate_raw_hash(
221- PASSWORD ,
222- SALT ,
223- SALT_SEPARATOR ,
224- SIGNER_KEY ,
225- ROUNDS ,
226- MEM_COST ,
227- ) . unwrap( ) ) , PASSWORD_HASH )
210+ assert_eq ! (
211+ base64:: encode(
212+ generate_raw_hash( PASSWORD , SALT , SALT_SEPARATOR , SIGNER_KEY , ROUNDS , MEM_COST , )
213+ . unwrap( )
214+ ) ,
215+ PASSWORD_HASH
216+ )
228217 }
229218
230219 #[ test]
231220 fn encrypt_works ( ) {
232221 let param_1 = b"randomrandomrandomrandomrandomrandomrandom" ;
233222 let param_2 = b"12345678901234567890123456789012" ;
234223
235- assert_eq ! ( hex:: encode( encrypt( param_1, * param_2) . unwrap( ) ) , "09f509fa3d09cde568f80709416681e4ed5d9677ca8b4807a932869ba3fd057be3606c2940877850ed96" ) ;
224+ assert_eq ! (
225+ hex:: encode( encrypt( param_1, * param_2) . unwrap( ) ) ,
226+ "09f509fa3d09cde568f80709416681e4ed5d9677ca8b4807a932869ba3fd057be3606c2940877850ed96"
227+ ) ;
236228 }
237229
238230 #[ test]
0 commit comments