aboutsummaryrefslogtreecommitdiff
path: root/src/math/seed.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/math/seed.c')
-rw-r--r--src/math/seed.c104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/math/seed.c b/src/math/seed.c
new file mode 100644
index 0000000..44663c8
--- /dev/null
+++ b/src/math/seed.c
@@ -0,0 +1,104 @@
+/*
+ * ecgen, tool for generating Elliptic curve domain parameters
+ * Copyright (C) 2017 J08nY
+ */
+
+#include "seed.h"
+#include "util/memory.h"
+
+seed_t *seed_new(void) { return try_calloc(sizeof(seed_t)); }
+
+seed_t *seed_copy(const seed_t *src, seed_t *dest) {
+ if (src->seed) dest->seed = gcopy(src->seed);
+ return dest;
+}
+
+seed_t *seed_new_copy(const seed_t *src) {
+ seed_t *result = seed_new();
+ return seed_copy(src, result);
+}
+
+seed_t *seed_clone(const seed_t *src, seed_t *dest) {
+ if (src->seed) dest->seed = gclone(src->seed);
+ return dest;
+}
+
+seed_t *seed_new_clone(const seed_t *src) {
+ seed_t *result = seed_new();
+ return seed_clone(src, result);
+}
+
+void seed_free(seed_t **seed) {
+ if (*seed) {
+ if ((*seed)->seed && isclone((*seed)->seed)) {
+ gunclone((*seed)->seed);
+ }
+ pari_free(*seed);
+ *seed = NULL;
+ }
+}
+
+static 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);
+ gerepileall(btop, 1, &seed);
+ }
+
+ return gerepilecopy(ltop, seed);
+}
+
+char *seed_itos(GEN seed) {
+ pari_sp ltop = avma;
+ GEN bits = binary_zv(seed);
+
+ long len = glength(bits);
+ long bytes = (len / 8) + (len % 8 == 0 ? 0 : 1);
+ char *result = try_malloc((size_t)bytes);
+
+ for (long i = 0; i < len; ++i) {
+ // TODO
+ }
+ avma = ltop;
+ return result;
+}
+
+int seed_random(curve_t *curve, const config_t *cfg, arg_t *args) {
+ curve->seed = seed_new();
+ curve->seed->seed = random_int(160);
+ curve->seed->raw = seed_itos(curve->seed->seed);
+ curve->seed->raw_len = strlen(curve->seed->raw);
+ return 1;
+}
+
+int seed_argument(curve_t *curve, const config_t *cfg, arg_t *args) {
+ curve->seed = seed_new();
+ curve->seed->seed = seed_stoi(cfg->seed);
+ curve->seed->raw = cfg->seed;
+ curve->seed->raw_len = strlen(cfg->seed);
+ return 1;
+}
+
+int seed_input(curve_t *curve, const config_t *cfg, arg_t *args) {
+ pari_sp ltop = avma;
+
+ GEN str = input_string("seed:");
+ 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);
+
+ curve->seed = seed_new();
+ curve->seed->seed = gerepilecopy(ltop, seed);
+ return 1;
+}