diff options
| author | J08nY | 2017-02-05 03:59:52 +0100 |
|---|---|---|
| committer | J08nY | 2017-02-05 03:59:52 +0100 |
| commit | 763fc80153c5e9287f1b0f0609b11fb4f50c90ab (patch) | |
| tree | 5cd6e7acc4512cca65bcc16a74f3b63879b2d3bc /src/cli.c | |
| parent | 3d9bf583ccc5eea61c5f78f52d1e2073daee924c (diff) | |
| download | ecgen-763fc80153c5e9287f1b0f0609b11fb4f50c90ab.tar.gz ecgen-763fc80153c5e9287f1b0f0609b11fb4f50c90ab.tar.zst ecgen-763fc80153c5e9287f1b0f0609b11fb4f50c90ab.zip | |
Diffstat (limited to 'src/cli.c')
| -rw-r--r-- | src/cli.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/cli.c b/src/cli.c new file mode 100644 index 0000000..cdc2af4 --- /dev/null +++ b/src/cli.c @@ -0,0 +1,97 @@ +/* + * ecgen, tool for generating Elliptic curve domain parameters + * Copyright (C) 2017 J08nY + */ +#include "cli.h" + +char doc[] = "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_APPEND = 'a', + OPT_PRIME = 'p', + OPT_OUTPUT = 'o', + OPT_INPUT = 'i', + OPT_RANDOM = 'r', + OPT_FP = 1, + OPT_F2M = 2, +}; + +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."}, + // Other + {"data-dir", OPT_DATADIR, "DIR", 0, + "PARI/GP data directory (containing seadata and elldata)."}, + {"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)."}, + {0}}; + +error_t parse_opt(int key, char *arg, struct argp_state *state) { + struct arguments *args = state->input; + + switch (key) { + case OPT_DATADIR: + args->datadir = arg; + break; + case OPT_INPUT: + args->input = arg; + break; + case OPT_OUTPUT: + args->output = arg; + break; + case OPT_APPEND: + args->append = true; + break; + case OPT_RANDOM: + args->random = true; + break; + case OPT_PRIME: + args->prime = true; + break; + case OPT_FP: + if (args->binary_field) { + argp_failure( + state, 1, 0, + "Either specify prime field or binary field, not both."); + } + args->field = FIELD_PRIME; + args->prime_field = true; + break; + case OPT_F2M: + if (args->prime_field) { + argp_failure( + state, 1, 0, + "Either specify binary field or prime field, not both."); + } + args->field = FIELD_BINARY; + args->binary_field = true; + break; + case ARGP_KEY_ARG: + if (state->arg_num >= 1) { + argp_usage(state); + } + + args->bits = strtol(arg, NULL, 10); + break; + case ARGP_KEY_END: + if (!args->prime_field && !args->binary_field) { + argp_failure( + state, 1, 0, + "Specify field type, prime or binary, with --fp / --f2m."); + } + break; + case ARGP_KEY_NO_ARGS: + argp_usage(state); + break; + default: + return ARGP_ERR_UNKNOWN; + } + return 0; +} |
