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/random | |
| parent | 0b5d1cca9c78869c6cffa2932297c1d70ba142e2 (diff) | |
| download | ecgen-79b29481b1c4d13063dd8b6ee6a1d0d70a54faab.tar.gz ecgen-79b29481b1c4d13063dd8b6ee6a1d0d70a54faab.tar.zst ecgen-79b29481b1c4d13063dd8b6ee6a1d0d70a54faab.zip | |
Seperated different generation methods into modules.
- Added Koblitz curve generation.
Diffstat (limited to 'src/random')
| -rw-r--r-- | src/random/generators.c | 54 | ||||
| -rw-r--r-- | src/random/generators.h | 25 | ||||
| -rw-r--r-- | src/random/seed.c | 70 | ||||
| -rw-r--r-- | src/random/seed.h | 44 |
4 files changed, 193 insertions, 0 deletions
diff --git a/src/random/generators.c b/src/random/generators.c new file mode 100644 index 0000000..9769166 --- /dev/null +++ b/src/random/generators.c @@ -0,0 +1,54 @@ +/* + * ecgen, tool for generating Elliptic curve domain parameters + * Copyright (C) 2017 J08nY + */ +#include "generators.h" +#include "math/curve.h" +#include "math/equation.h" +#include "math/field.h" +#include "random/seed.h" + +int gen_skip(curve_t *curve, config_t *config, ...) { return 1; } + +void gen_init(gen_t generators[], config_t *config) { + if (config->from_seed) { + if (config->seed) { + generators[OFFSET_SEED] = &seed_argument; + } else { + if (config->random) { + generators[OFFSET_SEED] = &seed_random; + } else { + generators[OFFSET_SEED] = &seed_input; + } + } + generators[OFFSET_A] = &a_seed; + generators[OFFSET_B] = &b_seed; + generators[OFFSET_CURVE] = &curve_seed; + } else { + generators[OFFSET_SEED] = &gen_skip; + + if (config->random) { + generators[OFFSET_A] = &a_random; + generators[OFFSET_B] = &b_random; + } else { + generators[OFFSET_A] = &a_input; + generators[OFFSET_B] = &b_input; + } + + if (config->koblitz) { + generators[OFFSET_A] = &a_zero; + } + + if (config->prime) { + generators[OFFSET_CURVE] = &curve_prime; + } else { + generators[OFFSET_CURVE] = &curve_nonzero; + } + } + + if (config->random) { + generators[OFFSET_FIELD] = &field_random; + } else { + generators[OFFSET_FIELD] = &field_input; + } +}
\ No newline at end of file diff --git a/src/random/generators.h b/src/random/generators.h new file mode 100644 index 0000000..87e599b --- /dev/null +++ b/src/random/generators.h @@ -0,0 +1,25 @@ +/* + * ecgen, tool for generating Elliptic curve domain parameters + * Copyright (C) 2017 J08nY + */ +#ifndef ECGEN_GENERATORS_H +#define ECGEN_GENERATORS_H + +#include "types.h" + +enum gen_offset { + OFFSET_SEED, + OFFSET_FIELD, + OFFSET_A, + OFFSET_B, + OFFSET_CURVE, + OFFSET_POINTS +}; + +/** + * + * @param generators + */ +void gen_init(gen_t generators[], config_t *config); + +#endif // ECGEN_GENERATORS_H diff --git a/src/random/seed.c b/src/random/seed.c new file mode 100644 index 0000000..a78ff24 --- /dev/null +++ b/src/random/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 diff --git a/src/random/seed.h b/src/random/seed.h new file mode 100644 index 0000000..998bdcd --- /dev/null +++ b/src/random/seed.h @@ -0,0 +1,44 @@ +/* + * ecgen, tool for generating Elliptic curve domain parameters + * Copyright (C) 2017 J08nY + */ +#ifndef ECGEN_SEED_H +#define ECGEN_SEED_H + +#include "io/cli.h" +#include "types.h" + +/** + * + * @param seed + */ +void seed_free(seed_t **seed); + +/** + * + * @param curve + * @param config + * @param ... + * @return + */ +int seed_random(curve_t *curve, config_t *config, ...); + +/** + * + * @param curve + * @param config + * @param ... + * @return + */ +int seed_argument(curve_t *curve, config_t *config, ...); + +/** + * + * @param curve + * @param config + * @param ... + * @return + */ +int seed_input(curve_t *curve, config_t *config, ...); + +#endif // ECGEN_SEED_H |
