blob: 8a168929319355448b24996421d255f1c80353c4 [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 # -------------------------------------------------------
Paul Kehrerefca2802014-02-17 20:55:13 -0600583 # PSS Example 8.1
Alex Stapleton58f27ac2014-02-02 19:30:03 +0000584
Paul Kehrerefca2802014-02-17 20:55:13 -0600585 # -----------------
586
587 # Message to be signed:
588 81 33 2f 4b e6 29 48 41 5e a1 d8 99 79 2e ea cf
589 6c 6e 1d b1 da 8b e1 3b 5c ea 41 db 2f ed 46 70
590 92 e1 ff 39 89 14 c7 14 25 97 75 f5 95 f8 54 7f
591 73 56 92 a5 75 e6 92 3a f7 8f 22 c6 99 7d db 90
592 fb 6f 72 d7 bb 0d d5 74 4a 31 de cd 3d c3 68 58
593 49 83 6e d3 4a ec 59 63 04 ad 11 84 3c 4f 88 48
594 9f 20 97 35 f5 fb 7f da f7 ce c8 ad dc 58 18 16
595 8f 88 0a cb f4 90 d5 10 05 b7 a8 e8 4e 43 e5 42
596 87 97 75 71 dd 99 ee a4 b1 61 eb 2d f1 f5 10 8f
597 12 a4 14 2a 83 32 2e db 05 a7 54 87 a3 43 5c 9a
598 78 ce 53 ed 93 bc 55 08 57 d7 a9 fb
599
600 # Salt:
601 1d 65 49 1d 79 c8 64 b3 73 00 9b e6 f6 f2 46 7b
602 ac 4c 78 fa
603
604 # Signature:
605 02 62 ac 25 4b fa 77 f3 c1 ac a2 2c 51 79 f8 f0
606 40 42 2b 3c 5b af d4 0a 8f 21 cf 0f a5 a6 67 cc
607 d5 99 3d 42 db af b4 09 c5 20 e2 5f ce 2b 1e e1
608 e7 16 57 7f 1e fa 17 f3 da 28 05 2f 40 f0 41 9b
609 23 10 6d 78 45 aa f0 11 25 b6 98 e7 a4 df e9 2d
610 39 67 bb 00 c4 d0 d3 5b a3 55 2a b9 a8 b3 ee f0
611 7c 7f ec db c5 42 4a c4 db 1e 20 cb 37 d0 b2 74
612 47 69 94 0e a9 07 e1 7f bb ca 67 3b 20 52 23 80
613 c5
614
615 # PSS Example 8.2
616
617 # -----------------
618
619 # Message to be signed:
620 e2 f9 6e af 0e 05 e7 ba 32 6e cc a0 ba 7f d2 f7
621 c0 23 56 f3 ce de 9d 0f aa bf 4f cc 8e 60 a9 73
622 e5 59 5f d9 ea 08
623
624 # Salt:
625 43 5c 09 8a a9 90 9e b2 37 7f 12 48 b0 91 b6 89
626 87 ff 18 38
627
628 # Signature:
629 27 07 b9 ad 51 15 c5 8c 94 e9 32 e8 ec 0a 28 0f
630 56 33 9e 44 a1 b5 8d 4d dc ff 2f 31 2e 5f 34 dc
631 fe 39 e8 9c 6a 94 dc ee 86 db bd ae 5b 79 ba 4e
632 08 19 a9 e7 bf d9 d9 82 e7 ee 6c 86 ee 68 39 6e
633 8b 3a 14 c9 c8 f3 4b 17 8e b7 41 f9 d3 f1 21 10
634 9b f5 c8 17 2f ad a2 e7 68 f9 ea 14 33 03 2c 00
635 4a 8a a0 7e b9 90 00 0a 48 dc 94 c8 ba c8 aa be
636 2b 09 b1 aa 46 c0 a2 aa 0e 12 f6 3f bb a7 75 ba
637 7e
638
639 # <snip>
Alex Stapleton58f27ac2014-02-02 19:30:03 +0000640
641 # =============================================
642
643 # Example 9: A 1536-bit RSA key pair
644 # -----------------------------------
645
646
647 # Public key
648 # ----------
649
650 # Modulus:
651 e6 bd 69 2a c9 66 45 79 04 03 fd d0 f5 be b8 b9
652 bf 92 ed 10 00 7f c3 65 04 64 19 dd 06 c0 5c 5b
653 5b 2f 48 ec f9 89 e4 ce 26 91 09 97 9c bb 40 b4
654 a0 ad 24 d2 24 83 d1 ee 31 5a d4 cc b1 53 42 68
655 35 26 91 c5 24 f6 dd 8e 6c 29 d2 24 cf 24 69 73
656 ae c8 6c 5b f6 b1 40 1a 85 0d 1b 9a d1 bb 8c bc
657 ec 47 b0 6f 0f 8c 7f 45 d3 fc 8f 31 92 99 c5 43
658 3d db c2 b3 05 3b 47 de d2 ec d4 a4 ca ef d6 14
659 83 3d c8 bb 62 2f 31 7e d0 76 b8 05 7f e8 de 3f
660 84 48 0a d5 e8 3e 4a 61 90 4a 4f 24 8f b3 97 02
661 73 57 e1 d3 0e 46 31 39 81 5c 6f d4 fd 5a c5 b8
662 17 2a 45 23 0e cb 63 18 a0 4f 14 55 d8 4e 5a 8b
663
664 # Exponent:
665 01 00 01
666
667 # Private key
668 # -----------
669
670 # Modulus:
671 e6 bd 69 2a c9 66 45 79 04 03 fd d0 f5 be b8 b9
672 bf 92 ed 10 00 7f c3 65 04 64 19 dd 06 c0 5c 5b
673 5b 2f 48 ec f9 89 e4 ce 26 91 09 97 9c bb 40 b4
674 a0 ad 24 d2 24 83 d1 ee 31 5a d4 cc b1 53 42 68
675 35 26 91 c5 24 f6 dd 8e 6c 29 d2 24 cf 24 69 73
676 ae c8 6c 5b f6 b1 40 1a 85 0d 1b 9a d1 bb 8c bc
677 ec 47 b0 6f 0f 8c 7f 45 d3 fc 8f 31 92 99 c5 43
678 3d db c2 b3 05 3b 47 de d2 ec d4 a4 ca ef d6 14
679 83 3d c8 bb 62 2f 31 7e d0 76 b8 05 7f e8 de 3f
680 84 48 0a d5 e8 3e 4a 61 90 4a 4f 24 8f b3 97 02
681 73 57 e1 d3 0e 46 31 39 81 5c 6f d4 fd 5a c5 b8
682 17 2a 45 23 0e cb 63 18 a0 4f 14 55 d8 4e 5a 8b
683
684 # Public exponent:
685 01 00 01
686
687 # Exponent:
688 6a 7f d8 4f b8 5f ad 07 3b 34 40 6d b7 4f 8d 61
689 a6 ab c1 21 96 a9 61 dd 79 56 5e 9d a6 e5 18 7b
690 ce 2d 98 02 50 f7 35 95 75 35 92 70 d9 15 90 bb
691 0e 42 7c 71 46 0b 55 d5 14 10 b1 91 bc f3 09 fe
692 a1 31 a9 2c 8e 70 27 38 fa 71 9f 1e 00 41 f5 2e
693 40 e9 1f 22 9f 4d 96 a1 e6 f1 72 e1 55 96 b4 51
694 0a 6d ae c2 61 05 f2 be bc 53 31 6b 87 bd f2 13
695 11 66 60 70 e8 df ee 69 d5 2c 71 a9 76 ca ae 79
696 c7 2b 68 d2 85 80 dc 68 6d 9f 51 29 d2 25 f8 2b
697 3d 61 55 13 a8 82 b3 db 91 41 6b 48 ce 08 88 82
698 13 e3 7e eb 9a f8 00 d8 1c ab 32 8c e4 20 68 99
699 03 c0 0c 7b 5f d3 1b 75 50 3a 6d 41 96 84 d6 29
700
701 # Prime 1:
702 f8 eb 97 e9 8d f1 26 64 ee fd b7 61 59 6a 69 dd
703 cd 0e 76 da ec e6 ed 4b f5 a1 b5 0a c0 86 f7 92
704 8a 4d 2f 87 26 a7 7e 51 5b 74 da 41 98 8f 22 0b
705 1c c8 7a a1 fc 81 0c e9 9a 82 f2 d1 ce 82 1e dc
706 ed 79 4c 69 41 f4 2c 7a 1a 0b 8c 4d 28 c7 5e c6
707 0b 65 22 79 f6 15 4a 76 2a ed 16 5d 47 de e3 67
708
709 # Prime 2:
710 ed 4d 71 d0 a6 e2 4b 93 c2 e5 f6 b4 bb e0 5f 5f
711 b0 af a0 42 d2 04 fe 33 78 d3 65 c2 f2 88 b6 a8
712 da d7 ef e4 5d 15 3e ef 40 ca cc 7b 81 ff 93 40
713 02 d1 08 99 4b 94 a5 e4 72 8c d9 c9 63 37 5a e4
714 99 65 bd a5 5c bf 0e fe d8 d6 55 3b 40 27 f2 d8
715 62 08 a6 e6 b4 89 c1 76 12 80 92 d6 29 e4 9d 3d
716
717 # Prime exponent 1:
718 2b b6 8b dd fb 0c 4f 56 c8 55 8b ff af 89 2d 80
719 43 03 78 41 e7 fa 81 cf a6 1a 38 c5 e3 9b 90 1c
720 8e e7 11 22 a5 da 22 27 bd 6c de eb 48 14 52 c1
721 2a d3 d6 1d 5e 4f 77 6a 0a b5 56 59 1b ef e3 e5
722 9e 5a 7f dd b8 34 5e 1f 2f 35 b9 f4 ce e5 7c 32
723 41 4c 08 6a ec 99 3e 93 53 e4 80 d9 ee c6 28 9f
724
725 # Prime exponent 2:
726 4f f8 97 70 9f ad 07 97 46 49 45 78 e7 0f d8 54
727 61 30 ee ab 56 27 c4 9b 08 0f 05 ee 4a d9 f3 e4
728 b7 cb a9 d6 a5 df f1 13 a4 1c 34 09 33 68 33 f1
729 90 81 6d 8a 6b c4 2e 9b ec 56 b7 56 7d 0f 3c 9c
730 69 6d b6 19 b2 45 d9 01 dd 85 6d b7 c8 09 2e 77
731 e9 a1 cc cd 56 ee 4d ba 42 c5 fd b6 1a ec 26 69
732
733 # Coefficient:
734 77 b9 d1 13 7b 50 40 4a 98 27 29 31 6e fa fc 7d
735 fe 66 d3 4e 5a 18 26 00 d5 f3 0a 0a 85 12 05 1c
736 56 0d 08 1d 4d 0a 18 35 ec 3d 25 a6 0f 4e 4d 6a
737 a9 48 b2 bf 3d bb 5b 12 4c bb c3 48 92 55 a3 a9
738 48 37 2f 69 78 49 67 45 f9 43 e1 db 4f 18 38 2c
739 ea a5 05 df c6 57 57 bb 3f 85 7a 58 dc e5 21 56
740
Paul Kehrerefca2802014-02-17 20:55:13 -0600741 # PKCS#1 v1.5 Signature Example 2.17
Alex Stapleton58f27ac2014-02-02 19:30:03 +0000742
Paul Kehrerefca2802014-02-17 20:55:13 -0600743 # -----------------
744
745 # Message to be signed:
746 06 ad d7 5a b6 89 de 06 77 44 e6 9a 2e bd 4b 90
747 fa 93 83 00 3c d0 5f f5 36 cb f2 94 cd 21 5f 09
748 23 b7 fc 90 04 f0 aa 18 52 71 a1 d0 06 1f d0 e9
749 77 7a d1 ec 0c 71 59 1f 57 8b f7 b8 e5 a1
750
751 # Signature:
752 45 14 21 0e 54 1d 5b ad 7d d6 0a e5 49 b9 43 ac
753 c4 4f 21 39 0d f5 b6 13 18 45 5a 17 61 0d f5 b7
754 4d 84 ae d2 32 f1 7e 59 d9 1d d2 65 99 22 f8 12
755 db d4 96 81 69 03 84 b9 54 e9 ad fb 9b 1a 96 8c
756 0c bf f7 63 ec ee d6 27 50 c5 91 64 b5 e0 80 a8
757 fe f3 d5 5b fe 2a cf ad 27 52 a6 a8 45 9f a1 fa
758 b4 9a d3 78 c6 96 4b 23 ee 97 fd 10 34 61 0c 5c
759 c1 4c 61 e0 eb fb 17 11 f8 ad e9 6f e6 55 7b 38
760
761 # <snip>
Alex Stapleton58f27ac2014-02-02 19:30:03 +0000762
763 # =============================================
764
Paul Kehrerefca2802014-02-17 20:55:13 -0600765 # <snip>
Alex Stapleton58f27ac2014-02-02 19:30:03 +0000766 """).splitlines()
767
768 vectors = tuple(load_pkcs1_vectors(vector_data))
769 expected = (
770 (
771 {
772 'modulus': int(
773 '495370a1fb18543c16d3631e3163255df62be6eee890d5f25509e4f77'
774 '8a8ea6fbbbcdf85dff64e0d972003ab3681fbba6dd41fd541829b2e58'
775 '2de9f2a4a4e0a2d0900bef4753db3cee0ee06c7dfae8b1d53b5953218'
776 'f9cceea695b08668edeaadced9463b1d790d5ebf27e9115b46cad4d9a'
777 '2b8efab0561b0810344739ada0733f', 16),
778 'public_exponent': int('10001', 16),
779 'private_exponent': int(
780 '6c66ffe98980c38fcdeab5159898836165f4b4b817c4f6a8d486ee4ea'
781 '9130fe9b9092bd136d184f95f504a607eac565846d2fdd6597a8967c7'
782 '396ef95a6eeebb4578a643966dca4d8ee3de842de63279c618159c1ab'
783 '54a89437b6a6120e4930afb52a4ba6ced8a4947ac64b30a3497cbe701'
784 'c2d6266d517219ad0ec6d347dbe9', 16),
785 'p': int(
786 '8dad7f11363faa623d5d6d5e8a319328d82190d7127d2846c439b0ab7'
787 '2619b0a43a95320e4ec34fc3a9cea876422305bd76c5ba7be9e2f410c'
788 '8060645a1d29edb', 16),
789 'q': int(
790 '847e732376fc7900f898ea82eb2b0fc418565fdae62f7d9ec4ce2217b'
791 '97990dd272db157f99f63c0dcbb9fbacdbd4c4dadb6df67756358ca41'
Paul Kehrer09328bb2014-02-12 23:57:27 -0600792 '74825b48f49706d', 16),
793 'dmp1': int(
794 '05c2a83c124b3621a2aa57ea2c3efe035eff4560f33ddebb7adab81fc'
795 'e69a0c8c2edc16520dda83d59a23be867963ac65f2cc710bbcfb96ee1'
796 '03deb771d105fd85', 16),
797 'dmq1': int(
798 '04cae8aa0d9faa165c87b682ec140b8ed3b50b24594b7a3b2c220b366'
799 '9bb819f984f55310a1ae7823651d4a02e99447972595139363434e5e3'
800 '0a7e7d241551e1b9', 16),
801 'iqmp': int(
802 '07d3e47bf686600b11ac283ce88dbb3f6051e8efd04680e44c171ef53'
803 '1b80b2b7c39fc766320e2cf15d8d99820e96ff30dc69691839c4b40d7'
Paul Kehrerefca2802014-02-17 20:55:13 -0600804 'b06e45307dc91f3f', 16),
805 'examples': [
806 {
Paul Kehrer7d9c3062014-02-18 08:27:39 -0600807 'message': '81332f4be62948415ea1d899792eeacf6c6e1db1da'
808 '8be13b5cea41db2fed467092e1ff398914c7142597'
809 '75f595f8547f735692a575e6923af78f22c6997ddb'
810 '90fb6f72d7bb0dd5744a31decd3dc3685849836ed3'
811 '4aec596304ad11843c4f88489f209735f5fb7fdaf7'
812 'cec8addc5818168f880acbf490d51005b7a8e84e43'
813 'e54287977571dd99eea4b161eb2df1f5108f12a414'
814 '2a83322edb05a75487a3435c9a78ce53ed93bc5508'
815 '57d7a9fb',
Paul Kehrerefca2802014-02-17 20:55:13 -0600816 'salt': '1d65491d79c864b373009be6f6f2467bac4c78fa',
817 'signature': '0262ac254bfa77f3c1aca22c5179f8f040422b3c'
818 '5bafd40a8f21cf0fa5a667ccd5993d42dbafb409'
819 'c520e25fce2b1ee1e716577f1efa17f3da28052f'
820 '40f0419b23106d7845aaf01125b698e7a4dfe92d'
821 '3967bb00c4d0d35ba3552ab9a8b3eef07c7fecdb'
822 'c5424ac4db1e20cb37d0b2744769940ea907e17f'
823 'bbca673b20522380c5'
824 }, {
Paul Kehrer7d9c3062014-02-18 08:27:39 -0600825 'message': 'e2f96eaf0e05e7ba326ecca0ba7fd2f7c02356f3ce'
826 'de9d0faabf4fcc8e60a973e5595fd9ea08',
Paul Kehrerefca2802014-02-17 20:55:13 -0600827 'salt': '435c098aa9909eb2377f1248b091b68987ff1838',
828 'signature': '2707b9ad5115c58c94e932e8ec0a280f56339e44'
829 'a1b58d4ddcff2f312e5f34dcfe39e89c6a94dcee'
830 '86dbbdae5b79ba4e0819a9e7bfd9d982e7ee6c86'
831 'ee68396e8b3a14c9c8f34b178eb741f9d3f12110'
832 '9bf5c8172fada2e768f9ea1433032c004a8aa07e'
833 'b990000a48dc94c8bac8aabe2b09b1aa46c0a2aa'
834 '0e12f63fbba775ba7e'
835 }
836 ]
Alex Stapleton58f27ac2014-02-02 19:30:03 +0000837 },
838
839 {
840 'modulus': int(
841 '495370a1fb18543c16d3631e3163255df62be6eee890d5f25509e4f77'
842 '8a8ea6fbbbcdf85dff64e0d972003ab3681fbba6dd41fd541829b2e58'
843 '2de9f2a4a4e0a2d0900bef4753db3cee0ee06c7dfae8b1d53b5953218'
844 'f9cceea695b08668edeaadced9463b1d790d5ebf27e9115b46cad4d9a'
845 '2b8efab0561b0810344739ada0733f', 16),
846 'public_exponent': int('10001', 16)
847 }
848 ),
849 (
850 {
851 'modulus': int(
852 'e6bd692ac96645790403fdd0f5beb8b9bf92ed10007fc365046419dd0'
853 '6c05c5b5b2f48ecf989e4ce269109979cbb40b4a0ad24d22483d1ee31'
854 '5ad4ccb1534268352691c524f6dd8e6c29d224cf246973aec86c5bf6b'
855 '1401a850d1b9ad1bb8cbcec47b06f0f8c7f45d3fc8f319299c5433ddb'
856 'c2b3053b47ded2ecd4a4caefd614833dc8bb622f317ed076b8057fe8d'
857 'e3f84480ad5e83e4a61904a4f248fb397027357e1d30e463139815c6f'
858 'd4fd5ac5b8172a45230ecb6318a04f1455d84e5a8b', 16),
859 'public_exponent': int('10001', 16),
860 'private_exponent': int(
861 '6a7fd84fb85fad073b34406db74f8d61a6abc12196a961dd79565e9da'
862 '6e5187bce2d980250f7359575359270d91590bb0e427c71460b55d514'
863 '10b191bcf309fea131a92c8e702738fa719f1e0041f52e40e91f229f4'
864 'd96a1e6f172e15596b4510a6daec26105f2bebc53316b87bdf2131166'
865 '6070e8dfee69d52c71a976caae79c72b68d28580dc686d9f5129d225f'
866 '82b3d615513a882b3db91416b48ce08888213e37eeb9af800d81cab32'
867 '8ce420689903c00c7b5fd31b75503a6d419684d629', 16),
868 'p': int(
869 'f8eb97e98df12664eefdb761596a69ddcd0e76daece6ed4bf5a1b50ac'
870 '086f7928a4d2f8726a77e515b74da41988f220b1cc87aa1fc810ce99a'
871 '82f2d1ce821edced794c6941f42c7a1a0b8c4d28c75ec60b652279f61'
872 '54a762aed165d47dee367', 16),
873 'q': int(
874 'ed4d71d0a6e24b93c2e5f6b4bbe05f5fb0afa042d204fe3378d365c2f'
875 '288b6a8dad7efe45d153eef40cacc7b81ff934002d108994b94a5e472'
876 '8cd9c963375ae49965bda55cbf0efed8d6553b4027f2d86208a6e6b48'
Paul Kehrer09328bb2014-02-12 23:57:27 -0600877 '9c176128092d629e49d3d', 16),
878 'dmp1': int(
879 '2bb68bddfb0c4f56c8558bffaf892d8043037841e7fa81cfa61a38c5e'
880 '39b901c8ee71122a5da2227bd6cdeeb481452c12ad3d61d5e4f776a0a'
881 'b556591befe3e59e5a7fddb8345e1f2f35b9f4cee57c32414c086aec9'
882 '93e9353e480d9eec6289f', 16),
883 'dmq1': int(
884 '4ff897709fad079746494578e70fd8546130eeab5627c49b080f05ee4'
885 'ad9f3e4b7cba9d6a5dff113a41c3409336833f190816d8a6bc42e9bec'
886 '56b7567d0f3c9c696db619b245d901dd856db7c8092e77e9a1cccd56e'
887 'e4dba42c5fdb61aec2669', 16),
888 'iqmp': int(
889 '77b9d1137b50404a982729316efafc7dfe66d34e5a182600d5f30a0a8'
890 '512051c560d081d4d0a1835ec3d25a60f4e4d6aa948b2bf3dbb5b124c'
891 'bbc3489255a3a948372f6978496745f943e1db4f18382ceaa505dfc65'
Paul Kehrerefca2802014-02-17 20:55:13 -0600892 '757bb3f857a58dce52156', 16),
893 'examples': [
894 {
Paul Kehrer7d9c3062014-02-18 08:27:39 -0600895 'message': '06add75ab689de067744e69a2ebd4b90fa9383003c'
896 'd05ff536cbf294cd215f0923b7fc9004f0aa185271'
897 'a1d0061fd0e9777ad1ec0c71591f578bf7b8e5a1',
Paul Kehrerefca2802014-02-17 20:55:13 -0600898 'signature': '4514210e541d5bad7dd60ae549b943acc44f2139'
899 '0df5b61318455a17610df5b74d84aed232f17e59'
900 'd91dd2659922f812dbd49681690384b954e9adfb'
901 '9b1a968c0cbff763eceed62750c59164b5e080a8'
902 'fef3d55bfe2acfad2752a6a8459fa1fab49ad378'
903 'c6964b23ee97fd1034610c5cc14c61e0ebfb1711'
904 'f8ade96fe6557b38'
905 }
906 ]
Alex Stapleton58f27ac2014-02-02 19:30:03 +0000907 },
908
909 {
910 'modulus': int(
911 'e6bd692ac96645790403fdd0f5beb8b9bf92ed10007fc365046419dd0'
912 '6c05c5b5b2f48ecf989e4ce269109979cbb40b4a0ad24d22483d1ee31'
913 '5ad4ccb1534268352691c524f6dd8e6c29d224cf246973aec86c5bf6b'
914 '1401a850d1b9ad1bb8cbcec47b06f0f8c7f45d3fc8f319299c5433ddb'
915 'c2b3053b47ded2ecd4a4caefd614833dc8bb622f317ed076b8057fe8d'
916 'e3f84480ad5e83e4a61904a4f248fb397027357e1d30e463139815c6f'
917 'd4fd5ac5b8172a45230ecb6318a04f1455d84e5a8b', 16),
918 'public_exponent': int('10001', 16)
919 }
920 )
921 )
922 assert vectors == expected
Ayrx4300f6c2014-02-09 15:15:13 +0800923
924
925def test_load_hotp_vectors():
926 vector_data = textwrap.dedent("""
927 # HOTP Test Vectors
928 # RFC 4226 Appendix D
929
930 COUNT = 0
931 COUNTER = 0
932 INTERMEDIATE = cc93cf18508d94934c64b65d8ba7667fb7cde4b0
933 TRUNCATED = 4c93cf18
934 HOTP = 755224
Ayrxefc68382014-02-10 00:01:05 +0800935 SECRET = 12345678901234567890
Ayrx4300f6c2014-02-09 15:15:13 +0800936
937 COUNT = 1
938 COUNTER = 1
939 INTERMEDIATE = 75a48a19d4cbe100644e8ac1397eea747a2d33ab
940 TRUNCATED = 41397eea
941 HOTP = 287082
Ayrxefc68382014-02-10 00:01:05 +0800942 SECRET = 12345678901234567890
943
Ayrx4300f6c2014-02-09 15:15:13 +0800944
945 COUNT = 2
946 COUNTER = 2
947 INTERMEDIATE = 0bacb7fa082fef30782211938bc1c5e70416ff44
948 TRUNCATED = 82fef30
949 HOTP = 359152
Ayrxefc68382014-02-10 00:01:05 +0800950 SECRET = 12345678901234567890
951
Ayrx4300f6c2014-02-09 15:15:13 +0800952
953 COUNT = 3
954 COUNTER = 3
955 INTERMEDIATE = 66c28227d03a2d5529262ff016a1e6ef76557ece
956 TRUNCATED = 66ef7655
957 HOTP = 969429
Ayrxefc68382014-02-10 00:01:05 +0800958 SECRET = 12345678901234567890
Ayrx4300f6c2014-02-09 15:15:13 +0800959 """).splitlines()
960
961 assert load_nist_vectors(vector_data) == [
962 {
963 "counter": b"0",
964 "intermediate": b"cc93cf18508d94934c64b65d8ba7667fb7cde4b0",
965 "truncated": b"4c93cf18",
966 "hotp": b"755224",
Ayrxefc68382014-02-10 00:01:05 +0800967 "secret": b"12345678901234567890",
Ayrx4300f6c2014-02-09 15:15:13 +0800968 },
969 {
970 "counter": b"1",
971 "intermediate": b"75a48a19d4cbe100644e8ac1397eea747a2d33ab",
972 "truncated": b"41397eea",
973 "hotp": b"287082",
Ayrxefc68382014-02-10 00:01:05 +0800974 "secret": b"12345678901234567890",
Ayrx4300f6c2014-02-09 15:15:13 +0800975 },
976 {
977 "counter": b"2",
978 "intermediate": b"0bacb7fa082fef30782211938bc1c5e70416ff44",
979 "truncated": b"82fef30",
980 "hotp": b"359152",
Ayrxefc68382014-02-10 00:01:05 +0800981 "secret": b"12345678901234567890",
Ayrx4300f6c2014-02-09 15:15:13 +0800982 },
983 {
984 "counter": b"3",
985 "intermediate": b"66c28227d03a2d5529262ff016a1e6ef76557ece",
986 "truncated": b"66ef7655",
987 "hotp": b"969429",
Ayrxefc68382014-02-10 00:01:05 +0800988 "secret": b"12345678901234567890",
Ayrx4300f6c2014-02-09 15:15:13 +0800989 },
990 ]
991
992
993def test_load_totp_vectors():
994 vector_data = textwrap.dedent("""
995 # TOTP Test Vectors
996 # RFC 6238 Appendix B
997
998 COUNT = 0
999 TIME = 59
1000 TOTP = 94287082
1001 MODE = SHA1
Ayrxefc68382014-02-10 00:01:05 +08001002 SECRET = 12345678901234567890
Ayrx4300f6c2014-02-09 15:15:13 +08001003
1004 COUNT = 1
1005 TIME = 59
1006 TOTP = 46119246
1007 MODE = SHA256
Ayrxefc68382014-02-10 00:01:05 +08001008 SECRET = 12345678901234567890
Ayrx4300f6c2014-02-09 15:15:13 +08001009
1010 COUNT = 2
1011 TIME = 59
1012 TOTP = 90693936
1013 MODE = SHA512
Ayrxefc68382014-02-10 00:01:05 +08001014 SECRET = 12345678901234567890
Ayrx4300f6c2014-02-09 15:15:13 +08001015 """).splitlines()
1016
1017 assert load_nist_vectors(vector_data) == [
1018 {
1019 "time": b"59",
1020 "totp": b"94287082",
1021 "mode": b"SHA1",
Ayrxefc68382014-02-10 00:01:05 +08001022 "secret": b"12345678901234567890",
Ayrx4300f6c2014-02-09 15:15:13 +08001023 },
1024 {
1025 "time": b"59",
1026 "totp": b"46119246",
1027 "mode": b"SHA256",
Ayrxefc68382014-02-10 00:01:05 +08001028 "secret": b"12345678901234567890",
Ayrx4300f6c2014-02-09 15:15:13 +08001029 },
1030 {
1031 "time": b"59",
1032 "totp": b"90693936",
1033 "mode": b"SHA512",
Ayrxefc68382014-02-10 00:01:05 +08001034 "secret": b"12345678901234567890",
Ayrx4300f6c2014-02-09 15:15:13 +08001035 },
1036 ]