diff options
| author | J08nY | 2017-05-31 23:07:35 +0200 |
|---|---|---|
| committer | J08nY | 2017-05-31 23:07:35 +0200 |
| commit | 637702cb14fe7133f3cffe58eaaca4186d67fc43 (patch) | |
| tree | bdbb50a3fd8cae28a1c767d3fe20a3c0c752cab9 /src/util | |
| parent | ba8c1f2bc424205cbb167b3c65ce184912c6173a (diff) | |
| download | ecgen-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.c | 64 | ||||
| -rw-r--r-- | src/util/random.h | 39 |
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 |
