From 8ab638b98364e93e6ad43a9e0f759c3d076080eb Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Wed, 8 Nov 2017 12:53:37 +0100 Subject: [PATCH] argon2: let fill_memory_blocks() accept a pass counter --- .../crypto_pwhash/argon2/argon2-core.c | 24 +++++++++---------- .../crypto_pwhash/argon2/argon2-core.h | 3 ++- src/libsodium/crypto_pwhash/argon2/argon2.c | 6 ++++- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/libsodium/crypto_pwhash/argon2/argon2-core.c b/src/libsodium/crypto_pwhash/argon2/argon2-core.c index 588756b0..174a3876 100644 --- a/src/libsodium/crypto_pwhash/argon2/argon2-core.c +++ b/src/libsodium/crypto_pwhash/argon2/argon2-core.c @@ -288,27 +288,25 @@ index_alpha(const argon2_instance_t *instance, } void -fill_memory_blocks(argon2_instance_t *instance) +fill_memory_blocks(argon2_instance_t *instance, uint32_t pass) { - uint32_t r, s; + uint32_t s; if (instance == NULL || instance->lanes == 0) { return; /* LCOV_EXCL_LINE */ } - for (r = 0; r < instance->passes; ++r) { - for (s = 0; s < ARGON2_SYNC_POINTS; ++s) { - uint32_t l; + for (s = 0; s < ARGON2_SYNC_POINTS; ++s) { + uint32_t l; - for (l = 0; l < instance->lanes; ++l) { - argon2_position_t position; + for (l = 0; l < instance->lanes; ++l) { + argon2_position_t position; - position.pass = r; - position.lane = l; - position.slice = (uint8_t) s; - position.index = 0; - fill_segment(instance, position); - } + position.pass = pass; + position.lane = l; + position.slice = (uint8_t) s; + position.index = 0; + fill_segment(instance, position); } } } diff --git a/src/libsodium/crypto_pwhash/argon2/argon2-core.h b/src/libsodium/crypto_pwhash/argon2/argon2-core.h index ab259bdf..0c07bc2b 100644 --- a/src/libsodium/crypto_pwhash/argon2/argon2-core.h +++ b/src/libsodium/crypto_pwhash/argon2/argon2-core.h @@ -96,6 +96,7 @@ typedef struct Argon2_instance_t { block_region *region; /* Memory region pointer */ uint64_t *pseudo_rands; uint32_t passes; /* Number of passes */ + uint32_t current_pass; uint32_t memory_blocks; /* Number of blocks in memory */ uint32_t segment_length; uint32_t lane_length; @@ -224,6 +225,6 @@ void fill_segment_ref(const argon2_instance_t *instance, * @param instance Pointer to the current instance * @return Zero if successful, -1 if memory failed to allocate */ -void fill_memory_blocks(argon2_instance_t *instance); +void fill_memory_blocks(argon2_instance_t *instance, uint32_t pass); #endif diff --git a/src/libsodium/crypto_pwhash/argon2/argon2.c b/src/libsodium/crypto_pwhash/argon2/argon2.c index 3eb4b97e..ac1628c9 100644 --- a/src/libsodium/crypto_pwhash/argon2/argon2.c +++ b/src/libsodium/crypto_pwhash/argon2/argon2.c @@ -29,6 +29,7 @@ argon2_ctx(argon2_context *context, argon2_type type) /* 1. Validate all inputs */ int result = validate_inputs(context); uint32_t memory_blocks, segment_length; + uint32_t pass; argon2_instance_t instance; if (ARGON2_OK != result) { @@ -53,6 +54,7 @@ argon2_ctx(argon2_context *context, argon2_type type) instance.region = NULL; instance.passes = context->t_cost; + instance.current_pass = ~ 0U; instance.memory_blocks = memory_blocks; instance.segment_length = segment_length; instance.lane_length = segment_length * ARGON2_SYNC_POINTS; @@ -70,7 +72,9 @@ argon2_ctx(argon2_context *context, argon2_type type) } /* 4. Filling memory */ - fill_memory_blocks(&instance); + for (pass = 0; pass < instance.passes; pass++) { + fill_memory_blocks(&instance, pass); + } /* 5. Finalization */ finalize(context, &instance);