From b09586f3cca80ec3409c4e34a2fae22974c43d56 Mon Sep 17 00:00:00 2001 From: J08nY Date: Tue, 17 Oct 2017 21:45:04 +0200 Subject: Add check_f for a string in the hex expansion of a curve param. --- src/gen/hex.c | 98 ++++++++++++++++++++++++++++ src/gen/hex.h | 22 +++++++ src/util/str.c | 21 ++++++ src/util/str.h | 21 ++++++ test/src/exhaustive/test_ansi.c | 2 +- test/src/gen/test_hex.c | 138 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 301 insertions(+), 1 deletion(-) create mode 100644 src/gen/hex.c create mode 100644 src/gen/hex.h create mode 100644 src/util/str.c create mode 100644 src/util/str.h create mode 100644 test/src/gen/test_hex.c 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 +#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 + +/** + * @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 +#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 -- cgit v1.2.3-70-g09d2