From 51437318493e6f623631a73bd7f9389708cea537 Mon Sep 17 00:00:00 2001 From: EuAndreh Date: Fri, 29 Dec 2023 12:47:15 -0300 Subject: Rewrite code, but keeping the exact same semantic and behaviour - remove `#ifndef TWEETNACL_H` guard inside `tweetnacl.h`: as headers shouldn't include other headers; - remove `#define sv static void` golfing alias; - remove `#define FOR(i,n) for (i = 0;i < n;++i)` golfing alias; - assert that the generated `tweetnacl.o` code is identical to the original code, available at `tests/assert-identical.sh`; - remove all extra definitions from tweetnacl.h; - rewrite code with the correct indentation, spacing and formatting; - use C99 constructs over C89 (for loop variable declarations inside the parentheses); - use smaller types on loop variables, mostly `u8` over `int`, `i64`, etc.; - fix the public API; - add fuzz targets; --- src/random.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/random.c (limited to 'src/random.c') diff --git a/src/random.c b/src/random.c new file mode 100644 index 0000000..de94783 --- /dev/null +++ b/src/random.c @@ -0,0 +1,74 @@ +#include + +#include +#include + +#include "random.h" + + + +static FILE * +FH = NULL; + + + +int +random_init(void) { + int rc = -1; + + FH = fopen("/dev/urandom", "r"); + if (FH == NULL) { + perror("fopen()"); + goto out; + } + + rc = 0; +out: + return rc; +} + +int +random_destroy(void) { + if (FH == NULL) { + return 0; + } + + int rc = -1; + + if (fclose(FH)) { + perror("fclose()"); + goto out; + } + + rc = 0; +out: + FH = NULL; + return rc; +} + +static int +random_generate(const unsigned long long length, unsigned char *const out) { + int rc = -1; + + const size_t read_count = fread(out, 1U, length, FH); + if (ferror(FH)) { + perror("fread()"); + goto out; + } + assert(read_count == length); + + rc = 0; +out: + return rc; +} + +void +random_bytes(unsigned char *const out, const unsigned long long length) { + assert(FH != NULL); + assert(random_generate(length, out) == 0); +} + +void +randombytes(unsigned char *const out, const unsigned long long length) { + random_bytes(out, length); +} -- cgit v1.2.3