aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ08nY2017-10-15 01:48:24 +0200
committerJ08nY2017-10-15 01:48:24 +0200
commit533542ee2b29f5f1ad490ffe00673a9ec50d375b (patch)
tree0ba29a8e7e0427266d8002015656f637699c193c
parenta6289893431c59bec9eec2493a955d8e05018dfc (diff)
downloadecgen-533542ee2b29f5f1ad490ffe00673a9ec50d375b.tar.gz
ecgen-533542ee2b29f5f1ad490ffe00673a9ec50d375b.tar.zst
ecgen-533542ee2b29f5f1ad490ffe00673a9ec50d375b.zip
-rw-r--r--src/exhaustive/exhaustive.c1
-rw-r--r--src/gen/field.c12
-rw-r--r--src/gen/field.h5
-rw-r--r--test/src/gen/test_equation.c10
-rw-r--r--test/src/gen/test_field.c199
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