diff options
| author | J08nY | 2017-02-09 04:07:37 +0100 |
|---|---|---|
| committer | J08nY | 2017-02-09 04:07:37 +0100 |
| commit | 79b29481b1c4d13063dd8b6ee6a1d0d70a54faab (patch) | |
| tree | 007da84bc4133c656f2f66df541f74c6b55bfb11 /src/math/random.c | |
| parent | 0b5d1cca9c78869c6cffa2932297c1d70ba142e2 (diff) | |
| download | ecgen-79b29481b1c4d13063dd8b6ee6a1d0d70a54faab.tar.gz ecgen-79b29481b1c4d13063dd8b6ee6a1d0d70a54faab.tar.zst ecgen-79b29481b1c4d13063dd8b6ee6a1d0d70a54faab.zip | |
Diffstat (limited to 'src/math/random.c')
| -rw-r--r-- | src/math/random.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/math/random.c b/src/math/random.c new file mode 100644 index 0000000..319ed3c --- /dev/null +++ b/src/math/random.c @@ -0,0 +1,60 @@ +/* + * ecgen, tool for generating Elliptic curve domain parameters + * Copyright (C) 2017 J08nY + */ +#include "random.h" +#include <time.h> + +bool random_init() { + pari_ulong seed = 0; + // Try urandom first + FILE *rand = fopen("/dev/urandom", "rb"); + if (rand) { + fread(&seed, sizeof(char), sizeof(pari_ulong), 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(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); + if (gc_needed(btop, 1)) p = gerepilecopy(btop, p); + } while (!isprime(p)); + } + + return gerepilecopy(ltop, p); +} + +GEN random_int(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)); +}
\ No newline at end of file |
