aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ08nY2017-10-03 21:00:18 +0200
committerJ08nY2017-10-03 21:00:18 +0200
commit42576337198e76fa0f5dad74800237254a0fda35 (patch)
tree1ed6170514d7c378da641db9cb230884a4d979a7
parent6fea41693fa19734747103b5cf4d681613090bc1 (diff)
parent3bd57944c8d7e416ae5adab88e2f89ed0a358ee1 (diff)
downloadecgen-42576337198e76fa0f5dad74800237254a0fda35.tar.gz
ecgen-42576337198e76fa0f5dad74800237254a0fda35.tar.zst
ecgen-42576337198e76fa0f5dad74800237254a0fda35.zip
-rw-r--r--src/gen/gp.c56
-rw-r--r--src/gen/gp.h10
-rw-r--r--test/src/gen/test_gp.c121
3 files changed, 179 insertions, 8 deletions
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
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 <criterion/criterion.h>
+#include <misc/types.h>
#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