diff options
Diffstat (limited to 'src/input.c')
| -rw-r--r-- | src/input.c | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/src/input.c b/src/input.c new file mode 100644 index 0000000..441fd47 --- /dev/null +++ b/src/input.c @@ -0,0 +1,135 @@ +/* + * ecgen, tool for generating Elliptic curve domain parameters + * Copyright (C) 2017 J08nY + */ +#include "input.h" + +/* + * + *char *prime_prompts[] = {"p:", "a:", "b:"}; + param_t prime_params[] = {PARAM_PRIME, PARAM_INT, PARAM_INT}; + + char *binary_prompts[] = {"e1:", "e2:", "e3:", "a:", "b:"}; + param_t binary_params[] = {PARAM_SHORT, PARAM_SHORT, PARAM_SHORT, PARAM_INT, PARAM_INT}; + + char **prompts; + param_t *params; + size_t length; + if (args.prime_field) { + prompts = prime_prompts; + params = prime_params; + length = 3; + } else { + prompts = binary_prompts; + params = binary_params; + length = 5; + } + GEN field; + GEN domain[length]; + + if (args.random) { + //random domain, might not define a curve... check disc + if (args.prime_field) { + field = ifield_prime(args.bits); + } else { + field = ifield_binary(args.bits); + } + } else { + for (size_t i = 0; i < length; ++i) { + domain[i] = fread_param(params[i], in, prompts[i], args.bits, in == stdin ? '\n' : ','); + if (equalii(domain[i], gen_m1)) { + fprintf(stderr, "Whoops?"); + return quit(1); + } + } + if (args.prime_field) { + field = field_prime(domain[0]); + } else { + field = field_binary(args.bits, domain[0], domain[1], domain[2]); + } + } + pari_fprintf(out, "%Ps", field_params(field)); + + if (args.prime_field) { + GEN field = prime_field(p); + GEN curve = prime_weierstrass(a, b, field, 0); + } else if (args.binary_field) { + GEN e[3]; + for (size_t i = 0; i < 3; ++i) { + char prompt[] = {'e', (char) ('1' + i), ':', 0}; + e[i] = read_short(prompt, '\n'); + } + GEN a = read_int("a:", args.bits, '\n'); + + GEN field = binary_field(args.bits, e[0], e[1], e[2]); + } +*/ + + +GEN fread_i(FILE *stream, const char *prompt, long bits, int delim, + GEN (*rand_func)(long)) { + printf("%s ", prompt); + char *line = NULL; + size_t n = 0; + + ssize_t len = getdelim(&line, &n, delim, stream); + if (len == 1) { + free(line); + if (rand_func) { + return rand_func(bits); + } else { + return gen_0; + } + } + pari_sp ltop = avma; + GEN in = strtoi(line); + free(line); + + // check bitsize here + GEN size = int2n(bits); + if (cmpii(in, size)) { + return gerepileupto(ltop, in); + } else { + fprintf(stderr, "Number too big(> %ld bits).\n", bits); + return gen_m1; + } +} + +GEN fread_prime(FILE *stream, const char *prompt, long bits, int delim) { + GEN read = fread_i(stream, prompt, bits, delim, &random_prime); + if (equalii(read, gen_m1)) { + return read; + } else { + if (isprime(read)) { + return read; + } else { + fprintf(stderr, "Number is not prime. Prime required.\n"); + return gen_m1; + } + } +} + +GEN fread_int(FILE *stream, const char *prompt, long bits, int delim) { + return fread_i(stream, prompt, bits, delim, &random_int); +} + +GEN fread_short(FILE *stream, const char *prompt, int delim) { + return fread_i(stream, prompt, 16, delim, NULL); +} + +GEN fread_param(param_t param, FILE *stream, const char *prompt, long bits, int delim) { + switch (param) { + case PARAM_PRIME: + return fread_prime(stream, prompt, bits, delim); + case PARAM_INT: + return fread_int(stream, prompt, bits, delim); + case PARAM_SHORT: + return fread_short(stream, prompt, delim); + } + return gen_m1; +} + +GEN read_param(param_t param, const char *prompt, long bits, int delim) { + return fread_param(param, stdin, prompt, bits, delim); +} + |
