blob: 90c15b1361831892dfc77db00e8ca52fabcf0f35 [file] [log] [blame]
Alex Gaynorbd458ae2013-10-16 11:59:30 -07001import binascii
2import os
3
4import pytest
5
Donald Stufftce0d7812013-10-27 16:52:33 -04006from cryptography.hazmat.bindings import _ALL_BACKENDS
David Reid69aeb492013-10-30 11:35:37 -07007from cryptography.hazmat.primitives import hashes
Paul Kehrer0317b042013-10-28 17:34:27 -05008from cryptography.hazmat.primitives import hmac
Paul Kehrer21dde562013-11-06 12:22:09 +08009from cryptography.hazmat.primitives.ciphers import Cipher
Alex Gaynorbd458ae2013-10-16 11:59:30 -070010
11
Alex Gaynor016eed12013-10-16 14:16:04 -070012def generate_encrypt_test(param_loader, path, file_names, cipher_factory,
Paul Kehrerdb37d0e2013-10-22 20:13:06 -050013 mode_factory, only_if=lambda backend: True,
Alex Gaynor512dd692013-10-16 14:27:52 -070014 skip_message=None):
Alex Gaynorbd458ae2013-10-16 11:59:30 -070015 def test_encryption(self):
Paul Kehrerdb37d0e2013-10-22 20:13:06 -050016 for backend in _ALL_BACKENDS:
Alex Gaynor512dd692013-10-16 14:27:52 -070017 for file_name in file_names:
18 for params in param_loader(os.path.join(path, file_name)):
19 yield (
20 encrypt_test,
Paul Kehrerdb37d0e2013-10-22 20:13:06 -050021 backend,
Alex Gaynor512dd692013-10-16 14:27:52 -070022 cipher_factory,
23 mode_factory,
24 params,
25 only_if,
26 skip_message
27 )
Alex Gaynorbd458ae2013-10-16 11:59:30 -070028 return test_encryption
29
30
Paul Kehrerdb37d0e2013-10-22 20:13:06 -050031def encrypt_test(backend, cipher_factory, mode_factory, params, only_if,
Alex Gaynor512dd692013-10-16 14:27:52 -070032 skip_message):
Paul Kehrerdb37d0e2013-10-22 20:13:06 -050033 if not only_if(backend):
Alex Gaynor512dd692013-10-16 14:27:52 -070034 pytest.skip(skip_message)
Alex Gaynorbd458ae2013-10-16 11:59:30 -070035 plaintext = params.pop("plaintext")
36 ciphertext = params.pop("ciphertext")
Paul Kehrer21dde562013-11-06 12:22:09 +080037 cipher = Cipher(
Alex Gaynorbd458ae2013-10-16 11:59:30 -070038 cipher_factory(**params),
39 mode_factory(**params),
Paul Kehrerdb37d0e2013-10-22 20:13:06 -050040 backend
Alex Gaynorbd458ae2013-10-16 11:59:30 -070041 )
Paul Kehrer620c2ae2013-10-19 14:12:04 -050042 encryptor = cipher.encryptor()
43 actual_ciphertext = encryptor.update(binascii.unhexlify(plaintext))
44 actual_ciphertext += encryptor.finalize()
Alex Gaynorfb39b3f2013-10-16 14:30:59 -070045 assert actual_ciphertext == binascii.unhexlify(ciphertext)
Paul Kehrer620c2ae2013-10-19 14:12:04 -050046 decryptor = cipher.decryptor()
47 actual_plaintext = decryptor.update(binascii.unhexlify(ciphertext))
48 actual_plaintext += decryptor.finalize()
49 assert actual_plaintext == binascii.unhexlify(plaintext)
Paul Kehrerbde6fb52013-10-18 18:08:49 -050050
51
Paul Kehrer4da28c32013-11-07 07:50:17 +080052def generate_stream_encryption_test(param_loader, path, file_names,
53 cipher_factory, only_if=None,
54 skip_message=None):
55 def test_stream_encryption(self):
56 for backend in _ALL_BACKENDS:
57 for file_name in file_names:
58 for params in param_loader(os.path.join(path, file_name)):
59 yield (
60 stream_encryption_test,
61 backend,
62 cipher_factory,
63 params,
64 only_if,
65 skip_message
66 )
67 return test_stream_encryption
68
69
70def stream_encryption_test(backend, cipher_factory, params, only_if,
71 skip_message):
72 if not only_if(backend):
73 pytest.skip(skip_message)
74 plaintext = params.pop("plaintext")
75 ciphertext = params.pop("ciphertext")
76 offset = params.pop("offset")
77 cipher = Cipher(cipher_factory(**params), None, backend)
78 encryptor = cipher.encryptor()
79 # throw away offset bytes
80 encryptor.update(b"\x00" * int(offset))
81 actual_ciphertext = encryptor.update(binascii.unhexlify(plaintext))
82 actual_ciphertext += encryptor.finalize()
83 assert actual_ciphertext == binascii.unhexlify(ciphertext)
84 decryptor = cipher.decryptor()
85 decryptor.update(b"\x00" * int(offset))
86 actual_plaintext = decryptor.update(binascii.unhexlify(ciphertext))
87 actual_plaintext += decryptor.finalize()
88 assert actual_plaintext == binascii.unhexlify(plaintext)
89
90
Paul Kehrerbb069c22013-10-18 19:51:01 -050091def generate_hash_test(param_loader, path, file_names, hash_cls,
Donald Stufft2acd77a2013-10-19 19:49:30 -040092 only_if=None, skip_message=None):
Paul Kehrerbde6fb52013-10-18 18:08:49 -050093 def test_hash(self):
Paul Kehrerdb37d0e2013-10-22 20:13:06 -050094 for backend in _ALL_BACKENDS:
Paul Kehrerbde6fb52013-10-18 18:08:49 -050095 for file_name in file_names:
96 for params in param_loader(os.path.join(path, file_name)):
97 yield (
98 hash_test,
Paul Kehrerdb37d0e2013-10-22 20:13:06 -050099 backend,
Paul Kehrerbb069c22013-10-18 19:51:01 -0500100 hash_cls,
Paul Kehrerbde6fb52013-10-18 18:08:49 -0500101 params,
102 only_if,
103 skip_message
104 )
105 return test_hash
106
107
David Reidbb0d3f02013-10-31 15:22:49 -0700108def hash_test(backend, algorithm, params, only_if, skip_message):
Paul Kehrerdb37d0e2013-10-22 20:13:06 -0500109 if only_if is not None and not only_if(backend):
Paul Kehrerbde6fb52013-10-18 18:08:49 -0500110 pytest.skip(skip_message)
111 msg = params[0]
112 md = params[1]
David Reidbb0d3f02013-10-31 15:22:49 -0700113 m = hashes.Hash(algorithm, backend=backend)
Paul Kehrerbde6fb52013-10-18 18:08:49 -0500114 m.update(binascii.unhexlify(msg))
David Reidc3d029f2013-10-31 14:06:14 -0700115 expected_md = md.replace(" ", "").lower().encode("ascii")
116 assert m.finalize() == binascii.unhexlify(expected_md)
Paul Kehrerbde6fb52013-10-18 18:08:49 -0500117
118
David Reid69aeb492013-10-30 11:35:37 -0700119def generate_base_hash_test(algorithm, digest_size, block_size,
Donald Stufft2acd77a2013-10-19 19:49:30 -0400120 only_if=None, skip_message=None):
Paul Kehrerbde6fb52013-10-18 18:08:49 -0500121 def test_base_hash(self):
Paul Kehrerdb37d0e2013-10-22 20:13:06 -0500122 for backend in _ALL_BACKENDS:
Paul Kehrerbde6fb52013-10-18 18:08:49 -0500123 yield (
124 base_hash_test,
Paul Kehrerdb37d0e2013-10-22 20:13:06 -0500125 backend,
David Reid69aeb492013-10-30 11:35:37 -0700126 algorithm,
Paul Kehrerbde6fb52013-10-18 18:08:49 -0500127 digest_size,
128 block_size,
129 only_if,
130 skip_message,
131 )
132 return test_base_hash
133
134
David Reid69aeb492013-10-30 11:35:37 -0700135def base_hash_test(backend, algorithm, digest_size, block_size, only_if,
Paul Kehrerbde6fb52013-10-18 18:08:49 -0500136 skip_message):
Paul Kehrerdb37d0e2013-10-22 20:13:06 -0500137 if only_if is not None and not only_if(backend):
Paul Kehrerbde6fb52013-10-18 18:08:49 -0500138 pytest.skip(skip_message)
David Reid69aeb492013-10-30 11:35:37 -0700139
140 m = hashes.Hash(algorithm, backend=backend)
141 assert m.algorithm.digest_size == digest_size
142 assert m.algorithm.block_size == block_size
Paul Kehrerbde6fb52013-10-18 18:08:49 -0500143 m_copy = m.copy()
144 assert m != m_copy
145 assert m._ctx != m_copy._ctx
Paul Kehrerc1794072013-10-18 21:42:57 -0500146
147
Donald Stufft2acd77a2013-10-19 19:49:30 -0400148def generate_long_string_hash_test(hash_factory, md, only_if=None,
Paul Kehrerc1794072013-10-18 21:42:57 -0500149 skip_message=None):
150 def test_long_string_hash(self):
Paul Kehrerdb37d0e2013-10-22 20:13:06 -0500151 for backend in _ALL_BACKENDS:
Paul Kehrerc1794072013-10-18 21:42:57 -0500152 yield(
153 long_string_hash_test,
Paul Kehrerdb37d0e2013-10-22 20:13:06 -0500154 backend,
Paul Kehrerc1794072013-10-18 21:42:57 -0500155 hash_factory,
156 md,
157 only_if,
158 skip_message
159 )
160 return test_long_string_hash
161
162
David Reid69aeb492013-10-30 11:35:37 -0700163def long_string_hash_test(backend, algorithm, md, only_if, skip_message):
Paul Kehrerdb37d0e2013-10-22 20:13:06 -0500164 if only_if is not None and not only_if(backend):
Paul Kehrerc1794072013-10-18 21:42:57 -0500165 pytest.skip(skip_message)
David Reid69aeb492013-10-30 11:35:37 -0700166 m = hashes.Hash(algorithm, backend=backend)
Paul Kehrerc1794072013-10-18 21:42:57 -0500167 m.update(b"a" * 1000000)
David Reidc3d029f2013-10-31 14:06:14 -0700168 assert m.finalize() == binascii.unhexlify(md.lower().encode("ascii"))
Paul Kehrer0317b042013-10-28 17:34:27 -0500169
170
David Reide3960f62013-11-01 14:52:16 -0700171def generate_hmac_test(param_loader, path, file_names, algorithm,
Paul Kehrer0317b042013-10-28 17:34:27 -0500172 only_if=None, skip_message=None):
173 def test_hmac(self):
174 for backend in _ALL_BACKENDS:
175 for file_name in file_names:
176 for params in param_loader(os.path.join(path, file_name)):
177 yield (
178 hmac_test,
179 backend,
David Reide3960f62013-11-01 14:52:16 -0700180 algorithm,
Paul Kehrer0317b042013-10-28 17:34:27 -0500181 params,
182 only_if,
183 skip_message
184 )
185 return test_hmac
186
187
David Reide3960f62013-11-01 14:52:16 -0700188def hmac_test(backend, algorithm, params, only_if, skip_message):
Paul Kehrer0317b042013-10-28 17:34:27 -0500189 if only_if is not None and not only_if(backend):
190 pytest.skip(skip_message)
191 msg = params[0]
192 md = params[1]
193 key = params[2]
David Reide3960f62013-11-01 14:52:16 -0700194 h = hmac.HMAC(binascii.unhexlify(key), algorithm)
Paul Kehrer0317b042013-10-28 17:34:27 -0500195 h.update(binascii.unhexlify(msg))
David Reid753ae192013-11-01 16:28:41 -0700196 assert h.finalize() == binascii.unhexlify(md.encode("ascii"))
Paul Kehrer0317b042013-10-28 17:34:27 -0500197
198
199def generate_base_hmac_test(hash_cls, only_if=None, skip_message=None):
200 def test_base_hmac(self):
201 for backend in _ALL_BACKENDS:
202 yield (
203 base_hmac_test,
204 backend,
205 hash_cls,
206 only_if,
207 skip_message,
208 )
209 return test_base_hmac
210
211
David Reide3960f62013-11-01 14:52:16 -0700212def base_hmac_test(backend, algorithm, only_if, skip_message):
Paul Kehrer0317b042013-10-28 17:34:27 -0500213 if only_if is not None and not only_if(backend):
214 pytest.skip(skip_message)
215 key = b"ab"
David Reide3960f62013-11-01 14:52:16 -0700216 h = hmac.HMAC(binascii.unhexlify(key), algorithm)
Paul Kehrer0317b042013-10-28 17:34:27 -0500217 h_copy = h.copy()
218 assert h != h_copy
219 assert h._ctx != h_copy._ctx