blob: ceecd57ee812e859fbc9965b8b504167c31ab9fb [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 Gaynoraef7ee82013-08-08 22:31:11 -070029class TestAES_CBC(object):
Alex Gaynor1fe70b12013-10-16 11:59:17 -070030 test_KAT = generate_encrypt_test(
31 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynor016eed12013-10-16 14:16:04 -070032 os.path.join("AES", "KAT"),
Alex Gaynor920e3302013-09-10 16:55:52 -070033 [
34 "CBCGFSbox128.rsp",
35 "CBCGFSbox192.rsp",
36 "CBCGFSbox256.rsp",
37 "CBCKeySbox128.rsp",
38 "CBCKeySbox192.rsp",
39 "CBCKeySbox256.rsp",
40 "CBCVarKey128.rsp",
41 "CBCVarKey192.rsp",
42 "CBCVarKey256.rsp",
43 "CBCVarTxt128.rsp",
44 "CBCVarTxt192.rsp",
45 "CBCVarTxt256.rsp",
Alex Gaynor1fe70b12013-10-16 11:59:17 -070046 ],
47 lambda key, iv: ciphers.AES(binascii.unhexlify(key)),
48 lambda key, iv: modes.CBC(binascii.unhexlify(iv)),
Alex Gaynor920e3302013-09-10 16:55:52 -070049 )
Donald Stufftec672e82013-08-09 01:20:03 -040050
Alex Gaynor1fe70b12013-10-16 11:59:17 -070051 test_MMT = generate_encrypt_test(
52 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynor016eed12013-10-16 14:16:04 -070053 os.path.join("AES", "MMT"),
Alex Gaynor920e3302013-09-10 16:55:52 -070054 [
55 "CBCMMT128.rsp",
56 "CBCMMT192.rsp",
57 "CBCMMT256.rsp",
Alex Gaynor1fe70b12013-10-16 11:59:17 -070058 ],
59 lambda key, iv: ciphers.AES(binascii.unhexlify(key)),
60 lambda key, iv: modes.CBC(binascii.unhexlify(iv)),
Alex Gaynor920e3302013-09-10 16:55:52 -070061 )
Paul Kehrer13f108f2013-09-09 21:41:03 -050062
63
64class TestAES_ECB(object):
Alex Gaynor1fe70b12013-10-16 11:59:17 -070065 test_KAT = generate_encrypt_test(
66 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynor016eed12013-10-16 14:16:04 -070067 os.path.join("AES", "KAT"),
Paul Kehrer13f108f2013-09-09 21:41:03 -050068 [
69 "ECBGFSbox128.rsp",
70 "ECBGFSbox192.rsp",
71 "ECBGFSbox256.rsp",
72 "ECBKeySbox128.rsp",
73 "ECBKeySbox192.rsp",
74 "ECBKeySbox256.rsp",
75 "ECBVarKey128.rsp",
76 "ECBVarKey192.rsp",
77 "ECBVarKey256.rsp",
78 "ECBVarTxt128.rsp",
79 "ECBVarTxt192.rsp",
80 "ECBVarTxt256.rsp",
Alex Gaynor1fe70b12013-10-16 11:59:17 -070081 ],
82 lambda key: ciphers.AES(binascii.unhexlify(key)),
83 lambda key: modes.ECB(),
Paul Kehrer13f108f2013-09-09 21:41:03 -050084 )
Paul Kehrer13f108f2013-09-09 21:41:03 -050085
Alex Gaynor1fe70b12013-10-16 11:59:17 -070086 test_MMT = generate_encrypt_test(
87 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynor016eed12013-10-16 14:16:04 -070088 os.path.join("AES", "MMT"),
Paul Kehrer13f108f2013-09-09 21:41:03 -050089 [
90 "ECBMMT128.rsp",
91 "ECBMMT192.rsp",
92 "ECBMMT256.rsp",
Alex Gaynor1fe70b12013-10-16 11:59:17 -070093 ],
94 lambda key: ciphers.AES(binascii.unhexlify(key)),
95 lambda key: modes.ECB(),
Paul Kehrer13f108f2013-09-09 21:41:03 -050096 )
Paul Kehrer6f412a02013-09-10 21:30:50 -050097
98
99class TestAES_OFB(object):
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700100 test_KAT = generate_encrypt_test(
101 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynor016eed12013-10-16 14:16:04 -0700102 os.path.join("AES", "KAT"),
Paul Kehrer6f412a02013-09-10 21:30:50 -0500103 [
104 "OFBGFSbox128.rsp",
105 "OFBGFSbox192.rsp",
106 "OFBGFSbox256.rsp",
107 "OFBKeySbox128.rsp",
108 "OFBKeySbox192.rsp",
109 "OFBKeySbox256.rsp",
110 "OFBVarKey128.rsp",
111 "OFBVarKey192.rsp",
112 "OFBVarKey256.rsp",
113 "OFBVarTxt128.rsp",
114 "OFBVarTxt192.rsp",
115 "OFBVarTxt256.rsp",
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700116 ],
117 lambda key, iv: ciphers.AES(binascii.unhexlify(key)),
118 lambda key, iv: modes.OFB(binascii.unhexlify(iv)),
Paul Kehrer6f412a02013-09-10 21:30:50 -0500119 )
Paul Kehrer6f412a02013-09-10 21:30:50 -0500120
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700121 test_MMT = generate_encrypt_test(
122 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynor016eed12013-10-16 14:16:04 -0700123 os.path.join("AES", "MMT"),
Paul Kehrer6f412a02013-09-10 21:30:50 -0500124 [
125 "OFBMMT128.rsp",
126 "OFBMMT192.rsp",
127 "OFBMMT256.rsp",
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700128 ],
129 lambda key, iv: ciphers.AES(binascii.unhexlify(key)),
130 lambda key, iv: modes.OFB(binascii.unhexlify(iv)),
Paul Kehrer6f412a02013-09-10 21:30:50 -0500131 )
Paul Kehrera1ec2622013-09-11 09:38:45 -0500132
133
134class TestAES_CFB(object):
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700135 test_KAT = generate_encrypt_test(
136 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynor016eed12013-10-16 14:16:04 -0700137 os.path.join("AES", "KAT"),
Paul Kehrera1ec2622013-09-11 09:38:45 -0500138 [
139 "CFB128GFSbox128.rsp",
140 "CFB128GFSbox192.rsp",
141 "CFB128GFSbox256.rsp",
142 "CFB128KeySbox128.rsp",
143 "CFB128KeySbox192.rsp",
144 "CFB128KeySbox256.rsp",
145 "CFB128VarKey128.rsp",
146 "CFB128VarKey192.rsp",
147 "CFB128VarKey256.rsp",
148 "CFB128VarTxt128.rsp",
149 "CFB128VarTxt192.rsp",
150 "CFB128VarTxt256.rsp",
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700151 ],
152 lambda key, iv: ciphers.AES(binascii.unhexlify(key)),
153 lambda key, iv: modes.CFB(binascii.unhexlify(iv)),
Paul Kehrera1ec2622013-09-11 09:38:45 -0500154 )
Paul Kehrera1ec2622013-09-11 09:38:45 -0500155
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700156 test_MMT = generate_encrypt_test(
157 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
Alex Gaynor016eed12013-10-16 14:16:04 -0700158 os.path.join("AES", "MMT"),
Paul Kehrera1ec2622013-09-11 09:38:45 -0500159 [
160 "CFB128MMT128.rsp",
161 "CFB128MMT192.rsp",
162 "CFB128MMT256.rsp",
Alex Gaynor1fe70b12013-10-16 11:59:17 -0700163 ],
164 lambda key, iv: ciphers.AES(binascii.unhexlify(key)),
165 lambda key, iv: modes.CFB(binascii.unhexlify(iv)),
Paul Kehrera1ec2622013-09-11 09:38:45 -0500166 )
Alex Gaynor9f44cab2013-09-09 19:04:16 -0700167
168
169class TestTripleDES_CBC(object):
Alex Gaynore761f8b2013-10-16 16:55:40 -0700170 test_KAT1 = generate_encrypt_test(
171 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
172 os.path.join("3DES", "KAT"),
Alex Gaynor920e3302013-09-10 16:55:52 -0700173 [
174 "TCBCinvperm.rsp",
175 "TCBCpermop.rsp",
176 "TCBCsubtab.rsp",
177 "TCBCvarkey.rsp",
178 "TCBCvartext.rsp",
Alex Gaynore761f8b2013-10-16 16:55:40 -0700179 ],
180 lambda keys, iv: ciphers.TripleDES(binascii.unhexlify(keys)),
181 lambda keys, iv: modes.CBC(iv),
Alex Gaynor920e3302013-09-10 16:55:52 -0700182 )
Alex Gaynor9f44cab2013-09-09 19:04:16 -0700183
Alex Gaynore761f8b2013-10-16 16:55:40 -0700184 test_KAT2 = generate_encrypt_test(
185 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
186 os.path.join("3DES", "KAT"),
Alex Gaynor920e3302013-09-10 16:55:52 -0700187 [
188 "TCBCIpermop.rsp",
189 "TCBCIsubtab.rsp",
190 "TCBCIvarkey.rsp",
191 "TCBCIvartext.rsp",
Alex Gaynore761f8b2013-10-16 16:55:40 -0700192 ],
193 lambda keys, iv1, iv2, iv3: ciphers.TripleDES(binascii.unhexlify(keys)),
194 lambda keys, iv1, iv2, iv3: modes.CBC(iv1 + iv2 + iv3),
Alex Gaynor920e3302013-09-10 16:55:52 -0700195 )
Alex Gaynor920e3302013-09-10 16:55:52 -0700196
197 @parameterize_encrypt_test(
198 "3DES", "KAT",
Alex Gaynor62ebc7e2013-09-10 17:22:11 -0700199 ("keys", "iv1", "iv2", "iv3", "plaintext1", "ciphertext3"),
Alex Gaynor920e3302013-09-10 16:55:52 -0700200 [
201 "TCBCIinvperm.rsp",
202 ]
203 )
204 def test_KAT_3(self, keys, iv1, iv2, iv3, plaintext1, ciphertext3):
205 cipher = BlockCipher(
206 ciphers.TripleDES(binascii.unhexlify(keys)),
207 modes.CBC(binascii.unhexlify(iv1 + iv2 + iv3)),
208 )
209 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext1))
210 actual_ciphertext += cipher.finalize()
211 assert binascii.hexlify(actual_ciphertext) == ciphertext3
212
Alex Gaynore761f8b2013-10-16 16:55:40 -0700213 test_MMT1 = generate_encrypt_test(
214 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
215 os.path.join("3DES", "MMT"),
Alex Gaynor920e3302013-09-10 16:55:52 -0700216 [
217 "TCBCIMMT1.rsp",
218 "TCBCIMMT2.rsp",
219 "TCBCIMMT3.rsp",
Alex Gaynore761f8b2013-10-16 16:55:40 -0700220 ],
221 lambda key1, key2, key3, iv1, iv2, iv3: ciphers.TripleDES(binascii.unhexlify(key1 + key2 + key3)),
222 lambda key1, key2, key3, iv1, iv2, iv3: modes.CBC(iv1 + iv2 + iv3),
Alex Gaynor920e3302013-09-10 16:55:52 -0700223 )
Alex Gaynor920e3302013-09-10 16:55:52 -0700224
Alex Gaynore761f8b2013-10-16 16:55:40 -0700225 test_MMT1 = generate_encrypt_test(
226 lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
227 os.path.join("3DES", "MMT"),
Alex Gaynor920e3302013-09-10 16:55:52 -0700228 [
229 "TCBCMMT1.rsp",
230 "TCBCMMT2.rsp",
231 "TCBCMMT3.rsp",
Alex Gaynore761f8b2013-10-16 16:55:40 -0700232 ],
233 lambda key1, key2, key3, iv: ciphers.TripleDES(binascii.unhexlify(key1 + key2 + key3)),
234 lambda key1, key2, key3, iv: modes.CBC(iv),
Alex Gaynor920e3302013-09-10 16:55:52 -0700235 )