diff options
| author | J08nY | 2018-03-03 01:02:08 +0100 |
|---|---|---|
| committer | J08nY | 2018-03-03 01:02:08 +0100 |
| commit | ac60f78a253efde94cab36264b0555b0691fdd8a (patch) | |
| tree | 12ce2bfdee1f13f0b6e56a017c3c29979475fe02 /test/src/gen/test_point.c | |
| parent | 40cbb213ac910ddcaf22a26a247d2a9eeddca1fc (diff) | |
| download | ecgen-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.c | 171 |
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); } |
