1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
/*
* ecgen, tool for generating Elliptic curve domain parameters
* Copyright (C) 2017 J08nY
*/
#include "seed.h"
#include "io/input.h"
seed_t *seed_new(void) {
seed_t *seed = pari_malloc(sizeof(seed_t));
if (!seed) {
perror("Couldn't malloc.");
exit(1);
}
memset(seed, 0, sizeof(seed_t));
return seed;
}
seed_t *seed_copy(seed_t *src, seed_t *dest) {
dest->seed = gcopy(src->seed);
return dest;
}
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 *cfg, arg_t *args) {
curve->seed = seed_new();
curve->seed->seed = random_int(160);
return 1;
}
int seed_argument(curve_t *curve, config_t *cfg, arg_t *args) {
curve->seed = seed_new();
curve->seed->seed = seed_stoi(cfg->seed);
return 1;
}
int seed_input(curve_t *curve, 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;
}
|