diff options
author | EuAndreh <eu@euandre.org> | 2024-07-05 09:46:35 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2024-07-05 09:46:35 -0300 |
commit | e8e58c09ae2845d79d6ba894af5d8347e2b3a657 (patch) | |
tree | 956e9a9ef27c2627daf9b512e8ac79d9b5c7c4d1 /src | |
parent | src/util.c: Tolerate be given a NULL pointer (diff) | |
download | pindaiba-e8e58c09ae2845d79d6ba894af5d8347e2b3a657.tar.gz pindaiba-e8e58c09ae2845d79d6ba894af5d8347e2b3a657.tar.xz |
src/random.h: Add initial implementation of random_{new,free,generate}()
Diffstat (limited to 'src')
-rw-r--r-- | src/random.c | 82 | ||||
-rw-r--r-- | src/random.h | 16 |
2 files changed, 97 insertions, 1 deletions
diff --git a/src/random.c b/src/random.c index df2d3ff..b409e6a 100644 --- a/src/random.c +++ b/src/random.c @@ -13,6 +13,13 @@ #include "random.h" + +struct Random { + FILE *const file_handle; +}; + + + int urandom_bytes(const size_t n, uint8_t (*const addr)[]) { int rc = -1; @@ -32,7 +39,7 @@ urandom_bytes(const size_t n, uint8_t (*const addr)[]) { goto out; } - const size_t read_count = fread(ret, 1, n, f); + const size_t read_count = fread(ret, 1U, n, f); if (ferror(f)) { logerr("fread(): %s", strerror(errno)); goto out; @@ -59,3 +66,76 @@ out: } return rc; } + +int +random_generate( + const struct Random *const r, + const size_t length, + uint8_t (*const out)[] +) { + int rc = -1; + + const size_t read_count = fread(out, 1U, length, r->file_handle); + if (ferror(r->file_handle)) { + logerr("fread(): %s", strerror(errno)); + goto out; + } + assert(read_count == length); + + rc = 0; +out: + return rc; +} + +int +random_new(const struct Random **const out) { + int rc = -1; + + const struct Random *ret = NULL; + FILE *f = NULL; + + ret = malloc(sizeof(*ret)); + if (ret == NULL) { + logerr("malloc(): %s", strerror(errno)); + goto out; + } + + f = fopen("/dev/urandom", "r"); + if (f == NULL) { + logerr("fopen(): %s", strerror(errno)); + goto out; + } + + memcpy((void *)ret, &(struct Random) { + .file_handle = f, + }, sizeof(*ret)); + *out = ret; + rc = 0; +out: + if (rc) { + random_free(&ret); + } + return rc; +} + +int +random_free(const struct Random **const r) { + if (r == NULL) { + return 0; + } + + if (*r == NULL) { + return 0; + } + + int rc = -1; + if (fclose((*r)->file_handle)) { + logerr("fclose(): %s", strerror(errno)); + goto out; + } + + rc = 0; +out: + freeit((void *)r); + return rc; +} diff --git a/src/random.h b/src/random.h index ffaa69e..4b31abb 100644 --- a/src/random.h +++ b/src/random.h @@ -1,2 +1,18 @@ +struct Random; + + int urandom_bytes(const size_t n, uint8_t (*const addr)[]); + +int +random_new(const struct Random **out); + +int +random_free(const struct Random **r); + +int +random_generate( + const struct Random *r, + const size_t length, + uint8_t (*const out)[] +); |