21
21
generator_384 ,
22
22
generator_521 ,
23
23
generator_secp256k1 ,
24
+ curve_192 ,
25
+ InvalidPointError ,
26
+ curve_112r2 ,
27
+ generator_112r2 ,
28
+ int_to_string ,
24
29
)
25
30
26
31
@@ -96,6 +101,20 @@ def test_inequality_public_key(self):
96
101
pub_key2 = Public_key (gen , point2 )
97
102
self .assertNotEqual (pub_key1 , pub_key2 )
98
103
104
+ def test_inequality_different_curves (self ):
105
+ gen = generator_192
106
+ x1 = 0xC58D61F88D905293BCD4CD0080BCB1B7F811F2FFA41979F6
107
+ y1 = 0x8804DC7A7C4C7F8B5D437F5156F3312CA7D6DE8A0E11867F
108
+ point1 = ellipticcurve .Point (gen .curve (), x1 , y1 )
109
+
110
+ x2 = 0x722BA0FB6B8FC8898A4C6AB49E66
111
+ y2 = 0x2B7344BB57A7ABC8CA0F1A398C7D
112
+ point2 = ellipticcurve .Point (generator_112r2 .curve (), x2 , y2 )
113
+
114
+ pub_key1 = Public_key (gen , point1 )
115
+ pub_key2 = Public_key (generator_112r2 , point2 )
116
+ self .assertNotEqual (pub_key1 , pub_key2 )
117
+
99
118
def test_inequality_public_key_not_implemented (self ):
100
119
gen = generator_192
101
120
x = 0xC58D61F88D905293BCD4CD0080BCB1B7F811F2FFA41979F6
@@ -104,6 +123,106 @@ def test_inequality_public_key_not_implemented(self):
104
123
pub_key = Public_key (gen , point )
105
124
self .assertNotEqual (pub_key , None )
106
125
126
+ def test_public_key_with_generator_without_order (self ):
127
+ gen = ellipticcurve .PointJacobi (
128
+ generator_192 .curve (), generator_192 .x (), generator_192 .y (), 1
129
+ )
130
+
131
+ x = 0xC58D61F88D905293BCD4CD0080BCB1B7F811F2FFA41979F6
132
+ y = 0x8804DC7A7C4C7F8B5D437F5156F3312CA7D6DE8A0E11867F
133
+ point = ellipticcurve .Point (gen .curve (), x , y )
134
+
135
+ with self .assertRaises (InvalidPointError ) as e :
136
+ Public_key (gen , point )
137
+
138
+ self .assertIn ("Generator point must have order" , str (e .exception ))
139
+
140
+ def test_public_point_on_curve_not_scalar_multiple_of_base_point (self ):
141
+ x = 2
142
+ y = 0xBE6AA4938EF7CFE6FE29595B6B00
143
+ # we need a curve with cofactor != 1
144
+ point = ellipticcurve .PointJacobi (curve_112r2 , x , y , 1 )
145
+
146
+ self .assertTrue (curve_112r2 .contains_point (x , y ))
147
+
148
+ with self .assertRaises (InvalidPointError ) as e :
149
+ Public_key (generator_112r2 , point )
150
+
151
+ self .assertIn ("Generator point order" , str (e .exception ))
152
+
153
+ def test_point_is_valid_with_not_scalar_multiple_of_base_point (self ):
154
+ x = 2
155
+ y = 0xBE6AA4938EF7CFE6FE29595B6B00
156
+
157
+ self .assertFalse (point_is_valid (generator_112r2 , x , y ))
158
+
159
+ # the tests to verify the extensiveness of tests in ecdsa.ecdsa
160
+ # if PointJacobi gets modified to calculate the x and y mod p the tests
161
+ # below will need to use a fake/mock object
162
+ def test_invalid_point_x_negative (self ):
163
+ pt = ellipticcurve .PointJacobi (curve_192 , - 1 , 0 , 1 )
164
+
165
+ with self .assertRaises (InvalidPointError ) as e :
166
+ Public_key (generator_192 , pt )
167
+
168
+ self .assertIn ("The public point has x or y" , str (e .exception ))
169
+
170
+ def test_invalid_point_x_equal_p (self ):
171
+ pt = ellipticcurve .PointJacobi (curve_192 , curve_192 .p (), 0 , 1 )
172
+
173
+ with self .assertRaises (InvalidPointError ) as e :
174
+ Public_key (generator_192 , pt )
175
+
176
+ self .assertIn ("The public point has x or y" , str (e .exception ))
177
+
178
+ def test_invalid_point_y_negative (self ):
179
+ pt = ellipticcurve .PointJacobi (curve_192 , 0 , - 1 , 1 )
180
+
181
+ with self .assertRaises (InvalidPointError ) as e :
182
+ Public_key (generator_192 , pt )
183
+
184
+ self .assertIn ("The public point has x or y" , str (e .exception ))
185
+
186
+ def test_invalid_point_y_equal_p (self ):
187
+ pt = ellipticcurve .PointJacobi (curve_192 , 0 , curve_192 .p (), 1 )
188
+
189
+ with self .assertRaises (InvalidPointError ) as e :
190
+ Public_key (generator_192 , pt )
191
+
192
+ self .assertIn ("The public point has x or y" , str (e .exception ))
193
+
194
+
195
+ class TestPublicKeyVerifies (unittest .TestCase ):
196
+ # test all the different ways that a signature can be publicly invalid
197
+ @classmethod
198
+ def setUpClass (cls ):
199
+ gen = generator_192
200
+ x = 0xC58D61F88D905293BCD4CD0080BCB1B7F811F2FFA41979F6
201
+ y = 0x8804DC7A7C4C7F8B5D437F5156F3312CA7D6DE8A0E11867F
202
+ point = ellipticcurve .Point (gen .curve (), x , y )
203
+
204
+ cls .pub_key = Public_key (gen , point )
205
+
206
+ def test_sig_with_r_zero (self ):
207
+ sig = Signature (0 , 1 )
208
+
209
+ self .assertFalse (self .pub_key .verifies (1 , sig ))
210
+
211
+ def test_sig_with_r_order (self ):
212
+ sig = Signature (generator_192 .order (), 1 )
213
+
214
+ self .assertFalse (self .pub_key .verifies (1 , sig ))
215
+
216
+ def test_sig_with_s_zero (self ):
217
+ sig = Signature (1 , 0 )
218
+
219
+ self .assertFalse (self .pub_key .verifies (1 , sig ))
220
+
221
+ def test_sig_with_s_order (self ):
222
+ sig = Signature (1 , generator_192 .order ())
223
+
224
+ self .assertFalse (self .pub_key .verifies (1 , sig ))
225
+
107
226
108
227
class TestPrivateKey (unittest .TestCase ):
109
228
@classmethod
@@ -536,3 +655,7 @@ def test_sig_verify(args):
536
655
assert pubkey .verifies (msg , signature )
537
656
538
657
assert not pubkey .verifies (msg - 1 , signature )
658
+
659
+
660
+ def test_int_to_string_with_zero ():
661
+ assert int_to_string (0 ) == b"\x00 "
0 commit comments