summaryrefslogtreecommitdiff
path: root/test/src/gen/test_point.c
diff options
context:
space:
mode:
authorJ08nY2018-03-03 01:02:08 +0100
committerJ08nY2018-03-03 01:02:08 +0100
commitac60f78a253efde94cab36264b0555b0691fdd8a (patch)
tree12ce2bfdee1f13f0b6e56a017c3c29979475fe02 /test/src/gen/test_point.c
parent40cbb213ac910ddcaf22a26a247d2a9eeddca1fc (diff)
downloadecgen-ac60f78a253efde94cab36264b0555b0691fdd8a.tar.gz
ecgen-ac60f78a253efde94cab36264b0555b0691fdd8a.tar.zst
ecgen-ac60f78a253efde94cab36264b0555b0691fdd8a.zip
Rewrite generator and point generation code.
Diffstat (limited to 'test/src/gen/test_point.c')
-rw-r--r--test/src/gen/test_point.c171
1 files changed, 105 insertions, 66 deletions
diff --git a/test/src/gen/test_point.c b/test/src/gen/test_point.c
index ca23ba6..cb27495 100644
--- a/test/src/gen/test_point.c
+++ b/test/src/gen/test_point.c
@@ -5,6 +5,7 @@
#include <criterion/criterion.h>
#include "gen/point.h"
+#include "math/subgroup.h"
#include "test/io.h"
TestSuite(point, .init = io_setup, .fini = io_teardown);
@@ -31,118 +32,160 @@ Test(point, test_points_clone) {
points_free_deep(&others, 1);
}
+// TODO: add utility functions to setup the two example curves used in these tests.
+
Test(point, test_point_random) {
// curve = ellinit([1, 3], 23), order = 27
GEN e = ellinit(mkvec2s(1, 3), stoi(23), -1);
- curve_t curve = {.order = stoi(27), .curve = e};
+ GEN gen = mkvec2(mkintmodu(15, 23), mkintmodu(14, 23));
+ point_t gen_point = {.point = gen, .order = stoi(27), .cofactor = stoi(1)};
+ subgroup_t gen_subgroup = {.generator = &gen_point};
+ subgroup_t *generators[1] = {&gen_subgroup};
+ curve_t curve = {.order = stoi(27), .curve = e, .generators = generators};
int ret = point_gen_random(&curve, NULL, OFFSET_POINTS);
cr_assert_eq(ret, 1, "Point wasn't generated.");
- cr_assert_eq(curve.npoints, 1, "Incorrect number of points.");
- cr_assert_not_null(curve.points, "Points are null.");
- cr_assert(ellisoncurve(e, curve.points[0]->point), "Point not on curve.");
- cr_assert(gequal(ellorder(e, curve.points[0]->point, NULL),
- curve.points[0]->order),
+ cr_assert_eq(gen_subgroup.npoints, 1, "Incorrect number of points.");
+ cr_assert_not_null(gen_subgroup.points, "Points are null.");
+ cr_assert(ellisoncurve(e, gen_subgroup.points[0]->point), "Point not on curve.");
+ cr_assert(gequal(ellorder(e, gen_subgroup.points[0]->point, NULL),
+ gen_subgroup.points[0]->order),
"Point has wrong order set.");
- points_free_deep(&curve.points, 1);
+ points_free_deep(&gen_subgroup.points, gen_subgroup.npoints);
+}
+
+Test(point, test_point_random_more_gens) {
+ GEN e = ellinit(mkvec2s(2,3), stoi(23), -1);
+ GEN one_gen = mkvec2(mkintmodu(6, 23), mkintmodu(1,23));
+ point_t *one_gen_point = point_new();
+ one_gen_point->point = one_gen;
+ one_gen_point->order = stoi(12);
+ one_gen_point->cofactor = stoi(2);
+ subgroup_t *one_subgroup = subgroup_new();
+ one_subgroup->generator = one_gen_point;
+ GEN two_gen = mkvec2(mkintmodu(20, 23), mkintmodu(19, 23));
+ point_t *two_gen_point = point_new();
+ two_gen_point->point = two_gen;
+ two_gen_point->order = stoi(6);
+ two_gen_point->cofactor = stoi(4);
+ subgroup_t *two_subgroup = subgroup_new();
+ two_subgroup->generator = two_gen_point;
+ subgroup_t **subgroups = subgroups_new(2);
+ subgroups[0] = one_subgroup;
+ subgroups[1] = two_subgroup;
+ curve_t curve = {.order = stoi(24), .curve = e, .generators = subgroups, .ngens = 2};
+ int ret = point_gen_random(&curve, NULL, OFFSET_POINTS);
+
+ cr_assert_eq(ret, 1, "Point wasn't generated.");
+ size_t generated = 0;
+ for (size_t i = 0; i < 2; ++i) {
+ subgroup_t *subgroup = curve.generators[i];
+ if (subgroup->npoints > 0) {
+ generated += subgroup->npoints;
+ cr_assert_not_null(subgroup->points, "Points are null.");
+ cr_assert(ellisoncurve(e, subgroup->points[0]->point), "Point not on curve.");
+ cr_assert(gequal(ellorder(e, subgroup->points[0]->point, NULL),
+ subgroup->points[0]->order),
+ "Point has wrong order set.");
+ }
+ }
+ cr_assert_eq(generated, 1, "Point wasn't saved.");
+
+ subgroups_free_deep(&subgroups, 2);
}
Test(point, test_points_random) {
// curve = ellinit([1, 3], 23), order = 27
GEN e = ellinit(mkvec2s(1, 3), stoi(23), -1);
- curve_t curve = {.order = stoi(27), .curve = e};
+ GEN gen = mkvec2(mkintmodu(15, 23), mkintmodu(14, 23));
+ point_t gen_point = {.point = gen, .order = stoi(27), .cofactor = stoi(1)};
+ subgroup_t gen_subgroup = {.generator = &gen_point};
+ subgroup_t *generators[1] = {&gen_subgroup};
+ curve_t curve = {.order = stoi(27), .curve = e, .generators = generators, .ngens = 1};
size_t npoints = 3;
arg_t arg = {.args = &npoints, .nargs = 1};
int ret = points_gen_random(&curve, &arg, OFFSET_POINTS);
cr_assert_eq(ret, 1, "Points weren't generated.");
- cr_assert_eq(curve.npoints, npoints, "Incorrect number of points.");
- cr_assert_not_null(curve.points, "Points are null.");
+ cr_assert_eq(gen_subgroup.npoints, npoints, "Incorrect number of points.");
+ cr_assert_not_null(gen_subgroup.points, "Points are null.");
for (size_t i = 0; i < npoints; i++) {
- point_t *point = curve.points[i];
+ point_t *point = gen_subgroup.points[i];
cr_assert(ellisoncurve(e, point->point), "Point not on curve.");
cr_assert(gequal(ellorder(e, point->point, NULL), point->order),
"Point has wrong order set.");
}
- points_free_deep(&curve.points, npoints);
+ points_free_deep(&gen_subgroup.points, npoints);
}
Test(point, test_points_trial) {
// curve = ellinit([1, 3], 23), order = 27
GEN e = ellinit(mkvec2s(1, 3), stoi(23), -1);
- point_t **gens = points_new(1);
- gens[0] = point_new();
- gens[0]->order = stoi(27);
- gens[0]->cofactor = stoi(1);
- gens[0]->point = mkvec2(mkintmodu(15, 23), mkintmodu(14, 23));
- curve_t curve = {
- .order = stoi(27), .curve = e, .ngens = 1, .generators = gens};
+ GEN gen = mkvec2(mkintmodu(15, 23), mkintmodu(14, 23));
+ point_t gen_point = {.point = gen, .order = stoi(27), .cofactor = stoi(1)};
+ subgroup_t gen_subgroup = {.generator = &gen_point};
+ subgroup_t *generators[1] = {&gen_subgroup};
+ curve_t curve = {.order = stoi(27), .curve = e, .generators = generators, .ngens = 1};
pari_ulong prime = 3;
arg_t arg = {.args = &prime, .nargs = 1};
int ret = points_gen_trial(&curve, &arg, OFFSET_POINTS);
cr_assert_eq(ret, 1, "Points weren't generated.");
- cr_assert_eq(curve.npoints, 1, "Incorrect number of points.");
- cr_assert_not_null(curve.points, "Points are null.");
- cr_assert(ellisoncurve(e, curve.points[0]->point), "Point not on curve.");
- cr_assert(gequal(ellorder(e, curve.points[0]->point, NULL),
- curve.points[0]->order),
+ cr_assert_eq(gen_subgroup.npoints, 1, "Incorrect number of points.");
+ cr_assert_not_null(gen_subgroup.points, "Points are null.");
+ cr_assert(ellisoncurve(e, gen_subgroup.points[0]->point), "Point not on curve.");
+ cr_assert(gequal(ellorder(e, gen_subgroup.points[0]->point, NULL),
+ gen_subgroup.points[0]->order),
"Point has wrong order set.");
- cr_assert(gequal(curve.points[0]->order, utoi(prime)),
+ cr_assert(gequal(gen_subgroup.points[0]->order, utoi(prime)),
"Point has wrong order.");
- points_free_deep(&curve.points, 1);
- points_free_deep(&curve.generators, 1);
+ points_free_deep(&gen_subgroup.points, 1);
}
Test(point, test_points_prime) {
// curve = ellinit([1, 3], 23), order = 27
GEN e = ellinit(mkvec2s(1, 3), stoi(23), -1);
- point_t **gens = points_new(1);
- gens[0] = point_new();
- gens[0]->order = stoi(27);
- gens[0]->cofactor = stoi(1);
- gens[0]->point = mkvec2(mkintmodu(15, 23), mkintmodu(14, 23));
- curve_t curve = {
- .order = stoi(27), .curve = e, .ngens = 1, .generators = gens};
+ GEN gen = mkvec2(mkintmodu(15, 23), mkintmodu(14, 23));
+ point_t gen_point = {.point = gen, .order = stoi(27), .cofactor = stoi(1)};
+ subgroup_t gen_subgroup = {.generator = &gen_point};
+ subgroup_t *generators[1] = {&gen_subgroup};
+ curve_t curve = {.order = stoi(27), .curve = e, .generators = generators, .ngens = 1};
pari_ulong prime = 3;
int ret = points_gen_prime(&curve, NULL, OFFSET_POINTS);
cr_assert_eq(ret, 1, "Points weren't generated.");
- cr_assert_eq(curve.npoints, 1, "Incorrect number of points.");
- cr_assert_not_null(curve.points, "Points are null.");
- cr_assert(ellisoncurve(e, curve.points[0]->point), "Point not on curve.");
- cr_assert(gequal(ellorder(e, curve.points[0]->point, NULL),
- curve.points[0]->order),
+ cr_assert_eq(gen_subgroup.npoints, 1, "Incorrect number of points.");
+ cr_assert_not_null(gen_subgroup.points, "Points are null.");
+ cr_assert(ellisoncurve(e, gen_subgroup.points[0]->point), "Point not on curve.");
+ cr_assert(gequal(ellorder(e, gen_subgroup.points[0]->point, NULL),
+ gen_subgroup.points[0]->order),
"Point has wrong order set.");
- cr_assert(gequal(curve.points[0]->order, utoi(prime)),
+ cr_assert(gequal(gen_subgroup.points[0]->order, utoi(prime)),
"Point has wrong order.");
- points_free_deep(&curve.points, 1);
- points_free_deep(&curve.generators, 1);
+ points_free_deep(&gen_subgroup.points, 1);
}
Test(point, test_points_all) {
// curve = ellinit([1, 3], 23), order = 27
GEN e = ellinit(mkvec2s(1, 3), stoi(23), -1);
- point_t **gens = points_new(1);
- gens[0] = point_new();
- gens[0]->order = stoi(27);
- gens[0]->cofactor = stoi(1);
- gens[0]->point = mkvec2(mkintmodu(15, 23), mkintmodu(14, 23));
- curve_t curve = {
- .order = stoi(27), .curve = e, .ngens = 1, .generators = gens};
+ GEN gen = mkvec2(mkintmodu(15, 23), mkintmodu(14, 23));
+ point_t gen_point = {.point = gen, .order = stoi(27), .cofactor = stoi(1)};
+ subgroup_t gen_subgroup = {.generator = &gen_point};
+ subgroup_t *generators[1] = {&gen_subgroup};
+ curve_t curve = {.order = stoi(27), .curve = e, .generators = generators, .ngens = 1};
GEN orders = mkvec3s(3, 9, 27);
size_t npoints = 3;
int ret = points_gen_allgroups(&curve, NULL, OFFSET_POINTS);
cr_assert_eq(ret, 1, "Points weren't generated.");
- cr_assert_eq(curve.npoints, npoints, "Incorrect number of points.");
- cr_assert_not_null(curve.points, "Points are null.");
+ cr_assert_eq(gen_subgroup.npoints, npoints, "Incorrect number of points.");
+ cr_assert_not_null(gen_subgroup.points, "Points are null.");
for (size_t i = 0; i < npoints; i++) {
- point_t *point = curve.points[i];
+ point_t *point = gen_subgroup.points[i];
cr_assert(ellisoncurve(e, point->point), "Point not on curve.");
cr_assert(gequal(ellorder(e, point->point, NULL), point->order),
"Point has wrong order set.");
@@ -150,29 +193,26 @@ Test(point, test_points_all) {
"Point has wrong order.");
}
- points_free_deep(&curve.points, 1);
- points_free_deep(&curve.generators, 1);
+ points_free_deep(&gen_subgroup.points, 1);
}
Test(point, test_points_nonprime) {
// curve = ellinit([1, 3], 23), order = 27
GEN e = ellinit(mkvec2s(1, 3), stoi(23), -1);
- point_t **gens = points_new(1);
- gens[0] = point_new();
- gens[0]->order = stoi(27);
- gens[0]->cofactor = stoi(1);
- gens[0]->point = mkvec2(mkintmodu(15, 23), mkintmodu(14, 23));
- curve_t curve = {
- .order = stoi(27), .curve = e, .ngens = 1, .generators = gens};
+ GEN gen = mkvec2(mkintmodu(15, 23), mkintmodu(14, 23));
+ point_t gen_point = {.point = gen, .order = stoi(27), .cofactor = stoi(1)};
+ subgroup_t gen_subgroup = {.generator = &gen_point};
+ subgroup_t *generators[1] = {&gen_subgroup};
+ curve_t curve = {.order = stoi(27), .curve = e, .generators = generators, .ngens = 1};
GEN orders = mkvec2s(9, 27);
size_t npoints = 2;
int ret = points_gen_nonprime(&curve, NULL, OFFSET_POINTS);
cr_assert_eq(ret, 1, "Points weren't generated.");
- cr_assert_eq(curve.npoints, npoints, "Incorrect number of points.");
- cr_assert_not_null(curve.points, "Points are null.");
+ cr_assert_eq(gen_subgroup.npoints, npoints, "Incorrect number of points.");
+ cr_assert_not_null(gen_subgroup.points, "Points are null.");
for (size_t i = 0; i < npoints; i++) {
- point_t *point = curve.points[i];
+ point_t *point = gen_subgroup.points[i];
cr_assert(ellisoncurve(e, point->point), "Point not on curve.");
cr_assert(gequal(ellorder(e, point->point, NULL), point->order),
"Point has wrong order set.");
@@ -180,6 +220,5 @@ Test(point, test_points_nonprime) {
"Point has wrong order.");
}
- points_free_deep(&curve.points, 1);
- points_free_deep(&curve.generators, 1);
+ points_free_deep(&gen_subgroup.points, 1);
}