summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEuAndreh <eu@euandre.org>2024-07-05 09:46:35 -0300
committerEuAndreh <eu@euandre.org>2024-07-05 09:46:35 -0300
commite8e58c09ae2845d79d6ba894af5d8347e2b3a657 (patch)
tree956e9a9ef27c2627daf9b512e8ac79d9b5c7c4d1 /src
parentsrc/util.c: Tolerate be given a NULL pointer (diff)
downloadpindaiba-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.c82
-rw-r--r--src/random.h16
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)[]
+);