aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorJ08nY2017-05-31 23:07:35 +0200
committerJ08nY2017-05-31 23:07:35 +0200
commit637702cb14fe7133f3cffe58eaaca4186d67fc43 (patch)
treebdbb50a3fd8cae28a1c767d3fe20a3c0c752cab9 /src/util
parentba8c1f2bc424205cbb167b3c65ce184912c6173a (diff)
downloadecgen-637702cb14fe7133f3cffe58eaaca4186d67fc43.tar.gz
ecgen-637702cb14fe7133f3cffe58eaaca4186d67fc43.tar.zst
ecgen-637702cb14fe7133f3cffe58eaaca4186d67fc43.zip
Move stuff related to generators to src/gen.
Diffstat (limited to 'src/util')
-rw-r--r--src/util/random.c64
-rw-r--r--src/util/random.h39
2 files changed, 103 insertions, 0 deletions
diff --git a/src/util/random.c b/src/util/random.c
new file mode 100644
index 0000000..519ce6b
--- /dev/null
+++ b/src/util/random.c
@@ -0,0 +1,64 @@
+/*
+ * ecgen, tool for generating Elliptic curve domain parameters
+ * Copyright (C) 2017 J08nY
+ */
+#define _POSIX_C_SOURCE 200809L
+
+#include "random.h"
+#include <time.h>
+
+bool random_init(void) {
+ pari_ulong seed = 0;
+ // Try urandom first
+ FILE *rand = fopen("/dev/urandom", "rb");
+ if (rand) {
+ size_t read = 0;
+ while (read < sizeof(pari_ulong)) {
+ read += fread(&seed + read, 1, sizeof(pari_ulong) - read, rand);
+ }
+
+ fclose(rand);
+ }
+ // Try worse methods later
+ if (seed == 0) {
+ struct timespec t;
+ if (!clock_gettime(CLOCK_REALTIME, &t)) {
+ seed = (pari_ulong)t.tv_nsec;
+ } else {
+ seed = (pari_ulong)time(NULL);
+ }
+ }
+
+ pari_sp ltop = avma;
+ setrand(utoi(seed));
+ avma = ltop;
+
+ return true;
+}
+
+GEN random_prime(unsigned long bits) {
+ pari_sp ltop = avma;
+
+ GEN range = gtovec0(gen_0, 2);
+ gel(range, 1) = powis(gen_2, bits - 1);
+ gel(range, 2) = powis(gen_2, bits);
+
+ GEN p;
+ pari_sp btop = avma;
+ do {
+ p = randomprime(range);
+ p = gerepileupto(btop, p);
+ } while (!isprime(p));
+
+ return gerepilecopy(ltop, p);
+}
+
+GEN random_int(unsigned long bits) {
+ pari_sp ltop = avma;
+
+ GEN range = gtovec0(gen_0, 2);
+ gel(range, 1) = powis(gen_2, bits - 1);
+ gel(range, 2) = powis(gen_2, bits);
+
+ return gerepilecopy(ltop, genrand(range));
+}
diff --git a/src/util/random.h b/src/util/random.h
new file mode 100644
index 0000000..96eb210
--- /dev/null
+++ b/src/util/random.h
@@ -0,0 +1,39 @@
+/*
+ * ecgen, tool for generating Elliptic curve domain parameters
+ * Copyright (C) 2017 J08nY
+ */
+/**
+ * @file random.h
+ */
+#ifndef ECGEN_RANDOM_H
+#define ECGEN_RANDOM_H
+
+#include <pari/pari.h>
+#include <stdbool.h>
+
+/**
+ * @brief Init the PARI-GP random generator.
+ *
+ * Initializes the PARI-GP random generator, tries to do so from
+ * cryptographically strong sources(/dev/urandom) at first but falls back on
+ * clock_gettime and time(NULL).
+ *
+ * @return whether the initialization was successful
+ */
+bool random_init(void);
+
+/**
+ * @brief Generate random <code>bits</code> sized prime.
+ * @param bits the size of the prime to generate
+ * @return a random prime in range [2^(bits - 1), 2^bits]
+ */
+GEN random_prime(unsigned long bits);
+
+/**
+ * @brief Generate random <code>bits</code> sized integer.
+ * @param bits the size of the integer to generate
+ * @return a random integer in range [2^(bits - 1), 2^bits]
+ */
+GEN random_int(unsigned long bits);
+
+#endif // ECGEN_RANDOM_H