diff options
Diffstat (limited to 'src/io')
| -rw-r--r-- | src/io/cli.c | 43 | ||||
| -rw-r--r-- | src/io/cli.h | 3 | ||||
| -rw-r--r-- | src/io/input.c | 47 | ||||
| -rw-r--r-- | src/io/input.h | 37 | ||||
| -rw-r--r-- | src/io/output.c | 32 |
5 files changed, 100 insertions, 62 deletions
diff --git a/src/io/cli.c b/src/io/cli.c index f9097d9..22fd457 100644 --- a/src/io/cli.c +++ b/src/io/cli.c @@ -6,12 +6,13 @@ #include <string.h> char doc[] = - "ecgen, tool for generating Elliptic curve domain parameters.\v(C) 2017 " - "Eastern Seaboard Phishing Authority"; + "ecgen, tool for generating Elliptic curve domain parameters.\v(C) 2017 " + "Eastern Seaboard Phishing Authority"; char args_doc[] = "bits"; enum opt_keys { OPT_DATADIR = 'd', + OPT_COUNT = 'c', OPT_PRIME = 'p', OPT_RANDOM = 'r', OPT_SEED = 's', @@ -39,6 +40,7 @@ struct argp_option options[] = { {"invalid", OPT_INVALID, 0, 0, "Generate a set of invalid curves (for a given curve)."}, {"order", OPT_ORDER, "ORDER", 0, "Generate a curve with given order (using Complex Multiplication)."}, {"koblitz", OPT_KOBLITZ, 0, 0, "Generate a Koblitz curve."}, + //{"count", OPT_COUNT, "COUNT", 0, "Generate multiple curves."}, // Other {"data-dir", OPT_DATADIR, "DIR", 0, "PARI/GP data directory (containing seadata package)."}, {"format", OPT_FORMAT, "FORMAT", 0, "Format to output in. One of [csv,json], default is json."}, @@ -56,6 +58,11 @@ error_t parse_opt(int key, char *arg, struct argp_state *state) { case OPT_DATADIR: cfg->datadir = arg; break; + case OPT_COUNT: + if (arg) { + cfg->count = strtol(arg, NULL, 10); + } + break; case OPT_FORMAT: if (arg) { if (!strcmp(arg, "csv")) { @@ -64,11 +71,13 @@ error_t parse_opt(int key, char *arg, struct argp_state *state) { cfg->format = FORMAT_JSON; } else { argp_failure(state, 1, 0, - "Invalid format specified. One of [csv, json] is valid."); + "Invalid format specified. One of [csv, json] " + "is valid."); } } else { - argp_failure(state, 1, 0, - "You have to specify a format with the format option."); + argp_failure( + state, 1, 0, + "You have to specify a format with the format option."); } break; case OPT_INPUT: @@ -110,8 +119,8 @@ error_t parse_opt(int key, char *arg, struct argp_state *state) { // ANSI X9.62 specifies seed as at least 160 bits in length. if (strlen(arg) < 20) { argp_failure( - state, 1, 0, - "SEED must be at least 160 bits (20 characters)."); + state, 1, 0, + "SEED must be at least 160 bits (20 characters)."); } cfg->seed = arg; } @@ -136,22 +145,26 @@ error_t parse_opt(int key, char *arg, struct argp_state *state) { // Only one field if (!cfg->prime_field && !cfg->binary_field) { argp_failure(state, 1, 0, - "Specify field type, prime or binary, with --fp / " - "--f2m (but not both)."); + "Specify field type, prime or binary, with --fp / " + "--f2m (but not both)."); } // Invalid is not prime or seed by definition. if (cfg->invalid && (cfg->prime || cfg->from_seed)) { // not seed, not prime argp_failure(state, 1, 0, - "Invalid curve generation can not generate curves " - "from seed, exhaustive or prime order."); + "Invalid curve generation can not generate curves " + "from seed, exhaustive or prime order."); } if (cfg->cm && (cfg->prime || cfg->from_seed || cfg->invalid)) { argp_failure(state, 1, 0, - "Fixed order curve generation can not generate " - "curves from seed, or invalid curves. Prime order " - "also doesn't make sense if the given one isn't " - "prime."); + "Fixed order curve generation can not generate " + "curves from seed, or invalid curves. Prime order " + "also doesn't make sense if the given one isn't " + "prime."); + } + // default values + if (!cfg->count) { + cfg->count = 1; } break; case ARGP_KEY_NO_ARGS: diff --git a/src/io/cli.h b/src/io/cli.h index 96871ce..76e17db 100644 --- a/src/io/cli.h +++ b/src/io/cli.h @@ -17,12 +17,13 @@ extern char args_doc[]; extern struct argp_option options[]; enum field_e { FIELD_PRIME, FIELD_BINARY }; -enum format_e { FORMAT_JSON, FORMAT_CSV }; +enum format_e { FORMAT_JSON, FORMAT_CSV }; typedef struct config_t { enum field_e field; bool binary_field; bool prime_field; + long count; bool random; bool prime; bool invalid; diff --git a/src/io/input.c b/src/io/input.c index 780e4d3..34aeb5a 100644 --- a/src/io/input.c +++ b/src/io/input.c @@ -2,24 +2,29 @@ * ecgen, tool for generating Elliptic curve domain parameters * Copyright (C) 2017 J08nY */ +#define _POSIX_C_SOURCE 200809L #include "input.h" #include <parson/parson.h> +#include "output.h" FILE *in; int delim; -GEN fread_i(FILE *stream, const char *prompt, long bits) { - if (prompt) { - printf("%s ", prompt); +GEN input_i(const char *prompt, long bits) { + if (prompt && out == stdout) { + fprintf(out, "%s ", prompt); } char *line = NULL; size_t n = 0; - ssize_t len = getdelim(&line, &n, delim, stream); + ssize_t len = getdelim(&line, &n, delim, in); if (len == 1) { free(line); return gen_m1; } + for (size_t i = 0, j = 0; (line[j] = line[i]); j += !isspace(line[i++])) + ; + pari_sp ltop = avma; GEN in = strtoi(line); free(line); @@ -34,8 +39,8 @@ GEN fread_i(FILE *stream, const char *prompt, long bits) { } } -GEN fread_prime(FILE *stream, const char *prompt, long bits) { - GEN read = fread_i(stream, prompt, bits); +GEN input_prime(const char *prompt, long bits) { + GEN read = input_i(prompt, bits); if (equalii(read, gen_m1)) { return read; } else { @@ -48,22 +53,18 @@ GEN fread_prime(FILE *stream, const char *prompt, long bits) { } } -GEN fread_int(FILE *stream, const char *prompt, long bits) { - return fread_i(stream, prompt, bits); -} +GEN input_int(const char *prompt, long bits) { return input_i(prompt, bits); } -GEN fread_short(FILE *stream, const char *prompt) { - return fread_i(stream, prompt, 16); -} +GEN input_short(const char *prompt) { return input_i(prompt, 16); } -GEN fread_string(FILE *stream, const char *prompt) { - if (prompt) { - printf("%s ", prompt); +GEN input_string(const char *prompt) { + if (prompt && out == stdout) { + fprintf(out, "%s ", prompt); } char *line = NULL; size_t n = 0; - ssize_t len = getdelim(&line, &n, delim, stream); + ssize_t len = getdelim(&line, &n, delim, in); if (len == 1) { free(line); return strtoGENstr(""); @@ -75,24 +76,20 @@ GEN fread_string(FILE *stream, const char *prompt) { return result; } -GEN fread_param(param_t param, FILE *stream, const char *prompt, long bits) { +GEN input_param(param_t param, const char *prompt, long bits) { switch (param) { case PARAM_PRIME: - return fread_prime(stream, prompt, bits); + return input_prime(prompt, bits); case PARAM_INT: - return fread_int(stream, prompt, bits); + return input_int(prompt, bits); case PARAM_SHORT: - return fread_short(stream, prompt); + return input_short(prompt); case PARAM_STRING: - return fread_string(stream, prompt); + return input_string(prompt); } return gen_m1; } -GEN read_param(param_t param, const char *prompt, long bits) { - return fread_param(param, stdin, prompt, bits); -} - void input_init(config_t *cfg) { json_set_allocation_functions(pari_malloc, pari_free); diff --git a/src/io/input.h b/src/io/input.h index b76159d..3be68fc 100644 --- a/src/io/input.h +++ b/src/io/input.h @@ -20,40 +20,57 @@ typedef enum PARAM { /** * - * @param stream * @param prompt * @param bits * @return */ -GEN fread_prime(FILE *stream, const char *prompt, long bits); +GEN input_prime(const char *prompt, long bits); /** * - * @param stream * @param prompt * @param bits * @return */ -GEN fread_int(FILE *stream, const char *prompt, long bits); +GEN input_int(const char *prompt, long bits); /** * - * @param stream * @param prompt * @return */ -GEN fread_short(FILE *stream, const char *prompt); +GEN input_short(const char *prompt); -GEN fread_string(FILE *stream, const char *prompt); - -GEN fread_param(param_t param, FILE *stream, const char *prompt, long bits); +/** + * + * @param prompt + * @return + */ +GEN input_string(const char *prompt); -GEN read_param(param_t param, const char *prompt, long bits); +/** + * + * @param param + * @param prompt + * @param bits + * @return + */ +GEN input_param(param_t param, const char *prompt, long bits); +/** + * + */ extern FILE *in; +/** + * + * @param cfg + */ void input_init(config_t *cfg); +/** + * + */ void input_quit(void); #endif // ECGEN_INPUT_H diff --git a/src/io/output.c b/src/io/output.c index 7b3e8a1..e1e08bd 100644 --- a/src/io/output.c +++ b/src/io/output.c @@ -5,13 +5,21 @@ #include "output.h" #include <parson/parson.h> -#include "math/field.h" #include "math/curve.h" - +#include "math/field.h" FILE *out; FILE *debug; +int fprintff(FILE *stream, const char *fmt, ...) { + va_list arg; + va_start(arg, fmt); + int result = vfprintf(stream, fmt, arg); + fflush(stream); + va_end(arg); + return result; +} + char *output_scsv(curve_t *curve, config_t *config) { pari_sp ltop = avma; GEN vector = curve_params(curve); @@ -26,7 +34,7 @@ char *output_scsv(curve_t *curve, config_t *config) { total += lengths[i]; } - char *result = (char *) malloc(total + len); + char *result = (char *)malloc(total + len); if (!result) { perror("Couldn't malloc."); exit(1); @@ -51,7 +59,7 @@ char *output_scsv(curve_t *curve, config_t *config) { void output_fcsv(FILE *out, curve_t *curve, config_t *config) { char *string = output_scsv(curve, config); - fprintf(out, "%s\n", string); + fprintff(out, "%s\n", string); free(string); } @@ -74,10 +82,10 @@ JSON_Value *output_jjson(curve_t *curve, config_t *config) { } case FIELD_BINARY: { GEN field = field_params(curve->field); - char *e1 = pari_sprintf("%P#x", gel(field, 1)); - char *e2 = pari_sprintf("%P#x", gel(field, 2)); - char *e3 = pari_sprintf("%P#x", gel(field, 3)); - char *m = pari_sprintf("%#lx", config->bits); // maybe not? + char *m = pari_sprintf("%P#x", gel(field, 1)); + char *e1 = pari_sprintf("%P#x", gel(field, 2)); + char *e2 = pari_sprintf("%P#x", gel(field, 3)); + char *e3 = pari_sprintf("%P#x", gel(field, 4)); json_object_dotset_string(root_object, "field.m", m); json_object_dotset_string(root_object, "field.e1", e1); json_object_dotset_string(root_object, "field.e2", e2); @@ -110,10 +118,12 @@ JSON_Value *output_jjson(curve_t *curve, config_t *config) { JSON_Value *point_value = json_value_init_object(); JSON_Object *point_object = json_value_get_object(point_value); - char *x = pari_sprintf("%P#x", field_elementi(gel(curve->points[i]->point, 1))); + char *x = pari_sprintf( + "%P#x", field_elementi(gel(curve->points[i]->point, 1))); json_object_set_string(point_object, "x", x); pari_free(x); - char *y = pari_sprintf("%P#x", field_elementi(gel(curve->points[i]->point, 2))); + char *y = pari_sprintf( + "%P#x", field_elementi(gel(curve->points[i]->point, 2))); json_object_set_string(point_object, "y", y); pari_free(y); char *p_order = pari_sprintf("%P#x", curve->points[i]->order); @@ -138,7 +148,7 @@ char *output_sjson(curve_t *curve, config_t *config) { void output_fjson(FILE *out, curve_t *curve, config_t *config) { char *s = output_sjson(curve, config); - fprintf(out, "%s", s); + fprintff(out, "%s", s); json_free_serialized_string(s); } |
