blob: dc26543575b4e4e39bc074dd53abbc168b377fac [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"""
17import binascii
Alex Gaynoraef7ee82013-08-08 22:31:11 -070018import os
Donald Stufftec672e82013-08-09 01:20:03 -040019
20import pytest
21
Donald Stufftea8e9fc2013-08-10 15:22:28 -040022from cryptography.primitives.block import BlockCipher, ciphers, modes
Donald Stufftec672e82013-08-09 01:20:03 -040023
24from ..utils import load_nist_vectors_from_file
25
26
Donald Stufft3704a832013-08-09 06:01:41 -040027def parameterize_kat_encrypt(fname):
Alex Gaynoraef7ee82013-08-08 22:31:11 -070028 return pytest.mark.parametrize(("key", "iv", "plaintext", "ciphertext"),
Donald Stufftec672e82013-08-09 01:20:03 -040029 load_nist_vectors_from_file(
Alex Gaynoraef7ee82013-08-08 22:31:11 -070030 os.path.join("AES/KAT/", fname),
Donald Stufftec672e82013-08-09 01:20:03 -040031 "ENCRYPT",
32 ["key", "iv", "plaintext", "ciphertext"],
33 ),
34 )
Alex Gaynoraef7ee82013-08-08 22:31:11 -070035
36
Donald Stufft3704a832013-08-09 06:01:41 -040037def paramterize_mmt_encrypt(fname):
38 return pytest.mark.parametrize(("key", "iv", "plaintext", "ciphertext"),
39 load_nist_vectors_from_file(
Alex Gaynor64e9a642013-08-10 15:34:34 -040040 os.path.join("AES/MMT/", fname),
Donald Stufft3704a832013-08-09 06:01:41 -040041 "ENCRYPT",
42 ["key", "iv", "plaintext", "ciphertext"],
43 )
44 )
45
46
Alex Gaynoraef7ee82013-08-08 22:31:11 -070047class TestAES_CBC(object):
Donald Stufft3704a832013-08-09 06:01:41 -040048 @parameterize_kat_encrypt("CBCGFSbox128.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -040049 def test_KAT_GFSbox_128_encrypt(self, key, iv, plaintext, ciphertext):
50 cipher = BlockCipher(
51 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -040052 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -040053 )
Donald Stufft5de03922013-08-09 07:28:31 -040054 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
55 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -040056 assert binascii.hexlify(actual_ciphertext) == ciphertext
57
Donald Stufft3704a832013-08-09 06:01:41 -040058 @parameterize_kat_encrypt("CBCGFSbox192.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -040059 def test_KAT_GFSbox_192_encrypt(self, key, iv, plaintext, ciphertext):
60 cipher = BlockCipher(
61 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -040062 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -040063 )
Donald Stufft5de03922013-08-09 07:28:31 -040064 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
65 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -040066 assert binascii.hexlify(actual_ciphertext) == ciphertext
67
Donald Stufft3704a832013-08-09 06:01:41 -040068 @parameterize_kat_encrypt("CBCGFSbox256.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -040069 def test_KAT_GFSbox_256_encrypt(self, key, iv, plaintext, ciphertext):
70 cipher = BlockCipher(
71 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -040072 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -040073 )
Donald Stufft5de03922013-08-09 07:28:31 -040074 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
75 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -040076 assert binascii.hexlify(actual_ciphertext) == ciphertext
77
Donald Stufft3704a832013-08-09 06:01:41 -040078 @parameterize_kat_encrypt("CBCKeySbox128.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -040079 def test_KAT_KeySbox_128_encrypt(self, key, iv, plaintext, ciphertext):
80 cipher = BlockCipher(
81 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -040082 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -040083 )
Donald Stufft5de03922013-08-09 07:28:31 -040084 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
85 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -040086 assert binascii.hexlify(actual_ciphertext) == ciphertext
87
Donald Stufft3704a832013-08-09 06:01:41 -040088 @parameterize_kat_encrypt("CBCKeySbox192.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -040089 def test_KAT_KeySbox_192_encrypt(self, key, iv, plaintext, ciphertext):
90 cipher = BlockCipher(
91 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -040092 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -040093 )
Donald Stufft5de03922013-08-09 07:28:31 -040094 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
95 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -040096 assert binascii.hexlify(actual_ciphertext) == ciphertext
97
Donald Stufft3704a832013-08-09 06:01:41 -040098 @parameterize_kat_encrypt("CBCKeySbox256.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -040099 def test_KAT_KeySbox_256_encrypt(self, key, iv, plaintext, ciphertext):
100 cipher = BlockCipher(
101 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400102 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -0400103 )
Donald Stufft5de03922013-08-09 07:28:31 -0400104 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
105 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -0400106 assert binascii.hexlify(actual_ciphertext) == ciphertext
107
Donald Stufft3704a832013-08-09 06:01:41 -0400108 @parameterize_kat_encrypt("CBCVarKey128.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -0400109 def test_KAT_VarKey_128_encrypt(self, key, iv, plaintext, ciphertext):
110 cipher = BlockCipher(
111 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400112 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -0400113 )
Donald Stufft5de03922013-08-09 07:28:31 -0400114 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
115 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -0400116 assert binascii.hexlify(actual_ciphertext) == ciphertext
117
Donald Stufft3704a832013-08-09 06:01:41 -0400118 @parameterize_kat_encrypt("CBCVarKey192.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -0400119 def test_KAT_VarKey_192_encrypt(self, key, iv, plaintext, ciphertext):
120 cipher = BlockCipher(
121 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400122 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -0400123 )
Donald Stufft5de03922013-08-09 07:28:31 -0400124 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
125 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -0400126 assert binascii.hexlify(actual_ciphertext) == ciphertext
127
Donald Stufft3704a832013-08-09 06:01:41 -0400128 @parameterize_kat_encrypt("CBCVarKey256.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -0400129 def test_KAT_VarKey_256_encrypt(self, key, iv, plaintext, ciphertext):
130 cipher = BlockCipher(
131 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400132 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -0400133 )
Donald Stufft5de03922013-08-09 07:28:31 -0400134 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
135 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -0400136 assert binascii.hexlify(actual_ciphertext) == ciphertext
137
Donald Stufft3704a832013-08-09 06:01:41 -0400138 @parameterize_kat_encrypt("CBCVarTxt128.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -0400139 def test_KAT_VarTxt_128_encrypt(self, key, iv, plaintext, ciphertext):
140 cipher = BlockCipher(
141 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400142 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -0400143 )
Donald Stufft5de03922013-08-09 07:28:31 -0400144 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
145 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -0400146 assert binascii.hexlify(actual_ciphertext) == ciphertext
147
Donald Stufft3704a832013-08-09 06:01:41 -0400148 @parameterize_kat_encrypt("CBCVarTxt192.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -0400149 def test_KAT_VarTxt_192_encrypt(self, key, iv, plaintext, ciphertext):
150 cipher = BlockCipher(
151 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400152 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -0400153 )
Donald Stufft5de03922013-08-09 07:28:31 -0400154 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
155 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -0400156 assert binascii.hexlify(actual_ciphertext) == ciphertext
157
Donald Stufft3704a832013-08-09 06:01:41 -0400158 @parameterize_kat_encrypt("CBCVarTxt256.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -0400159 def test_KAT_VarTxt_256_encrypt(self, key, iv, plaintext, ciphertext):
160 cipher = BlockCipher(
161 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400162 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -0400163 )
Donald Stufft5de03922013-08-09 07:28:31 -0400164 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
165 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -0400166 assert binascii.hexlify(actual_ciphertext) == ciphertext
Donald Stufft3704a832013-08-09 06:01:41 -0400167
168 @paramterize_mmt_encrypt("CBCMMT128.rsp")
169 def test_MMT_128_encrypt(self, key, iv, plaintext, ciphertext):
170 cipher = BlockCipher(
171 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400172 modes.CBC(binascii.unhexlify(iv)),
Donald Stufft3704a832013-08-09 06:01:41 -0400173 )
Donald Stufft5de03922013-08-09 07:28:31 -0400174 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
175 actual_ciphertext += cipher.finalize()
Donald Stufft3704a832013-08-09 06:01:41 -0400176 assert binascii.hexlify(actual_ciphertext) == ciphertext
177
178 @paramterize_mmt_encrypt("CBCMMT192.rsp")
179 def test_MMT_192_encrypt(self, key, iv, plaintext, ciphertext):
180 cipher = BlockCipher(
181 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400182 modes.CBC(binascii.unhexlify(iv)),
Donald Stufft3704a832013-08-09 06:01:41 -0400183 )
Donald Stufft5de03922013-08-09 07:28:31 -0400184 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
185 actual_ciphertext += cipher.finalize()
Donald Stufft3704a832013-08-09 06:01:41 -0400186 assert binascii.hexlify(actual_ciphertext) == ciphertext
187
188 @paramterize_mmt_encrypt("CBCMMT256.rsp")
189 def test_MMT_256_encrypt(self, key, iv, plaintext, ciphertext):
190 cipher = BlockCipher(
191 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400192 modes.CBC(binascii.unhexlify(iv)),
Donald Stufft3704a832013-08-09 06:01:41 -0400193 )
Donald Stufft5de03922013-08-09 07:28:31 -0400194 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
195 actual_ciphertext += cipher.finalize()
Donald Stufft3704a832013-08-09 06:01:41 -0400196 assert binascii.hexlify(actual_ciphertext) == ciphertext