diff options
| -rw-r--r-- | src/exhaustive/exhaustive.c | 1 | ||||
| -rw-r--r-- | src/gen/field.c | 12 | ||||
| -rw-r--r-- | src/gen/field.h | 5 | ||||
| -rw-r--r-- | test/src/gen/test_equation.c | 10 | ||||
| -rw-r--r-- | test/src/gen/test_field.c | 199 |
5 files changed, 220 insertions, 7 deletions
diff --git a/src/exhaustive/exhaustive.c b/src/exhaustive/exhaustive.c index 5bfdffb..3bc9167 100644 --- a/src/exhaustive/exhaustive.c +++ b/src/exhaustive/exhaustive.c @@ -305,6 +305,7 @@ static void exhaustive_init(exhaustive_t *setup) { } static void exhaustive_quit(exhaustive_t *setup) { + field_quit(); equation_quit(); anomalous_quit(); exhaustive_clear(setup); diff --git a/src/gen/field.c b/src/gen/field.c index 020927c..cc95bda 100644 --- a/src/gen/field.c +++ b/src/gen/field.c @@ -52,17 +52,17 @@ GENERATOR(field_gen_input) { } GEN e1 = input_short("e1:"); - if (equalii(e1, gen_m1)) { + if (equalii(e1, gen_m1) || gcmp(e1, m) > 0) { avma = ltop; return 0; } GEN e2 = input_short("e2:"); - if (equalii(e2, gen_m1)) { + if (equalii(e2, gen_m1) || gcmp(e2, m) > 0) { avma = ltop; return 0; } GEN e3 = input_short("e3:"); - if (equalii(e3, gen_m1)) { + if (equalii(e3, gen_m1) || gcmp(e3, m) > 0) { avma = ltop; return 0; } @@ -173,3 +173,9 @@ GEN field_ielement(GEN field, GEN in) { return gen_m1; /* NOT REACHABLE */ } } + +void field_quit(void) { + if (field && isclone(field)) { + gunclone(field); + } +} diff --git a/src/gen/field.h b/src/gen/field.h index 50cef8e..19edd02 100644 --- a/src/gen/field.h +++ b/src/gen/field.h @@ -74,4 +74,9 @@ GEN field_elementi(GEN element); */ GEN field_ielement(GEN field, GEN in); +/** + * @brief + */ +void field_quit(void); + #endif // ECGEN_FIELD_H diff --git a/test/src/gen/test_equation.c b/test/src/gen/test_equation.c index 8e0d659..c66d28b 100644 --- a/test/src/gen/test_equation.c +++ b/test/src/gen/test_equation.c @@ -24,6 +24,7 @@ Test(equation, test_a_gen_random) { int ret = a_gen_random(&curve, NULL, OFFSET_A); cr_assert_eq(ret, 1, ); + cr_assert_not_null(curve.a, ); } Test(equation, test_a_gen_input) { @@ -55,14 +56,14 @@ Test(equation, test_a_gen_once) { } Test(equation, test_a_gen_zero) { - curve_t curve = {}; + curve_t curve = {0}; int ret = a_gen_zero(&curve, NULL, OFFSET_A); cr_assert_eq(ret, 1, ); cr_assert(gequal(gen_0, curve.a), ); } Test(equation, test_a_gen_one) { - curve_t curve = {}; + curve_t curve = {0}; int ret = a_gen_one(&curve, NULL, OFFSET_A); cr_assert_eq(ret, 1, ); cr_assert(gequal(gen_1, curve.a), ); @@ -73,6 +74,7 @@ Test(equation, test_b_gen_random) { int ret = b_gen_random(&curve, NULL, OFFSET_B); cr_assert_eq(ret, 1, ); + cr_assert_not_null(curve.b, ); } Test(equation, test_b_gen_input) { @@ -104,14 +106,14 @@ Test(equation, test_b_gen_once) { } Test(equation, test_b_gen_zero) { - curve_t curve = {}; + curve_t curve = {0}; int ret = b_gen_zero(&curve, NULL, OFFSET_B); cr_assert_eq(ret, 1, ); cr_assert(gequal(gen_0, curve.b), ); } Test(equation, test_b_gen_one) { - curve_t curve = {}; + curve_t curve = {0}; int ret = b_gen_one(&curve, NULL, OFFSET_B); cr_assert_eq(ret, 1, ); cr_assert(gequal(gen_1, curve.b), ); diff --git a/test/src/gen/test_field.c b/test/src/gen/test_field.c new file mode 100644 index 0000000..fb1f1e3 --- /dev/null +++ b/test/src/gen/test_field.c @@ -0,0 +1,199 @@ +/* + * ecgen, tool for generating Elliptic curve domain parameters + * Copyright (C) 2017 J08nY + */ +#include <criterion/criterion.h> +#include "gen/field.h" +#include "math/poly.h" +#include "misc/types.h" +#include "test/default.h" +#include "test/input.h" +#include "test/output.h" + +void field_setup() { + default_setup(); + input_setup(); + output_setup(); +} + +void field_teardown() { + default_teardown(); + input_teardown(); + output_teardown(); +} + +TestSuite(field, .init = field_setup, .fini = field_teardown); + +Test(field, test_field_gen_random_fp) { + curve_t curve = {0}; + cfg->bits = 10; + cfg->prime_field = true; + cfg->field = FIELD_PRIME; + + int ret = field_gen_random(&curve, NULL, OFFSET_FIELD); + cr_assert_eq(ret, 1, ); + cr_assert_not_null(curve.field, ); + cr_assert(gle(curve.field, int2n(cfg->bits)), ); +} + +Test(field, test_field_gen_random_f2m) { + curve_t curve = {0}; + cfg->bits = 10; + cfg->binary_field = true; + cfg->field = FIELD_BINARY; + + int ret = field_gen_random(&curve, NULL, OFFSET_FIELD); + cr_assert_eq(ret, 1, ); + cr_assert_not_null(curve.field, ); + GEN coeffs = FF_to_FpXQ(curve.field); + GEN vec = gtovec(coeffs); + GEN n = fromdigits(vec, stoi(2)); + cr_assert(gle(n, int2n(cfg->bits)), ); +} + +Test(field, test_field_gen_input_fp) { + curve_t curve = {0}; + cfg->bits = 10; + cfg->prime_field = true; + cfg->field = FIELD_PRIME; + + unsigned int p = 5; + fprintf(write_in, "%u\n", p); + int ret = field_gen_input(&curve, NULL, OFFSET_FIELD); + cr_assert_eq(ret, 1, ); + cr_assert_not_null(curve.field, ); + cr_assert(gequal(stoi(p), curve.field), ); + + memset(&curve, 0, sizeof(curve_t)); + + p = 4; + fprintf(write_in, "%u\n", p); + ret = field_gen_input(&curve, NULL, OFFSET_FIELD); + cr_assert_eq(ret, 0, ); + cr_assert_null(curve.field, ); + + memset(&curve, 0, sizeof(curve_t)); + + p = 2 << 11; + fprintf(write_in, "%u\n", p); + ret = field_gen_input(&curve, NULL, OFFSET_FIELD); + cr_assert_eq(ret, 0, ); + cr_assert_null(curve.field, ); +}; + +Test(field, test_field_gen_input_f2m) { + curve_t curve = {0}; + cfg->bits = 10; + cfg->binary_field = true; + cfg->field = FIELD_BINARY; + + unsigned int m = 9; + fprintf(write_in, "%u\n", m); + int ret = field_gen_input(&curve, NULL, OFFSET_FIELD); + cr_assert_eq(ret, 0, ); + cr_assert_null(curve.field, ); + + memset(&curve, 0, sizeof(curve_t)); + + m = 10; + unsigned int e1 = 17; + fprintf(write_in, "%u\n%u\n", m, e1); + ret = field_gen_input(&curve, NULL, OFFSET_FIELD); + cr_assert_eq(ret, 0, ); + cr_assert_null(curve.field, ); + + memset(&curve, 0, sizeof(curve_t)); + + e1 = 9; + unsigned int e2 = 17; + fprintf(write_in, "%u\n%u\n%u\n", m, e1, e2); + ret = field_gen_input(&curve, NULL, OFFSET_FIELD); + cr_assert_eq(ret, 0, ); + cr_assert_null(curve.field, ); + + memset(&curve, 0, sizeof(curve_t)); + + e1 = 9; + e2 = 5; + unsigned int e3 = 17; + fprintf(write_in, "%u\n%u\n%u\n%u\n", m, e1, e2, e3); + ret = field_gen_input(&curve, NULL, OFFSET_FIELD); + cr_assert_eq(ret, 0, ); + cr_assert_null(curve.field, ); + + memset(&curve, 0, sizeof(curve_t)); + + e1 = 0; + e2 = 0; + e3 = 0; + fprintf(write_in, "%u\n%u\n%u\n%u\n", m, e1, e2, e3); + ret = field_gen_input(&curve, NULL, OFFSET_FIELD); + cr_assert_eq(ret, 0, ); + cr_assert_null(curve.field, ); + + memset(&curve, 0, sizeof(curve_t)); + + e1 = 4; + fprintf(write_in, "%u\n%u\n%u\n%u\n", m, e1, e2, e3); + ret = field_gen_input(&curve, NULL, OFFSET_FIELD); + cr_assert_eq(ret, 0, ); + cr_assert_null(curve.field, ); + + memset(&curve, 0, sizeof(curve_t)); + + e1 = 3; + fprintf(write_in, "%u\n%u\n%u\n%u\n", m, e1, e2, e3); + ret = field_gen_input(&curve, NULL, OFFSET_FIELD); + cr_assert_eq(ret, 1, ); + cr_assert_not_null(curve.field, ); + GEN poly = poly_find_gen(m); + cr_assert(gequal(poly, curve.field), ); +} + +Test(field, test_field_gen_once_fp) { + curve_t curve = {0}; + cfg->bits = 10; + cfg->prime_field = true; + cfg->field = FIELD_PRIME; + + unsigned int p = 5; + fprintf(write_in, "%u\n", p); + int ret = field_gen_once(&curve, NULL, OFFSET_FIELD); + cr_assert_eq(ret, 1, ); + cr_assert_not_null(curve.field, ); + cr_assert(equalis(curve.field, p), ); + + memset(&curve, 0, sizeof(curve_t)); + + ret = field_gen_once(&curve, NULL, OFFSET_FIELD); + cr_assert_eq(ret, 1, ); + cr_assert_not_null(curve.field, ); + cr_assert(equalis(curve.field, p), ); + field_quit(); +} + +Test(field, test_field_gen_once_f2m) { + curve_t curve = {0}; + cfg->bits = 10; + cfg->binary_field = true; + cfg->field = FIELD_BINARY; + + unsigned int m = 10; + unsigned int e1 = 3; + unsigned int e2 = 0; + unsigned int e3 = 0; + fprintf(write_in, "%u\n%u\n%u\n%u\n", m, e1, e2, e3); + int ret = field_gen_once(&curve, NULL, OFFSET_FIELD); + cr_assert_eq(ret, 1, ); + cr_assert_not_null(curve.field, ); + GEN poly = poly_find_gen(m); + cr_assert(gequal(poly, curve.field), ); + + memset(&curve, 0, sizeof(curve_t)); + + ret = field_gen_once(&curve, NULL, OFFSET_FIELD); + cr_assert_eq(ret, 1, ); + cr_assert_not_null(curve.field, ); + cr_assert(gequal(poly, curve.field), ); + field_quit(); +}
\ No newline at end of file |
