Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
jvdsn
GitHub Repository: jvdsn/crypto-attacks
Path: blob/master/test/shared/test_ecc.py
2589 views
1
import os
2
import sys
3
from unittest import TestCase
4
5
from sage.all import factor
6
7
path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(os.path.abspath(__file__)))))
8
if sys.path[1] != path:
9
sys.path.insert(1, path)
10
11
from shared.ecc import generate_anomalous
12
from shared.ecc import generate_anomalous_q
13
from shared.ecc import generate_mnt
14
from shared.ecc import generate_mnt_k2
15
from shared.ecc import generate_supersingular
16
from shared.ecc import generate_with_order
17
from shared.ecc import generate_with_order_q
18
from shared.ecc import generate_with_trace
19
from shared.ecc import generate_with_trace_q
20
from shared.ecc import get_embedding_degree
21
22
23
class TestECC(TestCase):
24
def test_generate_anomalous_q(self):
25
q = 214667031558479219841849884722475668069
26
gen = generate_anomalous_q(q)
27
for _ in range(4):
28
E = next(gen)
29
self.assertEqual(E.base_ring().order(), q)
30
self.assertEqual(E.trace_of_frobenius(), 1)
31
32
D = -11
33
gen = generate_anomalous_q(q, D)
34
for _ in range(4):
35
E = next(gen)
36
self.assertEqual(E.base_ring().order(), q)
37
self.assertEqual(E.trace_of_frobenius(), 1)
38
39
def test_generate_anomalous(self):
40
q_bit_length = 128
41
gen = generate_anomalous(q_bit_length)
42
for _ in range(4):
43
E = next(gen)
44
self.assertEqual(E.base_ring().order().nbits(), q_bit_length)
45
self.assertEqual(E.trace_of_frobenius(), 1)
46
47
D = -19
48
gen = generate_anomalous(q_bit_length, D)
49
for _ in range(4):
50
E = next(gen)
51
self.assertEqual(E.base_ring().order().nbits(), q_bit_length)
52
self.assertEqual(E.trace_of_frobenius(), 1)
53
54
def test_generate_with_trace_q(self):
55
t = 1234
56
q = 548567
57
gen = generate_with_trace_q(t, q)
58
for _ in range(4):
59
E = next(gen)
60
self.assertEqual(E.base_ring().order(), q)
61
self.assertEqual(E.trace_of_frobenius(), t)
62
63
D = -671512
64
gen = generate_with_trace_q(t, q, D)
65
for _ in range(4):
66
E = next(gen)
67
self.assertEqual(E.base_ring().order(), q)
68
self.assertEqual(E.trace_of_frobenius(), t)
69
70
def test_generate_with_trace(self):
71
t = 1234
72
q_bit_length = 128
73
gen = generate_with_trace(t, q_bit_length)
74
for _ in range(4):
75
E = next(gen)
76
self.assertEqual(E.base_ring().order().nbits(), q_bit_length)
77
self.assertEqual(E.trace_of_frobenius(), t)
78
79
D = -11
80
gen = generate_with_trace(t, q_bit_length, D)
81
for _ in range(4):
82
E = next(gen)
83
self.assertEqual(E.base_ring().order().nbits(), q_bit_length)
84
self.assertEqual(E.trace_of_frobenius(), t)
85
86
def test_generate_with_order_q(self):
87
m = 548567 + 1 - 1234
88
q = 548567
89
gen = generate_with_order_q(m, q)
90
for _ in range(4):
91
E = next(gen)
92
self.assertEqual(E.base_ring().order(), q)
93
self.assertEqual(E.order(), m)
94
95
D = -671512
96
gen = generate_with_order_q(m, q, D)
97
for _ in range(4):
98
E = next(gen)
99
self.assertEqual(E.base_ring().order(), q)
100
self.assertEqual(E.order(), m)
101
102
def test_generate_with_order(self):
103
m = 2 ** 64 + 1
104
gen = generate_with_order(m)
105
for _ in range(4):
106
E = next(gen)
107
self.assertEqual(E.order(), m)
108
109
D = -1411
110
gen = generate_with_order(m, D)
111
for _ in range(4):
112
E = next(gen)
113
self.assertEqual(E.order(), m)
114
115
def test_generate_supersingular(self):
116
for p in [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]:
117
for n in range(1, 5):
118
q = p ** n
119
gen = generate_supersingular(q)
120
for _ in range(4):
121
E = next(gen)
122
self.assertEqual(E.base_ring().order(), q)
123
self.assertTrue(E.is_supersingular())
124
125
q = 214667031558479219841849884722475668069
126
gen = generate_supersingular(q)
127
for _ in range(4):
128
E = next(gen)
129
self.assertEqual(E.base_ring().order(), q)
130
self.assertTrue(E.is_supersingular())
131
132
def test_generate_mnt(self):
133
for k in {3, 4, 6}:
134
for h in range(1, 5):
135
gen = generate_mnt(k, h_min=h, h_max=h)
136
for _ in range(4):
137
E = next(gen)
138
q = E.base_ring().order()
139
n = E.order()
140
r, _ = factor(n)[-1]
141
self.assertEqual(n // r, h)
142
self.assertEqual(get_embedding_degree(q, r, 10), k)
143
144
def test_generate_mnt_k2(self):
145
q_bit_length = 128
146
gen = generate_mnt_k2(q_bit_length)
147
for _ in range(4):
148
E = next(gen)
149
q = E.base_ring().order()
150
n = E.order()
151
r, _ = factor(n)[-1]
152
self.assertEqual(q.nbits(), q_bit_length)
153
self.assertEqual(get_embedding_degree(q, r, 10), 2)
154
155
D = -19
156
gen = generate_mnt_k2(q_bit_length, D)
157
for _ in range(4):
158
E = next(gen)
159
q = E.base_ring().order()
160
n = E.order()
161
r, _ = factor(n)[-1]
162
self.assertEqual(q.nbits(), q_bit_length)
163
self.assertEqual(get_embedding_degree(q, r, 10), 2)
164
165