blob: eb0091b6fb20289d30b75c14dfb641380c9d71c9 [file] [log] [blame]
Alex Gaynora2e1f542013-08-10 08:59:11 -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
Donald Stufftec672e82013-08-09 01:20:03 -040014"""
15Test using the NIST Test Vectors
16"""
Hynek Schlawack425f5842013-08-11 09:54:59 +020017
18from __future__ import absolute_import, division, print_function
19
Donald Stufftec672e82013-08-09 01:20:03 -040020import binascii
Alex Gaynoraef7ee82013-08-08 22:31:11 -070021import os
Donald Stufftec672e82013-08-09 01:20:03 -040022
Alex Gaynor1fe70b12013-10-16 11:59:17 -070023from cryptography.primitives.block import ciphers, modes
Donald Stufftec672e82013-08-09 01:20:03 -040024
Alex Gaynor1fe70b12013-10-16 11:59:17 -070025from .utils import generate_encrypt_test
Donald Stufftec672e82013-08-09 01:20:03 -040026from ..utils import load_nist_vectors_from_file
27
28
Alex Gaynoref2f91e2013-10-16 17:15:04 -070029def load_3des_nist_vectors_from_file(path, op):
Alex Gaynor5e04ba62013-10-21 16:16:29 -070030 vectors = []
31 for vector in load_nist_vectors_from_file(path, op):
32 for i in xrange(1, 4):
33 plaintext = vector.get("plaintext{0}".format(i))
34 if plaintext is None:
35 plaintext = vector["plaintext"]
36 vectors.append({
37 "key": vector["keys"],
38 "iv": vector["iv{0}".format(i)],
39 "ciphertext": vector["ciphertext{0}".format(i)],
40 "plaintext": plaintext,
41 })
Alex Gaynoref2f91e2013-10-16 17:15:04 -070042 return vectors
43
44
Alex Gaynoraef7ee82013-08-08 22:31:11 -070045class TestAES_CBC(object):
Alex Gaynor1fe70b12013-10-16 11:59:17 -070046 test_KAT = generate_encrypt_test(
47 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynor016eed12013-10-16 14:16:04 -070048 os.path.join("AES", "KAT"),
Alex Gaynor920e3302013-09-10 16:55:52 -070049 [
50 "CBCGFSbox128.rsp",
51 "CBCGFSbox192.rsp",
52 "CBCGFSbox256.rsp",
53 "CBCKeySbox128.rsp",
54 "CBCKeySbox192.rsp",
55 "CBCKeySbox256.rsp",
56 "CBCVarKey128.rsp",
57 "CBCVarKey192.rsp",
58 "CBCVarKey256.rsp",
59 "CBCVarTxt128.rsp",
60 "CBCVarTxt192.rsp",
61 "CBCVarTxt256.rsp",
Alex Gaynor1fe70b12013-10-16 11:59:17 -070062 ],
63 lambda key, iv: ciphers.AES(binascii.unhexlify(key)),
64 lambda key, iv: modes.CBC(binascii.unhexlify(iv)),
Alex Gaynor920e3302013-09-10 16:55:52 -070065 )
Donald Stufftec672e82013-08-09 01:20:03 -040066
Alex Gaynor1fe70b12013-10-16 11:59:17 -070067 test_MMT = generate_encrypt_test(
68 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynor016eed12013-10-16 14:16:04 -070069 os.path.join("AES", "MMT"),
Alex Gaynor920e3302013-09-10 16:55:52 -070070 [
71 "CBCMMT128.rsp",
72 "CBCMMT192.rsp",
73 "CBCMMT256.rsp",
Alex Gaynor1fe70b12013-10-16 11:59:17 -070074 ],
75 lambda key, iv: ciphers.AES(binascii.unhexlify(key)),
76 lambda key, iv: modes.CBC(binascii.unhexlify(iv)),
Alex Gaynor920e3302013-09-10 16:55:52 -070077 )
Paul Kehrer13f108f2013-09-09 21:41:03 -050078
79
80class TestAES_ECB(object):
Alex Gaynor1fe70b12013-10-16 11:59:17 -070081 test_KAT = generate_encrypt_test(
82 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynor016eed12013-10-16 14:16:04 -070083 os.path.join("AES", "KAT"),
Paul Kehrer13f108f2013-09-09 21:41:03 -050084 [
85 "ECBGFSbox128.rsp",
86 "ECBGFSbox192.rsp",
87 "ECBGFSbox256.rsp",
88 "ECBKeySbox128.rsp",
89 "ECBKeySbox192.rsp",
90 "ECBKeySbox256.rsp",
91 "ECBVarKey128.rsp",
92 "ECBVarKey192.rsp",
93 "ECBVarKey256.rsp",
94 "ECBVarTxt128.rsp",
95 "ECBVarTxt192.rsp",
96 "ECBVarTxt256.rsp",
Alex Gaynor1fe70b12013-10-16 11:59:17 -070097 ],
98 lambda key: ciphers.AES(binascii.unhexlify(key)),
99 lambda key: modes.ECB(),
Paul Kehrer13f108f2013-09-09 21:41:03 -0500100 )
Paul Kehrer13f108f2013-09-09 21:41:03 -0500101
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700102 test_MMT = generate_encrypt_test(
103 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynor016eed12013-10-16 14:16:04 -0700104 os.path.join("AES", "MMT"),
Paul Kehrer13f108f2013-09-09 21:41:03 -0500105 [
106 "ECBMMT128.rsp",
107 "ECBMMT192.rsp",
108 "ECBMMT256.rsp",
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700109 ],
110 lambda key: ciphers.AES(binascii.unhexlify(key)),
111 lambda key: modes.ECB(),
Paul Kehrer13f108f2013-09-09 21:41:03 -0500112 )
Paul Kehrer6f412a02013-09-10 21:30:50 -0500113
114
115class TestAES_OFB(object):
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700116 test_KAT = generate_encrypt_test(
117 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynor016eed12013-10-16 14:16:04 -0700118 os.path.join("AES", "KAT"),
Paul Kehrer6f412a02013-09-10 21:30:50 -0500119 [
120 "OFBGFSbox128.rsp",
121 "OFBGFSbox192.rsp",
122 "OFBGFSbox256.rsp",
123 "OFBKeySbox128.rsp",
124 "OFBKeySbox192.rsp",
125 "OFBKeySbox256.rsp",
126 "OFBVarKey128.rsp",
127 "OFBVarKey192.rsp",
128 "OFBVarKey256.rsp",
129 "OFBVarTxt128.rsp",
130 "OFBVarTxt192.rsp",
131 "OFBVarTxt256.rsp",
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700132 ],
133 lambda key, iv: ciphers.AES(binascii.unhexlify(key)),
134 lambda key, iv: modes.OFB(binascii.unhexlify(iv)),
Paul Kehrer6f412a02013-09-10 21:30:50 -0500135 )
Paul Kehrer6f412a02013-09-10 21:30:50 -0500136
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700137 test_MMT = generate_encrypt_test(
138 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynor016eed12013-10-16 14:16:04 -0700139 os.path.join("AES", "MMT"),
Paul Kehrer6f412a02013-09-10 21:30:50 -0500140 [
141 "OFBMMT128.rsp",
142 "OFBMMT192.rsp",
143 "OFBMMT256.rsp",
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700144 ],
145 lambda key, iv: ciphers.AES(binascii.unhexlify(key)),
146 lambda key, iv: modes.OFB(binascii.unhexlify(iv)),
Paul Kehrer6f412a02013-09-10 21:30:50 -0500147 )
Paul Kehrera1ec2622013-09-11 09:38:45 -0500148
149
150class TestAES_CFB(object):
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700151 test_KAT = generate_encrypt_test(
152 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynor016eed12013-10-16 14:16:04 -0700153 os.path.join("AES", "KAT"),
Paul Kehrera1ec2622013-09-11 09:38:45 -0500154 [
155 "CFB128GFSbox128.rsp",
156 "CFB128GFSbox192.rsp",
157 "CFB128GFSbox256.rsp",
158 "CFB128KeySbox128.rsp",
159 "CFB128KeySbox192.rsp",
160 "CFB128KeySbox256.rsp",
161 "CFB128VarKey128.rsp",
162 "CFB128VarKey192.rsp",
163 "CFB128VarKey256.rsp",
164 "CFB128VarTxt128.rsp",
165 "CFB128VarTxt192.rsp",
166 "CFB128VarTxt256.rsp",
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700167 ],
168 lambda key, iv: ciphers.AES(binascii.unhexlify(key)),
169 lambda key, iv: modes.CFB(binascii.unhexlify(iv)),
Paul Kehrera1ec2622013-09-11 09:38:45 -0500170 )
Paul Kehrera1ec2622013-09-11 09:38:45 -0500171
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700172 test_MMT = generate_encrypt_test(
173 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynor016eed12013-10-16 14:16:04 -0700174 os.path.join("AES", "MMT"),
Paul Kehrera1ec2622013-09-11 09:38:45 -0500175 [
176 "CFB128MMT128.rsp",
177 "CFB128MMT192.rsp",
178 "CFB128MMT256.rsp",
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700179 ],
180 lambda key, iv: ciphers.AES(binascii.unhexlify(key)),
181 lambda key, iv: modes.CFB(binascii.unhexlify(iv)),
Paul Kehrera1ec2622013-09-11 09:38:45 -0500182 )
Alex Gaynor9f44cab2013-09-09 19:04:16 -0700183
184
185class TestTripleDES_CBC(object):
Alex Gaynore761f8b2013-10-16 16:55:40 -0700186 test_KAT1 = generate_encrypt_test(
187 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
188 os.path.join("3DES", "KAT"),
Alex Gaynor920e3302013-09-10 16:55:52 -0700189 [
190 "TCBCinvperm.rsp",
191 "TCBCpermop.rsp",
192 "TCBCsubtab.rsp",
193 "TCBCvarkey.rsp",
194 "TCBCvartext.rsp",
Alex Gaynore761f8b2013-10-16 16:55:40 -0700195 ],
196 lambda keys, iv: ciphers.TripleDES(binascii.unhexlify(keys)),
Alex Gaynor5e04ba62013-10-21 16:16:29 -0700197 lambda keys, iv: modes.CBC(binascii.unhexlify(iv)),
Alex Gaynor920e3302013-09-10 16:55:52 -0700198 )
Alex Gaynor9f44cab2013-09-09 19:04:16 -0700199
Alex Gaynore761f8b2013-10-16 16:55:40 -0700200 test_KAT2 = generate_encrypt_test(
Alex Gaynoref2f91e2013-10-16 17:15:04 -0700201 lambda path: load_3des_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynore761f8b2013-10-16 16:55:40 -0700202 os.path.join("3DES", "KAT"),
Alex Gaynor920e3302013-09-10 16:55:52 -0700203 [
204 "TCBCIpermop.rsp",
205 "TCBCIsubtab.rsp",
206 "TCBCIvarkey.rsp",
207 "TCBCIvartext.rsp",
Alex Gaynor920e3302013-09-10 16:55:52 -0700208 "TCBCIinvperm.rsp",
Alex Gaynor6abac462013-10-16 16:57:20 -0700209 ],
Alex Gaynor5e04ba62013-10-21 16:16:29 -0700210 lambda key, iv: ciphers.TripleDES(binascii.unhexlify(key)),
211 lambda key, iv: modes.CBC(binascii.unhexlify(iv)),
Alex Gaynor920e3302013-09-10 16:55:52 -0700212 )
Alex Gaynor920e3302013-09-10 16:55:52 -0700213
Alex Gaynore761f8b2013-10-16 16:55:40 -0700214 test_MMT1 = generate_encrypt_test(
215 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
216 os.path.join("3DES", "MMT"),
Alex Gaynor920e3302013-09-10 16:55:52 -0700217 [
Alex Gaynordc424002013-10-21 16:51:31 -0700218 "TCBCMMT1.rsp",
219 "TCBCMMT2.rsp",
220 "TCBCMMT3.rsp",
221 ],
222 lambda key1, key2, key3, iv: (
223 ciphers.TripleDES(binascii.unhexlify(key1 + key2 + key3))
224 ),
225 lambda key1, key2, key3, iv: modes.CBC(binascii.unhexlify(iv)),
226 )
227
228 test_MMT2 = generate_encrypt_test(
229 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
230 os.path.join("3DES", "MMT"),
231 [
Alex Gaynor920e3302013-09-10 16:55:52 -0700232 "TCBCIMMT1.rsp",
233 "TCBCIMMT2.rsp",
234 "TCBCIMMT3.rsp",
Alex Gaynore761f8b2013-10-16 16:55:40 -0700235 ],
Alex Gaynor19642a12013-10-21 16:36:29 -0700236 lambda key1, key2, key3, iv1, iv2, iv3: (
237 ciphers.TripleDES(binascii.unhexlify(key1 + key2 + key3))
238 ),
239 lambda key1, key2, key3, iv1, iv2, iv3: (
240 modes.CBC(binascii.unhexlify(iv1 + iv2 + iv3))
241 ),
Alex Gaynor920e3302013-09-10 16:55:52 -0700242 )
Alex Gaynor920e3302013-09-10 16:55:52 -0700243
Alex Gaynordc424002013-10-21 16:51:31 -0700244
245class TestTripleDES_OFB(object):
Alex Gaynor804e9812013-10-21 17:04:40 -0700246 test_KAT1 = generate_encrypt_test(
247 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
248 os.path.join("3DES", "KAT"),
249 [
250 "tests/primitives/vectors/NIST/3DES/KAT/TOFBpermop.rsp",
251 "tests/primitives/vectors/NIST/3DES/KAT/TOFBsubtab.rsp",
252 "tests/primitives/vectors/NIST/3DES/KAT/TOFBvarkey.rsp",
253 "tests/primitives/vectors/NIST/3DES/KAT/TOFBvartext.rsp",
254 "tests/primitives/vectors/NIST/3DES/KAT/TOFBinvperm.rsp",
255 ],
256 )
257
258 test_KAT2 = generate_encrypt_test(
259 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
260 os.path.join("3DES", "KAT"),
261 [
262 "tests/primitives/vectors/NIST/3DES/KAT/TOFBIinvperm.rsp",
263 "tests/primitives/vectors/NIST/3DES/KAT/TOFBIpermop.rsp",
264 "tests/primitives/vectors/NIST/3DES/KAT/TOFBIsubtab.rsp",
265 "tests/primitives/vectors/NIST/3DES/KAT/TOFBIvarkey.rsp",
266 "tests/primitives/vectors/NIST/3DES/KAT/TOFBIvartext.rsp",
267 ],
268 )
269
Alex Gaynore761f8b2013-10-16 16:55:40 -0700270 test_MMT1 = generate_encrypt_test(
271 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
272 os.path.join("3DES", "MMT"),
Alex Gaynor920e3302013-09-10 16:55:52 -0700273 [
Alex Gaynordc424002013-10-21 16:51:31 -0700274 "TOFBMMT1.rsp",
275 "TOFBMMT2.rsp",
276 "TOFBMMT3.rsp",
Alex Gaynore761f8b2013-10-16 16:55:40 -0700277 ],
Alex Gaynor19642a12013-10-21 16:36:29 -0700278 lambda key1, key2, key3, iv: (
279 ciphers.TripleDES(binascii.unhexlify(key1 + key2 + key3))
280 ),
Alex Gaynor5e04ba62013-10-21 16:16:29 -0700281 lambda key1, key2, key3, iv: modes.CBC(binascii.unhexlify(iv)),
Alex Gaynor920e3302013-09-10 16:55:52 -0700282 )
Alex Gaynor19642a12013-10-21 16:36:29 -0700283
Alex Gaynordc424002013-10-21 16:51:31 -0700284 test_MMT2 = generate_encrypt_test(
285 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
286 os.path.join("3DES", "MMT"),
287 [
288 "TOFBIMMT1.rsp",
289 "TOFBIMMT2.rsp",
290 "TOFBIMMT3.rsp",
291 ],
292 lambda key1, key2, key3, iv1, iv2, iv3: (
293 ciphers.TripleDES(binascii.unhexlify(key1 + key2 + key3))
294 ),
295 lambda key1, key2, key3, iv1, iv2, iv3: (
296 modes.CBC(binascii.unhexlify(iv1 + iv2 + iv3))
297 ),
298 )
Alex Gaynor19642a12013-10-21 16:36:29 -0700299
300
301class TestTripleDES_CFB(object):
302 pass