/* LibTomCrypt, modular cryptographic library -- Tom St Denis */ /* SPDX-License-Identifier: Unlicense */ #include #ifdef LTC_ARGON2 /* RFC 9106 test vectors */ int argon2_test(void) { static const unsigned char password[32] = { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }; static const unsigned char salt[16] = { 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02 }; static const unsigned char secret[8] = { 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 }; static const unsigned char ad[12] = { 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04 }; static const unsigned char expected_argon2d[32] = { 0x51, 0x2b, 0x39, 0x1b, 0x6f, 0x11, 0x62, 0x97, 0x53, 0x71, 0xd3, 0x09, 0x19, 0x73, 0x42, 0x94, 0xf8, 0x68, 0xe3, 0xbe, 0x39, 0x84, 0xf3, 0xc1, 0xa1, 0x3a, 0x4d, 0xb9, 0xfa, 0xbe, 0x4a, 0xcb }; static const unsigned char expected_argon2i[32] = { 0xc8, 0x14, 0xd9, 0xd1, 0xdc, 0x7f, 0x37, 0xaa, 0x13, 0xf0, 0xd7, 0x7f, 0x24, 0x94, 0xbd, 0xa1, 0xc8, 0xde, 0x6b, 0x01, 0x6d, 0xd3, 0x88, 0xd2, 0x99, 0x52, 0xa4, 0xc4, 0x67, 0x2b, 0x6c, 0xe8 }; static const unsigned char expected_argon2id[32] = { 0x0d, 0x64, 0x0d, 0xf5, 0x8d, 0x78, 0x76, 0x6c, 0x08, 0xc0, 0x37, 0xa3, 0x4a, 0x8b, 0x53, 0xc9, 0xd0, 0x1e, 0xf0, 0x45, 0x2d, 0x75, 0xb6, 0x5e, 0xb5, 0x25, 0x20, 0xe9, 0x6b, 0x01, 0xe6, 0x59 }; unsigned char tag[32]; const struct { const char *name; argon2_type type; const unsigned char *expected; unsigned long elen; } argon_testcase[] = { { "Argon2d", ARGON2_D, expected_argon2d, sizeof(expected_argon2d) }, { "Argon2i", ARGON2_I, expected_argon2i, sizeof(expected_argon2i) }, { "Argon2id", ARGON2_ID, expected_argon2id, sizeof(expected_argon2id) }, }; size_t n; for (n = 0; n < LTC_ARRAY_SIZE(argon_testcase); ++n) { DO(argon2_hash(password, sizeof(password), salt, sizeof(salt), secret, sizeof(secret), ad, sizeof(ad), 3, 32, 4, argon_testcase[n].type, tag, sizeof(tag))); 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; } #else LTC_NOP_TEST(argon2_test) #endif