blob: 013d491ebc63d874940995499fb10c4f1a46ee99 [file] [log] [blame]
Alex Gaynorf312a5c2013-08-10 15:23:38 -04001# Licensed under the Apache License, Version 2.0 (the "License");
2# you may not use this file except in compliance with the License.
3# You may obtain a copy of the License at
4#
5# http://www.apache.org/licenses/LICENSE-2.0
6#
7# Unless required by applicable law or agreed to in writing, software
8# distributed under the License is distributed on an "AS IS" BASIS,
9# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
10# implied.
11# See the License for the specific language governing permissions and
12# limitations under the License.
13
Alex Gaynorab53bc52013-11-12 09:37:59 -080014import os
Donald Stufft9e1a48b2013-08-09 00:32:30 -040015import textwrap
16
Alex Gaynor2b3f9422013-12-24 21:55:24 -080017import pretend
18
Paul Kehrer79c16e92013-10-18 17:44:36 -050019import pytest
20
Alex Gaynorafdddca2013-10-21 21:00:20 -070021from .utils import (
Paul Kehrerf7f6a9f2013-11-11 20:43:52 -060022 load_nist_vectors, load_vectors_from_file, load_cryptrec_vectors,
Paul Kehrerd5c9f5a2014-02-15 22:17:14 -060023 load_hash_vectors, check_for_iface, check_backend_support,
24 select_backends, load_pkcs1_vectors
Alex Gaynorafdddca2013-10-21 21:00:20 -070025)
Donald Stufft9e1a48b2013-08-09 00:32:30 -040026
27
Alex Gaynor2b3f9422013-12-24 21:55:24 -080028class FakeInterface(object):
29 pass
30
31
Paul Kehrerc421e632014-01-18 09:22:21 -060032def test_select_one_backend():
Paul Kehrer34c075e2014-01-13 21:52:08 -050033 b1 = pretend.stub(name="b1")
34 b2 = pretend.stub(name="b2")
35 b3 = pretend.stub(name="b3")
36 backends = [b1, b2, b3]
37 name = "b2"
Paul Kehreraed9e172014-01-19 12:09:27 -060038 selected_backends = select_backends(name, backends)
39 assert len(selected_backends) == 1
40 assert selected_backends[0] == b2
Paul Kehrer34c075e2014-01-13 21:52:08 -050041
42
Paul Kehrerc421e632014-01-18 09:22:21 -060043def test_select_no_backend():
Paul Kehrer34c075e2014-01-13 21:52:08 -050044 b1 = pretend.stub(name="b1")
45 b2 = pretend.stub(name="b2")
46 b3 = pretend.stub(name="b3")
47 backends = [b1, b2, b3]
48 name = "back!"
49 with pytest.raises(ValueError):
Paul Kehrerc421e632014-01-18 09:22:21 -060050 select_backends(name, backends)
51
52
53def test_select_backends_none():
54 b1 = pretend.stub(name="b1")
55 b2 = pretend.stub(name="b2")
56 b3 = pretend.stub(name="b3")
57 backends = [b1, b2, b3]
58 name = None
Paul Kehreraed9e172014-01-19 12:09:27 -060059 selected_backends = select_backends(name, backends)
60 assert len(selected_backends) == 3
Paul Kehrerc421e632014-01-18 09:22:21 -060061
62
63def test_select_two_backends():
64 b1 = pretend.stub(name="b1")
65 b2 = pretend.stub(name="b2")
66 b3 = pretend.stub(name="b3")
67 backends = [b1, b2, b3]
68 name = "b2 ,b1 "
Paul Kehreraed9e172014-01-19 12:09:27 -060069 selected_backends = select_backends(name, backends)
70 assert len(selected_backends) == 2
71 assert selected_backends == [b1, b2]
Paul Kehrer34c075e2014-01-13 21:52:08 -050072
73
Alex Gaynor2b3f9422013-12-24 21:55:24 -080074def test_check_for_iface():
75 item = pretend.stub(keywords=["fake_name"], funcargs={"backend": True})
76 with pytest.raises(pytest.skip.Exception) as exc_info:
77 check_for_iface("fake_name", FakeInterface, item)
78 assert exc_info.value.args[0] == "True backend does not support fake_name"
79
80 item = pretend.stub(
81 keywords=["fake_name"],
82 funcargs={"backend": FakeInterface()}
83 )
84 check_for_iface("fake_name", FakeInterface, item)
85
86
Paul Kehrer60fc8da2013-12-26 20:19:34 -060087def test_check_backend_support_skip():
Paul Kehrer5a8fdf82013-12-26 20:13:45 -060088 supported = pretend.stub(
89 kwargs={"only_if": lambda backend: False, "skip_message": "Nope"}
90 )
91 item = pretend.stub(keywords={"supported": supported},
92 funcargs={"backend": True})
93 with pytest.raises(pytest.skip.Exception) as exc_info:
Paul Kehrer60fc8da2013-12-26 20:19:34 -060094 check_backend_support(item)
Paul Kehrerf03334e2014-01-02 23:16:14 -060095 assert exc_info.value.args[0] == "Nope (True)"
Paul Kehrer5a8fdf82013-12-26 20:13:45 -060096
97
Paul Kehrer60fc8da2013-12-26 20:19:34 -060098def test_check_backend_support_no_skip():
Paul Kehrer5a8fdf82013-12-26 20:13:45 -060099 supported = pretend.stub(
100 kwargs={"only_if": lambda backend: True, "skip_message": "Nope"}
101 )
102 item = pretend.stub(keywords={"supported": supported},
103 funcargs={"backend": True})
Paul Kehrer60fc8da2013-12-26 20:19:34 -0600104 assert check_backend_support(item) is None
Paul Kehrer5a8fdf82013-12-26 20:13:45 -0600105
106
Paul Kehrer60fc8da2013-12-26 20:19:34 -0600107def test_check_backend_support_no_backend():
Paul Kehrer5a8fdf82013-12-26 20:13:45 -0600108 supported = pretend.stub(
109 kwargs={"only_if": "notalambda", "skip_message": "Nope"}
110 )
111 item = pretend.stub(keywords={"supported": supported},
112 funcargs={})
Paul Kehrerec495502013-12-27 15:51:40 -0600113 with pytest.raises(ValueError):
Paul Kehrer60fc8da2013-12-26 20:19:34 -0600114 check_backend_support(item)
Paul Kehrer5a8fdf82013-12-26 20:13:45 -0600115
116
Alex Gaynorcf5fb332013-11-11 15:39:52 -0800117def test_load_nist_vectors():
Donald Stufft9e1a48b2013-08-09 00:32:30 -0400118 vector_data = textwrap.dedent("""
119 # CAVS 11.1
120 # Config info for aes_values
121 # AESVS GFSbox test data for CBC
122 # State : Encrypt and Decrypt
123 # Key Length : 128
124 # Generated on Fri Apr 22 15:11:33 2011
125
126 [ENCRYPT]
127
128 COUNT = 0
129 KEY = 00000000000000000000000000000000
130 IV = 00000000000000000000000000000000
131 PLAINTEXT = f34481ec3cc627bacd5dc3fb08f273e6
132 CIPHERTEXT = 0336763e966d92595a567cc9ce537f5e
133
134 COUNT = 1
135 KEY = 00000000000000000000000000000000
136 IV = 00000000000000000000000000000000
137 PLAINTEXT = 9798c4640bad75c7c3227db910174e72
138 CIPHERTEXT = a9a1631bf4996954ebc093957b234589
139
140 [DECRYPT]
141
142 COUNT = 0
143 KEY = 00000000000000000000000000000000
144 IV = 00000000000000000000000000000000
145 CIPHERTEXT = 0336763e966d92595a567cc9ce537f5e
146 PLAINTEXT = f34481ec3cc627bacd5dc3fb08f273e6
147
148 COUNT = 1
149 KEY = 00000000000000000000000000000000
150 IV = 00000000000000000000000000000000
151 CIPHERTEXT = a9a1631bf4996954ebc093957b234589
152 PLAINTEXT = 9798c4640bad75c7c3227db910174e72
153 """).splitlines()
154
Alex Gaynord3ce7032013-11-11 14:46:20 -0800155 assert load_nist_vectors(vector_data) == [
156 {
157 "key": b"00000000000000000000000000000000",
158 "iv": b"00000000000000000000000000000000",
159 "plaintext": b"f34481ec3cc627bacd5dc3fb08f273e6",
160 "ciphertext": b"0336763e966d92595a567cc9ce537f5e",
161 },
162 {
163 "key": b"00000000000000000000000000000000",
164 "iv": b"00000000000000000000000000000000",
165 "plaintext": b"9798c4640bad75c7c3227db910174e72",
166 "ciphertext": b"a9a1631bf4996954ebc093957b234589",
167 },
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700168 {
169 "key": b"00000000000000000000000000000000",
170 "iv": b"00000000000000000000000000000000",
171 "plaintext": b"f34481ec3cc627bacd5dc3fb08f273e6",
172 "ciphertext": b"0336763e966d92595a567cc9ce537f5e",
173 },
174 {
175 "key": b"00000000000000000000000000000000",
176 "iv": b"00000000000000000000000000000000",
177 "plaintext": b"9798c4640bad75c7c3227db910174e72",
178 "ciphertext": b"a9a1631bf4996954ebc093957b234589",
179 },
Donald Stufft9e1a48b2013-08-09 00:32:30 -0400180 ]
181
182
Paul Kehrer6fb1a5a2014-01-29 13:44:07 -0600183def test_load_nist_vectors_with_null_chars():
184 vector_data = textwrap.dedent("""
185 COUNT = 0
186 KEY = thing\\0withnulls
187
188 COUNT = 1
189 KEY = 00000000000000000000000000000000
190 """).splitlines()
191
192 assert load_nist_vectors(vector_data) == [
193 {
194 "key": b"thing\x00withnulls",
195 },
196 {
197 "key": b"00000000000000000000000000000000",
198 },
199 ]
200
201
Paul Kehrer1951bf62013-09-15 12:05:43 -0500202def test_load_cryptrec_vectors():
203 vector_data = textwrap.dedent("""
204 # Vectors taken from http://info.isl.ntt.co.jp/crypt/eng/camellia/
205 # Download is t_camelia.txt
206
207 # Camellia with 128-bit key
208
209 K No.001 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
210
211 P No.001 : 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
212 C No.001 : 07 92 3A 39 EB 0A 81 7D 1C 4D 87 BD B8 2D 1F 1C
213
214 P No.002 : 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
215 C No.002 : 48 CD 64 19 80 96 72 D2 34 92 60 D8 9A 08 D3 D3
216
217 K No.002 : 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
218
219 P No.001 : 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
220 C No.001 : 07 92 3A 39 EB 0A 81 7D 1C 4D 87 BD B8 2D 1F 1C
221 """).splitlines()
222
223 assert load_cryptrec_vectors(vector_data) == [
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700224 {
225 "key": b"00000000000000000000000000000000",
226 "plaintext": b"80000000000000000000000000000000",
227 "ciphertext": b"07923A39EB0A817D1C4D87BDB82D1F1C",
228 },
229 {
230 "key": b"00000000000000000000000000000000",
231 "plaintext": b"40000000000000000000000000000000",
232 "ciphertext": b"48CD6419809672D2349260D89A08D3D3",
233 },
234 {
235 "key": b"10000000000000000000000000000000",
236 "plaintext": b"80000000000000000000000000000000",
237 "ciphertext": b"07923A39EB0A817D1C4D87BDB82D1F1C",
238 },
Paul Kehrer1951bf62013-09-15 12:05:43 -0500239 ]
240
241
Donald Stufft3359d7e2013-10-19 19:33:06 -0400242def test_load_cryptrec_vectors_invalid():
243 vector_data = textwrap.dedent("""
244 # Vectors taken from http://info.isl.ntt.co.jp/crypt/eng/camellia/
245 # Download is t_camelia.txt
246
247 # Camellia with 128-bit key
248
249 E No.001 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
250 """).splitlines()
251
252 with pytest.raises(ValueError):
253 load_cryptrec_vectors(vector_data)
254
255
Paul Kehrer69e06522013-10-18 17:28:39 -0500256def test_load_hash_vectors():
257 vector_data = textwrap.dedent("""
258
259 # http://tools.ietf.org/html/rfc1321
Paul Kehrer87cd0db2013-10-18 18:01:26 -0500260 [irrelevant]
Paul Kehrer69e06522013-10-18 17:28:39 -0500261
262 Len = 0
263 Msg = 00
264 MD = d41d8cd98f00b204e9800998ecf8427e
265
266 Len = 8
267 Msg = 61
268 MD = 0cc175b9c0f1b6a831c399e269772661
269
270 Len = 24
271 Msg = 616263
272 MD = 900150983cd24fb0d6963f7d28e17f72
273
274 Len = 112
275 Msg = 6d65737361676520646967657374
276 MD = f96b697d7cb7938d525a2f31aaf161d0
277 """).splitlines()
278 assert load_hash_vectors(vector_data) == [
Paul Kehrer79c16e92013-10-18 17:44:36 -0500279 (b"", "d41d8cd98f00b204e9800998ecf8427e"),
280 (b"61", "0cc175b9c0f1b6a831c399e269772661"),
281 (b"616263", "900150983cd24fb0d6963f7d28e17f72"),
282 (b"6d65737361676520646967657374", "f96b697d7cb7938d525a2f31aaf161d0"),
Paul Kehrer69e06522013-10-18 17:28:39 -0500283 ]
284
285
Paul Kehrer0317b042013-10-28 17:34:27 -0500286def test_load_hmac_vectors():
287 vector_data = textwrap.dedent("""
288Len = 224
289# "Jefe"
290Key = 4a656665
291# "what do ya want for nothing?"
292Msg = 7768617420646f2079612077616e7420666f72206e6f7468696e673f
293MD = 750c783e6ab0b503eaa86e310a5db738
294 """).splitlines()
295 assert load_hash_vectors(vector_data) == [
296 (b"7768617420646f2079612077616e7420666f72206e6f7468696e673f",
297 "750c783e6ab0b503eaa86e310a5db738",
298 b"4a656665"),
299 ]
300
301
Paul Kehrer69e06522013-10-18 17:28:39 -0500302def test_load_hash_vectors_bad_data():
303 vector_data = textwrap.dedent("""
304 # http://tools.ietf.org/html/rfc1321
305
306 Len = 0
307 Msg = 00
308 UNKNOWN=Hello World
309 """).splitlines()
310 with pytest.raises(ValueError):
311 load_hash_vectors(vector_data)
312
Alex Gaynor41172ab2013-11-12 10:00:42 -0800313
Alex Gaynorab53bc52013-11-12 09:37:59 -0800314def test_load_vectors_from_file():
315 vectors = load_vectors_from_file(
316 os.path.join("ciphers", "Blowfish", "bf-cfb.txt"),
317 load_nist_vectors,
Paul Kehrer2b758672013-10-30 09:01:38 -0500318 )
Alex Gaynorab53bc52013-11-12 09:37:59 -0800319 assert vectors == [
320 {
Alex Gaynorc2f45d52013-11-12 09:50:25 -0800321 "key": b"0123456789ABCDEFF0E1D2C3B4A59687",
322 "iv": b"FEDCBA9876543210",
Alex Gaynorab53bc52013-11-12 09:37:59 -0800323 "plaintext": (
Alex Gaynorc2f45d52013-11-12 09:50:25 -0800324 b"37363534333231204E6F77206973207468652074696D6520666F722000"
Alex Gaynorab53bc52013-11-12 09:37:59 -0800325 ),
326 "ciphertext": (
Alex Gaynorc2f45d52013-11-12 09:50:25 -0800327 b"E73214A2822139CAF26ECF6D2EB9E76E3DA3DE04D1517200519D57A6C3"
Alex Gaynorab53bc52013-11-12 09:37:59 -0800328 ),
329 }
330 ]
Paul Kehrera43b6692013-11-12 15:35:49 -0600331
332
333def test_load_nist_gcm_vectors():
334 vector_data = textwrap.dedent("""
335 [Keylen = 128]
336 [IVlen = 96]
337 [PTlen = 0]
338 [AADlen = 0]
339 [Taglen = 128]
340
341 Count = 0
342 Key = 11754cd72aec309bf52f7687212e8957
343 IV = 3c819d9a9bed087615030b65
344 PT =
345 AAD =
346 CT =
347 Tag = 250327c674aaf477aef2675748cf6971
348
349 Count = 1
350 Key = 272f16edb81a7abbea887357a58c1917
351 IV = 794ec588176c703d3d2a7a07
352 PT =
353 AAD =
354 CT =
355 Tag = b6e6f197168f5049aeda32dafbdaeb
356
357 Count = 2
358 Key = a49a5e26a2f8cb63d05546c2a62f5343
359 IV = 907763b19b9b4ab6bd4f0281
360 CT =
361 AAD =
362 Tag = a2be08210d8c470a8df6e8fbd79ec5cf
363 FAIL
364
365 Count = 3
366 Key = 5c1155084cc0ede76b3bc22e9f7574ef
367 IV = 9549e4ba69a61cad7856efc1
368 PT = d1448fa852b84408e2dad8381f363de7
369 AAD = e98e9d9c618e46fef32660976f854ee3
370 CT = f78b60ca125218493bea1c50a2e12ef4
371 Tag = d72da7f5c6cf0bca7242c71835809449
372
373 [Keylen = 128]
374 [IVlen = 96]
375 [PTlen = 0]
376 [AADlen = 0]
377 [Taglen = 120]
378
379 Count = 0
380 Key = eac258e99c55e6ae8ef1da26640613d7
381 IV = 4e8df20faaf2c8eebe922902
382 CT =
383 AAD =
384 Tag = e39aeaebe86aa309a4d062d6274339
385 PT =
386
387 Count = 1
388 Key = 3726cf02fcc6b8639a5497652c94350d
389 IV = 55fef82cde693ce76efcc193
390 CT =
391 AAD =
392 Tag = 3d68111a81ed22d2ef5bccac4fc27f
393 FAIL
394
395 Count = 2
396 Key = f202299d5fd74f03b12d2119a6c4c038
397 IV = eec51e7958c3f20a1bb71815
398 CT =
399 AAD =
400 Tag = a81886b3fb26e51fca87b267e1e157
401 FAIL
402
403 Count = 3
404 Key = fd52925f39546b4c55ffb6b20c59898c
405 IV = f5cf3227444afd905a5f6dba
406 CT =
407 AAD =
408 Tag = 1665b0f1a0b456e1664cfd3de08ccd
409 PT =
Paul Kehrerc985dbb2013-11-18 14:11:55 -0600410
411 [Keylen = 128]
412 [IVlen = 8]
413 [PTlen = 104]
414 [AADlen = 0]
415 [Taglen = 128]
416
417 Count = 0
418 Key = 58fab7632bcf10d2bcee58520bf37414
419 IV = 3c
420 CT = 15c4db4cbb451211179d57017f
421 AAD =
422 Tag = eae841d4355feeb3f786bc86625f1e5b
423 FAIL
Paul Kehrera43b6692013-11-12 15:35:49 -0600424 """).splitlines()
425 assert load_nist_vectors(vector_data) == [
426 {'aad': b'',
Paul Kehrer749ac5b2013-11-18 18:12:41 -0600427 'pt': b'',
428 'iv': b'3c819d9a9bed087615030b65',
429 'tag': b'250327c674aaf477aef2675748cf6971',
430 'key': b'11754cd72aec309bf52f7687212e8957',
431 'ct': b''},
432 {'aad': b'',
433 'pt': b'',
434 'iv': b'794ec588176c703d3d2a7a07',
435 'tag': b'b6e6f197168f5049aeda32dafbdaeb',
436 'key': b'272f16edb81a7abbea887357a58c1917',
437 'ct': b''},
438 {'aad': b'',
439 'iv': b'907763b19b9b4ab6bd4f0281',
440 'tag': b'a2be08210d8c470a8df6e8fbd79ec5cf',
441 'key': b'a49a5e26a2f8cb63d05546c2a62f5343',
442 'ct': b'',
Paul Kehrerc985dbb2013-11-18 14:11:55 -0600443 'fail': True},
Paul Kehrer749ac5b2013-11-18 18:12:41 -0600444 {'aad': b'e98e9d9c618e46fef32660976f854ee3',
445 'pt': b'd1448fa852b84408e2dad8381f363de7',
446 'iv': b'9549e4ba69a61cad7856efc1',
447 'tag': b'd72da7f5c6cf0bca7242c71835809449',
448 'key': b'5c1155084cc0ede76b3bc22e9f7574ef',
449 'ct': b'f78b60ca125218493bea1c50a2e12ef4'},
Paul Kehrerc985dbb2013-11-18 14:11:55 -0600450 {'aad': b'',
Paul Kehrera43b6692013-11-12 15:35:49 -0600451 'pt': b'',
452 'iv': b'4e8df20faaf2c8eebe922902',
453 'tag': b'e39aeaebe86aa309a4d062d6274339',
454 'key': b'eac258e99c55e6ae8ef1da26640613d7',
455 'ct': b''},
456 {'aad': b'',
457 'iv': b'55fef82cde693ce76efcc193',
458 'tag': b'3d68111a81ed22d2ef5bccac4fc27f',
459 'key': b'3726cf02fcc6b8639a5497652c94350d',
460 'ct': b'',
461 'fail': True},
462 {'aad': b'',
463 'iv': b'eec51e7958c3f20a1bb71815',
464 'tag': b'a81886b3fb26e51fca87b267e1e157',
465 'key': b'f202299d5fd74f03b12d2119a6c4c038',
466 'ct': b'',
467 'fail': True},
468 {'aad': b'',
469 'pt': b'',
470 'iv': b'f5cf3227444afd905a5f6dba',
471 'tag': b'1665b0f1a0b456e1664cfd3de08ccd',
472 'key': b'fd52925f39546b4c55ffb6b20c59898c',
473 'ct': b''},
474 {'aad': b'',
Paul Kehrer749ac5b2013-11-18 18:12:41 -0600475 'iv': b'3c',
476 'tag': b'eae841d4355feeb3f786bc86625f1e5b',
477 'key': b'58fab7632bcf10d2bcee58520bf37414',
478 'ct': b'15c4db4cbb451211179d57017f',
Paul Kehrera43b6692013-11-12 15:35:49 -0600479 'fail': True},
Paul Kehrera43b6692013-11-12 15:35:49 -0600480 ]
Alex Stapleton58f27ac2014-02-02 19:30:03 +0000481
482
483def test_load_pkcs1_vectors():
484 vector_data = textwrap.dedent("""
485 Test vectors for RSA-PSS
486 ========================
487
488 This file contains an extract of the original pss-vect.txt
489
490 Key lengths:
491
492 Key 8: 1031 bits
493 Key 9: 1536 bits
494 ===========================================================================
495
496 <snip>
497
498 # Example 8: A 1031-bit RSA key pair
499 # -----------------------------------
500
501
502 # Public key
503 # ----------
504
505 # Modulus:
506 49 53 70 a1 fb 18 54 3c 16 d3 63 1e 31 63 25 5d
507 f6 2b e6 ee e8 90 d5 f2 55 09 e4 f7 78 a8 ea 6f
508 bb bc df 85 df f6 4e 0d 97 20 03 ab 36 81 fb ba
509 6d d4 1f d5 41 82 9b 2e 58 2d e9 f2 a4 a4 e0 a2
510 d0 90 0b ef 47 53 db 3c ee 0e e0 6c 7d fa e8 b1
511 d5 3b 59 53 21 8f 9c ce ea 69 5b 08 66 8e de aa
512 dc ed 94 63 b1 d7 90 d5 eb f2 7e 91 15 b4 6c ad
513 4d 9a 2b 8e fa b0 56 1b 08 10 34 47 39 ad a0 73
514 3f
515
516 # Exponent:
517 01 00 01
518
519 # Private key
520 # -----------
521
522 # Modulus:
523 49 53 70 a1 fb 18 54 3c 16 d3 63 1e 31 63 25 5d
524 f6 2b e6 ee e8 90 d5 f2 55 09 e4 f7 78 a8 ea 6f
525 bb bc df 85 df f6 4e 0d 97 20 03 ab 36 81 fb ba
526 6d d4 1f d5 41 82 9b 2e 58 2d e9 f2 a4 a4 e0 a2
527 d0 90 0b ef 47 53 db 3c ee 0e e0 6c 7d fa e8 b1
528 d5 3b 59 53 21 8f 9c ce ea 69 5b 08 66 8e de aa
529 dc ed 94 63 b1 d7 90 d5 eb f2 7e 91 15 b4 6c ad
530 4d 9a 2b 8e fa b0 56 1b 08 10 34 47 39 ad a0 73
531 3f
532
533 # Public exponent:
534 01 00 01
535
536 # Exponent:
537 6c 66 ff e9 89 80 c3 8f cd ea b5 15 98 98 83 61
538 65 f4 b4 b8 17 c4 f6 a8 d4 86 ee 4e a9 13 0f e9
539 b9 09 2b d1 36 d1 84 f9 5f 50 4a 60 7e ac 56 58
540 46 d2 fd d6 59 7a 89 67 c7 39 6e f9 5a 6e ee bb
541 45 78 a6 43 96 6d ca 4d 8e e3 de 84 2d e6 32 79
542 c6 18 15 9c 1a b5 4a 89 43 7b 6a 61 20 e4 93 0a
543 fb 52 a4 ba 6c ed 8a 49 47 ac 64 b3 0a 34 97 cb
544 e7 01 c2 d6 26 6d 51 72 19 ad 0e c6 d3 47 db e9
545
546 # Prime 1:
547 08 da d7 f1 13 63 fa a6 23 d5 d6 d5 e8 a3 19 32
548 8d 82 19 0d 71 27 d2 84 6c 43 9b 0a b7 26 19 b0
549 a4 3a 95 32 0e 4e c3 4f c3 a9 ce a8 76 42 23 05
550 bd 76 c5 ba 7b e9 e2 f4 10 c8 06 06 45 a1 d2 9e
551 db
552
553 # Prime 2:
554 08 47 e7 32 37 6f c7 90 0f 89 8e a8 2e b2 b0 fc
555 41 85 65 fd ae 62 f7 d9 ec 4c e2 21 7b 97 99 0d
556 d2 72 db 15 7f 99 f6 3c 0d cb b9 fb ac db d4 c4
557 da db 6d f6 77 56 35 8c a4 17 48 25 b4 8f 49 70
558 6d
559
560 # Prime exponent 1:
561 05 c2 a8 3c 12 4b 36 21 a2 aa 57 ea 2c 3e fe 03
562 5e ff 45 60 f3 3d de bb 7a da b8 1f ce 69 a0 c8
563 c2 ed c1 65 20 dd a8 3d 59 a2 3b e8 67 96 3a c6
564 5f 2c c7 10 bb cf b9 6e e1 03 de b7 71 d1 05 fd
565 85
566
567 # Prime exponent 2:
568 04 ca e8 aa 0d 9f aa 16 5c 87 b6 82 ec 14 0b 8e
569 d3 b5 0b 24 59 4b 7a 3b 2c 22 0b 36 69 bb 81 9f
570 98 4f 55 31 0a 1a e7 82 36 51 d4 a0 2e 99 44 79
571 72 59 51 39 36 34 34 e5 e3 0a 7e 7d 24 15 51 e1
572 b9
573
574 # Coefficient:
575 07 d3 e4 7b f6 86 60 0b 11 ac 28 3c e8 8d bb 3f
576 60 51 e8 ef d0 46 80 e4 4c 17 1e f5 31 b8 0b 2b
577 7c 39 fc 76 63 20 e2 cf 15 d8 d9 98 20 e9 6f f3
578 0d c6 96 91 83 9c 4b 40 d7 b0 6e 45 30 7d c9 1f
579 3f
580
581 # RSA-PSS signing of 6 random messages with random salts
582 # -------------------------------------------------------
583
584 <snip>
585
586 # =============================================
587
588 # Example 9: A 1536-bit RSA key pair
589 # -----------------------------------
590
591
592 # Public key
593 # ----------
594
595 # Modulus:
596 e6 bd 69 2a c9 66 45 79 04 03 fd d0 f5 be b8 b9
597 bf 92 ed 10 00 7f c3 65 04 64 19 dd 06 c0 5c 5b
598 5b 2f 48 ec f9 89 e4 ce 26 91 09 97 9c bb 40 b4
599 a0 ad 24 d2 24 83 d1 ee 31 5a d4 cc b1 53 42 68
600 35 26 91 c5 24 f6 dd 8e 6c 29 d2 24 cf 24 69 73
601 ae c8 6c 5b f6 b1 40 1a 85 0d 1b 9a d1 bb 8c bc
602 ec 47 b0 6f 0f 8c 7f 45 d3 fc 8f 31 92 99 c5 43
603 3d db c2 b3 05 3b 47 de d2 ec d4 a4 ca ef d6 14
604 83 3d c8 bb 62 2f 31 7e d0 76 b8 05 7f e8 de 3f
605 84 48 0a d5 e8 3e 4a 61 90 4a 4f 24 8f b3 97 02
606 73 57 e1 d3 0e 46 31 39 81 5c 6f d4 fd 5a c5 b8
607 17 2a 45 23 0e cb 63 18 a0 4f 14 55 d8 4e 5a 8b
608
609 # Exponent:
610 01 00 01
611
612 # Private key
613 # -----------
614
615 # Modulus:
616 e6 bd 69 2a c9 66 45 79 04 03 fd d0 f5 be b8 b9
617 bf 92 ed 10 00 7f c3 65 04 64 19 dd 06 c0 5c 5b
618 5b 2f 48 ec f9 89 e4 ce 26 91 09 97 9c bb 40 b4
619 a0 ad 24 d2 24 83 d1 ee 31 5a d4 cc b1 53 42 68
620 35 26 91 c5 24 f6 dd 8e 6c 29 d2 24 cf 24 69 73
621 ae c8 6c 5b f6 b1 40 1a 85 0d 1b 9a d1 bb 8c bc
622 ec 47 b0 6f 0f 8c 7f 45 d3 fc 8f 31 92 99 c5 43
623 3d db c2 b3 05 3b 47 de d2 ec d4 a4 ca ef d6 14
624 83 3d c8 bb 62 2f 31 7e d0 76 b8 05 7f e8 de 3f
625 84 48 0a d5 e8 3e 4a 61 90 4a 4f 24 8f b3 97 02
626 73 57 e1 d3 0e 46 31 39 81 5c 6f d4 fd 5a c5 b8
627 17 2a 45 23 0e cb 63 18 a0 4f 14 55 d8 4e 5a 8b
628
629 # Public exponent:
630 01 00 01
631
632 # Exponent:
633 6a 7f d8 4f b8 5f ad 07 3b 34 40 6d b7 4f 8d 61
634 a6 ab c1 21 96 a9 61 dd 79 56 5e 9d a6 e5 18 7b
635 ce 2d 98 02 50 f7 35 95 75 35 92 70 d9 15 90 bb
636 0e 42 7c 71 46 0b 55 d5 14 10 b1 91 bc f3 09 fe
637 a1 31 a9 2c 8e 70 27 38 fa 71 9f 1e 00 41 f5 2e
638 40 e9 1f 22 9f 4d 96 a1 e6 f1 72 e1 55 96 b4 51
639 0a 6d ae c2 61 05 f2 be bc 53 31 6b 87 bd f2 13
640 11 66 60 70 e8 df ee 69 d5 2c 71 a9 76 ca ae 79
641 c7 2b 68 d2 85 80 dc 68 6d 9f 51 29 d2 25 f8 2b
642 3d 61 55 13 a8 82 b3 db 91 41 6b 48 ce 08 88 82
643 13 e3 7e eb 9a f8 00 d8 1c ab 32 8c e4 20 68 99
644 03 c0 0c 7b 5f d3 1b 75 50 3a 6d 41 96 84 d6 29
645
646 # Prime 1:
647 f8 eb 97 e9 8d f1 26 64 ee fd b7 61 59 6a 69 dd
648 cd 0e 76 da ec e6 ed 4b f5 a1 b5 0a c0 86 f7 92
649 8a 4d 2f 87 26 a7 7e 51 5b 74 da 41 98 8f 22 0b
650 1c c8 7a a1 fc 81 0c e9 9a 82 f2 d1 ce 82 1e dc
651 ed 79 4c 69 41 f4 2c 7a 1a 0b 8c 4d 28 c7 5e c6
652 0b 65 22 79 f6 15 4a 76 2a ed 16 5d 47 de e3 67
653
654 # Prime 2:
655 ed 4d 71 d0 a6 e2 4b 93 c2 e5 f6 b4 bb e0 5f 5f
656 b0 af a0 42 d2 04 fe 33 78 d3 65 c2 f2 88 b6 a8
657 da d7 ef e4 5d 15 3e ef 40 ca cc 7b 81 ff 93 40
658 02 d1 08 99 4b 94 a5 e4 72 8c d9 c9 63 37 5a e4
659 99 65 bd a5 5c bf 0e fe d8 d6 55 3b 40 27 f2 d8
660 62 08 a6 e6 b4 89 c1 76 12 80 92 d6 29 e4 9d 3d
661
662 # Prime exponent 1:
663 2b b6 8b dd fb 0c 4f 56 c8 55 8b ff af 89 2d 80
664 43 03 78 41 e7 fa 81 cf a6 1a 38 c5 e3 9b 90 1c
665 8e e7 11 22 a5 da 22 27 bd 6c de eb 48 14 52 c1
666 2a d3 d6 1d 5e 4f 77 6a 0a b5 56 59 1b ef e3 e5
667 9e 5a 7f dd b8 34 5e 1f 2f 35 b9 f4 ce e5 7c 32
668 41 4c 08 6a ec 99 3e 93 53 e4 80 d9 ee c6 28 9f
669
670 # Prime exponent 2:
671 4f f8 97 70 9f ad 07 97 46 49 45 78 e7 0f d8 54
672 61 30 ee ab 56 27 c4 9b 08 0f 05 ee 4a d9 f3 e4
673 b7 cb a9 d6 a5 df f1 13 a4 1c 34 09 33 68 33 f1
674 90 81 6d 8a 6b c4 2e 9b ec 56 b7 56 7d 0f 3c 9c
675 69 6d b6 19 b2 45 d9 01 dd 85 6d b7 c8 09 2e 77
676 e9 a1 cc cd 56 ee 4d ba 42 c5 fd b6 1a ec 26 69
677
678 # Coefficient:
679 77 b9 d1 13 7b 50 40 4a 98 27 29 31 6e fa fc 7d
680 fe 66 d3 4e 5a 18 26 00 d5 f3 0a 0a 85 12 05 1c
681 56 0d 08 1d 4d 0a 18 35 ec 3d 25 a6 0f 4e 4d 6a
682 a9 48 b2 bf 3d bb 5b 12 4c bb c3 48 92 55 a3 a9
683 48 37 2f 69 78 49 67 45 f9 43 e1 db 4f 18 38 2c
684 ea a5 05 df c6 57 57 bb 3f 85 7a 58 dc e5 21 56
685
686 # RSA-PSS signing of 6 random messages with random salts
687 # -------------------------------------------------------
688
689 <snip>
690
691 # =============================================
692
693 <snip>
694 """).splitlines()
695
696 vectors = tuple(load_pkcs1_vectors(vector_data))
697 expected = (
698 (
699 {
700 'modulus': int(
701 '495370a1fb18543c16d3631e3163255df62be6eee890d5f25509e4f77'
702 '8a8ea6fbbbcdf85dff64e0d972003ab3681fbba6dd41fd541829b2e58'
703 '2de9f2a4a4e0a2d0900bef4753db3cee0ee06c7dfae8b1d53b5953218'
704 'f9cceea695b08668edeaadced9463b1d790d5ebf27e9115b46cad4d9a'
705 '2b8efab0561b0810344739ada0733f', 16),
706 'public_exponent': int('10001', 16),
707 'private_exponent': int(
708 '6c66ffe98980c38fcdeab5159898836165f4b4b817c4f6a8d486ee4ea'
709 '9130fe9b9092bd136d184f95f504a607eac565846d2fdd6597a8967c7'
710 '396ef95a6eeebb4578a643966dca4d8ee3de842de63279c618159c1ab'
711 '54a89437b6a6120e4930afb52a4ba6ced8a4947ac64b30a3497cbe701'
712 'c2d6266d517219ad0ec6d347dbe9', 16),
713 'p': int(
714 '8dad7f11363faa623d5d6d5e8a319328d82190d7127d2846c439b0ab7'
715 '2619b0a43a95320e4ec34fc3a9cea876422305bd76c5ba7be9e2f410c'
716 '8060645a1d29edb', 16),
717 'q': int(
718 '847e732376fc7900f898ea82eb2b0fc418565fdae62f7d9ec4ce2217b'
719 '97990dd272db157f99f63c0dcbb9fbacdbd4c4dadb6df67756358ca41'
Paul Kehrer09328bb2014-02-12 23:57:27 -0600720 '74825b48f49706d', 16),
721 'dmp1': int(
722 '05c2a83c124b3621a2aa57ea2c3efe035eff4560f33ddebb7adab81fc'
723 'e69a0c8c2edc16520dda83d59a23be867963ac65f2cc710bbcfb96ee1'
724 '03deb771d105fd85', 16),
725 'dmq1': int(
726 '04cae8aa0d9faa165c87b682ec140b8ed3b50b24594b7a3b2c220b366'
727 '9bb819f984f55310a1ae7823651d4a02e99447972595139363434e5e3'
728 '0a7e7d241551e1b9', 16),
729 'iqmp': int(
730 '07d3e47bf686600b11ac283ce88dbb3f6051e8efd04680e44c171ef53'
731 '1b80b2b7c39fc766320e2cf15d8d99820e96ff30dc69691839c4b40d7'
732 'b06e45307dc91f3f', 16)
Alex Stapleton58f27ac2014-02-02 19:30:03 +0000733 },
734
735 {
736 'modulus': int(
737 '495370a1fb18543c16d3631e3163255df62be6eee890d5f25509e4f77'
738 '8a8ea6fbbbcdf85dff64e0d972003ab3681fbba6dd41fd541829b2e58'
739 '2de9f2a4a4e0a2d0900bef4753db3cee0ee06c7dfae8b1d53b5953218'
740 'f9cceea695b08668edeaadced9463b1d790d5ebf27e9115b46cad4d9a'
741 '2b8efab0561b0810344739ada0733f', 16),
742 'public_exponent': int('10001', 16)
743 }
744 ),
745 (
746 {
747 'modulus': int(
748 'e6bd692ac96645790403fdd0f5beb8b9bf92ed10007fc365046419dd0'
749 '6c05c5b5b2f48ecf989e4ce269109979cbb40b4a0ad24d22483d1ee31'
750 '5ad4ccb1534268352691c524f6dd8e6c29d224cf246973aec86c5bf6b'
751 '1401a850d1b9ad1bb8cbcec47b06f0f8c7f45d3fc8f319299c5433ddb'
752 'c2b3053b47ded2ecd4a4caefd614833dc8bb622f317ed076b8057fe8d'
753 'e3f84480ad5e83e4a61904a4f248fb397027357e1d30e463139815c6f'
754 'd4fd5ac5b8172a45230ecb6318a04f1455d84e5a8b', 16),
755 'public_exponent': int('10001', 16),
756 'private_exponent': int(
757 '6a7fd84fb85fad073b34406db74f8d61a6abc12196a961dd79565e9da'
758 '6e5187bce2d980250f7359575359270d91590bb0e427c71460b55d514'
759 '10b191bcf309fea131a92c8e702738fa719f1e0041f52e40e91f229f4'
760 'd96a1e6f172e15596b4510a6daec26105f2bebc53316b87bdf2131166'
761 '6070e8dfee69d52c71a976caae79c72b68d28580dc686d9f5129d225f'
762 '82b3d615513a882b3db91416b48ce08888213e37eeb9af800d81cab32'
763 '8ce420689903c00c7b5fd31b75503a6d419684d629', 16),
764 'p': int(
765 'f8eb97e98df12664eefdb761596a69ddcd0e76daece6ed4bf5a1b50ac'
766 '086f7928a4d2f8726a77e515b74da41988f220b1cc87aa1fc810ce99a'
767 '82f2d1ce821edced794c6941f42c7a1a0b8c4d28c75ec60b652279f61'
768 '54a762aed165d47dee367', 16),
769 'q': int(
770 'ed4d71d0a6e24b93c2e5f6b4bbe05f5fb0afa042d204fe3378d365c2f'
771 '288b6a8dad7efe45d153eef40cacc7b81ff934002d108994b94a5e472'
772 '8cd9c963375ae49965bda55cbf0efed8d6553b4027f2d86208a6e6b48'
Paul Kehrer09328bb2014-02-12 23:57:27 -0600773 '9c176128092d629e49d3d', 16),
774 'dmp1': int(
775 '2bb68bddfb0c4f56c8558bffaf892d8043037841e7fa81cfa61a38c5e'
776 '39b901c8ee71122a5da2227bd6cdeeb481452c12ad3d61d5e4f776a0a'
777 'b556591befe3e59e5a7fddb8345e1f2f35b9f4cee57c32414c086aec9'
778 '93e9353e480d9eec6289f', 16),
779 'dmq1': int(
780 '4ff897709fad079746494578e70fd8546130eeab5627c49b080f05ee4'
781 'ad9f3e4b7cba9d6a5dff113a41c3409336833f190816d8a6bc42e9bec'
782 '56b7567d0f3c9c696db619b245d901dd856db7c8092e77e9a1cccd56e'
783 'e4dba42c5fdb61aec2669', 16),
784 'iqmp': int(
785 '77b9d1137b50404a982729316efafc7dfe66d34e5a182600d5f30a0a8'
786 '512051c560d081d4d0a1835ec3d25a60f4e4d6aa948b2bf3dbb5b124c'
787 'bbc3489255a3a948372f6978496745f943e1db4f18382ceaa505dfc65'
788 '757bb3f857a58dce52156', 16)
Alex Stapleton58f27ac2014-02-02 19:30:03 +0000789 },
790
791 {
792 'modulus': int(
793 'e6bd692ac96645790403fdd0f5beb8b9bf92ed10007fc365046419dd0'
794 '6c05c5b5b2f48ecf989e4ce269109979cbb40b4a0ad24d22483d1ee31'
795 '5ad4ccb1534268352691c524f6dd8e6c29d224cf246973aec86c5bf6b'
796 '1401a850d1b9ad1bb8cbcec47b06f0f8c7f45d3fc8f319299c5433ddb'
797 'c2b3053b47ded2ecd4a4caefd614833dc8bb622f317ed076b8057fe8d'
798 'e3f84480ad5e83e4a61904a4f248fb397027357e1d30e463139815c6f'
799 'd4fd5ac5b8172a45230ecb6318a04f1455d84e5a8b', 16),
800 'public_exponent': int('10001', 16)
801 }
802 )
803 )
804 assert vectors == expected
Ayrx4300f6c2014-02-09 15:15:13 +0800805
806
807def test_load_hotp_vectors():
808 vector_data = textwrap.dedent("""
809 # HOTP Test Vectors
810 # RFC 4226 Appendix D
811
812 COUNT = 0
813 COUNTER = 0
814 INTERMEDIATE = cc93cf18508d94934c64b65d8ba7667fb7cde4b0
815 TRUNCATED = 4c93cf18
816 HOTP = 755224
Ayrxefc68382014-02-10 00:01:05 +0800817 SECRET = 12345678901234567890
Ayrx4300f6c2014-02-09 15:15:13 +0800818
819 COUNT = 1
820 COUNTER = 1
821 INTERMEDIATE = 75a48a19d4cbe100644e8ac1397eea747a2d33ab
822 TRUNCATED = 41397eea
823 HOTP = 287082
Ayrxefc68382014-02-10 00:01:05 +0800824 SECRET = 12345678901234567890
825
Ayrx4300f6c2014-02-09 15:15:13 +0800826
827 COUNT = 2
828 COUNTER = 2
829 INTERMEDIATE = 0bacb7fa082fef30782211938bc1c5e70416ff44
830 TRUNCATED = 82fef30
831 HOTP = 359152
Ayrxefc68382014-02-10 00:01:05 +0800832 SECRET = 12345678901234567890
833
Ayrx4300f6c2014-02-09 15:15:13 +0800834
835 COUNT = 3
836 COUNTER = 3
837 INTERMEDIATE = 66c28227d03a2d5529262ff016a1e6ef76557ece
838 TRUNCATED = 66ef7655
839 HOTP = 969429
Ayrxefc68382014-02-10 00:01:05 +0800840 SECRET = 12345678901234567890
Ayrx4300f6c2014-02-09 15:15:13 +0800841 """).splitlines()
842
843 assert load_nist_vectors(vector_data) == [
844 {
845 "counter": b"0",
846 "intermediate": b"cc93cf18508d94934c64b65d8ba7667fb7cde4b0",
847 "truncated": b"4c93cf18",
848 "hotp": b"755224",
Ayrxefc68382014-02-10 00:01:05 +0800849 "secret": b"12345678901234567890",
Ayrx4300f6c2014-02-09 15:15:13 +0800850 },
851 {
852 "counter": b"1",
853 "intermediate": b"75a48a19d4cbe100644e8ac1397eea747a2d33ab",
854 "truncated": b"41397eea",
855 "hotp": b"287082",
Ayrxefc68382014-02-10 00:01:05 +0800856 "secret": b"12345678901234567890",
Ayrx4300f6c2014-02-09 15:15:13 +0800857 },
858 {
859 "counter": b"2",
860 "intermediate": b"0bacb7fa082fef30782211938bc1c5e70416ff44",
861 "truncated": b"82fef30",
862 "hotp": b"359152",
Ayrxefc68382014-02-10 00:01:05 +0800863 "secret": b"12345678901234567890",
Ayrx4300f6c2014-02-09 15:15:13 +0800864 },
865 {
866 "counter": b"3",
867 "intermediate": b"66c28227d03a2d5529262ff016a1e6ef76557ece",
868 "truncated": b"66ef7655",
869 "hotp": b"969429",
Ayrxefc68382014-02-10 00:01:05 +0800870 "secret": b"12345678901234567890",
Ayrx4300f6c2014-02-09 15:15:13 +0800871 },
872 ]
873
874
875def test_load_totp_vectors():
876 vector_data = textwrap.dedent("""
877 # TOTP Test Vectors
878 # RFC 6238 Appendix B
879
880 COUNT = 0
881 TIME = 59
882 TOTP = 94287082
883 MODE = SHA1
Ayrxefc68382014-02-10 00:01:05 +0800884 SECRET = 12345678901234567890
Ayrx4300f6c2014-02-09 15:15:13 +0800885
886 COUNT = 1
887 TIME = 59
888 TOTP = 46119246
889 MODE = SHA256
Ayrxefc68382014-02-10 00:01:05 +0800890 SECRET = 12345678901234567890
Ayrx4300f6c2014-02-09 15:15:13 +0800891
892 COUNT = 2
893 TIME = 59
894 TOTP = 90693936
895 MODE = SHA512
Ayrxefc68382014-02-10 00:01:05 +0800896 SECRET = 12345678901234567890
Ayrx4300f6c2014-02-09 15:15:13 +0800897 """).splitlines()
898
899 assert load_nist_vectors(vector_data) == [
900 {
901 "time": b"59",
902 "totp": b"94287082",
903 "mode": b"SHA1",
Ayrxefc68382014-02-10 00:01:05 +0800904 "secret": b"12345678901234567890",
Ayrx4300f6c2014-02-09 15:15:13 +0800905 },
906 {
907 "time": b"59",
908 "totp": b"46119246",
909 "mode": b"SHA256",
Ayrxefc68382014-02-10 00:01:05 +0800910 "secret": b"12345678901234567890",
Ayrx4300f6c2014-02-09 15:15:13 +0800911 },
912 {
913 "time": b"59",
914 "totp": b"90693936",
915 "mode": b"SHA512",
Ayrxefc68382014-02-10 00:01:05 +0800916 "secret": b"12345678901234567890",
Ayrx4300f6c2014-02-09 15:15:13 +0800917 },
918 ]