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
|
/*
* ecgen, tool for generating Elliptic curve domain parameters
* Copyright (C) 2017-2018 J08nY
*/
#include "curve.h"
#include "math/twists.h"
GENERATOR(curve_gen_any) {
pari_sp ltop = avma;
GEN v = gen_0;
switch (typ(curve->field)) {
case t_INT:
v = gtovec0(gen_0, 2);
gel(v, 1) = curve->a;
gel(v, 2) = curve->b;
break;
case t_FFELT:
v = gtovec0(gen_0, 5);
gel(v, 1) = gen_1;
gel(v, 2) = curve->a;
gel(v, 5) = curve->b;
break;
default:
pari_err_TYPE("curve_gen_any", curve->field);
}
GEN crv = ellinit(v, curve->field, -1);
if (glength(crv) == 0) {
avma = ltop;
return -3;
} else {
curve->curve = gerepilecopy(ltop, crv);
return 1;
}
}
GENERATOR(curve_gen_any_twist) {
int result = curve_gen_any(curve, args, state);
if (result != 1) {
return result;
} else {
twist_rand(curve);
return 1;
}
}
CHECK(curve_check_nonzero) {
if (gequal0(ell_get_disc(curve->curve))) {
return -3;
} else {
return 1;
}
}
UNROLL(curve_unroll) {
if (curve->curve) {
obj_free(curve->curve);
curve->curve = NULL;
}
return -1;
}
|