summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/random.c82
-rw-r--r--src/random.h16
-rw-r--r--tests/random.c34
3 files changed, 131 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)[]
+);
diff --git a/tests/random.c b/tests/random.c
index c894e59..09ad1a7 100644
--- a/tests/random.c
+++ b/tests/random.c
@@ -56,6 +56,25 @@ out:
return rc;
}
+static int
+test_random_new(void) {
+ // FIXME: implement these
+ return 0;
+}
+
+static int
+test_random_free(void) {
+ // FIXME: implement these
+ return 0;
+}
+
+static int
+test_random_generate(void) {
+ // FIXME: implement these
+ return 0;
+}
+
+
int
main(void) {
int rc = EXIT_FAILURE;
@@ -65,6 +84,21 @@ main(void) {
goto out;
}
+ if (test_random_new()) {
+ logerr("test_random_new()");
+ goto out;
+ }
+
+ if (test_random_free()) {
+ logerr("test_random_free()");
+ goto out;
+ }
+
+ if (test_random_generate()) {
+ logerr("test_random_generate()");
+ goto out;
+ }
+
rc = EXIT_SUCCESS;
out:
return rc;