@@ -7,10 +7,10 @@ use std::{
7
7
sync:: RwLock ,
8
8
} ;
9
9
10
- use hmac:: { Hmac , Mac } ;
10
+ use hmac:: { digest :: Digest , Hmac , Mac , NewMac } ;
11
11
use lazy_static:: lazy_static;
12
12
use md5:: Md5 ;
13
- use sha1:: { Digest , Sha1 } ;
13
+ use sha1:: Sha1 ;
14
14
use sha2:: Sha256 ;
15
15
16
16
use crate :: {
@@ -42,7 +42,7 @@ const USERNAME_KEY: char = 'n';
42
42
const NO_CHANNEL_BINDING : char = 'n' ;
43
43
44
44
/// 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 ;
46
46
47
47
lazy_static ! {
48
48
/// Cache of pre-computed salted passwords.
@@ -55,7 +55,7 @@ lazy_static! {
55
55
struct CacheEntry {
56
56
password : String ,
57
57
salt : Vec < u8 > ,
58
- i : usize ,
58
+ i : u32 ,
59
59
mechanism : ScramVersion ,
60
60
}
61
61
@@ -298,7 +298,7 @@ impl ScramVersion {
298
298
}
299
299
300
300
/// 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 > {
302
302
match self {
303
303
ScramVersion :: Sha1 => h_i :: < Hmac < Sha1 > > ( str, salt, iterations, 160 / 8 ) ,
304
304
ScramVersion :: Sha256 => h_i :: < Hmac < Sha256 > > ( str, salt, iterations, 256 / 8 ) ,
@@ -311,14 +311,14 @@ impl ScramVersion {
311
311
& self ,
312
312
username : & str ,
313
313
password : & str ,
314
- i : usize ,
314
+ i : u32 ,
315
315
salt : & [ u8 ] ,
316
316
) -> Result < Vec < u8 > > {
317
317
let normalized_password = match self {
318
318
ScramVersion :: Sha1 => {
319
319
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 ( ) ) )
322
322
}
323
323
ScramVersion :: Sha256 => match stringprep:: saslprep ( password) {
324
324
Ok ( p) => p,
@@ -353,9 +353,9 @@ fn xor(lhs: &[u8], rhs: &[u8]) -> Vec<u8> {
353
353
. collect ( )
354
354
}
355
355
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 < ( ) > {
357
357
let mut mac = M :: new_varkey ( key) . map_err ( |_| Error :: unknown_authentication_error ( "SCRAM" ) ) ?;
358
- mac. input ( input) ;
358
+ mac. update ( input) ;
359
359
match mac. verify ( signature) {
360
360
Ok ( _) => Ok ( ( ) ) ,
361
361
Err ( _) => Err ( Error :: authentication_error (
@@ -367,11 +367,16 @@ fn mac_verify<M: Mac>(key: &[u8], input: &[u8], signature: &[u8]) -> Result<()>
367
367
368
368
fn hash < D : Digest > ( val : & [ u8 ] ) -> Vec < u8 > {
369
369
let mut hash = D :: new ( ) ;
370
- hash. input ( val) ;
371
- hash. result ( ) . to_vec ( )
370
+ hash. update ( val) ;
371
+ hash. finalize ( ) . to_vec ( )
372
372
}
373
373
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 > {
375
380
let mut buf = vec ! [ 0u8 ; output_size] ;
376
381
pbkdf2:: pbkdf2 :: < M > ( str. as_bytes ( ) , salt, iterations, buf. as_mut_slice ( ) ) ;
377
382
buf
@@ -469,7 +474,7 @@ struct ServerFirst {
469
474
message : String ,
470
475
nonce : String ,
471
476
salt : Vec < u8 > ,
472
- i : usize ,
477
+ i : u32 ,
473
478
}
474
479
475
480
impl ServerFirst {
@@ -494,7 +499,7 @@ impl ServerFirst {
494
499
let salt = base64:: decode ( parse_kvp ( parts[ 1 ] , SALT_KEY ) ?. as_str ( ) )
495
500
. map_err ( |_| Error :: invalid_authentication_response ( "SCRAM" ) ) ?;
496
501
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 ( ) {
498
503
Ok ( num) => num,
499
504
Err ( _) => {
500
505
return Err ( Error :: authentication_error (
@@ -530,7 +535,7 @@ impl ServerFirst {
530
535
self . salt . as_slice ( )
531
536
}
532
537
533
- fn i ( & self ) -> usize {
538
+ fn i ( & self ) -> u32 {
534
539
self . i
535
540
}
536
541
0 commit comments