diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gen/hex.c | 98 | ||||
| -rw-r--r-- | src/gen/hex.h | 22 | ||||
| -rw-r--r-- | src/util/str.c | 21 | ||||
| -rw-r--r-- | src/util/str.h | 21 |
4 files changed, 162 insertions, 0 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 |
