From 7f2aee83a9d5771b4c8bfd5d32d1eaa1e96398fa Mon Sep 17 00:00:00 2001 From: J08nY Date: Sun, 1 Oct 2017 02:56:56 +0200 Subject: Add GP interpreter check_f. --- src/gen/gp.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/gen/gp.h | 10 ++++++++++ 2 files changed, 66 insertions(+) diff --git a/src/gen/gp.c b/src/gen/gp.c index dff7ca1..7824a42 100644 --- a/src/gen/gp.c +++ b/src/gen/gp.c @@ -117,4 +117,60 @@ GENERATOR(gp_gen) { break; } return 1; +} + +CHECK(gp_check) { + HAS_ARG(args); + pari_sp ltop = avma; + GEN closure = compile_str(args->args); + GEN params = zerovec(state - OFFSET_SEED + 1); + + 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); + + int result = (int)itos(res); + avma = ltop; + return result; } \ No newline at end of file diff --git a/src/gen/gp.h b/src/gen/gp.h index c0ee1af..2f2f59d 100644 --- a/src/gen/gp.h +++ b/src/gen/gp.h @@ -16,4 +16,14 @@ */ GENERATOR(gp_gen); +/** + * @brief + * @param curve + * @param cfg + * @param args + * @param state + * @return + */ +CHECK(gp_check); + #endif // ECGEN_GP_H -- cgit v1.2.3-70-g09d2 From 3bd57944c8d7e416ae5adab88e2f89ed0a358ee1 Mon Sep 17 00:00:00 2001 From: J08nY Date: Tue, 3 Oct 2017 20:59:32 +0200 Subject: Add tests for gp interpretation check_f. --- test/src/gen/test_gp.c | 121 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 113 insertions(+), 8 deletions(-) diff --git a/test/src/gen/test_gp.c b/test/src/gen/test_gp.c index 0d01a3a..3f7a777 100644 --- a/test/src/gen/test_gp.c +++ b/test/src/gen/test_gp.c @@ -3,13 +3,14 @@ * Copyright (C) 2017 J08nY */ #include +#include #include "gen/gp.h" #include "test/default.h" #include "util/bits.h" TestSuite(gp, .init = default_setup, .fini = default_teardown); -Test(gp, test_gp_seed) { +Test(gp, test_gp_gen_seed) { curve_t curve = {0}; config_t cfg = {}; arg_t arg = {.args = "() -> { return(Vecsmall([1,0])); }", .nargs = 1}; @@ -21,7 +22,7 @@ Test(gp, test_gp_seed) { cr_assert(bits_eq(curve.seed->seed, bits_from_bin("10")),); } -Test(gp, test_gp_field) { +Test(gp, test_gp_gen_field) { curve_t curve = {0}; config_t cfg = {}; arg_t arg = {.args = "(seed) -> { return(19); }", .nargs = 1}; @@ -31,7 +32,7 @@ Test(gp, test_gp_field) { cr_assert(gequal(curve.field, stoi(19)),); } -Test(gp, test_gp_a) { +Test(gp, test_gp_gen_a) { curve_t curve = {.field = stoi(19)}; config_t cfg = {}; arg_t arg = {.args = "(seed, field) -> { return(Mod(3,field)); }", .nargs = 1}; @@ -41,7 +42,7 @@ Test(gp, test_gp_a) { cr_assert(gequal(curve.a, mkintmodu(3, 19)),); } -Test(gp, test_gp_b) { +Test(gp, test_gp_gen_b) { curve_t curve = {.field = stoi(19), .a = mkintmodu(3, 19)}; config_t cfg = {}; arg_t arg = {.args = "(seed, field, a) -> { return(a * 2); }", .nargs = 1}; @@ -51,7 +52,7 @@ Test(gp, test_gp_b) { cr_assert(gequal(curve.b, mkintmodu(6, 19)),); } -Test(gp, test_gp_curve) { +Test(gp, test_gp_gen_curve) { curve_t curve = {.field = stoi(19), .a = mkintmodu(3, 19), .b = mkintmodu(6, 19)}; config_t cfg = {}; arg_t arg = {.args = "(seed, field, a, b) -> { return(ellinit([a,b], field)); }", .nargs = 1}; @@ -61,7 +62,7 @@ Test(gp, test_gp_curve) { cr_assert(gequal(curve.curve, ellinit(mkvec2(curve.a, curve.b), curve.field, 0)),); } -Test(gp, test_gp_order) { +Test(gp, test_gp_gen_order) { curve_t curve = {.field = stoi(19), .a = mkintmodu(3, 19), .b = mkintmodu(6, 19), .curve = ellinit(mkvec2(stoi(3), stoi(6)), stoi(19), 0)}; config_t cfg = {}; @@ -72,7 +73,7 @@ Test(gp, test_gp_order) { cr_assert(gequal(ellsea(curve.curve, 0), curve.order),); } -Test(gp, test_gp_generators) { +Test(gp, test_gp_gen_generators) { curve_t curve = {.field = stoi(19), .a = mkintmodu(3, 19), .b = mkintmodu(6, 19), .curve = ellinit(mkvec2(stoi(3), stoi(6)), stoi(19), 0), .order = stoi(16) }; @@ -90,7 +91,7 @@ Test(gp, test_gp_generators) { } } -Test(gp, test_gp_points) { +Test(gp, test_gp_gen_points) { curve_t curve = {.field = stoi(19), .a = mkintmodu(3, 19), .b = mkintmodu(6, 19), .curve = ellinit(mkvec2(stoi(3), stoi(6)), stoi(19), 0), .order = stoi(16), }; @@ -106,4 +107,108 @@ Test(gp, test_gp_points) { cr_assert_eq(ret, 1,); cr_assert_eq(curve.npoints, 1,); cr_assert(gequal(curve.points[0]->point, ellmul(curve.curve, gen.point, stoi(2))),); +} + +Test(gp, test_gp_check_seed) { + seed_t seed = {.seed = bits_from_hex("ff")}; + curve_t curve = {.seed = &seed}; + + config_t cfg = {}; + arg_t arg = {.args="(seed) -> { return(1);}"}; + + int ret = gp_check(&curve, &cfg, &arg, OFFSET_SEED); + cr_assert_eq(ret, 1,); +} + +Test(gp, test_gp_check_field) { + seed_t seed = {.seed = bits_from_hex("ff")}; + curve_t curve = {.seed = &seed, .field = stoi(19)}; + + config_t cfg = {}; + arg_t arg = {.args="(seed, field) -> { if(field == 19, return(1));}"}; + + int ret = gp_check(&curve, &cfg, &arg, OFFSET_FIELD); + cr_assert_eq(ret, 1,); +} + +Test(gp, test_gp_check_a) { + seed_t seed = {.seed = bits_from_hex("ff")}; + curve_t curve = {.seed = &seed, .field = stoi(19), .a = mkintmodu(3, 19)}; + + config_t cfg = {}; + arg_t arg = {.args="(seed, field, a) -> { if(a == Mod(3,19), return(1));}"}; + + int ret = gp_check(&curve, &cfg, &arg, OFFSET_A); + cr_assert_eq(ret, 1,); +} + +Test(gp, test_gp_check_b) { + seed_t seed = {.seed = bits_from_hex("ff")}; + curve_t curve = {.seed = &seed, .field = stoi(19), .a = mkintmodu(3, 19), .b = mkintmodu(5, 19)}; + + config_t cfg = {}; + arg_t arg = {.args="(seed, field, a, b) -> { if(b == Mod(5,19), return(1));}"}; + + int ret = gp_check(&curve, &cfg, &arg, OFFSET_B); + cr_assert_eq(ret, 1,); +} + +Test(gp, test_gp_check_curve) { + seed_t seed = {.seed = bits_from_hex("ff")}; + curve_t curve = {.seed = &seed, .field = stoi(19), .a = mkintmodu(3, 19), .b = mkintmodu(5, 19), + .curve = ellinit(mkvec2(stoi(3), stoi(5)), stoi(19), 0)}; + + config_t cfg = {}; + arg_t arg = {.args="(seed, field, a, b, curve) -> { if(curve == ellinit([3, 5], 19), return(1));}"}; + + int ret = gp_check(&curve, &cfg, &arg, OFFSET_CURVE); + cr_assert_eq(ret, 1,); +} + +Test(gp, test_gp_check_order) { + seed_t seed = {.seed = bits_from_hex("ff")}; + curve_t curve = {.seed = &seed, .field = stoi(19), .a = mkintmodu(3, 19), .b = mkintmodu(5, 19), + .curve = ellinit(mkvec2(stoi(3), stoi(5)), stoi(19), 0), .order = stoi(16)}; + + config_t cfg = {}; + arg_t arg = {.args="(seed, field, a, b, curve, order) -> { if(order == 16, return(1));}"}; + + int ret = gp_check(&curve, &cfg, &arg, OFFSET_ORDER); + cr_assert_eq(ret, 1,); +} + +Test(gp, test_gp_check_generators) { + seed_t seed = {.seed = bits_from_hex("ff")}; + curve_t curve = {.seed = &seed, .field = stoi(19), .a = mkintmodu(3, 19), .b = mkintmodu(6, 19), + .curve = ellinit(mkvec2(stoi(3), stoi(6)), stoi(19), 0), .order = stoi(16), + }; + point_t gen = {.point = mkvec2(mkintmodu(4,19), mkintmodu(14,19))}; + point_t *generators[1] = {&gen}; + curve.generators = generators; + curve.ngens = 1; + + config_t cfg = {}; + arg_t arg = {.args="(seed, field, a, b, curve, order, gens) -> { if(gens == ellgenerators(curve), return(1));}"}; + + int ret = gp_check(&curve, &cfg, &arg, OFFSET_GENERATORS); + cr_assert_eq(ret, 1,); +} + +Test(gp, test_gp_check_points) { + seed_t seed = {.seed = bits_from_hex("ff")}; + curve_t curve = {.seed = &seed, .field = stoi(19), .a = mkintmodu(3, 19), .b = mkintmodu(6, 19), + .curve = ellinit(mkvec2(stoi(3), stoi(6)), stoi(19), 0), .order = stoi(16), + }; + point_t gen = {.point = mkvec2(mkintmodu(4,19), mkintmodu(14,19))}; + point_t *generators[1] = {&gen}; + curve.generators = generators; + curve.ngens = 1; + curve.points = generators; + curve.npoints = 1; + + config_t cfg = {}; + arg_t arg = {.args="(seed, field, a, b, curve, order, gens, points) -> { if(points == ellgenerators(curve), return(1));}"}; + + int ret = gp_check(&curve, &cfg, &arg, OFFSET_POINTS); + cr_assert_eq(ret, 1,); } \ No newline at end of file -- cgit v1.2.3-70-g09d2