diff options
| author | J08nY | 2017-02-28 20:22:16 +0100 |
|---|---|---|
| committer | J08nY | 2017-02-28 20:22:16 +0100 |
| commit | 8c230aa00002b57d47160756a183d65fb895a7b4 (patch) | |
| tree | 515ea83149f9652eb5dd3329871874f78764cbe7 /src | |
| parent | 209655dad1eda390213b9b9b53d3c56ae6dc493b (diff) | |
| download | ecgen-8c230aa00002b57d47160756a183d65fb895a7b4.tar.gz ecgen-8c230aa00002b57d47160756a183d65fb895a7b4.tar.zst ecgen-8c230aa00002b57d47160756a183d65fb895a7b4.zip | |
Added option to request uniquely generated curves.
-u --unique
Diffstat (limited to 'src')
| -rw-r--r-- | src/ecgen.c | 2 | ||||
| -rw-r--r-- | src/exhaustive/exhaustive.c | 17 | ||||
| -rw-r--r-- | src/invalid/invalid.c | 6 | ||||
| -rw-r--r-- | src/io/cli.c | 127 | ||||
| -rw-r--r-- | src/io/cli.h | 9 |
5 files changed, 84 insertions, 77 deletions
diff --git a/src/ecgen.c b/src/ecgen.c index 3585d59..bd33b04 100644 --- a/src/ecgen.c +++ b/src/ecgen.c @@ -39,7 +39,7 @@ const char *argp_program_version = "There is NO WARRANTY, to the extent permitted by law."; const char *argp_program_bug_address = "<johny@neuromancer.sk>"; -static struct argp argp = {options, parse_opt, args_doc, doc}; +static struct argp argp = {options, cli_parse, args_doc, doc, 0, cli_filter}; static struct config_t cfg; bool init(void) { diff --git a/src/exhaustive/exhaustive.c b/src/exhaustive/exhaustive.c index 2367058..2a839ff 100644 --- a/src/exhaustive/exhaustive.c +++ b/src/exhaustive/exhaustive.c @@ -49,7 +49,11 @@ void exhaustive_ginit(gen_t *generators, config_t *config) { generators[OFFSET_ORDER] = &order_any; } } - generators[OFFSET_GENERATORS] = &gens_any; + if (config->unique) { + generators[OFFSET_GENERATORS] = &gens_one; + } else { + generators[OFFSET_GENERATORS] = &gens_any; + } if (config->random) { generators[OFFSET_FIELD] = &field_random; @@ -65,7 +69,7 @@ void exhaustive_vinit(arg_t *argss[], config_t *config) { } int exhaustive_gen(curve_t *curve, config_t *config, gen_t generators[], - arg_t *argss[], int start_offset, int end_offset) { + arg_t *argss[], int start_offset, int end_offset) { if (start_offset == end_offset) { return 1; } @@ -79,7 +83,7 @@ int exhaustive_gen(curve_t *curve, config_t *config, gen_t generators[], tops[state - start_offset] = avma; int diff = - generators[state](curve, config, argss ? argss[state] : NULL); + generators[state](curve, config, argss ? argss[state] : NULL); state += diff; if (diff == INT_MIN) { @@ -101,7 +105,6 @@ int exhaustive_gen(curve_t *curve, config_t *config, gen_t generators[], } fflush(debug); } - } if (config->verbose) fprintf(debug, "\n"); @@ -109,9 +112,7 @@ int exhaustive_gen(curve_t *curve, config_t *config, gen_t generators[], return 1; } -void exhaustive_quit(void) { - equation_quit(); -} +void exhaustive_quit(void) { equation_quit(); } int exhaustive_do(config_t *cfg) { gen_t generators[OFFSET_END]; @@ -121,7 +122,7 @@ int exhaustive_do(config_t *cfg) { curve_t *curve = curve_new(); if (!exhaustive_gen(curve, cfg, generators, argss, OFFSET_SEED, - OFFSET_END)) { + OFFSET_END)) { curve_free(&curve); return 1; } diff --git a/src/invalid/invalid.c b/src/invalid/invalid.c index 69c7021..469b20c 100644 --- a/src/invalid/invalid.c +++ b/src/invalid/invalid.c @@ -77,7 +77,11 @@ size_t invalid_curves(curve_t *curve, config_t *cfg, pari_ulong *primes, invalid_gen[OFFSET_B] = &b_random; invalid_gen[OFFSET_CURVE] = &curve_nonzero; invalid_gen[OFFSET_ORDER] = &order_any; - invalid_gen[OFFSET_GENERATORS] = &gens_any; + if (cfg->unique) { + invalid_gen[OFFSET_GENERATORS] = &gens_one; + } else { + invalid_gen[OFFSET_GENERATORS] = &gens_any; + } invalid_gen[OFFSET_POINTS] = &points_primet; arg_t *invalid_argss[OFFSET_END]; diff --git a/src/io/cli.c b/src/io/cli.c index 22fd457..798d596 100644 --- a/src/io/cli.c +++ b/src/io/cli.c @@ -6,8 +6,8 @@ #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 { @@ -19,6 +19,7 @@ enum opt_keys { OPT_INVALID = 'i', OPT_ORDER = 'n', OPT_KOBLITZ = 'k', + OPT_UNIQUE = 'u', OPT_FORMAT = 't', OPT_OUTPUT = 'o', OPT_INPUT = 'f', @@ -30,33 +31,35 @@ enum opt_keys { // clang-format off struct argp_option options[] = { - // Field specification - {"fp", OPT_FP, 0, 0, "Prime field."}, - {"f2m", OPT_F2M, 0, 0, "Binary field."}, - // Curve specification - {"random", OPT_RANDOM, 0, 0, "Generate a random curve."}, - {"prime", OPT_PRIME, 0, 0, "Generate a curve with prime order."}, - {"seed", OPT_SEED, "SEED", OPTION_ARG_OPTIONAL, "Generate a curve from SEED (ANSI X9.62 verifiable procedure)."}, - {"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."}, - {"input", OPT_INPUT, "FILE", 0, "Input from file."}, - {"output", OPT_OUTPUT, "FILE", 0, "Output into file. Overwrites any existing file!"}, - {"append", OPT_APPEND, 0, 0, "Append to output file (don't overwrite)."}, - {"verbose", OPT_VERBOSE, "FILE", OPTION_ARG_OPTIONAL, "Verbose logging (to stdout or file)."}, - {0}}; + {0, 0, 0, 0, "Field specification:", 1}, + {"fp", OPT_FP, 0, 0, "Prime field.", 1}, + {"f2m", OPT_F2M, 0, 0, "Binary field.", 1}, + {0, 0, 0, 0, "Generation options:", 2}, + {"random", OPT_RANDOM, 0, 0, "Generate a random curve.", 2}, + {"prime", OPT_PRIME, 0, 0, "Generate a curve with prime order.", 2}, + {"seed", OPT_SEED, "SEED", OPTION_ARG_OPTIONAL, "Generate a curve from SEED (ANSI X9.62 verifiable procedure).", 2}, + {"invalid", OPT_INVALID, 0, 0, "Generate a set of invalid curves (for a given curve).", 2}, + {"order", OPT_ORDER, "ORDER", 0, "Generate a curve with given order (using Complex Multiplication).", 2}, + {"koblitz", OPT_KOBLITZ, 0, 0, "Generate a Koblitz curve (a = 0).", 2}, + {"unique", OPT_UNIQUE, 0, 0, "Generate a curve with only one generator.", 2}, + //{"count", OPT_COUNT, "COUNT", 0, "Generate multiple (COUNT) curves."}, + {0, 0, 0, 0, "Input/Output options:", 3}, + {"format", OPT_FORMAT, "FORMAT", 0, "Format to output in. One of [csv,json], default is json.", 3}, + {"input", OPT_INPUT, "FILE", 0, "Input from file.", 3}, + {"output", OPT_OUTPUT, "FILE", 0, "Output into file. Overwrites any existing file!", 3}, + {"append", OPT_APPEND, 0, 0, "Append to output file (don't overwrite).", 3}, + {"verbose", OPT_VERBOSE, "FILE", OPTION_ARG_OPTIONAL, "Verbose logging (to stdout or file).", 3}, + {0, 0, 0, 0, "Other:", 4}, + {"data-dir", OPT_DATADIR, "DIR", 0, "PARI/GP data directory (containing seadata package).", 4}, + {0} +}; // clang-format on -error_t parse_opt(int key, char *arg, struct argp_state *state) { +error_t cli_parse(int key, char *arg, struct argp_state *state) { struct config_t *cfg = state->input; switch (key) { - case OPT_DATADIR: - cfg->datadir = arg; + case OPT_DATADIR: cfg->datadir = arg; break; case OPT_COUNT: if (arg) { @@ -71,66 +74,56 @@ 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."); + state, 1, 0, + "You have to specify a format with the format option."); } break; - case OPT_INPUT: - cfg->input = arg; + case OPT_INPUT: cfg->input = arg; break; - case OPT_OUTPUT: - cfg->output = arg; + case OPT_OUTPUT: cfg->output = arg; break; - case OPT_APPEND: - cfg->append = true; + case OPT_APPEND: cfg->append = true; break; - case OPT_VERBOSE: - cfg->verbose++; + case OPT_VERBOSE: cfg->verbose++; if (arg) { cfg->debug = arg; } break; - case OPT_RANDOM: - cfg->random = true; + case OPT_RANDOM: cfg->random = true; break; - case OPT_PRIME: - cfg->prime = true; + case OPT_PRIME: cfg->prime = true; break; - case OPT_INVALID: - cfg->invalid = true; + case OPT_INVALID: cfg->invalid = true; break; - case OPT_ORDER: - cfg->cm = true; + case OPT_ORDER: cfg->cm = true; if (arg) { cfg->order = arg; } break; - case OPT_KOBLITZ: - cfg->koblitz = true; + case OPT_KOBLITZ: cfg->koblitz = true; + break; + case OPT_UNIQUE: cfg->unique = true; break; - case OPT_SEED: - cfg->from_seed = true; + case OPT_SEED: cfg->from_seed = true; if (arg) { // 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; } break; - case OPT_FP: - cfg->field = FIELD_PRIME; + case OPT_FP: cfg->field = FIELD_PRIME; cfg->prime_field = true; break; - case OPT_F2M: - cfg->field = FIELD_BINARY; + case OPT_F2M: cfg->field = FIELD_BINARY; cfg->binary_field = true; break; case ARGP_KEY_ARG: @@ -145,33 +138,35 @@ 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: - argp_usage(state); + case ARGP_KEY_NO_ARGS: argp_usage(state); break; - default: - return ARGP_ERR_UNKNOWN; + default: return ARGP_ERR_UNKNOWN; } return 0; } + +char *cli_filter(int key, const char *text, void *input) { + return (char *)text; +} diff --git a/src/io/cli.h b/src/io/cli.h index 76e17db..dd3d791 100644 --- a/src/io/cli.h +++ b/src/io/cli.h @@ -23,6 +23,7 @@ typedef struct config_t { enum field_e field; bool binary_field; bool prime_field; + long count; bool random; bool prime; @@ -32,17 +33,23 @@ typedef struct config_t { bool koblitz; bool from_seed; char *seed; + bool unique; + char *datadir; enum format_e format; char *output; char *input; bool append; + long verbose; char *debug; + long bits; } config_t; -error_t parse_opt(int key, char *arg, struct argp_state *state); +error_t cli_parse(int key, char *arg, struct argp_state *state); + +char *cli_filter(int key, const char *text, void *input); #endif // ECGEN_CLI_H |
