aboutsummaryrefslogtreecommitdiff
path: root/src/seed.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/seed.c')
-rw-r--r--src/seed.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/seed.c b/src/seed.c
new file mode 100644
index 0000000..411195f
--- /dev/null
+++ b/src/seed.c
@@ -0,0 +1,86 @@
+/*
+ * ecgen, tool for generating Elliptic curve domain parameters
+ * Copyright (C) 2017 J08nY
+ */
+#include "seed.h"
+#include "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;
+}
+
+int seed_g(curve_t *curve, config_t *config) {
+ if (config->from_seed) {
+ if (config->seed) {
+ return seed_argument(curve, config);
+ } else {
+ if (config->random) {
+ return seed_random(curve, config);
+ } else {
+ return seed_input(curve, config);
+ }
+ }
+ } else {
+ return 1; // seed none.. skip
+ }
+} \ No newline at end of file