Skip to content

Commit fc6918c

Browse files
committed
update digest, improve argon2 code a bit
1 parent 88365d6 commit fc6918c

File tree

3 files changed

+36
-35
lines changed

3 files changed

+36
-35
lines changed

Cargo.lock

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

argon2/src/instance.rs

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
33
use crate::{Algorithm, Argon2, Block, Error, Memory, Params, Result, Version, SYNC_POINTS};
44
use blake2::{
5-
digest::{self, Output, VariableOutput},
6-
Blake2b512, Blake2bVar, Digest,
5+
digest::{self, Digest, Output, VariableOutput},
6+
Blake2b512, Blake2bVar,
77
};
88

99
#[cfg(feature = "parallel")]
@@ -416,14 +416,18 @@ fn blake2b_long(inputs: &[&[u8]], mut out: &mut [u8]) -> Result<()> {
416416
let outlen_bytes = (out.len() as u32).to_le_bytes();
417417

418418
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);
421423

422424
for input in inputs {
423-
digest::Update::update(&mut digest, input);
425+
Update::update(&mut digest, input);
424426
}
425427

426-
digest.finalize_variable(|hash| out.copy_from_slice(hash));
428+
digest
429+
.finalize_variable(out)
430+
.expect("`out` length is valid for Blake2bVar");
427431
} else {
428432
let mut digest = Blake2b512::new();
429433
digest.update(&outlen_bytes);
@@ -432,25 +436,22 @@ fn blake2b_long(inputs: &[&[u8]], mut out: &mut [u8]) -> Result<()> {
432436
digest.update(input);
433437
}
434438

435-
let mut out_buffer = [0u8; BLAKE2B_OUTBYTES];
436-
out_buffer.copy_from_slice(&digest.finalize());
439+
let mut hash = digest.finalize();
437440

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;
440442

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]);
442446

443447
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]);
449452
}
450453

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");
454455
}
455456

456457
Ok(())

argon2/tests/kat.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -293,9 +293,9 @@ fn argon2id_v0x13() {
293293
assert_eq!(out, expected_tag);
294294
}
295295

296-
/// =======================================
297-
/// Basic error checks
298-
/// =======================================
296+
// =======================================
297+
// Basic error checks
298+
// =======================================
299299

300300
#[test]
301301
fn salt_bad_length() {
@@ -306,7 +306,7 @@ fn salt_bad_length() {
306306
let ret = ctx.hash_password_into(b"password", &too_short_salt, &mut out);
307307
assert_eq!(ret, Err(Error::SaltTooShort));
308308

309-
// 4Go of RAM seems big, but as long as we ask for a zero-initialized vector
309+
// 4 GiB of RAM seems big, but as long as we ask for a zero-initialized vector
310310
// optimizations kicks in an nothing is really allocated
311311
let too_long_salt = vec![0u8; argon2::MAX_SALT_LEN + 1];
312312
let ret = ctx.hash_password_into(b"password", &too_long_salt, &mut out);
@@ -320,17 +320,17 @@ fn output_bad_length() {
320320
let ret = ctx.hash_password_into(b"password", b"diffsalt", &mut out);
321321
assert_eq!(ret, Err(Error::OutputTooShort));
322322

323-
// 4Go of RAM seems big, but as long as we ask for a zero-initialized vector
323+
// 4 GiB of RAM seems big, but as long as we ask for a zero-initialized vector
324324
// optimizations kicks in an nothing is really allocated
325325
let mut out = vec![0u8; Params::MAX_OUTPUT_LEN + 1];
326326
let ret = ctx.hash_password_into(b"password", b"diffsalt", &mut out);
327327
assert_eq!(ret, Err(Error::OutputTooLong));
328328
}
329329

330-
/// =======================================
331-
/// Reference implementation's test suite
332-
/// =======================================
333-
/// Taken from https://github.com/P-H-C/phc-winner-argon2/blob/master/src/test.c
330+
// =======================================
331+
// Reference implementation's test suite
332+
// =======================================
333+
// Taken from https://github.com/P-H-C/phc-winner-argon2/blob/master/src/test.c
334334

335335
fn hashtest(
336336
algorithm: Algorithm,

0 commit comments

Comments
 (0)