blob: db5e0344e39e274a0e811d44d8b6d6808817271d [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
23import pytest
24
Donald Stufftea8e9fc2013-08-10 15:22:28 -040025from cryptography.primitives.block import BlockCipher, ciphers, modes
Donald Stufftec672e82013-08-09 01:20:03 -040026
27from ..utils import load_nist_vectors_from_file
28
29
Donald Stufft3704a832013-08-09 06:01:41 -040030def parameterize_kat_encrypt(fname):
Alex Gaynoraef7ee82013-08-08 22:31:11 -070031 return pytest.mark.parametrize(("key", "iv", "plaintext", "ciphertext"),
Donald Stufftec672e82013-08-09 01:20:03 -040032 load_nist_vectors_from_file(
Alex Gaynoraef7ee82013-08-08 22:31:11 -070033 os.path.join("AES/KAT/", fname),
Donald Stufftec672e82013-08-09 01:20:03 -040034 "ENCRYPT",
35 ["key", "iv", "plaintext", "ciphertext"],
36 ),
37 )
Alex Gaynoraef7ee82013-08-08 22:31:11 -070038
39
Donald Stufft3704a832013-08-09 06:01:41 -040040def paramterize_mmt_encrypt(fname):
41 return pytest.mark.parametrize(("key", "iv", "plaintext", "ciphertext"),
42 load_nist_vectors_from_file(
Alex Gaynor64e9a642013-08-10 15:34:34 -040043 os.path.join("AES/MMT/", fname),
Donald Stufft3704a832013-08-09 06:01:41 -040044 "ENCRYPT",
45 ["key", "iv", "plaintext", "ciphertext"],
46 )
47 )
48
49
Alex Gaynoraef7ee82013-08-08 22:31:11 -070050class TestAES_CBC(object):
Donald Stufft3704a832013-08-09 06:01:41 -040051 @parameterize_kat_encrypt("CBCGFSbox128.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -040052 def test_KAT_GFSbox_128_encrypt(self, key, iv, plaintext, ciphertext):
53 cipher = BlockCipher(
54 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -040055 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -040056 )
Donald Stufft5de03922013-08-09 07:28:31 -040057 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
58 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -040059 assert binascii.hexlify(actual_ciphertext) == ciphertext
60
Donald Stufft3704a832013-08-09 06:01:41 -040061 @parameterize_kat_encrypt("CBCGFSbox192.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -040062 def test_KAT_GFSbox_192_encrypt(self, key, iv, plaintext, ciphertext):
63 cipher = BlockCipher(
64 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -040065 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -040066 )
Donald Stufft5de03922013-08-09 07:28:31 -040067 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
68 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -040069 assert binascii.hexlify(actual_ciphertext) == ciphertext
70
Donald Stufft3704a832013-08-09 06:01:41 -040071 @parameterize_kat_encrypt("CBCGFSbox256.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -040072 def test_KAT_GFSbox_256_encrypt(self, key, iv, plaintext, ciphertext):
73 cipher = BlockCipher(
74 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -040075 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -040076 )
Donald Stufft5de03922013-08-09 07:28:31 -040077 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
78 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -040079 assert binascii.hexlify(actual_ciphertext) == ciphertext
80
Donald Stufft3704a832013-08-09 06:01:41 -040081 @parameterize_kat_encrypt("CBCKeySbox128.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -040082 def test_KAT_KeySbox_128_encrypt(self, key, iv, plaintext, ciphertext):
83 cipher = BlockCipher(
84 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -040085 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -040086 )
Donald Stufft5de03922013-08-09 07:28:31 -040087 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
88 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -040089 assert binascii.hexlify(actual_ciphertext) == ciphertext
90
Donald Stufft3704a832013-08-09 06:01:41 -040091 @parameterize_kat_encrypt("CBCKeySbox192.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -040092 def test_KAT_KeySbox_192_encrypt(self, key, iv, plaintext, ciphertext):
93 cipher = BlockCipher(
94 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -040095 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -040096 )
Donald Stufft5de03922013-08-09 07:28:31 -040097 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
98 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -040099 assert binascii.hexlify(actual_ciphertext) == ciphertext
100
Donald Stufft3704a832013-08-09 06:01:41 -0400101 @parameterize_kat_encrypt("CBCKeySbox256.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -0400102 def test_KAT_KeySbox_256_encrypt(self, key, iv, plaintext, ciphertext):
103 cipher = BlockCipher(
104 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400105 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -0400106 )
Donald Stufft5de03922013-08-09 07:28:31 -0400107 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
108 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -0400109 assert binascii.hexlify(actual_ciphertext) == ciphertext
110
Donald Stufft3704a832013-08-09 06:01:41 -0400111 @parameterize_kat_encrypt("CBCVarKey128.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -0400112 def test_KAT_VarKey_128_encrypt(self, key, iv, plaintext, ciphertext):
113 cipher = BlockCipher(
114 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400115 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -0400116 )
Donald Stufft5de03922013-08-09 07:28:31 -0400117 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
118 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -0400119 assert binascii.hexlify(actual_ciphertext) == ciphertext
120
Donald Stufft3704a832013-08-09 06:01:41 -0400121 @parameterize_kat_encrypt("CBCVarKey192.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -0400122 def test_KAT_VarKey_192_encrypt(self, key, iv, plaintext, ciphertext):
123 cipher = BlockCipher(
124 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400125 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -0400126 )
Donald Stufft5de03922013-08-09 07:28:31 -0400127 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
128 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -0400129 assert binascii.hexlify(actual_ciphertext) == ciphertext
130
Donald Stufft3704a832013-08-09 06:01:41 -0400131 @parameterize_kat_encrypt("CBCVarKey256.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -0400132 def test_KAT_VarKey_256_encrypt(self, key, iv, plaintext, ciphertext):
133 cipher = BlockCipher(
134 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400135 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -0400136 )
Donald Stufft5de03922013-08-09 07:28:31 -0400137 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
138 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -0400139 assert binascii.hexlify(actual_ciphertext) == ciphertext
140
Donald Stufft3704a832013-08-09 06:01:41 -0400141 @parameterize_kat_encrypt("CBCVarTxt128.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -0400142 def test_KAT_VarTxt_128_encrypt(self, key, iv, plaintext, ciphertext):
143 cipher = BlockCipher(
144 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400145 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -0400146 )
Donald Stufft5de03922013-08-09 07:28:31 -0400147 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
148 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -0400149 assert binascii.hexlify(actual_ciphertext) == ciphertext
150
Donald Stufft3704a832013-08-09 06:01:41 -0400151 @parameterize_kat_encrypt("CBCVarTxt192.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -0400152 def test_KAT_VarTxt_192_encrypt(self, key, iv, plaintext, ciphertext):
153 cipher = BlockCipher(
154 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400155 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -0400156 )
Donald Stufft5de03922013-08-09 07:28:31 -0400157 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
158 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -0400159 assert binascii.hexlify(actual_ciphertext) == ciphertext
160
Donald Stufft3704a832013-08-09 06:01:41 -0400161 @parameterize_kat_encrypt("CBCVarTxt256.rsp")
Donald Stufftec672e82013-08-09 01:20:03 -0400162 def test_KAT_VarTxt_256_encrypt(self, key, iv, plaintext, ciphertext):
163 cipher = BlockCipher(
164 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400165 modes.CBC(binascii.unhexlify(iv)),
Donald Stufftec672e82013-08-09 01:20:03 -0400166 )
Donald Stufft5de03922013-08-09 07:28:31 -0400167 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
168 actual_ciphertext += cipher.finalize()
Donald Stufftec672e82013-08-09 01:20:03 -0400169 assert binascii.hexlify(actual_ciphertext) == ciphertext
Donald Stufft3704a832013-08-09 06:01:41 -0400170
171 @paramterize_mmt_encrypt("CBCMMT128.rsp")
172 def test_MMT_128_encrypt(self, key, iv, plaintext, ciphertext):
173 cipher = BlockCipher(
174 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400175 modes.CBC(binascii.unhexlify(iv)),
Donald Stufft3704a832013-08-09 06:01:41 -0400176 )
Donald Stufft5de03922013-08-09 07:28:31 -0400177 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
178 actual_ciphertext += cipher.finalize()
Donald Stufft3704a832013-08-09 06:01:41 -0400179 assert binascii.hexlify(actual_ciphertext) == ciphertext
180
181 @paramterize_mmt_encrypt("CBCMMT192.rsp")
182 def test_MMT_192_encrypt(self, key, iv, plaintext, ciphertext):
183 cipher = BlockCipher(
184 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400185 modes.CBC(binascii.unhexlify(iv)),
Donald Stufft3704a832013-08-09 06:01:41 -0400186 )
Donald Stufft5de03922013-08-09 07:28:31 -0400187 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
188 actual_ciphertext += cipher.finalize()
Donald Stufft3704a832013-08-09 06:01:41 -0400189 assert binascii.hexlify(actual_ciphertext) == ciphertext
190
191 @paramterize_mmt_encrypt("CBCMMT256.rsp")
192 def test_MMT_256_encrypt(self, key, iv, plaintext, ciphertext):
193 cipher = BlockCipher(
194 ciphers.AES(binascii.unhexlify(key)),
Donald Stufftea8e9fc2013-08-10 15:22:28 -0400195 modes.CBC(binascii.unhexlify(iv)),
Donald Stufft3704a832013-08-09 06:01:41 -0400196 )
Donald Stufft5de03922013-08-09 07:28:31 -0400197 actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
198 actual_ciphertext += cipher.finalize()
Donald Stufft3704a832013-08-09 06:01:41 -0400199 assert binascii.hexlify(actual_ciphertext) == ciphertext