@@ -7,10 +7,10 @@ use std::{
77 sync:: RwLock ,
88} ;
99
10- use hmac:: { Hmac , Mac } ;
10+ use hmac:: { digest :: Digest , Hmac , Mac , NewMac } ;
1111use lazy_static:: lazy_static;
1212use md5:: Md5 ;
13- use sha1:: { Digest , Sha1 } ;
13+ use sha1:: Sha1 ;
1414use sha2:: Sha256 ;
1515
1616use crate :: {
@@ -42,7 +42,7 @@ const USERNAME_KEY: char = 'n';
4242const NO_CHANNEL_BINDING : char = 'n' ;
4343
4444/// The minimum number of iterations of the hash function that we will accept from the server.
45- const MIN_ITERATION_COUNT : usize = 4096 ;
45+ const MIN_ITERATION_COUNT : u32 = 4096 ;
4646
4747lazy_static ! {
4848 /// Cache of pre-computed salted passwords.
@@ -55,7 +55,7 @@ lazy_static! {
5555struct CacheEntry {
5656 password : String ,
5757 salt : Vec < u8 > ,
58- i : usize ,
58+ i : u32 ,
5959 mechanism : ScramVersion ,
6060}
6161
@@ -298,7 +298,7 @@ impl ScramVersion {
298298 }
299299
300300 /// The "h_i" function as defined in the SCRAM RFC.
301- fn h_i ( & self , str : & str , salt : & [ u8 ] , iterations : usize ) -> Vec < u8 > {
301+ fn h_i ( & self , str : & str , salt : & [ u8 ] , iterations : u32 ) -> Vec < u8 > {
302302 match self {
303303 ScramVersion :: Sha1 => h_i :: < Hmac < Sha1 > > ( str, salt, iterations, 160 / 8 ) ,
304304 ScramVersion :: Sha256 => h_i :: < Hmac < Sha256 > > ( str, salt, iterations, 256 / 8 ) ,
@@ -311,14 +311,14 @@ impl ScramVersion {
311311 & self ,
312312 username : & str ,
313313 password : & str ,
314- i : usize ,
314+ i : u32 ,
315315 salt : & [ u8 ] ,
316316 ) -> Result < Vec < u8 > > {
317317 let normalized_password = match self {
318318 ScramVersion :: Sha1 => {
319319 let mut md5 = Md5 :: new ( ) ;
320- md5. input ( format ! ( "{}:mongo:{}" , username, password) ) ;
321- Cow :: Owned ( hex:: encode ( md5. result ( ) ) )
320+ md5. update ( format ! ( "{}:mongo:{}" , username, password) ) ;
321+ Cow :: Owned ( hex:: encode ( md5. finalize ( ) ) )
322322 }
323323 ScramVersion :: Sha256 => match stringprep:: saslprep ( password) {
324324 Ok ( p) => p,
@@ -353,9 +353,9 @@ fn xor(lhs: &[u8], rhs: &[u8]) -> Vec<u8> {
353353 . collect ( )
354354}
355355
356- fn mac_verify < M : Mac > ( key : & [ u8 ] , input : & [ u8 ] , signature : & [ u8 ] ) -> Result < ( ) > {
356+ fn mac_verify < M : Mac + NewMac > ( key : & [ u8 ] , input : & [ u8 ] , signature : & [ u8 ] ) -> Result < ( ) > {
357357 let mut mac = M :: new_varkey ( key) . map_err ( |_| Error :: unknown_authentication_error ( "SCRAM" ) ) ?;
358- mac. input ( input) ;
358+ mac. update ( input) ;
359359 match mac. verify ( signature) {
360360 Ok ( _) => Ok ( ( ) ) ,
361361 Err ( _) => Err ( Error :: authentication_error (
@@ -367,11 +367,16 @@ fn mac_verify<M: Mac>(key: &[u8], input: &[u8], signature: &[u8]) -> Result<()>
367367
368368fn hash < D : Digest > ( val : & [ u8 ] ) -> Vec < u8 > {
369369 let mut hash = D :: new ( ) ;
370- hash. input ( val) ;
371- hash. result ( ) . to_vec ( )
370+ hash. update ( val) ;
371+ hash. finalize ( ) . to_vec ( )
372372}
373373
374- fn h_i < M : Mac + Sync > ( str : & str , salt : & [ u8 ] , iterations : usize , output_size : usize ) -> Vec < u8 > {
374+ fn h_i < M : Mac + NewMac + Sync > (
375+ str : & str ,
376+ salt : & [ u8 ] ,
377+ iterations : u32 ,
378+ output_size : usize ,
379+ ) -> Vec < u8 > {
375380 let mut buf = vec ! [ 0u8 ; output_size] ;
376381 pbkdf2:: pbkdf2 :: < M > ( str. as_bytes ( ) , salt, iterations, buf. as_mut_slice ( ) ) ;
377382 buf
@@ -469,7 +474,7 @@ struct ServerFirst {
469474 message : String ,
470475 nonce : String ,
471476 salt : Vec < u8 > ,
472- i : usize ,
477+ i : u32 ,
473478}
474479
475480impl ServerFirst {
@@ -494,7 +499,7 @@ impl ServerFirst {
494499 let salt = base64:: decode ( parse_kvp ( parts[ 1 ] , SALT_KEY ) ?. as_str ( ) )
495500 . map_err ( |_| Error :: invalid_authentication_response ( "SCRAM" ) ) ?;
496501
497- let i: usize = match parse_kvp ( parts[ 2 ] , ITERATION_COUNT_KEY ) ?. parse ( ) {
502+ let i: u32 = match parse_kvp ( parts[ 2 ] , ITERATION_COUNT_KEY ) ?. parse ( ) {
498503 Ok ( num) => num,
499504 Err ( _) => {
500505 return Err ( Error :: authentication_error (
@@ -530,7 +535,7 @@ impl ServerFirst {
530535 self . salt . as_slice ( )
531536 }
532537
533- fn i ( & self ) -> usize {
538+ fn i ( & self ) -> u32 {
534539 self . i
535540 }
536541
0 commit comments