summaryrefslogtreecommitdiff
path: root/src/random.c
diff options
context:
space:
mode:
authorEuAndreh <eu@euandre.org>2023-12-29 12:47:15 -0300
committerEuAndreh <eu@euandre.org>2025-03-20 15:58:40 -0300
commit51437318493e6f623631a73bd7f9389708cea537 (patch)
tree903ad1612db315d69d578db50c879f767bcc0c4f /src/random.c
parentAdd complete "Makefile" for standard packaging (diff)
downloadagahu-51437318493e6f623631a73bd7f9389708cea537.tar.gz
agahu-51437318493e6f623631a73bd7f9389708cea537.tar.xz
Rewrite code, but keeping the exact same semantic and behaviourHEADmain
- remove `#ifndef TWEETNACL_H` guard inside `tweetnacl.h`: as headers shouldn't include other headers; - remove `#define sv static void` golfing alias; - remove `#define FOR(i,n) for (i = 0;i < n;++i)` golfing alias; - assert that the generated `tweetnacl.o` code is identical to the original code, available at `tests/assert-identical.sh`; - remove all extra definitions from tweetnacl.h; - rewrite code with the correct indentation, spacing and formatting; - use C99 constructs over C89 (for loop variable declarations inside the parentheses); - use smaller types on loop variables, mostly `u8` over `int`, `i64`, etc.; - fix the public API; - add fuzz targets;
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);
+}