diff options
| -rw-r--r-- | src/exhaustive/check.c | 21 | ||||
| -rw-r--r-- | src/exhaustive/check.h | 2 | ||||
| -rw-r--r-- | src/exhaustive/exhaustive.c | 26 | ||||
| -rw-r--r-- | src/gen/curve.c | 8 | ||||
| -rw-r--r-- | src/gen/curve.h | 15 | ||||
| -rw-r--r-- | src/invalid/invalid.c | 23 |
6 files changed, 60 insertions, 35 deletions
diff --git a/src/exhaustive/check.c b/src/exhaustive/check.c index 1492b3c..1549af8 100644 --- a/src/exhaustive/check.c +++ b/src/exhaustive/check.c @@ -5,10 +5,29 @@ #include "check.h" #include "util/memory.h" -check_t *check_new(void) { return try_calloc(sizeof(check_t)); } +check_t *check_new(check_f one, ...) { + check_t *result = try_calloc(sizeof(check_t)); + result->checks = try_calloc(sizeof(check_f)); + result->checks[0] = one; + result->nchecks = 1; + + va_list args; + va_start(args, one); + check_f check; + while ((check = va_arg(args, check_f)) != NULL) { + result->checks = try_realloc(result->checks, ++result->nchecks); + result->checks[result->nchecks - 1] = check; + } + va_end(args); + + return result; +} void check_free(check_t **check) { if (*check) { + if ((*check)->checks) { + try_free((*check)->checks); + } try_free(*check); *check = NULL; } diff --git a/src/exhaustive/check.h b/src/exhaustive/check.h index d5584da..62416a8 100644 --- a/src/exhaustive/check.h +++ b/src/exhaustive/check.h @@ -14,7 +14,7 @@ * @brief * @return */ -check_t *check_new(void); +check_t *check_new(check_f one, ...); /** * @brief diff --git a/src/exhaustive/exhaustive.c b/src/exhaustive/exhaustive.c index 3e39a82..6c8c83d 100644 --- a/src/exhaustive/exhaustive.c +++ b/src/exhaustive/exhaustive.c @@ -3,8 +3,10 @@ * Copyright (C) 2017 J08nY */ #include "exhaustive.h" +#include <misc/types.h> #include "anomalous.h" #include "ansi.h" +#include "check.h" #include "gen/curve.h" #include "gen/equation.h" #include "gen/field.h" @@ -41,7 +43,6 @@ static void exhaustive_ginit(gen_f *generators, const config_t *cfg) { default: break; } - generators[OFFSET_CURVE] = &curve_gen_nonzero; generators[OFFSET_ORDER] = &order_gen_any; } else { // setup normal generators @@ -72,8 +73,6 @@ static void exhaustive_ginit(gen_f *generators, const config_t *cfg) { generators[OFFSET_B] = &b_gen_one; } - generators[OFFSET_CURVE] = &curve_gen_nonzero; - if (cfg->prime) { generators[OFFSET_ORDER] = &order_gen_prime; } else if (cfg->cofactor) { @@ -84,8 +83,9 @@ static void exhaustive_ginit(gen_f *generators, const config_t *cfg) { generators[OFFSET_ORDER] = &order_gen_any; } } - // setup common generators + generators[OFFSET_CURVE] = &curve_gen_any; + if (cfg->unique) { generators[OFFSET_GENERATORS] = &gens_gen_one; } else { @@ -123,7 +123,10 @@ static void exhaustive_ginit(gen_f *generators, const config_t *cfg) { } } -static void exhaustive_cinit(check_t **validators, const config_t *cfg) {} +static void exhaustive_cinit(check_t **validators, const config_t *cfg) { + check_t *curve_check = check_new(curve_check_nonzero, NULL); + validators[OFFSET_CURVE] = curve_check; +} static void exhaustive_ainit(arg_t **argss, const config_t *cfg) { if (cfg->anomalous) { @@ -202,7 +205,7 @@ 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[state](curve, cfg, arg); + int new_diff = validator->checks[i](curve, cfg, arg); if (new_diff <= 0) { diff = new_diff; break; @@ -271,12 +274,15 @@ static void exhaustive_init(exhaustive_t *setup, const config_t *cfg) { anomalous_init(); } -static void exhaustive_quit(arg_t *argss[]) { +static void exhaustive_quit(exhaustive_t *setup) { equation_quit(); anomalous_quit(); for (size_t i = 0; i < OFFSET_END; ++i) { - if (argss[i]) { - arg_free(&(argss[i])); + if (setup->argss[i]) { + arg_free(&(setup->argss[i])); + } + if (setup->validators[i]) { + check_free(&(setup->validators[i])); } } } @@ -313,7 +319,7 @@ int exhaustive_do(config_t *cfg) { } output_o_end(cfg); - exhaustive_quit(setup.argss); + exhaustive_quit(&setup); debug_log_end("Finished Exhaustive method"); return EXIT_SUCCESS; } diff --git a/src/gen/curve.c b/src/gen/curve.c index 62c8fa3..55fdb3f 100644 --- a/src/gen/curve.c +++ b/src/gen/curve.c @@ -116,14 +116,8 @@ GENERATOR(curve_gen_any) { } } -GENERATOR(curve_gen_nonzero) { - pari_sp ltop = avma; - int any = curve_gen_any(curve, cfg, args); - if (any <= 0) { - return any; - } +CHECK(curve_check_nonzero) { if (gequal0(ell_get_disc(curve->curve))) { - avma = ltop; return -3; } else { return 1; diff --git a/src/gen/curve.h b/src/gen/curve.h index 7694078..1bff19a 100644 --- a/src/gen/curve.h +++ b/src/gen/curve.h @@ -24,16 +24,15 @@ GENERATOR(curve_gen_any); /** - * GENERATOR(gen_f) - * Creates a curve GEN in curve_t curve from field, a and b. - * Succeeds if a curve exists(non-zero discriminant). + * CHECK(check_f) + * Checks that the curve has non-zero discriminant. * - * @param curve A curve_t being generated - * @param cfg An application config - * @param args unused - * @return state diff + * @param curve + * @param cfg + * @param args + * @return */ -GENERATOR(curve_gen_nonzero); +CHECK(curve_check_nonzero); /** * diff --git a/src/invalid/invalid.c b/src/invalid/invalid.c index 34d7667..c3abbc7 100644 --- a/src/invalid/invalid.c +++ b/src/invalid/invalid.c @@ -3,7 +3,7 @@ * Copyright (C) 2017 J08nY */ #include "invalid.h" -#include <exhaustive/exhaustive.h> +#include "exhaustive/check.h" #include "exhaustive/exhaustive.h" #include "gen/curve.h" #include "gen/equation.h" @@ -27,7 +27,7 @@ static void invalid_original_ginit(gen_f *generators, const config_t *cfg) { generators[OFFSET_B] = &b_gen_input; } generators[OFFSET_GENERATORS] = &gens_gen_any; - generators[OFFSET_CURVE] = &curve_gen_nonzero; + generators[OFFSET_CURVE] = &curve_gen_any; generators[OFFSET_ORDER] = &order_gen_any; } @@ -36,7 +36,7 @@ static void invalid_invalid_ginit(gen_f *generators, const config_t *cfg) { generators[OFFSET_FIELD] = &gen_skip; generators[OFFSET_A] = &gen_skip; generators[OFFSET_B] = &b_gen_random; - generators[OFFSET_CURVE] = &curve_gen_nonzero; + generators[OFFSET_CURVE] = &curve_gen_any; generators[OFFSET_ORDER] = &order_gen_any; if (cfg->unique) { generators[OFFSET_GENERATORS] = &gens_gen_one; @@ -46,6 +46,11 @@ static void invalid_invalid_ginit(gen_f *generators, const config_t *cfg) { generators[OFFSET_POINTS] = &points_gen_trial; } +static void invalid_cinit(check_t **validators, const config_t *cfg) { + check_t *curve_check = check_new(curve_check_nonzero, NULL); + validators[OFFSET_CURVE] = curve_check; +} + static size_t invalid_primes(GEN order, pari_ulong **primes) { pari_sp ltop = avma; @@ -277,13 +282,15 @@ static size_t invalid_curves_threaded(const curve_t *curve, const config_t *cfg, int invalid_do(config_t *cfg) { debug_log_start("Starting Invalid curve method"); - gen_f original_gens[OFFSET_END]; - arg_t *original_argss[OFFSET_END]; - unroll_f common_unrolls[OFFSET_END]; + gen_f original_gens[OFFSET_END] = {NULL}; + check_t *common_validators[OFFSET_END] = {NULL}; + arg_t *original_argss[OFFSET_END] = {NULL}; + unroll_f common_unrolls[OFFSET_END] = {NULL}; invalid_original_ginit(original_gens, cfg); + invalid_cinit(common_validators, cfg); exhaustive_uinit(common_unrolls, cfg); exhaustive_t original_setup = {.generators = original_gens, - .validators = NULL, + .validators = common_validators, .argss = original_argss, .unrolls = common_unrolls}; @@ -313,7 +320,7 @@ int invalid_do(config_t *cfg) { gen_f invalid_gens[OFFSET_END]; invalid_invalid_ginit(invalid_gens, cfg); exhaustive_t invalid_setup = {.generators = invalid_gens, - .validators = NULL, + .validators = common_validators, .argss = NULL, .unrolls = common_unrolls}; |
