From 26e8b0253f043189f3210cd29e1d6af6cec26384 Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Sun, 18 Sep 2016 09:33:35 +0200 Subject: [PATCH] Argon2: check that m_cost/t_cost/lanes decode to uint32 --- .../crypto_pwhash/argon2/argon2-encoding.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/libsodium/crypto_pwhash/argon2/argon2-encoding.c b/src/libsodium/crypto_pwhash/argon2/argon2-encoding.c index 9f8d63c6..05c4bba6 100644 --- a/src/libsodium/crypto_pwhash/argon2/argon2-encoding.c +++ b/src/libsodium/crypto_pwhash/argon2/argon2-encoding.c @@ -293,6 +293,7 @@ int decode_string(argon2_context *ctx, const char *str, argon2_type type) { size_t maxadlen = ctx->adlen; size_t maxsaltlen = ctx->saltlen; size_t maxoutlen = ctx->outlen; + unsigned long val; unsigned long version = 0; int validation_result; @@ -310,11 +311,23 @@ int decode_string(argon2_context *ctx, const char *str, argon2_type type) { return ARGON2_INCORRECT_TYPE; } CC("$m="); - DECIMAL(ctx->m_cost); + DECIMAL(val); + if (val > UINT32_MAX) { + return ARGON2_INCORRECT_TYPE; + } + ctx->m_cost = (uint32_t) val; CC(",t="); - DECIMAL(ctx->t_cost); + DECIMAL(val); + if (val > UINT32_MAX) { + return ARGON2_INCORRECT_TYPE; + } + ctx->t_cost = (uint32_t) val; CC(",p="); - DECIMAL(ctx->lanes); + DECIMAL(val); + if (val > UINT32_MAX) { + return ARGON2_INCORRECT_TYPE; + } + ctx->lanes = (uint32_t) val; ctx->threads = ctx->lanes; CC_opt(",data=", BIN(ctx->ad, maxadlen, ctx->adlen));