aboutsummaryrefslogtreecommitdiff
path: root/test/src/gen/test_gens.c
blob: 49f82e2be5dc2d00290c479c1de66ce2490e1569 (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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
 * ecgen, tool for generating Elliptic curve domain parameters
 * Copyright (C) 2017 J08nY
 */
#include <criterion/criterion.h>
#include "exhaustive/arg.h"
#include "gen/gens.h"
#include "test/io.h"

TestSuite(gens, .init = io_setup, .fini = io_teardown);

Test(gens, test_gens_gen_any) {
	cfg->field = FIELD_PRIME;
	curve_t curve = {.field = stoi(19),
	                 .a = mkintmodu(3, 19),
	                 .b = mkintmodu(5, 19),
	                 .curve = ellinit(mkvec2(stoi(3), stoi(5)), stoi(19), 0),
	                 .order = stoi(26)};

	pari_sp to = avma;
	int ret = gens_gen_any(&curve, NULL, OFFSET_GENERATORS);
	pari_sp from = avma;
	cr_assert_eq(ret, 1, );
	cr_assert_not_null(curve.generators, );
	cr_assert_eq(curve.ngens, 1, );
	gens_unroll(&curve, from, to);

	memset(&curve, 0, sizeof(curve_t));

	curve.field = stoi(29);
	curve.a = mkintmodu(5, 29);
	curve.b = mkintmodu(1, 29);
	curve.curve = ellinit(mkvec2(stoi(5), stoi(1)), stoi(29), 0);
	curve.order = stoi(32);

	ret = gens_gen_any(&curve, NULL, OFFSET_GENERATORS);
	cr_assert_eq(ret, 1, );
	cr_assert_not_null(curve.generators, );
	cr_assert_eq(curve.ngens, 2, );
}

Test(gens, test_gens_gen_one) {
	cfg->field = FIELD_PRIME;
	curve_t curve = {.field = stoi(19),
	                 .a = mkintmodu(3, 19),
	                 .b = mkintmodu(5, 19),
	                 .curve = ellinit(mkvec2(stoi(3), stoi(5)), stoi(19), 0),
	                 .order = stoi(26)};

	pari_sp to = avma;
	int ret = gens_gen_one(&curve, NULL, OFFSET_GENERATORS);
	pari_sp from = avma;
	cr_assert_eq(ret, 1, );
	cr_assert_not_null(curve.generators, );
	cr_assert_eq(curve.ngens, 1, );
	gens_unroll(&curve, from, to);

	memset(&curve, 0, sizeof(curve_t));

	curve.field = stoi(29);
	curve.a = mkintmodu(5, 29);
	curve.b = mkintmodu(1, 29);
	curve.curve = ellinit(mkvec2(stoi(5), stoi(1)), stoi(29), 0);
	curve.order = stoi(32);

	ret = gens_gen_one(&curve, NULL, OFFSET_GENERATORS);
	cr_assert_eq(ret, -5, );
	cr_assert_null(curve.generators, );
}

Test(gens, test_gens_check_anomalous) {
	cfg->field = FIELD_PRIME;
	curve_t curve = {
	    .field = stoi(19),
	    .a = mkintmodu(3, 19),
	    .b = mkintmodu(6, 19),
	    .curve = ellinit(mkvec2(stoi(3), stoi(6)), stoi(19), 0),
	    .order = stoi(16),
	};
	point_t gen = {.point = mkvec2(mkintmodu(4, 19), mkintmodu(14, 19)),
	               .order = stoi(16)};
	point_t *generators[1] = {&gen};
	curve.generators = generators;
	curve.ngens = 1;

	int ret = gens_check_anomalous(&curve, NULL, OFFSET_GENERATORS);
	cr_assert_eq(ret, 1, );

	memset(&curve, 0, sizeof(curve_t));

	curve.field = stoi(23);
	curve.a = mkintmodu(5, 23);
	curve.b = mkintmodu(14, 23);
	curve.curve = ellinit(mkvec2(stoi(5), stoi(14)), stoi(23), 0);
	curve.order = stoi(23);
	gen.point = mkvec2(mkintmodu(20, 23), mkintmodu(8, 23));
	gen.order = stoi(23);
	gen.cofactor = stoi(1);
	curve.generators = generators;
	curve.ngens = 1;

	ret = gens_check_anomalous(&curve, NULL, OFFSET_GENERATORS);
	cr_assert_eq(ret, -5, );
}

Test(gens, test_gens_check_embedding) {
	cfg->field = FIELD_PRIME;
	curve_t curve = {
	    .field = stoi(19),
	    .a = mkintmodu(3, 19),
	    .b = mkintmodu(12, 19),
	    .curve = ellinit(mkvec2(stoi(3), stoi(12)), stoi(19), 0),
	    .order = stoi(18),
	};
	point_t gen1 = {.point = mkvec2(mkintmodu(1, 19), mkintmodu(4, 19)),
	                .order = stoi(6)};
	point_t gen2 = {.point = mkvec2(mkintmodu(10, 19), mkintmodu(4, 19)),
	                .order = stoi(3)};
	point_t *generators[2] = {&gen1, &gen2};
	curve.generators = generators;
	curve.ngens = 2;

	char *min_degree = "5";
	arg_t arg = {.args = min_degree, .nargs = 1};

	int ret = gens_check_embedding(&curve, &arg, OFFSET_GENERATORS);
	cr_assert_eq(ret, -5, );
}