blob: 38f4d0db5a9c18128bd3db2daa2ba2eac11622db [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):
Alex Gaynore2188562013-10-21 18:38:39 -070032 for i in range(1, 4):
Alex Gaynor5e04ba62013-10-21 16:16:29 -070033 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
Alex Gaynordc424002013-10-21 16:51:31 -0700228
229class TestTripleDES_OFB(object):
Alex Gaynor804e9812013-10-21 17:04:40 -0700230 test_KAT1 = generate_encrypt_test(
231 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
232 os.path.join("3DES", "KAT"),
233 [
Alex Gaynord4728622013-10-21 17:10:12 -0700234 "TOFBpermop.rsp",
235 "TOFBsubtab.rsp",
236 "TOFBvarkey.rsp",
237 "TOFBvartext.rsp",
238 "TOFBinvperm.rsp",
Alex Gaynor804e9812013-10-21 17:04:40 -0700239 ],
Alex Gaynord4728622013-10-21 17:10:12 -0700240 lambda keys, iv: ciphers.TripleDES(binascii.unhexlify(keys)),
Alex Gaynor1db93192013-10-21 19:13:48 -0700241 lambda keys, iv: modes.OFB(binascii.unhexlify(iv)),
Alex Gaynor804e9812013-10-21 17:04:40 -0700242 )
243
244 test_KAT2 = generate_encrypt_test(
Alex Gaynor8af03902013-10-21 17:14:47 -0700245 lambda path: load_3des_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynor804e9812013-10-21 17:04:40 -0700246 os.path.join("3DES", "KAT"),
247 [
Alex Gaynord4728622013-10-21 17:10:12 -0700248 "TOFBIinvperm.rsp",
249 "TOFBIpermop.rsp",
250 "TOFBIsubtab.rsp",
251 "TOFBIvarkey.rsp",
252 "TOFBIvartext.rsp",
Alex Gaynor804e9812013-10-21 17:04:40 -0700253 ],
Alex Gaynord4728622013-10-21 17:10:12 -0700254 lambda key, iv: ciphers.TripleDES(binascii.unhexlify(key)),
Alex Gaynor1db93192013-10-21 19:13:48 -0700255 lambda key, iv: modes.OFB(binascii.unhexlify(iv)),
Alex Gaynor804e9812013-10-21 17:04:40 -0700256 )
257
Alex Gaynore761f8b2013-10-16 16:55:40 -0700258 test_MMT1 = generate_encrypt_test(
259 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
260 os.path.join("3DES", "MMT"),
Alex Gaynor920e3302013-09-10 16:55:52 -0700261 [
Alex Gaynordc424002013-10-21 16:51:31 -0700262 "TOFBMMT1.rsp",
263 "TOFBMMT2.rsp",
264 "TOFBMMT3.rsp",
Alex Gaynore761f8b2013-10-16 16:55:40 -0700265 ],
Alex Gaynor19642a12013-10-21 16:36:29 -0700266 lambda key1, key2, key3, iv: (
267 ciphers.TripleDES(binascii.unhexlify(key1 + key2 + key3))
268 ),
Alex Gaynor1db93192013-10-21 19:13:48 -0700269 lambda key1, key2, key3, iv: modes.OFB(binascii.unhexlify(iv)),
Alex Gaynor920e3302013-09-10 16:55:52 -0700270 )
Alex Gaynor19642a12013-10-21 16:36:29 -0700271
Alex Gaynor19642a12013-10-21 16:36:29 -0700272
273class TestTripleDES_CFB(object):
Alex Gaynor8e251e72013-10-21 19:25:54 -0700274 test_KAT = generate_encrypt_test(
275 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
276 os.path.join("3DES", "KAT"),
277 [
278 "TCFB64invperm.rsp",
279 "TCFB64permop.rsp",
280 "TCFB64subtab.rsp",
281 "TCFB64varkey.rsp",
282 "TCFB64vartext.rsp",
283 ],
284 lambda keys, iv: ciphers.TripleDES(binascii.unhexlify(keys)),
285 lambda keys, iv: modes.CFB(binascii.unhexlify(iv)),
286 )
287
288 test_MMT = generate_encrypt_test(
289 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
290 os.path.join("3DES", "MMT"),
291 [
292 "TCFB64MMT1.rsp",
293 "TCFB64MMT2.rsp",
294 "TCFB64MMT3.rsp",
295 ],
296 lambda key1, key2, key3, iv: (
297 ciphers.TripleDES(binascii.unhexlify(key1 + key2 + key3))
298 ),
299 lambda key1, key2, key3, iv: modes.CFB(binascii.unhexlify(iv)),
300 )