diff options
| author | J08nY | 2017-02-10 01:24:48 +0100 |
|---|---|---|
| committer | J08nY | 2017-02-10 01:24:48 +0100 |
| commit | de90c5cd76bcd45c82f34d1f3d60b529b7d5a86d (patch) | |
| tree | 6d5b6923cf7443e14004e779258b4c546cf769b5 /src/exhaustive/seed.c | |
| parent | 79b29481b1c4d13063dd8b6ee6a1d0d70a54faab (diff) | |
| download | ecgen-de90c5cd76bcd45c82f34d1f3d60b529b7d5a86d.tar.gz ecgen-de90c5cd76bcd45c82f34d1f3d60b529b7d5a86d.tar.zst ecgen-de90c5cd76bcd45c82f34d1f3d60b529b7d5a86d.zip | |
Diffstat (limited to 'src/exhaustive/seed.c')
| -rw-r--r-- | src/exhaustive/seed.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/exhaustive/seed.c b/src/exhaustive/seed.c new file mode 100644 index 0000000..a78ff24 --- /dev/null +++ b/src/exhaustive/seed.c @@ -0,0 +1,70 @@ +/* + * ecgen, tool for generating Elliptic curve domain parameters + * Copyright (C) 2017 J08nY + */ +#include "seed.h" +#include "io/input.h" + +seed_t *seed_new() { + seed_t *seed = pari_malloc(sizeof(seed_t)); + if (!seed) { + perror("Couldn't malloc."); + exit(1); + } + memset(seed, 0, sizeof(seed_t)); + return seed; +} + +void seed_free(seed_t **seed) { + if (*seed) { + pari_free(*seed); + *seed = NULL; + } +} + +GEN seed_stoi(const char *cstr) { + pari_sp ltop = avma; + GEN seed = gen_0; + + size_t len = strlen(cstr); + for (size_t i = 0; i < len; ++i) { + pari_sp btop = avma; + GEN s = stoi(cstr[i]); + s = shifti(s, (len - i - 1) * 8); + seed = addii(seed, s); + if (gc_needed(btop, 1)) gerepileall(btop, 1, seed); + } + + return gerepilecopy(ltop, seed); +} + +int seed_random(curve_t *curve, config_t *config, ...) { + curve->seed = seed_new(); + curve->seed->seed = random_int(160); + return 1; +} + +int seed_argument(curve_t *curve, config_t *config, ...) { + curve->seed = seed_new(); + curve->seed->seed = seed_stoi(config->seed); + return 1; +} + +int seed_input(curve_t *curve, config_t *config, ...) { + pari_sp ltop = avma; + + GEN str = fread_string(in, "seed:", '\n'); + const char *cstr = GSTR(str); + if (strlen(cstr) < 20) { + fprintf(stderr, "SEED must be at least 160 bits(20 characters).\n"); + avma = ltop; + return 0; + } + + GEN seed = seed_stoi(cstr); + gerepileall(ltop, 1, &seed); + + curve->seed = seed_new(); + curve->seed->seed = seed; + return 1; +}
\ No newline at end of file |
