aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ08nY2017-10-17 21:45:04 +0200
committerJ08nY2017-10-17 21:45:04 +0200
commitb09586f3cca80ec3409c4e34a2fae22974c43d56 (patch)
treed804f9884c4b2891d77c816af8c428c01a63ab43
parent3b573a6a432af1909224ff003cfcaadbc5d84308 (diff)
downloadecgen-b09586f3cca80ec3409c4e34a2fae22974c43d56.tar.gz
ecgen-b09586f3cca80ec3409c4e34a2fae22974c43d56.tar.zst
ecgen-b09586f3cca80ec3409c4e34a2fae22974c43d56.zip
-rw-r--r--src/gen/hex.c98
-rw-r--r--src/gen/hex.h22
-rw-r--r--src/util/str.c21
-rw-r--r--src/util/str.h21
-rw-r--r--test/src/exhaustive/test_ansi.c2
-rw-r--r--test/src/gen/test_hex.c138
6 files changed, 301 insertions, 1 deletions
diff --git a/src/gen/hex.c b/src/gen/hex.c
new file mode 100644
index 0000000..2a6fea4
--- /dev/null
+++ b/src/gen/hex.c
@@ -0,0 +1,98 @@
+/*
+ * ecgen, tool for generating Elliptic curve domain parameters
+ * Copyright (C) 2017 J08nY
+ */
+#include "hex.h"
+#include "exhaustive/arg.h"
+#include "field.h"
+#include "util/bits.h"
+#include "util/memory.h"
+
+static char *hex_points(point_t *points[], size_t len) {
+ char *x[len];
+ char *y[len];
+ for (size_t i = 0; i < len; ++i) {
+ point_t *pt = points[i];
+ bits_t *x_bits = bits_from_i(field_elementi(gel(pt->point, 1)));
+ bits_t *y_bits = bits_from_i(field_elementi(gel(pt->point, 2)));
+ x[i] = bits_to_hex(x_bits);
+ y[i] = bits_to_hex(y_bits);
+ bits_free(&x_bits);
+ bits_free(&y_bits);
+ }
+
+ size_t total = 0;
+ for (size_t i = 0; i < len; ++i) {
+ total += strlen(x[i]) + strlen(y[i]);
+ }
+
+ char *result = try_calloc(total);
+ for (size_t i = 0; i < len; ++i) {
+ strcat(result, x[i]);
+ strcat(result, y[i]);
+ try_free(x[i]);
+ try_free(y[i]);
+ }
+ return result;
+}
+
+CHECK(hex_check_param) {
+ HAS_ARG(args);
+
+ char *search_hex = try_strdup(args->args);
+ char *p = search_hex;
+ for (; *p; ++p) *p = (char)tolower(*p);
+
+ char *params[OFFSET_END] = {NULL};
+
+ if (state >= OFFSET_SEED) {
+ params[OFFSET_SEED] = bits_to_hex(curve->seed->seed);
+ }
+
+ if (state >= OFFSET_FIELD) {
+ if (cfg->field == FIELD_PRIME) {
+ bits_t *temp = bits_from_i(curve->field);
+ params[OFFSET_FIELD] = bits_to_hex(temp);
+ bits_free(&temp);
+ } else if (cfg->field == FIELD_BINARY) {
+ }
+ }
+
+ if (state >= OFFSET_A) {
+ bits_t *temp = bits_from_i(field_elementi(curve->a));
+ params[OFFSET_A] = bits_to_hex(temp);
+ bits_free(&temp);
+ }
+
+ if (state >= OFFSET_B) {
+ bits_t *temp = bits_from_i(field_elementi(curve->b));
+ params[OFFSET_B] = bits_to_hex(temp);
+ bits_free(&temp);
+ }
+
+ if (state >= OFFSET_ORDER) {
+ bits_t *temp = bits_from_i(curve->order);
+ params[OFFSET_ORDER] = bits_to_hex(temp);
+ bits_free(&temp);
+ }
+
+ if (state >= OFFSET_GENERATORS) {
+ params[OFFSET_GENERATORS] = hex_points(curve->generators, curve->ngens);
+ }
+
+ if (state >= OFFSET_POINTS) {
+ params[OFFSET_POINTS] = hex_points(curve->points, curve->npoints);
+ }
+
+ int result = OFFSET_FIELD - state;
+ for (offset_e i = OFFSET_SEED; i < OFFSET_END; ++i) {
+ if (params[i]) {
+ if (strstr(params[i], search_hex)) {
+ result = 1;
+ break;
+ }
+ }
+ }
+ try_free(search_hex);
+ return result;
+} \ No newline at end of file
diff --git a/src/gen/hex.h b/src/gen/hex.h
new file mode 100644
index 0000000..540a709
--- /dev/null
+++ b/src/gen/hex.h
@@ -0,0 +1,22 @@
+/*
+ * ecgen, tool for generating Elliptic curve domain parameters
+ * Copyright (C) 2017 J08nY
+ */
+/**
+ * @file hex.h
+ */
+#ifndef ECGEN_HEX_H
+#define ECGEN_HEX_H
+
+#include "misc/types.h"
+
+/**
+ * @brief
+ * @param curve
+ * @param args
+ * @param state
+ * @return
+ */
+CHECK(hex_check_param);
+
+#endif // ECGEN_HEX_H
diff --git a/src/util/str.c b/src/util/str.c
new file mode 100644
index 0000000..933eb83
--- /dev/null
+++ b/src/util/str.c
@@ -0,0 +1,21 @@
+/*
+ * ecgen, tool for generating Elliptic curve domain parameters
+ * Copyright (C) 2017 J08nY
+ */
+#include "str.h"
+#include <string.h>
+#include "util/memory.h"
+
+char *str_join(char *strings[], size_t len) {
+ size_t total = 0;
+ for (size_t i = 0; i < len; ++i) {
+ if (strings[i]) total += strlen(strings[i]);
+ }
+ char *result = try_calloc(total);
+ for (size_t i = 0; i < len; ++i) {
+ if (strings[i]) {
+ strcat(result, strings[i]);
+ }
+ }
+ return result;
+} \ No newline at end of file
diff --git a/src/util/str.h b/src/util/str.h
new file mode 100644
index 0000000..2e14272
--- /dev/null
+++ b/src/util/str.h
@@ -0,0 +1,21 @@
+/*
+ * ecgen, tool for generating Elliptic curve domain parameters
+ * Copyright (C) 2017 J08nY
+ */
+/**
+ * @file str.h
+ */
+#ifndef ECGEN_STR_H
+#define ECGEN_STR_H
+
+#include <stddef.h>
+
+/**
+ * @brief
+ * @param strings
+ * @param len
+ * @return
+ */
+char *str_join(char *strings[], size_t len);
+
+#endif // ECGEN_STR_H
diff --git a/test/src/exhaustive/test_ansi.c b/test/src/exhaustive/test_ansi.c
index 9497c80..f1177c7 100644
--- a/test/src/exhaustive/test_ansi.c
+++ b/test/src/exhaustive/test_ansi.c
@@ -9,8 +9,8 @@
#include "gen/field.h"
#include "gen/seed.h"
#include "math/poly.h"
-#include "test/memory.h"
#include "test/io.h"
+#include "test/memory.h"
#include "util/bits.h"
#include "util/memory.h"
diff --git a/test/src/gen/test_hex.c b/test/src/gen/test_hex.c
new file mode 100644
index 0000000..aa558ec
--- /dev/null
+++ b/test/src/gen/test_hex.c
@@ -0,0 +1,138 @@
+/*
+ * ecgen, tool for generating Elliptic curve domain parameters
+ * Copyright (C) 2017 J08nY
+ */
+#include <criterion/criterion.h>
+#include "gen/hex.h"
+#include "test/default.h"
+#include "util/bits.h"
+
+TestSuite(hex, .init = default_setup, .fini = default_teardown);
+
+Test(hex, test_hex_seed) {
+ cfg->field = FIELD_PRIME;
+ char *what = "ABCDE";
+ seed_t seed = {.seed = bits_from_hex(what)};
+ curve_t curve = {.seed = &seed};
+
+ arg_t arg = {.args = what, .nargs = 1};
+
+ int ret = hex_check_param(&curve, &arg, OFFSET_SEED);
+ cr_assert_eq(ret, 1, );
+}
+
+Test(hex, test_hex_field) {
+ cfg->field = FIELD_PRIME;
+ char *where = "0xF235ABCDE6F";
+ char *what = "ABCDE";
+ seed_t seed = {.seed = bits_from_hex("12345")};
+ curve_t curve = {.seed = &seed, .field = strtoi(where)};
+
+ arg_t arg = {.args = what, .nargs = 1};
+
+ int ret = hex_check_param(&curve, &arg, OFFSET_FIELD);
+ cr_assert_eq(ret, 1, );
+}
+
+Test(hex, test_hex_a) {
+ cfg->field = FIELD_PRIME;
+ char *where = "0xF235ABCDE6F";
+ char *field = "0xFFFFFFFFFFFF";
+ char *what = "ABCDE";
+ seed_t seed = {.seed = bits_from_hex("12345")};
+ curve_t curve = {.seed = &seed,
+ .field = strtoi(field),
+ .a = mkintmod(strtoi(where), strtoi(field))};
+
+ arg_t arg = {.args = what, .nargs = 1};
+
+ int ret = hex_check_param(&curve, &arg, OFFSET_A);
+ cr_assert_eq(ret, 1, );
+}
+
+Test(hex, test_hex_b) {
+ cfg->field = FIELD_PRIME;
+ char *where = "0xF235ABCDE6F";
+ char *field = "0xFFFFFFFFFFFF";
+ char *what = "ABCDE";
+ seed_t seed = {.seed = bits_from_hex("12345")};
+ curve_t curve = {.seed = &seed,
+ .field = strtoi(field),
+ .a = mkintmod(stoi(15), strtoi(field)),
+ .b = mkintmod(strtoi(where), strtoi(field))};
+
+ arg_t arg = {.args = what, .nargs = 1};
+
+ int ret = hex_check_param(&curve, &arg, OFFSET_B);
+ cr_assert_eq(ret, 1, );
+}
+
+Test(hex, test_hex_order) {
+ cfg->field = FIELD_PRIME;
+ char *where = "0xF235ABCDE6F";
+ char *what = "ABCDE";
+ seed_t seed = {.seed = bits_from_hex("12345")};
+ curve_t curve = {.seed = &seed,
+ .field = stoi(21),
+ .a = mkintmod(stoi(15), stoi(21)),
+ .b = mkintmod(stoi(20), stoi(21)),
+ .order = strtoi(where)};
+
+ arg_t arg = {.args = what, .nargs = 1};
+
+ int ret = hex_check_param(&curve, &arg, OFFSET_ORDER);
+ cr_assert_eq(ret, 1, );
+}
+
+Test(hex, test_hex_generators) {
+ cfg->field = FIELD_PRIME;
+ char *where = "0xF235ABCDE6F";
+ char *field = "0xFFFFFFFFFFFF";
+ char *what = "ABCDE";
+ point_t gen = {.point = mkvec2(mkintmod(strtoi(where), strtoi(field)),
+ mkintmod(stoi(52), strtoi(field)))};
+ point_t *generators[1] = {&gen};
+
+ seed_t seed = {.seed = bits_from_hex("12345")};
+ curve_t curve = {.seed = &seed,
+ .field = strtoi(field),
+ .a = mkintmod(stoi(15), strtoi(field)),
+ .b = mkintmod(stoi(20), strtoi(field)),
+ .order = stoi(22),
+ .generators = generators,
+ .ngens = 1};
+
+ arg_t arg = {.args = what, .nargs = 1};
+
+ int ret = hex_check_param(&curve, &arg, OFFSET_GENERATORS);
+ cr_assert_eq(ret, 1, );
+}
+
+Test(hex, test_hex_points) {
+ cfg->field = FIELD_PRIME;
+ char *where = "0xF235ABCDE6F";
+ char *field = "0xFFFFFFFFFFFF";
+ char *what = "ABCDE";
+ point_t gen = {.point = mkvec2(mkintmod(stoi(23), strtoi(field)),
+ mkintmod(stoi(52), strtoi(field)))};
+ point_t *generators[1] = {&gen};
+ point_t point = {.point = mkvec2(mkintmod(strtoi(where), strtoi(field)),
+ mkintmod(stoi(31), strtoi(field)))};
+ point_t *points[1] = {&point};
+
+ seed_t seed = {.seed = bits_from_hex("12345")};
+ curve_t curve = {.seed = &seed,
+ .field = strtoi(field),
+ .a = mkintmod(stoi(15), strtoi(field)),
+ .b = mkintmod(stoi(20), strtoi(field)),
+ .order = stoi(22),
+ .generators = generators,
+ .ngens = 1,
+ .points = points,
+ .npoints = 1};
+
+ arg_t arg = {.args = what, .nargs = 1};
+
+ int ret = hex_check_param(&curve, &arg, OFFSET_POINTS);
+ cr_assert_eq(ret, 1, );
+} \ No newline at end of file