From 43362aa1c57e3801f57c966c851a70d8e4edb3b4 Mon Sep 17 00:00:00 2001 From: J08nY Date: Sun, 17 Dec 2017 19:30:46 +0100 Subject: Fix gens_get_embedding and brainpool RFC generation. - The Brainpool RFC generation still uses way too much stack, so it is likely leaking it somewhere, but not sure where. --- src/exhaustive/brainpool.c | 5 ++--- src/exhaustive/brainpool_rfc.c | 8 -------- src/gen/gens.c | 4 +++- src/gen/order.c | 8 +++++--- test/src/exhaustive/test_brainpool_rfc.c | 7 +++++-- test/src/test/default.c | 2 +- 6 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/exhaustive/brainpool.c b/src/exhaustive/brainpool.c index 3debaec..c45d0d5 100644 --- a/src/exhaustive/brainpool.c +++ b/src/exhaustive/brainpool.c @@ -4,7 +4,6 @@ */ #include "brainpool.h" -#include #include "gen/gens.h" #include "gen/point.h" #include "gen/seed.h" @@ -147,7 +146,6 @@ GENERATOR(brainpool_gen_equation) { seed->brainpool.update_seed = false; } - GEN z; bits_t *a_bits = brainpool_hash(seed->seed, seed->brainpool.w, seed->brainpool.v); GEN a = bits_to_i(a_bits); @@ -158,7 +156,8 @@ GENERATOR(brainpool_gen_equation) { avma = btop; continue; } - z = Fp_sqrtn(Fp_muls(am, -1, curve->field), stoi(4), curve->field, + GEN z; + z = Fp_sqrtn(Fp_muls(am, -3, curve->field), stoi(4), curve->field, NULL); if (z == NULL) { brainpool_update_seed(seed->seed); diff --git a/src/exhaustive/brainpool_rfc.c b/src/exhaustive/brainpool_rfc.c index 921dff3..81529d2 100644 --- a/src/exhaustive/brainpool_rfc.c +++ b/src/exhaustive/brainpool_rfc.c @@ -33,24 +33,19 @@ GENERATOR(brainpool_rfc_gen_equation) { // field is definitely prime pari_sp btop = avma; seed_t *seed = curve->seed; - pari_printf("seed before %P#x\n", bits_to_i(seed->seed)); do { if (seed->brainpool.update_seed) { - printf("updating seed\n"); brainpool_update_seed(seed->seed); - pari_printf("seed after %P#x\n", bits_to_i(seed->seed)); seed->brainpool.update_seed = false; } bits_t *a_bits = brainpool_hash(seed->seed, seed->brainpool.w, seed->brainpool.v); GEN a = bits_to_i(a_bits); - pari_printf("trying a = '%P#x'\n", a); bits_free(&a_bits); GEN am = Fp_invsafe(a, curve->field); if (am == NULL) { brainpool_update_seed(seed->seed); - pari_printf("a, update seed(noinv) %P#x\n", bits_to_i(seed->seed)); avma = btop; continue; } @@ -59,7 +54,6 @@ GENERATOR(brainpool_rfc_gen_equation) { NULL); if (z == NULL) { brainpool_update_seed(seed->seed); - pari_printf("a, update seed(sqrtn) %P#x\n", bits_to_i(seed->seed)); avma = btop; continue; } @@ -72,7 +66,6 @@ GENERATOR(brainpool_rfc_gen_equation) { avma = bbtop; } brainpool_update_seed(seed->seed); - pari_printf("b, update seed %P#x\n", bits_to_i(seed->seed)); bits_t *b_bits = brainpool_hash(seed->seed, seed->brainpool.w, seed->brainpool.v); b = bits_to_i(b_bits); @@ -87,7 +80,6 @@ GENERATOR(brainpool_rfc_gen_equation) { if (gequal0(gmulsg(-16, gadd(gmulsg(4, gpowgs(mod_a, 3)), gmulsg(27, gsqr(mod_b)))))) { brainpool_update_seed(seed->seed); - pari_printf("curve, update seed %P#x\n", bits_to_i(seed->seed)); bits_free(&seed->brainpool.seed_a); bits_free(&seed->brainpool.seed_b); avma = btop; diff --git a/src/gen/gens.c b/src/gen/gens.c index e2c624e..04e7646 100644 --- a/src/gen/gens.c +++ b/src/gen/gens.c @@ -50,13 +50,15 @@ CHECK(gens_check_anomalous) { GEN gens_get_embedding(GEN prime, GEN order) { pari_sp ltop = avma; + GEN degree = gen_0; GEN power = gen_1; GEN pm; do { + degree = addii(degree, gen_1); power = mulii(power, prime); pm = subii(power, gen_1); } while (!dvdii(pm, order)); - return gerepilecopy(ltop, power); + return gerepilecopy(ltop, degree); } CHECK(gens_check_embedding) { diff --git a/src/gen/order.c b/src/gen/order.c index 366c2cd..1c9e280 100644 --- a/src/gen/order.c +++ b/src/gen/order.c @@ -20,10 +20,12 @@ GENERATOR(order_gen_input) { } GENERATOR(order_gen_any) { + pari_sp ltop = avma; GEN ord = ellff_get_card(curve->curve); if (isclone(ord)) { - curve->order = gcopy(ord); + curve->order = gerepilecopy(ltop, ord); } else { + avma = ltop; curve->order = ord; } return 1; @@ -36,7 +38,7 @@ GENERATOR(order_gen_sea) { avma = ltop; return -4; } else { - curve->order = order; + curve->order = gerepilecopy(ltop, order); obj_insert_shallow(curve->curve, 1, order); return 1; } @@ -86,7 +88,7 @@ GENERATOR(order_gen_prime) { avma = ltop; return -4; } else { - curve->order = order; + curve->order = gerepilecopy(ltop, order); obj_insert_shallow(curve->curve, 1, curve->order); return 1; } diff --git a/test/src/exhaustive/test_brainpool_rfc.c b/test/src/exhaustive/test_brainpool_rfc.c index 19008b4..63ed116 100644 --- a/test/src/exhaustive/test_brainpool_rfc.c +++ b/test/src/exhaustive/test_brainpool_rfc.c @@ -212,10 +212,13 @@ ParameterizedTest(struct rfc_params *param, brainpool_rfc, setup.validators = checks; setup.unrolls = unrolls; + // pari_sp top = avma; + // pari_ulong debug_before = DEBUGLEVEL; + // DEBUGLEVEL = 3; ret = exhaustive_gen(&curve, &setup, OFFSET_A, OFFSET_GENERATORS); + // DEBUGLEVEL = debug_before; + // dbg_gerepile(top); - pari_printf("expected a = %P#x\n", lift(a)); - pari_printf("real a = %P#x\n", lift(curve.a)); cr_assert_not_null(curve.a, ); cr_assert_not_null(curve.b, ); cr_assert_eq(ret, 1, ); diff --git a/test/src/test/default.c b/test/src/test/default.c index 52cd895..27f9525 100644 --- a/test/src/test/default.c +++ b/test/src/test/default.c @@ -9,7 +9,7 @@ void default_setup(void) { memset(cfg, 0, sizeof(config_t)); - pari_init(200000000, 1000000); + pari_init(200000000, 1000000); // 200MB memory, 1M primes // set_mem_funcs(cr_malloc, cr_simple_calloc, cr_realloc, cr_free); } -- cgit v1.2.3-70-g09d2