aboutsummaryrefslogtreecommitdiff
path: root/src/rnd.c
diff options
context:
space:
mode:
authorDavid Timber <mieabby@gmail.com>2020-01-11 18:03:47 +1100
committerDavid Timber <mieabby@gmail.com>2020-01-11 18:03:47 +1100
commit10512fc50e6184397206a41c157c09d9b02e9e1a (patch)
tree5f0779032edf0f0710400ae6c99b9a3f2977735d /src/rnd.c
parent129e12d7685a6ea99fde514ad104a0368a19033d (diff)
staged resolv_worker
* replaced RNG from `rnd` to `mbedtls_ctr_drbg` * use of `uint_fastN_t` where appropriate * heartbeat protocol draft * improved worker scheduling mech
Diffstat (limited to 'src/rnd.c')
-rw-r--r--src/rnd.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/rnd.c b/src/rnd.c
index 597aa60..b44b07e 100644
--- a/src/rnd.c
+++ b/src/rnd.c
@@ -2,6 +2,10 @@
#include "util_rt.h"
#include <stdlib.h>
+#include <time.h>
+
+#include <unistd.h>
+#include <sys/random.h>
#define N ((size_t)624)
@@ -92,3 +96,26 @@ uint32_t prne_rnd_gen_int (prne_rnd_engine_t *engine) {
double prne_rnd_gen_double (prne_rnd_engine_t *engine) {
return (double)prne_rnd_gen_int(engine) * 2.3283064370807974e-10;
}
+
+prne_rnd_engine_t *prne_mk_rnd_engine (void) {
+ uint32_t seed = 0;
+ prne_rnd_engnie_alloc_result_t ret;
+
+ getrandom(&seed, sizeof(uint32_t), 0);
+
+ if (seed == 0) {
+ // fall back to seeding with what's available.
+ seed =
+ (uint32_t)(time(NULL) % 0xFFFFFFFF) ^
+ (uint32_t)(getpid() % 0xFFFFFFFF) ^
+ (uint32_t)(getppid() % 0xFFFFFFFF) ^
+ (uint32_t)(clock() % 0xFFFFFFFF);
+ }
+
+ ret = prne_alloc_rnd_engine(seed == 0 ? NULL : &seed);
+ if (ret.result != PRNE_RND_ENGINE_ALLOC_OK) {
+ return NULL;
+ }
+
+ return ret.engine;
+}