diff options
Diffstat (limited to '')
-rw-r--r-- | test.c | 71 |
1 files changed, 70 insertions, 1 deletions
@@ -1,5 +1,10 @@ /* See LICENSE file for copyright and license details. */ #include "common.h" +#ifdef __linux__ +#include <sys/random.h> +#endif + +#define SALT_ALPHABET "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" #define MEM(S) S, sizeof(S) - 1 @@ -108,7 +113,69 @@ check_hash(const char *pwd, size_t pwdlen, const char *input, const char *output } -#define SALT_ALPHABET "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" +#ifdef __linux__ +static ssize_t getrandom_return; +static char getrandom_random0; +#endif + +ssize_t +getrandom(void *buf, size_t buflen, unsigned int flags) +{ + size_t i; + assert(flags == GRND_NONBLOCK); + if (getrandom_return < 0) + return getrandom_return; + for (i = 0; i < buflen && i < (size_t)getrandom_return; i++) + ((char *)buf)[i] = (char)((size_t)getrandom_random0 + i); + return (ssize_t)i; +} + +static void +check_random_salt_generate(void) +{ + struct libar2_argon2_parameters *params[8]; + size_t i, num_equal_first; + +#ifdef __linux__ + char expected_salt[8]; + const char *expected_salts[] = { + "AAAAAAAAAAA", + "BCBCBCBCBCB", + "CDECDECDECD", + "DEFGDEFGDEF", + "EFGHIEFGHIE", + "FGHIJKFGHIJ", + "GHIJKLMGHIJ", + "HIJKLMNOHIJ" + }; + + for (i = 0; i < sizeof(params) / sizeof(*params); i++) { + getrandom_return = (ssize_t)(i + 1); + getrandom_random0 = (char)i; + assert(!!(params[i] = libar2simplified_decode("$argon2d$v=16$m=8,t=1,p=1$*8$*8", NULL, NULL, NULL))); + assert_zueq(params[i]->saltlen, sizeof(expected_salt)); + libar2_decode_base64(expected_salts[i], expected_salt, &(size_t){0}); + assert(!memcmp(params[i]->salt, expected_salt, sizeof(expected_salt))); + free(params[i]); + } + + getrandom_return = -1; + getrandom_random0 = 0; +#endif + + num_equal_first = 0; + for (i = 0; i < sizeof(params) / sizeof(*params); i++) { + assert(!!(params[i] = libar2simplified_decode("$argon2d$v=16$m=8,t=1,p=1$*8$*8", NULL, NULL, NULL))); + } + for (i = 1; i < sizeof(params) / sizeof(*params); i++) { + assert_zueq(params[i]->saltlen, params[0]->saltlen); + num_equal_first += !memcmp(params[i]->salt, params[0]->salt, params[0]->saltlen); + free(params[i]); + } + free(params[0]); + assert(num_equal_first <= (sizeof(params) / sizeof(*params) - 1) / 4); +} + static int gensalt_ICAgICAgICA(char *out, size_t n) @@ -176,5 +243,7 @@ main(void) "NjODMrWrS7zeivNNpHsuxD9c6uDmUQ6YqPRhb8H5DSNw9n683FUCJZ3tyxgfJpYYANI" "+01WT/S5zp1UVs+qNRwnkdEyLKZMg+DIOXVc9z1po9ZlZG8+Gp4g5brqfza3lvkR9vw"); + check_random_salt_generate(); + return 0; } |