blob: 99f5fc827c4fb0b17befdd0c07c00c4ba12ce89f [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 Gaynore761f8b2013-10-16 16:55:40 -0700208 ],
Alex Gaynor5e04ba62013-10-21 16:16:29 -0700209 lambda key, iv: ciphers.TripleDES(binascii.unhexlify(key)),
210 lambda key, iv: modes.CBC(binascii.unhexlify(iv)),
Alex Gaynor920e3302013-09-10 16:55:52 -0700211 )
Alex Gaynor920e3302013-09-10 16:55:52 -0700212
Alex Gaynor6abac462013-10-16 16:57:20 -0700213 test_KAT3 = generate_encrypt_test(
Alex Gaynor5e04ba62013-10-21 16:16:29 -0700214 lambda path: load_3des_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynor6abac462013-10-16 16:57:20 -0700215 os.path.join("3DES", "KAT"),
Alex Gaynor920e3302013-09-10 16:55:52 -0700216 [
217 "TCBCIinvperm.rsp",
Alex Gaynor6abac462013-10-16 16:57:20 -0700218 ],
Alex Gaynor5e04ba62013-10-21 16:16:29 -0700219 lambda key, iv: ciphers.TripleDES(binascii.unhexlify(key)),
220 lambda key, iv: modes.CBC(binascii.unhexlify(iv)),
Alex Gaynor920e3302013-09-10 16:55:52 -0700221 )
Alex Gaynor920e3302013-09-10 16:55:52 -0700222
Alex Gaynore761f8b2013-10-16 16:55:40 -0700223 test_MMT1 = generate_encrypt_test(
224 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
225 os.path.join("3DES", "MMT"),
Alex Gaynor920e3302013-09-10 16:55:52 -0700226 [
Alex Gaynordc424002013-10-21 16:51:31 -0700227 "TCBCMMT1.rsp",
228 "TCBCMMT2.rsp",
229 "TCBCMMT3.rsp",
230 ],
231 lambda key1, key2, key3, iv: (
232 ciphers.TripleDES(binascii.unhexlify(key1 + key2 + key3))
233 ),
234 lambda key1, key2, key3, iv: modes.CBC(binascii.unhexlify(iv)),
235 )
236
237 test_MMT2 = generate_encrypt_test(
238 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
239 os.path.join("3DES", "MMT"),
240 [
Alex Gaynor920e3302013-09-10 16:55:52 -0700241 "TCBCIMMT1.rsp",
242 "TCBCIMMT2.rsp",
243 "TCBCIMMT3.rsp",
Alex Gaynore761f8b2013-10-16 16:55:40 -0700244 ],
Alex Gaynor19642a12013-10-21 16:36:29 -0700245 lambda key1, key2, key3, iv1, iv2, iv3: (
246 ciphers.TripleDES(binascii.unhexlify(key1 + key2 + key3))
247 ),
248 lambda key1, key2, key3, iv1, iv2, iv3: (
249 modes.CBC(binascii.unhexlify(iv1 + iv2 + iv3))
250 ),
Alex Gaynor920e3302013-09-10 16:55:52 -0700251 )
Alex Gaynor920e3302013-09-10 16:55:52 -0700252
Alex Gaynordc424002013-10-21 16:51:31 -0700253
254class TestTripleDES_OFB(object):
Alex Gaynore761f8b2013-10-16 16:55:40 -0700255 test_MMT1 = generate_encrypt_test(
256 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
257 os.path.join("3DES", "MMT"),
Alex Gaynor920e3302013-09-10 16:55:52 -0700258 [
Alex Gaynordc424002013-10-21 16:51:31 -0700259 "TOFBMMT1.rsp",
260 "TOFBMMT2.rsp",
261 "TOFBMMT3.rsp",
Alex Gaynore761f8b2013-10-16 16:55:40 -0700262 ],
Alex Gaynor19642a12013-10-21 16:36:29 -0700263 lambda key1, key2, key3, iv: (
264 ciphers.TripleDES(binascii.unhexlify(key1 + key2 + key3))
265 ),
Alex Gaynor5e04ba62013-10-21 16:16:29 -0700266 lambda key1, key2, key3, iv: modes.CBC(binascii.unhexlify(iv)),
Alex Gaynor920e3302013-09-10 16:55:52 -0700267 )
Alex Gaynor19642a12013-10-21 16:36:29 -0700268
Alex Gaynordc424002013-10-21 16:51:31 -0700269 test_MMT2 = generate_encrypt_test(
270 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
271 os.path.join("3DES", "MMT"),
272 [
273 "TOFBIMMT1.rsp",
274 "TOFBIMMT2.rsp",
275 "TOFBIMMT3.rsp",
276 ],
277 lambda key1, key2, key3, iv1, iv2, iv3: (
278 ciphers.TripleDES(binascii.unhexlify(key1 + key2 + key3))
279 ),
280 lambda key1, key2, key3, iv1, iv2, iv3: (
281 modes.CBC(binascii.unhexlify(iv1 + iv2 + iv3))
282 ),
283 )
Alex Gaynor19642a12013-10-21 16:36:29 -0700284
285
286class TestTripleDES_CFB(object):
287 pass