Argon2 enforce parallelism max 2^24-1

This commit is contained in:
Karel Miko 2026-07-18 20:18:10 +02:00
parent a68fa19bc2
commit a9d730a92c
2 changed files with 16 additions and 2 deletions

View file

@ -14,6 +14,7 @@
#define ARGON2_PREHASH_DIGEST_LEN 64
#define ARGON2_PREHASH_SEED_LEN 72
#define ARGON2_SYNC_POINTS 4
#define ARGON2_MAX_LANES 0xFFFFFF /* RFC 9106: parallelism p is at most 2^24-1 */
#define ARGON2_VERSION 0x13
#define ARGON2_MIN_OUTLEN 4
#define ARGON2_BLAKE2B_OUTBYTES 64
@ -497,10 +498,12 @@ int argon2_hash(const unsigned char *pwd, unsigned long pwdlen,
LTC_ARGCHK(secret != NULL || secretlen == 0);
LTC_ARGCHK(ad != NULL || adlen == 0);
LTC_ARGCHK(t_cost >= 1);
LTC_ARGCHK(parallelism >= 1);
LTC_ARGCHK(m_cost >= 8 * parallelism);
LTC_ARGCHK(type == ARGON2_D || type == ARGON2_I || type == ARGON2_ID);
if (parallelism < 1 || parallelism > ARGON2_MAX_LANES || m_cost < 8 * parallelism) {
return CRYPT_INVALID_ARG;
}
/* Align memory: ensure memory_blocks is a multiple of 4*parallelism */
memory_blocks = (ulong32)m_cost;
if (memory_blocks < 2 * ARGON2_SYNC_POINTS * (ulong32)parallelism) {

View file

@ -72,6 +72,17 @@ int argon2_test(void)
COMPARE_TESTVECTOR(tag, sizeof(tag), argon_testcase[n].expected, argon_testcase[n].elen, argon_testcase[n].name, n);
}
/* RFC 9106: parallelism is limited to 2^24-1 (16777216 == 2^24) */
if (argon2_hash(password, sizeof(password),
salt, sizeof(salt),
secret, sizeof(secret),
ad, sizeof(ad),
3, 134217728, 16777216,
ARGON2_ID,
tag, sizeof(tag)) != CRYPT_INVALID_ARG) {
return CRYPT_FAIL_TESTVECTOR;
}
return CRYPT_OK;
}