summaryrefslogtreecommitdiff
path: root/src/gen/seed.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gen/seed.c')
-rw-r--r--src/gen/seed.c84
1 files changed, 15 insertions, 69 deletions
diff --git a/src/gen/seed.c b/src/gen/seed.c
index 505493a..1653a50 100644
--- a/src/gen/seed.c
+++ b/src/gen/seed.c
@@ -4,13 +4,21 @@
*/
#include "seed.h"
+#include <misc/config.h>
#include "io/output.h"
+#include "misc/types.h"
+#include "util/bits.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);
+ if (src->seed) {
+ dest->seed = bits_copy(src->seed);
+ }
+ if (src->hash20) {
+ dest->hash20 = try_memdup(src->hash20, 20);
+ }
return dest;
}
@@ -20,8 +28,7 @@ seed_t *seed_new_copy(const seed_t *src) {
}
seed_t *seed_clone(const seed_t *src, seed_t *dest) {
- if (src->seed) dest->seed = gclone(src->seed);
- return dest;
+ return seed_copy(src, dest);
}
seed_t *seed_new_clone(const seed_t *src) {
@@ -31,75 +38,14 @@ seed_t *seed_new_clone(const seed_t *src) {
void seed_free(seed_t **seed) {
if (*seed) {
- if ((*seed)->seed && isclone((*seed)->seed)) {
- gunclone((*seed)->seed);
+ if ((*seed)->seed) {
+ bits_free(&(*seed)->seed);
+ }
+ if ((*seed)->hash20) {
+ try_free((*seed)->hash20);
}
try_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);
-}
-
-static 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;
-}
-
-GENERATOR(seed_gen_random) {
- 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;
-}
-
-GENERATOR(seed_gen_argument) {
- 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;
-}
-
-GENERATOR(seed_gen_input) {
- pari_sp ltop = avma;
-
- GEN str = input_string("seed:");
- const char *cstr = GSTR(str);
- if (strlen(cstr) < 20) {
- fprintf(err, "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;
-}