diff options
-rw-r--r-- | libar2_hash.c | 5 | ||||
-rw-r--r-- | test.c | 60 |
2 files changed, 45 insertions, 20 deletions
diff --git a/libar2_hash.c b/libar2_hash.c index 9d629f6..49bf61a 100644 --- a/libar2_hash.c +++ b/libar2_hash.c @@ -423,8 +423,11 @@ initial_hash(unsigned char hash[static 64], void *msg, size_t msglen, } if (n == 0) { off += libblake_blake2b_update(&state, SEGMENT(params->ad, params->adlen, off)); - if (params->adlen - off > 128) + if (params->adlen - off > 128) { + /* $covered{$ (not really possible, but just to be safe) */ off += libblake_blake2b_force_update(&state, SEGMENT(params->ad, params->adlen, off)); + /* $covered}$ */ + } memcpy(block, SEGMENT(params->ad, params->adlen, off)); n = params->adlen - off; } @@ -831,7 +831,9 @@ check_libar2_validate_params(void) static void -check_hash(const char *pwd_, size_t pwdlen, const char *hash, struct libar2_context *ctx, int lineno) +check_hash(const char *pwd_, size_t pwdlen, const char *hash, + void *key, size_t keylen, void *ad, size_t adlen, + struct libar2_context *ctx, int lineno) { struct libar2_argon2_parameters params; char *sbuf, output[512], pwd[512], output64[700]; @@ -842,6 +844,10 @@ check_hash(const char *pwd_, size_t pwdlen, const char *hash, struct libar2_cont strcpy(pwd, pwd_); plen = libar2_decode_params(hash, ¶ms, &sbuf, ctx); + params.key = key; + params.keylen = keylen; + params.ad = ad; + params.adlen = adlen; assert(!libar2_validate_params(¶ms, NULL)); assert(!libar2_hash(output, pwd, pwdlen, ¶ms, ctx)); libar2_encode_base64(output64, output, params.hashlen); @@ -892,12 +898,13 @@ check_libar2_erase(void) static void check_libar2_hash(void) { - char spaces[1024]; + char spaces[512]; + char zeroes[512]; memset(spaces, ' ', sizeof(spaces)); + memset(zeroes, 0, sizeof(zeroes)); -#if 1 #define CHECK(PWD, HASH)\ - check_hash(MEM(PWD), HASH, &ctx_st, __LINE__) + check_hash(MEM(PWD), HASH, NULL, 0, NULL, 0, &ctx_st, __LINE__) CHECK("\x00", "$argon2d$v=16$m=8,t=1,p=1$ICAgICAgICA$Eyx1BxGazSuPQoy7osaQuo20Dw9VI97dYUOgcC3cMgw"); CHECK("test", "$argon2i$v=19$m=4096,t=3,p=1$fn5/f35+f38$9tqKA4WMEsSAOEUwatjxvJLSqL1j0GQkgbsfnpresDw"); @@ -939,7 +946,7 @@ check_libar2_hash(void) #undef CHECK #define CHECK(PWD, HASH)\ - check_hash(MEM(PWD), HASH, &ctx_pt, __LINE__) + check_hash(MEM(PWD), HASH, NULL, 0, NULL, 0, &ctx_pt, __LINE__) CHECK("password", "$argon2i$m=256,t=2,p=2$c29tZXNhbHQ$tsEVYKap1h6scGt5ovl9aLRGOqOth+AMB+KwHpDFZPs"); CHECK("", "$argon2ds$v=16$m=8,t=1,p=2$ICAgICAgICA$+6+yBnWbuV7mLs6rKMhvi+SLbkzb5CB6Jd2pSWuC/Kw"); /* verified above */ @@ -947,23 +954,38 @@ check_libar2_hash(void) CHECK("password", "$argon2id$v=19$t=4,p=1,m=65536$c29tZXNhbHQ$kCXUjmjvc5XMqQedpMTsOv+zyJEf5PhtGiUghW9jFyw"); #undef CHECK -#endif -#define CHECK(PWDLEN, HASH)\ - check_hash(spaces, PWDLEN, HASH, &ctx_pt, __LINE__) +#define CHECK(PWDLEN, KEYLEN, ADLEN, HASH)\ + check_hash(spaces, PWDLEN, HASH, KEYLEN ? zeroes : NULL, KEYLEN, KEYLEN ? zeroes : NULL, ADLEN, &ctx_pt, __LINE__) /* these are calculated with reference implmentation */ - CHECK(1, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$MKifhakDKOM"); - CHECK(8, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$n6AxIe1Ch+Y"); - CHECK(16, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$n1jRvzIq/JI"); - CHECK(99, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$7f1A+np6ekI"); - CHECK(100, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$oQ0MP/+6pTE"); - CHECK(101, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$0nF5gzoood8"); - CHECK(96, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$JtutNzkqeVs"); - CHECK(88, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$uq+BEaf7YGs"); - CHECK(84, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$6fY3ZSyP1Yc"); - CHECK(85, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$EvoR6s6ZVs0"); - CHECK(83, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$q46jnJcAUCY"); + CHECK(1, 0, 0, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$MKifhakDKOM"); + CHECK(8, 0, 0, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$n6AxIe1Ch+Y"); + CHECK(16, 0, 0, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$n1jRvzIq/JI"); + CHECK(99, 0, 0, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$7f1A+np6ekI"); + CHECK(100, 0, 0, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$oQ0MP/+6pTE"); + CHECK(101, 0, 0, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$0nF5gzoood8"); + CHECK(96, 0, 0, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$JtutNzkqeVs"); + CHECK(88, 0, 0, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$uq+BEaf7YGs"); + CHECK(84, 0, 0, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$6fY3ZSyP1Yc"); + CHECK(85, 0, 0, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$EvoR6s6ZVs0"); + CHECK(83, 0, 0, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$q46jnJcAUCY"); + CHECK(1, 4, 0, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$Mhl4o3AkJuA"); + CHECK(84, 4, 0, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$+hlEcRn+F3s"); + CHECK(80, 4, 0, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$z2d6ce8UqS0"); + CHECK(80, 140, 0, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$15FAGe1KIX8"); + CHECK(80, 160, 0, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$oH3H5atuca8"); + CHECK(80, 128, 0, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$TsimqI1YC08"); + CHECK(80, 256, 0, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$mzPlVOVjVos"); + CHECK(1, 0, 16, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$HrfeSHrbdxk"); + CHECK(80, 0, 16, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$VRC9yoVQxGQ"); + CHECK(76, 0, 16, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$i8q267O+NzU"); + CHECK(76, 0, 128, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$fqP9Bhruhvs"); + CHECK(76, 0, 130, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$kZ/OfiPy33c"); + CHECK(76, 0, 160, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$XEdsiqJkQ4I"); + CHECK(80, 0, 160, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$2aPe8XbvFv0"); + CHECK(76, 0, 256, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$NlyQ7poTmcA"); + CHECK(80, 0, 128, "$argon2i$v=19$m=8,t=1,p=1$ICAgICAgICA$W214JDf8nik"); #undef CHECK } |