2
2
3
3
use crate :: { Algorithm , Argon2 , Block , Error , Memory , Params , Result , Version , SYNC_POINTS } ;
4
4
use blake2:: {
5
- digest:: { self , Output , VariableOutput } ,
6
- Blake2b512 , Blake2bVar , Digest ,
5
+ digest:: { self , Digest , Output , VariableOutput } ,
6
+ Blake2b512 , Blake2bVar ,
7
7
} ;
8
8
9
9
#[ cfg( feature = "parallel" ) ]
@@ -416,14 +416,18 @@ fn blake2b_long(inputs: &[&[u8]], mut out: &mut [u8]) -> Result<()> {
416
416
let outlen_bytes = ( out. len ( ) as u32 ) . to_le_bytes ( ) ;
417
417
418
418
if out. len ( ) <= BLAKE2B_OUTBYTES {
419
- let mut digest = Blake2bVar :: new ( out. len ( ) ) . unwrap ( ) ;
420
- digest:: Update :: update ( & mut digest, & outlen_bytes) ;
419
+ use digest:: Update ;
420
+
421
+ let mut digest = Blake2bVar :: new ( out. len ( ) ) . expect ( "`out` length is valid for Blake2bVar" ) ;
422
+ Update :: update ( & mut digest, & outlen_bytes) ;
421
423
422
424
for input in inputs {
423
- digest :: Update :: update ( & mut digest, input) ;
425
+ Update :: update ( & mut digest, input) ;
424
426
}
425
427
426
- digest. finalize_variable ( |hash| out. copy_from_slice ( hash) ) ;
428
+ digest
429
+ . finalize_variable ( out)
430
+ . expect ( "`out` length is valid for Blake2bVar" ) ;
427
431
} else {
428
432
let mut digest = Blake2b512 :: new ( ) ;
429
433
digest. update ( & outlen_bytes) ;
@@ -432,25 +436,22 @@ fn blake2b_long(inputs: &[&[u8]], mut out: &mut [u8]) -> Result<()> {
432
436
digest. update ( input) ;
433
437
}
434
438
435
- let mut out_buffer = [ 0u8 ; BLAKE2B_OUTBYTES ] ;
436
- out_buffer. copy_from_slice ( & digest. finalize ( ) ) ;
439
+ let mut hash = digest. finalize ( ) ;
437
440
438
- out[ ..( BLAKE2B_OUTBYTES / 2 ) ] . copy_from_slice ( & out_buffer[ ..( BLAKE2B_OUTBYTES / 2 ) ] ) ;
439
- out = & mut out[ ( BLAKE2B_OUTBYTES / 2 ) ..] ;
441
+ let n = BLAKE2B_OUTBYTES / 2 ;
440
442
441
- let mut in_buffer = [ 0u8 ; BLAKE2B_OUTBYTES ] ;
443
+ let ( chunk, tail) = out. split_at_mut ( n) ;
444
+ out = tail;
445
+ chunk. copy_from_slice ( & hash[ ..n] ) ;
442
446
443
447
while out. len ( ) > BLAKE2B_OUTBYTES {
444
- in_buffer. copy_from_slice ( & out_buffer) ;
445
- out_buffer. copy_from_slice ( & Blake2b512 :: digest ( & in_buffer) ) ;
446
-
447
- out[ ..( BLAKE2B_OUTBYTES / 2 ) ] . copy_from_slice ( & out_buffer[ ..( BLAKE2B_OUTBYTES / 2 ) ] ) ;
448
- out = & mut out[ ( BLAKE2B_OUTBYTES / 2 ) ..] ;
448
+ let ( chunk, tail) = out. split_at_mut ( n) ;
449
+ out = tail;
450
+ hash = Blake2b512 :: digest ( & hash) ;
451
+ chunk. copy_from_slice ( & hash[ ..n] ) ;
449
452
}
450
453
451
- let mut digest = Blake2bVar :: new ( out. len ( ) ) . unwrap ( ) ;
452
- digest:: Update :: update ( & mut digest, & out_buffer) ;
453
- digest. finalize_variable ( |hash| out. copy_from_slice ( hash) ) ;
454
+ Blake2bVar :: digest_variable ( & hash, out) . expect ( "`out` length is valid for Blake2bVar" ) ;
454
455
}
455
456
456
457
Ok ( ( ) )
0 commit comments