aboutsummaryrefslogtreecommitdiff
path: root/src/gen/curve.c
blob: 7ea2fb5eeb74734e45526b1982d9f637144c3098 (plain)
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;
}