diff options
author | Alex Xu (Hello71) <alex_y_xu@yahoo.ca> | 2018-08-10 09:42:35 -0400 |
---|---|---|
committer | Alex Xu (Hello71) <alex_y_xu@yahoo.ca> | 2018-08-10 09:42:35 -0400 |
commit | 59cfb5a84fd94fe72c4a19531bf014564a8b31f2 (patch) | |
tree | 9dfb7ee7a30919185e73841a1c31dd64072c3cee /util.c | |
parent | 07919e2ba58c8ad92207526299339d113855963e (diff) | |
download | random-seed-59cfb5a84fd94fe72c4a19531bf014564a8b31f2.tar.xz random-seed-59cfb5a84fd94fe72c4a19531bf014564a8b31f2.zip |
Cleanup code, add TEST_WRAPPER support.
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 30 |
1 files changed, 29 insertions, 1 deletions
@@ -68,7 +68,7 @@ void hash(const unsigned char salt[static SALT_LEN], unsigned char *out, const v sha256_final(&ctx, out); } -void print_hash(const unsigned char digest[static HASH_LEN]) { +static void print_hash(const unsigned char digest[static HASH_LEN]) { #ifdef DEBUG char hash[HASH_LEN*2+1]; mem2hex(hash, digest, HASH_LEN); @@ -93,3 +93,31 @@ bool hash_match(const unsigned char digest[static HASH_LEN], const char *arg) { #endif return !memcmp(digest, theirdigest, HASH_LEN); } + +ssize_t random_get(void *buf, size_t buflen, unsigned int flags) { + memset(buf, 0, buflen); + + long rv = syscall(SYS_getrandom, buf, buflen, flags); + if (rv == -1) { + if (errno == ENOSYS) { + fputs("getrandom returned ENOSYS. random-seed requires Linux 3.17\n", stderr); + exit(1); + } + } else { + bool all_zero = true; + if (buflen > 32) { + for (size_t i = 0; i < buflen; i++) { + if (((unsigned char *)buf)[i] != 0) { + all_zero = false; + break; + } + } + } + if (all_zero) { + fputs("getrandom returned all zeros, probably broken\n", stderr); + exit(1); + } + } + + return rv; +} |