diff options
| author | J08nY | 2017-09-30 23:50:27 +0200 |
|---|---|---|
| committer | J08nY | 2017-09-30 23:50:27 +0200 |
| commit | 75caf69b45fda59267790939cb8f180e4f3c3498 (patch) | |
| tree | c58ff06c6b8379844eddb23eccf214edf816e6eb /src | |
| parent | 8720b2359cb2f74e5b25beee712faa8001b2e73c (diff) | |
| download | ecgen-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.c | 4 | ||||
| -rw-r--r-- | src/gen/gp.c | 120 | ||||
| -rw-r--r-- | src/gen/gp.h | 19 | ||||
| -rw-r--r-- | src/misc/types.h | 5 |
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)); |
