aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJ08nY2017-09-30 23:50:27 +0200
committerJ08nY2017-09-30 23:50:27 +0200
commit75caf69b45fda59267790939cb8f180e4f3c3498 (patch)
treec58ff06c6b8379844eddb23eccf214edf816e6eb /src
parent8720b2359cb2f74e5b25beee712faa8001b2e73c (diff)
downloadecgen-75caf69b45fda59267790939cb8f180e4f3c3498.tar.gz
ecgen-75caf69b45fda59267790939cb8f180e4f3c3498.tar.zst
ecgen-75caf69b45fda59267790939cb8f180e4f3c3498.zip
Add GP code interpretation as a gen_f option.
Diffstat (limited to 'src')
-rw-r--r--src/exhaustive/exhaustive.c4
-rw-r--r--src/gen/gp.c120
-rw-r--r--src/gen/gp.h19
-rw-r--r--src/misc/types.h5
4 files changed, 144 insertions, 4 deletions
diff --git a/src/exhaustive/exhaustive.c b/src/exhaustive/exhaustive.c
index 8103f3b..30d2c47 100644
--- a/src/exhaustive/exhaustive.c
+++ b/src/exhaustive/exhaustive.c
@@ -237,8 +237,8 @@ int exhaustive_gen_retry(curve_t *curve, const config_t *cfg,
if (diff > 0 && validators && validators[state]) {
check_t *validator = validators[state];
for (size_t i = 0; i < validator->nchecks; ++i) {
- int new_diff = validator->checks[i](curve, cfg, arg,
- (offset_e)state);
+ int new_diff =
+ validator->checks[i](curve, cfg, arg, (offset_e)state);
if (new_diff <= 0) {
diff = new_diff;
break;
diff --git a/src/gen/gp.c b/src/gen/gp.c
new file mode 100644
index 0000000..dff7ca1
--- /dev/null
+++ b/src/gen/gp.c
@@ -0,0 +1,120 @@
+/*
+ * ecgen, tool for generating Elliptic curve domain parameters
+ * Copyright (C) 2017 J08nY
+ */
+#include "gp.h"
+#include "exhaustive/arg.h"
+#include "io/output.h"
+#include "point.h"
+#include "seed.h"
+#include "util/bits.h"
+
+static point_t **gp_points(const curve_t *curve, GEN point_vec) {
+ long len = glength(point_vec);
+ point_t **result = points_new((size_t)len);
+
+ for (long i = 1; i <= len; ++i) {
+ point_t *point = point_new();
+ point->point = gel(point_vec, i);
+ point->order = ellorder(curve->curve, point->point, NULL);
+ result[i - 1] = point;
+ }
+ return result;
+}
+
+static point_t **gp_gens(const curve_t *curve, GEN gens_vec) {
+ point_t **result = gp_points(curve, gens_vec);
+
+ long len = glength(gens_vec);
+ for (long i = 1; i <= len; ++i) {
+ point_t *gen = result[i - 1];
+ gen->cofactor = divii(curve->order, gen->order);
+ }
+ return result;
+}
+
+GENERATOR(gp_gen) {
+ HAS_ARG(args);
+ pari_sp ltop = avma;
+ GEN closure = compile_str(args->args);
+ GEN params = zerovec(state - OFFSET_SEED);
+
+ if (state > OFFSET_SEED) {
+ if (curve->seed && curve->seed->seed) {
+ gel(params, 1) = bits_to_bitvec(curve->seed->seed);
+ }
+ }
+
+ if (state > OFFSET_FIELD) {
+ gel(params, 2) = curve->field;
+ }
+
+ if (state > OFFSET_A) {
+ gel(params, 3) = curve->a;
+ }
+
+ if (state > OFFSET_B) {
+ gel(params, 4) = curve->b;
+ }
+
+ if (state > OFFSET_CURVE) {
+ gel(params, 5) = curve->curve;
+ }
+
+ if (state > OFFSET_ORDER) {
+ gel(params, 6) = curve->order;
+ }
+
+ if (state > OFFSET_GENERATORS) {
+ GEN gens = zerovec(curve->ngens);
+ for (size_t i = 0; i < curve->ngens; ++i) {
+ gel(gens, i + 1) = curve->generators[i]->point;
+ }
+ gel(params, 7) = gens;
+ }
+
+ if (state > OFFSET_POINTS) {
+ GEN points = zerovec(curve->npoints);
+ for (size_t i = 0; i < curve->npoints; ++i) {
+ gel(points, i + 1) = curve->points[i]->point;
+ }
+ gel(params, 8) = points;
+ }
+
+ GEN res = call0(closure, zerovec(0));
+ res = call0(res, params);
+
+ res = gerepileupto(ltop, res);
+ switch (state) {
+ case OFFSET_SEED:
+ curve->seed = seed_new();
+ curve->seed->seed = bits_from_bitvec(res);
+ break;
+ case OFFSET_FIELD:
+ curve->field = res;
+ break;
+ case OFFSET_A:
+ curve->a = res;
+ break;
+ case OFFSET_B:
+ curve->b = res;
+ break;
+ case OFFSET_CURVE:
+ curve->curve = res;
+ break;
+ case OFFSET_ORDER:
+ curve->order = res;
+ break;
+ case OFFSET_GENERATORS:
+ curve->ngens = (size_t)glength(res);
+ curve->generators = gp_gens(curve, res);
+ break;
+ case OFFSET_POINTS:
+ curve->npoints = (size_t)glength(res);
+ curve->points = gp_points(curve, res);
+ break;
+ case OFFSET_END:
+ break;
+ }
+ return 1;
+} \ No newline at end of file
diff --git a/src/gen/gp.h b/src/gen/gp.h
new file mode 100644
index 0000000..c0ee1af
--- /dev/null
+++ b/src/gen/gp.h
@@ -0,0 +1,19 @@
+/*
+ * ecgen, tool for generating Elliptic curve domain parameters
+ * Copyright (C) 2017 J08nY
+ */
+#ifndef ECGEN_GP_H
+#define ECGEN_GP_H
+
+#include "misc/types.h"
+
+/**
+ * @brief
+ * @param curve
+ * @param cfg
+ * @param args
+ * @return
+ */
+GENERATOR(gp_gen);
+
+#endif // ECGEN_GP_H
diff --git a/src/misc/types.h b/src/misc/types.h
index 74a0aa2..d20ed2b 100644
--- a/src/misc/types.h
+++ b/src/misc/types.h
@@ -119,8 +119,9 @@ typedef struct {
* @param state The current generation state
* @return state diff
*/
-#define GENERATOR(gen_name) \
- int gen_name(curve_t *curve, const config_t *cfg, arg_t *args, offset_e state)
+#define GENERATOR(gen_name) \
+ int gen_name(curve_t *curve, const config_t *cfg, arg_t *args, \
+ offset_e state)
typedef GENERATOR((*gen_f));