aboutsummaryrefslogtreecommitdiff
path: root/src/exhaustive/seed.c
diff options
context:
space:
mode:
authorJ08nY2017-02-10 01:24:48 +0100
committerJ08nY2017-02-10 01:24:48 +0100
commitde90c5cd76bcd45c82f34d1f3d60b529b7d5a86d (patch)
tree6d5b6923cf7443e14004e779258b4c546cf769b5 /src/exhaustive/seed.c
parent79b29481b1c4d13063dd8b6ee6a1d0d70a54faab (diff)
downloadecgen-de90c5cd76bcd45c82f34d1f3d60b529b7d5a86d.tar.gz
ecgen-de90c5cd76bcd45c82f34d1f3d60b529b7d5a86d.tar.zst
ecgen-de90c5cd76bcd45c82f34d1f3d60b529b7d5a86d.zip
Diffstat (limited to 'src/exhaustive/seed.c')
-rw-r--r--src/exhaustive/seed.c70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/exhaustive/seed.c b/src/exhaustive/seed.c
new file mode 100644
index 0000000..a78ff24
--- /dev/null
+++ b/src/exhaustive/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