test_CTR.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. # ===================================================================
  2. #
  3. # Copyright (c) 2015, Legrandin <helderijs@gmail.com>
  4. # All rights reserved.
  5. #
  6. # Redistribution and use in source and binary forms, with or without
  7. # modification, are permitted provided that the following conditions
  8. # are met:
  9. #
  10. # 1. Redistributions of source code must retain the above copyright
  11. # notice, this list of conditions and the following disclaimer.
  12. # 2. Redistributions in binary form must reproduce the above copyright
  13. # notice, this list of conditions and the following disclaimer in
  14. # the documentation and/or other materials provided with the
  15. # distribution.
  16. #
  17. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  18. # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  19. # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  20. # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  21. # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  22. # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  23. # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  24. # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  25. # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  26. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  27. # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  28. # POSSIBILITY OF SUCH DAMAGE.
  29. # ===================================================================
  30. import unittest
  31. from binascii import hexlify, unhexlify
  32. from tls.Crypto.SelfTest.st_common import list_test_cases
  33. from tls.Crypto.Util.py3compat import tobytes, bchr
  34. from tls.Crypto.Cipher import AES, DES3
  35. from tls.Crypto.Hash import SHAKE128, SHA256
  36. from tls.Crypto.Util import Counter
  37. def get_tag_random(tag, length):
  38. return SHAKE128.new(data=tobytes(tag)).read(length)
  39. class CtrTests(unittest.TestCase):
  40. key_128 = get_tag_random("key_128", 16)
  41. key_192 = get_tag_random("key_192", 24)
  42. nonce_32 = get_tag_random("nonce_32", 4)
  43. nonce_64 = get_tag_random("nonce_64", 8)
  44. ctr_64 = Counter.new(32, prefix=nonce_32)
  45. ctr_128 = Counter.new(64, prefix=nonce_64)
  46. def test_loopback_128(self):
  47. cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128)
  48. pt = get_tag_random("plaintext", 16 * 100)
  49. ct = cipher.encrypt(pt)
  50. cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128)
  51. pt2 = cipher.decrypt(ct)
  52. self.assertEqual(pt, pt2)
  53. def test_loopback_64(self):
  54. cipher = DES3.new(self.key_192, DES3.MODE_CTR, counter=self.ctr_64)
  55. pt = get_tag_random("plaintext", 8 * 100)
  56. ct = cipher.encrypt(pt)
  57. cipher = DES3.new(self.key_192, DES3.MODE_CTR, counter=self.ctr_64)
  58. pt2 = cipher.decrypt(ct)
  59. self.assertEqual(pt, pt2)
  60. def test_invalid_counter_parameter(self):
  61. # Counter object is required for ciphers with short block size
  62. self.assertRaises(TypeError, DES3.new, self.key_192, AES.MODE_CTR)
  63. # Positional arguments are not allowed (Counter must be passed as
  64. # keyword)
  65. self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CTR, self.ctr_128)
  66. def test_nonce_attribute(self):
  67. # Nonce attribute is the prefix passed to Counter (DES3)
  68. cipher = DES3.new(self.key_192, DES3.MODE_CTR, counter=self.ctr_64)
  69. self.assertEqual(cipher.nonce, self.nonce_32)
  70. # Nonce attribute is the prefix passed to Counter (AES)
  71. cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128)
  72. self.assertEqual(cipher.nonce, self.nonce_64)
  73. # Nonce attribute is not defined if suffix is used in Counter
  74. counter = Counter.new(64, prefix=self.nonce_32, suffix=self.nonce_32)
  75. cipher = AES.new(self.key_128, AES.MODE_CTR, counter=counter)
  76. self.failIf(hasattr(cipher, "nonce"))
  77. def test_nonce_parameter(self):
  78. # Nonce parameter becomes nonce attribute
  79. cipher1 = AES.new(self.key_128, AES.MODE_CTR, nonce=self.nonce_64)
  80. self.assertEqual(cipher1.nonce, self.nonce_64)
  81. counter = Counter.new(64, prefix=self.nonce_64, initial_value=0)
  82. cipher2 = AES.new(self.key_128, AES.MODE_CTR, counter=counter)
  83. self.assertEqual(cipher1.nonce, cipher2.nonce)
  84. pt = get_tag_random("plaintext", 65536)
  85. self.assertEqual(cipher1.encrypt(pt), cipher2.encrypt(pt))
  86. # Nonce is implicitly created (for AES) when no parameters are passed
  87. nonce1 = AES.new(self.key_128, AES.MODE_CTR).nonce
  88. nonce2 = AES.new(self.key_128, AES.MODE_CTR).nonce
  89. self.assertNotEqual(nonce1, nonce2)
  90. self.assertEqual(len(nonce1), 8)
  91. # Nonce can be zero-length
  92. cipher = AES.new(self.key_128, AES.MODE_CTR, nonce=b"")
  93. self.assertEqual(b"", cipher.nonce)
  94. cipher.encrypt(b'0'*300)
  95. # Nonce and Counter are mutually exclusive
  96. self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CTR,
  97. counter=self.ctr_128, nonce=self.nonce_64)
  98. def test_initial_value_parameter(self):
  99. # Test with nonce parameter
  100. cipher1 = AES.new(self.key_128, AES.MODE_CTR,
  101. nonce=self.nonce_64, initial_value=0xFFFF)
  102. counter = Counter.new(64, prefix=self.nonce_64, initial_value=0xFFFF)
  103. cipher2 = AES.new(self.key_128, AES.MODE_CTR, counter=counter)
  104. pt = get_tag_random("plaintext", 65536)
  105. self.assertEqual(cipher1.encrypt(pt), cipher2.encrypt(pt))
  106. # Test without nonce parameter
  107. cipher1 = AES.new(self.key_128, AES.MODE_CTR,
  108. initial_value=0xFFFF)
  109. counter = Counter.new(64, prefix=cipher1.nonce, initial_value=0xFFFF)
  110. cipher2 = AES.new(self.key_128, AES.MODE_CTR, counter=counter)
  111. pt = get_tag_random("plaintext", 65536)
  112. self.assertEqual(cipher1.encrypt(pt), cipher2.encrypt(pt))
  113. # Initial_value and Counter are mutually exclusive
  114. self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CTR,
  115. counter=self.ctr_128, initial_value=0)
  116. def test_initial_value_bytes_parameter(self):
  117. # Same result as when passing an integer
  118. cipher1 = AES.new(self.key_128, AES.MODE_CTR,
  119. nonce=self.nonce_64,
  120. initial_value=b"\x00"*6+b"\xFF\xFF")
  121. cipher2 = AES.new(self.key_128, AES.MODE_CTR,
  122. nonce=self.nonce_64, initial_value=0xFFFF)
  123. pt = get_tag_random("plaintext", 65536)
  124. self.assertEqual(cipher1.encrypt(pt), cipher2.encrypt(pt))
  125. # Fail if the iv is too large
  126. self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CTR,
  127. initial_value=b"5"*17)
  128. self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CTR,
  129. nonce=self.nonce_64, initial_value=b"5"*9)
  130. # Fail if the iv is too short
  131. self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CTR,
  132. initial_value=b"5"*15)
  133. self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CTR,
  134. nonce=self.nonce_64, initial_value=b"5"*7)
  135. def test_iv_with_matching_length(self):
  136. self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CTR,
  137. counter=Counter.new(120))
  138. self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CTR,
  139. counter=Counter.new(136))
  140. def test_block_size_128(self):
  141. cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128)
  142. self.assertEqual(cipher.block_size, AES.block_size)
  143. def test_block_size_64(self):
  144. cipher = DES3.new(self.key_192, DES3.MODE_CTR, counter=self.ctr_64)
  145. self.assertEqual(cipher.block_size, DES3.block_size)
  146. def test_unaligned_data_128(self):
  147. plaintexts = [ b"7777777" ] * 100
  148. cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128)
  149. ciphertexts = [ cipher.encrypt(x) for x in plaintexts ]
  150. cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128)
  151. self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts)))
  152. cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128)
  153. ciphertexts = [ cipher.encrypt(x) for x in plaintexts ]
  154. cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128)
  155. self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts)))
  156. def test_unaligned_data_64(self):
  157. plaintexts = [ b"7777777" ] * 100
  158. cipher = DES3.new(self.key_192, AES.MODE_CTR, counter=self.ctr_64)
  159. ciphertexts = [ cipher.encrypt(x) for x in plaintexts ]
  160. cipher = DES3.new(self.key_192, AES.MODE_CTR, counter=self.ctr_64)
  161. self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts)))
  162. cipher = DES3.new(self.key_192, AES.MODE_CTR, counter=self.ctr_64)
  163. ciphertexts = [ cipher.encrypt(x) for x in plaintexts ]
  164. cipher = DES3.new(self.key_192, AES.MODE_CTR, counter=self.ctr_64)
  165. self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts)))
  166. def test_unknown_parameters(self):
  167. self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CTR,
  168. 7, counter=self.ctr_128)
  169. self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CTR,
  170. counter=self.ctr_128, unknown=7)
  171. # But some are only known by the base cipher (e.g. use_aesni consumed by the AES module)
  172. AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128, use_aesni=False)
  173. def test_null_encryption_decryption(self):
  174. for func in "encrypt", "decrypt":
  175. cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128)
  176. result = getattr(cipher, func)(b"")
  177. self.assertEqual(result, b"")
  178. def test_either_encrypt_or_decrypt(self):
  179. cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128)
  180. cipher.encrypt(b"")
  181. self.assertRaises(TypeError, cipher.decrypt, b"")
  182. cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128)
  183. cipher.decrypt(b"")
  184. self.assertRaises(TypeError, cipher.encrypt, b"")
  185. def test_wrap_around(self):
  186. # Counter is only 8 bits, so we can only encrypt/decrypt 256 blocks (=4096 bytes)
  187. counter = Counter.new(8, prefix=bchr(9) * 15)
  188. max_bytes = 4096
  189. cipher = AES.new(self.key_128, AES.MODE_CTR, counter=counter)
  190. cipher.encrypt(b'9' * max_bytes)
  191. self.assertRaises(OverflowError, cipher.encrypt, b'9')
  192. cipher = AES.new(self.key_128, AES.MODE_CTR, counter=counter)
  193. self.assertRaises(OverflowError, cipher.encrypt, b'9' * (max_bytes + 1))
  194. cipher = AES.new(self.key_128, AES.MODE_CTR, counter=counter)
  195. cipher.decrypt(b'9' * max_bytes)
  196. self.assertRaises(OverflowError, cipher.decrypt, b'9')
  197. cipher = AES.new(self.key_128, AES.MODE_CTR, counter=counter)
  198. self.assertRaises(OverflowError, cipher.decrypt, b'9' * (max_bytes + 1))
  199. def test_bytearray(self):
  200. data = b"1" * 16
  201. iv = b"\x00" * 6 + b"\xFF\xFF"
  202. # Encrypt
  203. cipher1 = AES.new(self.key_128, AES.MODE_CTR,
  204. nonce=self.nonce_64,
  205. initial_value=iv)
  206. ref1 = cipher1.encrypt(data)
  207. cipher2 = AES.new(self.key_128, AES.MODE_CTR,
  208. nonce=bytearray(self.nonce_64),
  209. initial_value=bytearray(iv))
  210. ref2 = cipher2.encrypt(bytearray(data))
  211. self.assertEqual(ref1, ref2)
  212. self.assertEqual(cipher1.nonce, cipher2.nonce)
  213. # Decrypt
  214. cipher3 = AES.new(self.key_128, AES.MODE_CTR,
  215. nonce=self.nonce_64,
  216. initial_value=iv)
  217. ref3 = cipher3.decrypt(data)
  218. cipher4 = AES.new(self.key_128, AES.MODE_CTR,
  219. nonce=bytearray(self.nonce_64),
  220. initial_value=bytearray(iv))
  221. ref4 = cipher4.decrypt(bytearray(data))
  222. self.assertEqual(ref3, ref4)
  223. def test_very_long_data(self):
  224. cipher = AES.new(b'A' * 32, AES.MODE_CTR, nonce=b'')
  225. ct = cipher.encrypt(b'B' * 1000000)
  226. digest = SHA256.new(ct).hexdigest()
  227. self.assertEqual(digest, "96204fc470476561a3a8f3b6fe6d24be85c87510b638142d1d0fb90989f8a6a6")
  228. def test_output_param(self):
  229. pt = b'5' * 16
  230. cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64)
  231. ct = cipher.encrypt(pt)
  232. output = bytearray(16)
  233. cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64)
  234. res = cipher.encrypt(pt, output=output)
  235. self.assertEqual(ct, output)
  236. self.assertEqual(res, None)
  237. cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64)
  238. res = cipher.decrypt(ct, output=output)
  239. self.assertEqual(pt, output)
  240. self.assertEqual(res, None)
  241. def test_output_param_memoryview(self):
  242. pt = b'5' * 16
  243. cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64)
  244. ct = cipher.encrypt(pt)
  245. output = memoryview(bytearray(16))
  246. cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64)
  247. cipher.encrypt(pt, output=output)
  248. self.assertEqual(ct, output)
  249. cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64)
  250. cipher.decrypt(ct, output=output)
  251. self.assertEqual(pt, output)
  252. def test_output_param_neg(self):
  253. pt = b'5' * 16
  254. cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64)
  255. ct = cipher.encrypt(pt)
  256. cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64)
  257. self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*16)
  258. cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64)
  259. self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*16)
  260. shorter_output = bytearray(15)
  261. cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64)
  262. self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output)
  263. cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64)
  264. self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output)
  265. import sys
  266. if sys.version[:3] == "2.6":
  267. del test_output_param_memoryview
  268. class SP800TestVectors(unittest.TestCase):
  269. """Class exercising the CTR test vectors found in Section F.5
  270. of NIST SP 800-38A"""
  271. def test_aes_128(self):
  272. plaintext = '6bc1bee22e409f96e93d7e117393172a' +\
  273. 'ae2d8a571e03ac9c9eb76fac45af8e51' +\
  274. '30c81c46a35ce411e5fbc1191a0a52ef' +\
  275. 'f69f2445df4f9b17ad2b417be66c3710'
  276. ciphertext = '874d6191b620e3261bef6864990db6ce' +\
  277. '9806f66b7970fdff8617187bb9fffdff' +\
  278. '5ae4df3edbd5d35e5b4f09020db03eab' +\
  279. '1e031dda2fbe03d1792170a0f3009cee'
  280. key = '2b7e151628aed2a6abf7158809cf4f3c'
  281. counter = Counter.new(nbits=16,
  282. prefix=unhexlify('f0f1f2f3f4f5f6f7f8f9fafbfcfd'),
  283. initial_value=0xfeff)
  284. key = unhexlify(key)
  285. plaintext = unhexlify(plaintext)
  286. ciphertext = unhexlify(ciphertext)
  287. cipher = AES.new(key, AES.MODE_CTR, counter=counter)
  288. self.assertEqual(cipher.encrypt(plaintext), ciphertext)
  289. cipher = AES.new(key, AES.MODE_CTR, counter=counter)
  290. self.assertEqual(cipher.decrypt(ciphertext), plaintext)
  291. def test_aes_192(self):
  292. plaintext = '6bc1bee22e409f96e93d7e117393172a' +\
  293. 'ae2d8a571e03ac9c9eb76fac45af8e51' +\
  294. '30c81c46a35ce411e5fbc1191a0a52ef' +\
  295. 'f69f2445df4f9b17ad2b417be66c3710'
  296. ciphertext = '1abc932417521ca24f2b0459fe7e6e0b' +\
  297. '090339ec0aa6faefd5ccc2c6f4ce8e94' +\
  298. '1e36b26bd1ebc670d1bd1d665620abf7' +\
  299. '4f78a7f6d29809585a97daec58c6b050'
  300. key = '8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b'
  301. counter = Counter.new(nbits=16,
  302. prefix=unhexlify('f0f1f2f3f4f5f6f7f8f9fafbfcfd'),
  303. initial_value=0xfeff)
  304. key = unhexlify(key)
  305. plaintext = unhexlify(plaintext)
  306. ciphertext = unhexlify(ciphertext)
  307. cipher = AES.new(key, AES.MODE_CTR, counter=counter)
  308. self.assertEqual(cipher.encrypt(plaintext), ciphertext)
  309. cipher = AES.new(key, AES.MODE_CTR, counter=counter)
  310. self.assertEqual(cipher.decrypt(ciphertext), plaintext)
  311. def test_aes_256(self):
  312. plaintext = '6bc1bee22e409f96e93d7e117393172a' +\
  313. 'ae2d8a571e03ac9c9eb76fac45af8e51' +\
  314. '30c81c46a35ce411e5fbc1191a0a52ef' +\
  315. 'f69f2445df4f9b17ad2b417be66c3710'
  316. ciphertext = '601ec313775789a5b7a7f504bbf3d228' +\
  317. 'f443e3ca4d62b59aca84e990cacaf5c5' +\
  318. '2b0930daa23de94ce87017ba2d84988d' +\
  319. 'dfc9c58db67aada613c2dd08457941a6'
  320. key = '603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4'
  321. counter = Counter.new(nbits=16,
  322. prefix=unhexlify('f0f1f2f3f4f5f6f7f8f9fafbfcfd'),
  323. initial_value=0xfeff)
  324. key = unhexlify(key)
  325. plaintext = unhexlify(plaintext)
  326. ciphertext = unhexlify(ciphertext)
  327. cipher = AES.new(key, AES.MODE_CTR, counter=counter)
  328. self.assertEqual(cipher.encrypt(plaintext), ciphertext)
  329. cipher = AES.new(key, AES.MODE_CTR, counter=counter)
  330. self.assertEqual(cipher.decrypt(ciphertext), plaintext)
  331. class RFC3686TestVectors(unittest.TestCase):
  332. # Each item is a test vector with:
  333. # - plaintext
  334. # - ciphertext
  335. # - key (AES 128, 192 or 256 bits)
  336. # - counter prefix (4 byte nonce + 8 byte nonce)
  337. data = (
  338. ('53696e676c6520626c6f636b206d7367',
  339. 'e4095d4fb7a7b3792d6175a3261311b8',
  340. 'ae6852f8121067cc4bf7a5765577f39e',
  341. '000000300000000000000000'),
  342. ('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f',
  343. '5104a106168a72d9790d41ee8edad388eb2e1efc46da57c8fce630df9141be28',
  344. '7e24067817fae0d743d6ce1f32539163',
  345. '006cb6dbc0543b59da48d90b'),
  346. ('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223',
  347. 'c1cf48a89f2ffdd9cf4652e9efdb72d74540a42bde6d7836d59a5ceaaef3105325b2072f',
  348. '7691be035e5020a8ac6e618529f9a0dc',
  349. '00e0017b27777f3f4a1786f0'),
  350. ('53696e676c6520626c6f636b206d7367',
  351. '4b55384fe259c9c84e7935a003cbe928',
  352. '16af5b145fc9f579c175f93e3bfb0eed863d06ccfdb78515',
  353. '0000004836733c147d6d93cb'),
  354. ('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f',
  355. '453243fc609b23327edfaafa7131cd9f8490701c5ad4a79cfc1fe0ff42f4fb00',
  356. '7c5cb2401b3dc33c19e7340819e0f69c678c3db8e6f6a91a',
  357. '0096b03b020c6eadc2cb500d'),
  358. ('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223',
  359. '96893fc55e5c722f540b7dd1ddf7e758d288bc95c69165884536c811662f2188abee0935',
  360. '02bf391ee8ecb159b959617b0965279bf59b60a786d3e0fe',
  361. '0007bdfd5cbd60278dcc0912'),
  362. ('53696e676c6520626c6f636b206d7367',
  363. '145ad01dbf824ec7560863dc71e3e0c0',
  364. '776beff2851db06f4c8a0542c8696f6c6a81af1eec96b4d37fc1d689e6c1c104',
  365. '00000060db5672c97aa8f0b2'),
  366. ('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f',
  367. 'f05e231b3894612c49ee000b804eb2a9b8306b508f839d6a5530831d9344af1c',
  368. 'f6d66d6bd52d59bb0796365879eff886c66dd51a5b6a99744b50590c87a23884',
  369. '00faac24c1585ef15a43d875'),
  370. ('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223',
  371. 'eb6c52821d0bbbf7ce7594462aca4faab407df866569fd07f48cc0b583d6071f1ec0e6b8',
  372. 'ff7a617ce69148e4f1726e2f43581de2aa62d9f805532edff1eed687fb54153d',
  373. '001cc5b751a51d70a1c11148')
  374. )
  375. bindata = []
  376. for tv in data:
  377. bindata.append([unhexlify(x) for x in tv])
  378. def runTest(self):
  379. for pt, ct, key, prefix in self.bindata:
  380. counter = Counter.new(32, prefix=prefix)
  381. cipher = AES.new(key, AES.MODE_CTR, counter=counter)
  382. result = cipher.encrypt(pt)
  383. self.assertEqual(hexlify(ct), hexlify(result))
  384. def get_tests(config={}):
  385. tests = []
  386. tests += list_test_cases(CtrTests)
  387. tests += list_test_cases(SP800TestVectors)
  388. tests += [ RFC3686TestVectors() ]
  389. return tests
  390. if __name__ == '__main__':
  391. suite = lambda: unittest.TestSuite(get_tests())
  392. unittest.main(defaultTest='suite')