summaryrefslogtreecommitdiff
path: root/src/random.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/random.c')
-rw-r--r--src/random.c74
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);
+}