aboutsummaryrefslogtreecommitdiff
path: root/src/cm/cm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cm/cm.c')
-rw-r--r--src/cm/cm.c166
1 files changed, 145 insertions, 21 deletions
diff --git a/src/cm/cm.c b/src/cm/cm.c
index a29e368..239bb5d 100644
--- a/src/cm/cm.c
+++ b/src/cm/cm.c
@@ -3,39 +3,163 @@
* Copyright (C) 2017-2018 J08nY
*/
#include "cm.h"
+#include "anomalous.h"
#include "cm_any.h"
#include "cm_prime.h"
-#include "io/output.h"
+#include "exhaustive/check.h"
+#include "exhaustive/exhaustive.h"
+#include "gen/curve.h"
+#include "gen/field.h"
+#include "gen/gens.h"
+#include "gen/hex.h"
+#include "gen/metadata.h"
+#include "gen/point.h"
#include "obj/curve.h"
-#include "p1363.h"
+#include "supersingular.h"
+
+static void cm_ginit(gen_f *generators, bool prime) {
+ // SEED unused.
+ generators[OFFSET_SEED] = &gen_skip;
+
+ // Setup stuff so it can be overridden.
+ if (cfg->unique) {
+ generators[OFFSET_GENERATORS] = &gens_gen_one;
+ } else {
+ generators[OFFSET_GENERATORS] = &gens_gen_any;
+ }
+
+ if (cfg->metadata) {
+ generators[OFFSET_METADATA] = &metadata_gen;
+ } else {
+ generators[OFFSET_METADATA] = &gen_skip;
+ }
+
+ switch (cfg->points.type) {
+ case POINTS_RANDOM:
+ if (cfg->points.amount) {
+ generators[OFFSET_POINTS] = &points_gen_random;
+ } else {
+ generators[OFFSET_POINTS] = &point_gen_random;
+ }
+ break;
+ case POINTS_PRIME:
+ generators[OFFSET_POINTS] = &points_gen_prime;
+ break;
+ case POINTS_NONPRIME:
+ generators[OFFSET_POINTS] = &points_gen_nonprime;
+ break;
+ case POINTS_ALL:
+ generators[OFFSET_POINTS] = &points_gen_allgroups;
+ break;
+ case POINTS_NONE:
+ generators[OFFSET_POINTS] = &gen_skip;
+ break;
+ }
+
+ // Now do the actual CM setup.
+ if (cfg->method == METHOD_CM) {
+ generators[OFFSET_FIELD] = &gen_skip;
+ generators[OFFSET_A] = &gen_skip;
+ generators[OFFSET_B] = &gen_skip;
+ if (prime) {
+ generators[OFFSET_CURVE] = &cm_gen_curve_prime;
+ generators[OFFSET_POINTS] = &points_gen_prime;
+ } else {
+ generators[OFFSET_CURVE] = &cm_gen_curve_any;
+ }
+ generators[OFFSET_ORDER] = &cm_gen_order;
+ } else if (cfg->method == METHOD_ANOMALOUS) {
+ generators[OFFSET_FIELD] = &anomalous_gen_field;
+ generators[OFFSET_A] = &gen_skip;
+ generators[OFFSET_B] = &anomalous_gen_equation;
+ generators[OFFSET_CURVE] = &curve_gen_any;
+ generators[OFFSET_ORDER] = &anomalous_gen_order;
+ } else if (cfg->method == METHOD_SUPERSINGULAR) {
+ if (cfg->random & RANDOM_FIELD) {
+ generators[OFFSET_FIELD] = &field_gen_random;
+ } else {
+ generators[OFFSET_FIELD] = &field_gen_input;
+ }
+ generators[OFFSET_A] = &gen_skip;
+ generators[OFFSET_B] = &supersingular_gen_equation;
+ generators[OFFSET_CURVE] = &curve_gen_any;
+ generators[OFFSET_ORDER] = &supersingular_gen_order;
+ }
+}
+
+static void cm_ainit(arg_t **gen_argss, arg_t **check_argss) {
+ if (cfg->method == METHOD_ANOMALOUS) {
+ arg_t *field_arg = arg_new();
+ arg_t *eq_arg = arg_new();
+ size_t *i = try_calloc(sizeof(size_t));
+ *i = 3;
+ field_arg->args = i;
+ field_arg->nargs = 1;
+ eq_arg->args = i;
+ eq_arg->nargs = 1;
+ eq_arg->allocd = i;
+ gen_argss[OFFSET_FIELD] = field_arg;
+ gen_argss[OFFSET_B] = eq_arg;
+ }
+
+ if (cfg->points.type == POINTS_RANDOM) {
+ arg_t *points_arg = arg_new();
+ points_arg->args = &cfg->points.amount;
+ points_arg->nargs = 1;
+ gen_argss[OFFSET_POINTS] = points_arg;
+ }
+}
+
+static void cm_cinit(check_t **validators) {
+ check_t *curve_check = check_new(curve_check_nonzero, NULL);
+ validators[OFFSET_CURVE] = curve_check;
+
+ if (cfg->hex_check) {
+ check_t *hex_check = check_new(hex_check_param, NULL);
+ validators[OFFSET_POINTS] = hex_check;
+ }
+}
int cm_do() {
debug_log_start("Starting Complex Multiplication method");
- int result = 0;
- GEN order = strtoi(cfg->cm_order);
- curve_t *curve = NULL;
+ gen_f generators[OFFSET_END] = {NULL};
+ arg_t *gen_argss[OFFSET_END] = {NULL};
+ check_t *validators[OFFSET_END] = {NULL};
+ arg_t *check_argss[OFFSET_END] = {NULL};
+ unroll_f unrolls[OFFSET_END] = {NULL};
- if (gequal0(order)) {
- fprintf(err, "Order requested not a number: %s\n", cfg->cm_order);
- result = 1;
- } else if (isprime(order)) {
- debug_log("Starting prime order curve generation");
- curve = cm_prime_curve(order);
- } else {
- debug_log("Starting composite order curve generation");
- curve = cm_any_curve(order);
+ exhaustive_t setup = {.generators = generators,
+ .gen_argss = gen_argss,
+ .validators = validators,
+ .check_argss = check_argss,
+ .unrolls = unrolls};
+
+ bool ord_prime = false;
+ if (cfg->method == METHOD_CM) {
+ GEN order = strtoi(cfg->cm_order);
+ if (gequal0(order)) {
+ fprintf(err, "Order requested not a number: %s\n", cfg->cm_order);
+ return 1;
+ }
+ ord_prime = (bool)isprime(order);
+ }
+
+ if (cfg->method == METHOD_ANOMALOUS) {
+ anomalous_init();
}
- if (curve) {
- output_o_begin();
- output_o(curve);
- output_o_end();
+ cm_ginit(setup.generators, ord_prime);
+ cm_ainit(setup.gen_argss, setup.check_argss);
+ cm_cinit(setup.validators);
+ exhaustive_uinit(setup.unrolls);
- curve_free(&curve);
- } else {
- result = 1;
+ int result = exhaustive_generate(&setup);
+
+ if (cfg->method == METHOD_ANOMALOUS) {
+ anomalous_quit();
}
+ exhaustive_clear(&setup);
debug_log_start("Finished Complex Multiplication method");
return result;