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 | |
| parent | 40cbb213ac910ddcaf22a26a247d2a9eeddca1fc (diff) | |
| download | ecgen-ac60f78a253efde94cab36264b0555b0691fdd8a.tar.gz ecgen-ac60f78a253efde94cab36264b0555b0691fdd8a.tar.zst ecgen-ac60f78a253efde94cab36264b0555b0691fdd8a.zip | |
Diffstat (limited to 'test')
| -rw-r--r-- | test/src/gen/test_gens.c | 7 | ||||
| -rw-r--r-- | test/src/gen/test_gp.c | 249 | ||||
| -rw-r--r-- | test/src/gen/test_hex.c | 16 | ||||
| -rw-r--r-- | test/src/gen/test_point.c | 171 | ||||
| -rw-r--r-- | test/src/math/test_subgroup.c | 40 | ||||
| -rw-r--r-- | test/src/math/test_subgroups.c | 73 | ||||
| -rw-r--r-- | test/src/util/test_random.c | 8 |
7 files changed, 167 insertions, 397 deletions
diff --git a/test/src/gen/test_gens.c b/test/src/gen/test_gens.c index 49f82e2..db11e3d 100644 --- a/test/src/gen/test_gens.c +++ b/test/src/gen/test_gens.c @@ -79,7 +79,8 @@ Test(gens, test_gens_check_anomalous) { }; point_t gen = {.point = mkvec2(mkintmodu(4, 19), mkintmodu(14, 19)), .order = stoi(16)}; - point_t *generators[1] = {&gen}; + subgroup_t gen_subgroup = {.generator = &gen}; + subgroup_t *generators[1] = {&gen_subgroup}; curve.generators = generators; curve.ngens = 1; @@ -116,7 +117,9 @@ Test(gens, test_gens_check_embedding) { .order = stoi(6)}; point_t gen2 = {.point = mkvec2(mkintmodu(10, 19), mkintmodu(4, 19)), .order = stoi(3)}; - point_t *generators[2] = {&gen1, &gen2}; + subgroup_t gen1_subgroup = {.generator = &gen1}; + subgroup_t gen2_subgroup = {.generator = &gen2}; + subgroup_t *generators[2] = {&gen1_subgroup, &gen2_subgroup}; curve.generators = generators; curve.ngens = 2; diff --git a/test/src/gen/test_gp.c b/test/src/gen/test_gp.c deleted file mode 100644 index 9e3e1a9..0000000 --- a/test/src/gen/test_gp.c +++ /dev/null @@ -1,249 +0,0 @@ -/* - * ecgen, tool for generating Elliptic curve domain parameters - * Copyright (C) 2017 J08nY - */ -#include <criterion/criterion.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_gen_seed) { - curve_t curve = {0}; - arg_t arg = {.args = "() -> { return(Vecsmall([1,0])); }", .nargs = 1}; - - int ret = gp_gen(&curve, &arg, OFFSET_SEED); - cr_assert_eq(ret, 1, ); - cr_assert_not_null(curve.seed, ); - cr_assert_not_null(curve.seed->seed, ); - cr_assert(bits_eq(curve.seed->seed, bits_from_bin("10")), ); -} - -Test(gp, test_gp_gen_field) { - curve_t curve = {0}; - arg_t arg = {.args = "(seed) -> { return(19); }", .nargs = 1}; - - int ret = gp_gen(&curve, &arg, OFFSET_FIELD); - cr_assert_eq(ret, 1, ); - cr_assert(gequal(curve.field, stoi(19)), ); -} - -Test(gp, test_gp_gen_a) { - curve_t curve = {.field = stoi(19)}; - arg_t arg = {.args = "(seed, field) -> { return(Mod(3,field)); }", - .nargs = 1}; - - int ret = gp_gen(&curve, &arg, OFFSET_A); - cr_assert_eq(ret, 1, ); - cr_assert(gequal(curve.a, mkintmodu(3, 19)), ); -} - -Test(gp, test_gp_gen_b) { - curve_t curve = {.field = stoi(19), .a = mkintmodu(3, 19)}; - arg_t arg = {.args = "(seed, field, a) -> { return(a * 2); }", .nargs = 1}; - - int ret = gp_gen(&curve, &arg, OFFSET_B); - cr_assert_eq(ret, 1, ); - cr_assert(gequal(curve.b, mkintmodu(6, 19)), ); -} - -Test(gp, test_gp_gen_curve) { - curve_t curve = { - .field = stoi(19), .a = mkintmodu(3, 19), .b = mkintmodu(6, 19)}; - arg_t arg = { - .args = "(seed, field, a, b) -> { return(ellinit([a,b], field)); }", - .nargs = 1}; - - int ret = gp_gen(&curve, &arg, OFFSET_CURVE); - cr_assert_eq(ret, 1, ); - cr_assert(gequal(curve.curve, - ellinit(mkvec2(curve.a, curve.b), curve.field, 0)), ); -} - -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)}; - arg_t arg = { - .args = "(seed, field, a, b, curve) -> { return(ellsea(curve)); }", - .nargs = 1}; - - int ret = gp_gen(&curve, &arg, OFFSET_ORDER); - cr_assert_eq(ret, 1, ); - cr_assert(gequal(ellsea(curve.curve, 0), curve.order), ); -} - -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)}; - arg_t arg = {.args = - "(seed, field, a, b, curve, order) -> { " - "return(ellgenerators(curve)); }", - .nargs = 1}; - - int ret = gp_gen(&curve, &arg, OFFSET_GENERATORS); - cr_assert_eq(ret, 1, ); - - GEN ellgens = ellgenerators(curve.curve); - long len = glength(ellgens); - cr_assert_eq(len, curve.ngens, ); - for (long i = 1; i <= len; ++i) { - cr_assert(gequal(gel(ellgens, i), curve.generators[i - 1]->point), ); - } -} - -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), - }; - point_t gen = {.point = mkvec2(mkintmodu(4, 19), mkintmodu(14, 19))}; - point_t *generators[1] = {&gen}; - curve.generators = generators; - curve.ngens = 1; - - arg_t arg = {.args = - "(seed, field, a, b, curve, order, gens) -> { " - "return([ellmul(curve,gens[1],2)]); }", - .nargs = 1}; - - int ret = gp_gen(&curve, &arg, OFFSET_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}; - - arg_t arg = {.args = "(seed) -> { return(1);}"}; - - int ret = gp_check(&curve, &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)}; - - arg_t arg = {.args = "(seed, field) -> { if(field == 19, return(1));}"}; - - int ret = gp_check(&curve, &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)}; - - arg_t arg = {.args = - "(seed, field, a) -> { if(a == Mod(3,19), return(1));}"}; - - int ret = gp_check(&curve, &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)}; - - arg_t arg = { - .args = "(seed, field, a, b) -> { if(b == Mod(5,19), return(1));}"}; - - int ret = gp_check(&curve, &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)}; - - arg_t arg = {.args = - "(seed, field, a, b, curve) -> { if(curve == ellinit([3, " - "5], 19), return(1));}"}; - - int ret = gp_check(&curve, &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)}; - - arg_t arg = {.args = - "(seed, field, a, b, curve, order) -> { if(order == 16, " - "return(1));}"}; - - int ret = gp_check(&curve, &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; - - arg_t arg = {.args = - "(seed, field, a, b, curve, order, gens) -> { if(gens == " - "ellgenerators(curve), return(1));}"}; - - int ret = gp_check(&curve, &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; - - arg_t arg = {.args = - "(seed, field, a, b, curve, order, gens, points) -> { " - "if(points == ellgenerators(curve), return(1));}"}; - - int ret = gp_check(&curve, &arg, OFFSET_POINTS); - cr_assert_eq(ret, 1, ); -}
\ No newline at end of file diff --git a/test/src/gen/test_hex.c b/test/src/gen/test_hex.c index aa558ec..d1f1931 100644 --- a/test/src/gen/test_hex.c +++ b/test/src/gen/test_hex.c @@ -91,7 +91,8 @@ Test(hex, test_hex_generators) { char *what = "ABCDE"; point_t gen = {.point = mkvec2(mkintmod(strtoi(where), strtoi(field)), mkintmod(stoi(52), strtoi(field)))}; - point_t *generators[1] = {&gen}; + subgroup_t gen_subgroup = {.generator = &gen}; + subgroup_t *subgroups[1] = {&gen_subgroup}; seed_t seed = {.seed = bits_from_hex("12345")}; curve_t curve = {.seed = &seed, @@ -99,7 +100,7 @@ Test(hex, test_hex_generators) { .a = mkintmod(stoi(15), strtoi(field)), .b = mkintmod(stoi(20), strtoi(field)), .order = stoi(22), - .generators = generators, + .generators = subgroups, .ngens = 1}; arg_t arg = {.args = what, .nargs = 1}; @@ -115,10 +116,13 @@ Test(hex, test_hex_points) { char *what = "ABCDE"; point_t gen = {.point = mkvec2(mkintmod(stoi(23), strtoi(field)), mkintmod(stoi(52), strtoi(field)))}; - point_t *generators[1] = {&gen}; + subgroup_t gen_subgroup = {.generator = &gen}; + subgroup_t *subgroups[1] = {&gen_subgroup}; point_t point = {.point = mkvec2(mkintmod(strtoi(where), strtoi(field)), mkintmod(stoi(31), strtoi(field)))}; point_t *points[1] = {&point}; + gen_subgroup.npoints = 1; + gen_subgroup.points = points; seed_t seed = {.seed = bits_from_hex("12345")}; curve_t curve = {.seed = &seed, @@ -126,10 +130,8 @@ Test(hex, test_hex_points) { .a = mkintmod(stoi(15), strtoi(field)), .b = mkintmod(stoi(20), strtoi(field)), .order = stoi(22), - .generators = generators, - .ngens = 1, - .points = points, - .npoints = 1}; + .generators = subgroups, + .ngens = 1}; arg_t arg = {.args = what, .nargs = 1}; 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); } diff --git a/test/src/math/test_subgroup.c b/test/src/math/test_subgroup.c new file mode 100644 index 0000000..1acb468 --- /dev/null +++ b/test/src/math/test_subgroup.c @@ -0,0 +1,40 @@ +/* + * ecgen, tool for generating Elliptic curve domain parameters + * Copyright (C) 2017 J08nY + */ +#include <criterion/criterion.h> +#include "gen/point.h" +#include "math/subgroup.h" +#include "test/default.h" + +TestSuite(subgroup, .init = default_setup, .fini = default_teardown); + +Test(subgroup, test_prime_factors) { + GEN divs = subgroups_prime(stoi(12)); + GEN vec = mkvec2s(2, 3); + cr_assert(gequal(divs, vec), "Factors not equal!"); +} + +Test(subgroup, test_prime_factors_other) { + GEN divs = subgroups_prime(stoi(27)); + GEN vec = gtovec(stoi(3)); + cr_assert(gequal(divs, vec), "Factors not equal!"); +} + +Test(subgroup, test_prime_prime) { + GEN divs = subgroups_prime(stoi(5)); + GEN vec = gtovec(stoi(5)); + cr_assert(gequal(divs, vec), "Factors not equal!"); +} + +Test(subgroup, test_nonprime_factors) { + GEN divs = subgroups_nonprime(stoi(27)); + GEN vec = mkvec2s(9, 27); + cr_assert(gequal(divs, vec), "Factors not equal!"); +} + +Test(subgroup, test_all_factors) { + GEN divs = subgroups_all(stoi(27)); + GEN vec = mkvec3s(3, 9, 27); + cr_assert(gequal(divs, vec), "Factors not equal!"); +}
\ No newline at end of file diff --git a/test/src/math/test_subgroups.c b/test/src/math/test_subgroups.c deleted file mode 100644 index f944a4f..0000000 --- a/test/src/math/test_subgroups.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - * ecgen, tool for generating Elliptic curve domain parameters - * Copyright (C) 2017 J08nY - */ -#include <criterion/criterion.h> -#include "gen/point.h" -#include "math/subgroups.h" -#include "test/default.h" - -TestSuite(subgroups, .init = default_setup, .fini = default_teardown); - -Test(subgroups, test_prime_factors) { - curve_t curve = {.order = stoi(12)}; - cfg->prime = false; - GEN divs = subgroups_prime(&curve); - GEN vec = mkvec2s(2, 3); - cr_assert(gequal(divs, vec), "Factors not equal!"); -} - -Test(subgroups, test_prime_factors_other) { - curve_t curve = {.order = stoi(27)}; - cfg->prime = false; - GEN divs = subgroups_prime(&curve); - GEN vec = gtovec(stoi(3)); - cr_assert(gequal(divs, vec), "Factors not equal!"); -} - -Test(subgroups, test_prime_prime) { - curve_t curve = {.order = stoi(5)}; - cfg->prime = true; - GEN divs = subgroups_prime(&curve); - GEN vec = gtovec(stoi(5)); - cr_assert(gequal(divs, vec), "Factors not equal!"); -} - -Test(subgroups, test_nonprime_factors) { - // curve = ellinit([1, 3], 23), order = 27 - curve_t curve = {.order = stoi(27), .ngens = 1}; - cfg->prime = false; - GEN divs = subgroups_nonprime(&curve); - GEN vec = mkvec2s(9, 27); - cr_assert(gequal(divs, vec), "Factors not equal!"); -} - -Test(subgroups, test_all_factors) { - // curve = ellinit([1, 3], 23), order = 27 - curve_t curve = {.order = stoi(27), .ngens = 1}; - cfg->prime = false; - GEN divs = subgroups_all(&curve); - GEN vec = mkvec3s(3, 9, 27); - cr_assert(gequal(divs, vec), "Factors not equal!"); -} - -Test(subgroups, test_all_factors_two_gens) { - // curve = ellinit([2, 3], 23), order = 24 - point_t **gens = points_new(2); - gens[0] = point_new(); - gens[0]->order = stoi(12); - gens[0]->cofactor = stoi(2); - gens[0]->point = mkvec2(mkintmodu(6, 23), mkintmodu(1, 23)); - gens[1] = point_new(); - gens[1]->order = stoi(6); - gens[1]->cofactor = stoi(4); - gens[1]->point = mkvec2(mkintmodu(20, 23), mkintmodu(19, 23)); - - curve_t curve = {.order = stoi(24), .ngens = 2, .generators = gens}; - cfg->prime = false; - GEN divs = subgroups_all(&curve); - GEN vec = mkvecn(8, stoi(2), stoi(3), stoi(4), stoi(6), stoi(12), stoi(2), - stoi(3), stoi(6)); - cr_assert(gequal(divs, vec), "Factors not equal!"); - points_free_deep(&gens, 2); -} diff --git a/test/src/util/test_random.c b/test/src/util/test_random.c index be45f95..8f10453 100644 --- a/test/src/util/test_random.c +++ b/test/src/util/test_random.c @@ -32,6 +32,14 @@ Test(random, test_random_int) { } } +Test(random, test_random_range) { + for (size_t i = 0; i < 100; ++i) { + GEN j = random_range(stoi(100), stoi(5000)); + cr_assert_lt(cmpii(j, stoi(5000)), 0, ); + cr_assert_geq(cmpii(j, stoi(100)), 0, ); + } +} + Test(random, test_random_field_element_fp) { GEN fp = random_int(25); for (size_t i = 0; i < 100; ++i) { |
