diff options
Diffstat (limited to 'src/random.c')
-rw-r--r-- | src/random.c | 74 |
1 files changed, 74 insertions, 0 deletions
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 <s.h> + +#include <assert.h> +#include <stdio.h> + +#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); +} |