aboutsummaryrefslogtreecommitdiff
path: root/src/io
diff options
context:
space:
mode:
Diffstat (limited to 'src/io')
-rw-r--r--src/io/cli.c43
-rw-r--r--src/io/cli.h3
-rw-r--r--src/io/input.c47
-rw-r--r--src/io/input.h37
-rw-r--r--src/io/output.c32
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);
}