summaryrefslogtreecommitdiff
path: root/src/input.c
diff options
context:
space:
mode:
authorJ08nY2017-02-05 03:59:52 +0100
committerJ08nY2017-02-05 03:59:52 +0100
commit763fc80153c5e9287f1b0f0609b11fb4f50c90ab (patch)
tree5cd6e7acc4512cca65bcc16a74f3b63879b2d3bc /src/input.c
parent3d9bf583ccc5eea61c5f78f52d1e2073daee924c (diff)
downloadecgen-0.2.0.tar.gz
ecgen-0.2.0.tar.zst
ecgen-0.2.0.zip
Diffstat (limited to 'src/input.c')
-rw-r--r--src/input.c135
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);
+}
+