aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJ08nY2017-02-28 20:22:16 +0100
committerJ08nY2017-02-28 20:22:16 +0100
commit8c230aa00002b57d47160756a183d65fb895a7b4 (patch)
tree515ea83149f9652eb5dd3329871874f78764cbe7 /src
parent209655dad1eda390213b9b9b53d3c56ae6dc493b (diff)
downloadecgen-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.c2
-rw-r--r--src/exhaustive/exhaustive.c17
-rw-r--r--src/invalid/invalid.c6
-rw-r--r--src/io/cli.c127
-rw-r--r--src/io/cli.h9
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