aboutsummaryrefslogtreecommitdiff
path: root/src/random
diff options
context:
space:
mode:
authorJ08nY2017-02-09 04:07:37 +0100
committerJ08nY2017-02-09 04:07:37 +0100
commit79b29481b1c4d13063dd8b6ee6a1d0d70a54faab (patch)
tree007da84bc4133c656f2f66df541f74c6b55bfb11 /src/random
parent0b5d1cca9c78869c6cffa2932297c1d70ba142e2 (diff)
downloadecgen-79b29481b1c4d13063dd8b6ee6a1d0d70a54faab.tar.gz
ecgen-79b29481b1c4d13063dd8b6ee6a1d0d70a54faab.tar.zst
ecgen-79b29481b1c4d13063dd8b6ee6a1d0d70a54faab.zip
Seperated different generation methods into modules.
- Added Koblitz curve generation.
Diffstat (limited to 'src/random')
-rw-r--r--src/random/generators.c54
-rw-r--r--src/random/generators.h25
-rw-r--r--src/random/seed.c70
-rw-r--r--src/random/seed.h44
4 files changed, 193 insertions, 0 deletions
diff --git a/src/random/generators.c b/src/random/generators.c
new file mode 100644
index 0000000..9769166
--- /dev/null
+++ b/src/random/generators.c
@@ -0,0 +1,54 @@
+/*
+ * ecgen, tool for generating Elliptic curve domain parameters
+ * Copyright (C) 2017 J08nY
+ */
+#include "generators.h"
+#include "math/curve.h"
+#include "math/equation.h"
+#include "math/field.h"
+#include "random/seed.h"
+
+int gen_skip(curve_t *curve, config_t *config, ...) { return 1; }
+
+void gen_init(gen_t generators[], config_t *config) {
+ if (config->from_seed) {
+ if (config->seed) {
+ generators[OFFSET_SEED] = &seed_argument;
+ } else {
+ if (config->random) {
+ generators[OFFSET_SEED] = &seed_random;
+ } else {
+ generators[OFFSET_SEED] = &seed_input;
+ }
+ }
+ generators[OFFSET_A] = &a_seed;
+ generators[OFFSET_B] = &b_seed;
+ generators[OFFSET_CURVE] = &curve_seed;
+ } else {
+ generators[OFFSET_SEED] = &gen_skip;
+
+ if (config->random) {
+ generators[OFFSET_A] = &a_random;
+ generators[OFFSET_B] = &b_random;
+ } else {
+ generators[OFFSET_A] = &a_input;
+ generators[OFFSET_B] = &b_input;
+ }
+
+ if (config->koblitz) {
+ generators[OFFSET_A] = &a_zero;
+ }
+
+ if (config->prime) {
+ generators[OFFSET_CURVE] = &curve_prime;
+ } else {
+ generators[OFFSET_CURVE] = &curve_nonzero;
+ }
+ }
+
+ if (config->random) {
+ generators[OFFSET_FIELD] = &field_random;
+ } else {
+ generators[OFFSET_FIELD] = &field_input;
+ }
+} \ No newline at end of file
diff --git a/src/random/generators.h b/src/random/generators.h
new file mode 100644
index 0000000..87e599b
--- /dev/null
+++ b/src/random/generators.h
@@ -0,0 +1,25 @@
+/*
+ * ecgen, tool for generating Elliptic curve domain parameters
+ * Copyright (C) 2017 J08nY
+ */
+#ifndef ECGEN_GENERATORS_H
+#define ECGEN_GENERATORS_H
+
+#include "types.h"
+
+enum gen_offset {
+ OFFSET_SEED,
+ OFFSET_FIELD,
+ OFFSET_A,
+ OFFSET_B,
+ OFFSET_CURVE,
+ OFFSET_POINTS
+};
+
+/**
+ *
+ * @param generators
+ */
+void gen_init(gen_t generators[], config_t *config);
+
+#endif // ECGEN_GENERATORS_H
diff --git a/src/random/seed.c b/src/random/seed.c
new file mode 100644
index 0000000..a78ff24
--- /dev/null
+++ b/src/random/seed.c
@@ -0,0 +1,70 @@
+/*
+ * ecgen, tool for generating Elliptic curve domain parameters
+ * Copyright (C) 2017 J08nY
+ */
+#include "seed.h"
+#include "io/input.h"
+
+seed_t *seed_new() {
+ seed_t *seed = pari_malloc(sizeof(seed_t));
+ if (!seed) {
+ perror("Couldn't malloc.");
+ exit(1);
+ }
+ memset(seed, 0, sizeof(seed_t));
+ return seed;
+}
+
+void seed_free(seed_t **seed) {
+ if (*seed) {
+ pari_free(*seed);
+ *seed = NULL;
+ }
+}
+
+GEN seed_stoi(const char *cstr) {
+ pari_sp ltop = avma;
+ GEN seed = gen_0;
+
+ size_t len = strlen(cstr);
+ for (size_t i = 0; i < len; ++i) {
+ pari_sp btop = avma;
+ GEN s = stoi(cstr[i]);
+ s = shifti(s, (len - i - 1) * 8);
+ seed = addii(seed, s);
+ if (gc_needed(btop, 1)) gerepileall(btop, 1, seed);
+ }
+
+ return gerepilecopy(ltop, seed);
+}
+
+int seed_random(curve_t *curve, config_t *config, ...) {
+ curve->seed = seed_new();
+ curve->seed->seed = random_int(160);
+ return 1;
+}
+
+int seed_argument(curve_t *curve, config_t *config, ...) {
+ curve->seed = seed_new();
+ curve->seed->seed = seed_stoi(config->seed);
+ return 1;
+}
+
+int seed_input(curve_t *curve, config_t *config, ...) {
+ pari_sp ltop = avma;
+
+ GEN str = fread_string(in, "seed:", '\n');
+ const char *cstr = GSTR(str);
+ if (strlen(cstr) < 20) {
+ fprintf(stderr, "SEED must be at least 160 bits(20 characters).\n");
+ avma = ltop;
+ return 0;
+ }
+
+ GEN seed = seed_stoi(cstr);
+ gerepileall(ltop, 1, &seed);
+
+ curve->seed = seed_new();
+ curve->seed->seed = seed;
+ return 1;
+} \ No newline at end of file
diff --git a/src/random/seed.h b/src/random/seed.h
new file mode 100644
index 0000000..998bdcd
--- /dev/null
+++ b/src/random/seed.h
@@ -0,0 +1,44 @@
+/*
+ * ecgen, tool for generating Elliptic curve domain parameters
+ * Copyright (C) 2017 J08nY
+ */
+#ifndef ECGEN_SEED_H
+#define ECGEN_SEED_H
+
+#include "io/cli.h"
+#include "types.h"
+
+/**
+ *
+ * @param seed
+ */
+void seed_free(seed_t **seed);
+
+/**
+ *
+ * @param curve
+ * @param config
+ * @param ...
+ * @return
+ */
+int seed_random(curve_t *curve, config_t *config, ...);
+
+/**
+ *
+ * @param curve
+ * @param config
+ * @param ...
+ * @return
+ */
+int seed_argument(curve_t *curve, config_t *config, ...);
+
+/**
+ *
+ * @param curve
+ * @param config
+ * @param ...
+ * @return
+ */
+int seed_input(curve_t *curve, config_t *config, ...);
+
+#endif // ECGEN_SEED_H