test_aes.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #!/usr/bin/env python3
  2. from __future__ import unicode_literals
  3. # Allow direct execution
  4. import os
  5. import sys
  6. import unittest
  7. sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  8. from hypervideo_dl.aes import (
  9. aes_decrypt,
  10. aes_encrypt,
  11. aes_cbc_decrypt,
  12. aes_cbc_decrypt_bytes,
  13. aes_cbc_encrypt,
  14. aes_ctr_decrypt,
  15. aes_ctr_encrypt,
  16. aes_gcm_decrypt_and_verify,
  17. aes_gcm_decrypt_and_verify_bytes,
  18. aes_decrypt_text
  19. )
  20. from hypervideo_dl.compat import compat_pycrypto_AES
  21. from hypervideo_dl.utils import bytes_to_intlist, intlist_to_bytes
  22. import base64
  23. # the encrypted data can be generate with 'devscripts/generate_aes_testdata.py'
  24. class TestAES(unittest.TestCase):
  25. def setUp(self):
  26. self.key = self.iv = [0x20, 0x15] + 14 * [0]
  27. self.secret_msg = b'Secret message goes here'
  28. def test_encrypt(self):
  29. msg = b'message'
  30. key = list(range(16))
  31. encrypted = aes_encrypt(bytes_to_intlist(msg), key)
  32. decrypted = intlist_to_bytes(aes_decrypt(encrypted, key))
  33. self.assertEqual(decrypted, msg)
  34. def test_cbc_decrypt(self):
  35. data = b'\x97\x92+\xe5\x0b\xc3\x18\x91ky9m&\xb3\xb5@\xe6\x27\xc2\x96.\xc8u\x88\xab9-[\x9e|\xf1\xcd'
  36. decrypted = intlist_to_bytes(aes_cbc_decrypt(bytes_to_intlist(data), self.key, self.iv))
  37. self.assertEqual(decrypted.rstrip(b'\x08'), self.secret_msg)
  38. if compat_pycrypto_AES:
  39. decrypted = aes_cbc_decrypt_bytes(data, intlist_to_bytes(self.key), intlist_to_bytes(self.iv))
  40. self.assertEqual(decrypted.rstrip(b'\x08'), self.secret_msg)
  41. def test_cbc_encrypt(self):
  42. data = bytes_to_intlist(self.secret_msg)
  43. encrypted = intlist_to_bytes(aes_cbc_encrypt(data, self.key, self.iv))
  44. self.assertEqual(
  45. encrypted,
  46. b'\x97\x92+\xe5\x0b\xc3\x18\x91ky9m&\xb3\xb5@\xe6\'\xc2\x96.\xc8u\x88\xab9-[\x9e|\xf1\xcd')
  47. def test_ctr_decrypt(self):
  48. data = bytes_to_intlist(b'\x03\xc7\xdd\xd4\x8e\xb3\xbc\x1a*O\xdc1\x12+8Aio\xd1z\xb5#\xaf\x08')
  49. decrypted = intlist_to_bytes(aes_ctr_decrypt(data, self.key, self.iv))
  50. self.assertEqual(decrypted.rstrip(b'\x08'), self.secret_msg)
  51. def test_ctr_encrypt(self):
  52. data = bytes_to_intlist(self.secret_msg)
  53. encrypted = intlist_to_bytes(aes_ctr_encrypt(data, self.key, self.iv))
  54. self.assertEqual(
  55. encrypted,
  56. b'\x03\xc7\xdd\xd4\x8e\xb3\xbc\x1a*O\xdc1\x12+8Aio\xd1z\xb5#\xaf\x08')
  57. def test_gcm_decrypt(self):
  58. data = b'\x159Y\xcf5eud\x90\x9c\x85&]\x14\x1d\x0f.\x08\xb4T\xe4/\x17\xbd'
  59. authentication_tag = b'\xe8&I\x80rI\x07\x9d}YWuU@:e'
  60. decrypted = intlist_to_bytes(aes_gcm_decrypt_and_verify(
  61. bytes_to_intlist(data), self.key, bytes_to_intlist(authentication_tag), self.iv[:12]))
  62. self.assertEqual(decrypted.rstrip(b'\x08'), self.secret_msg)
  63. if compat_pycrypto_AES:
  64. decrypted = aes_gcm_decrypt_and_verify_bytes(
  65. data, intlist_to_bytes(self.key), authentication_tag, intlist_to_bytes(self.iv[:12]))
  66. self.assertEqual(decrypted.rstrip(b'\x08'), self.secret_msg)
  67. def test_decrypt_text(self):
  68. password = intlist_to_bytes(self.key).decode('utf-8')
  69. encrypted = base64.b64encode(
  70. intlist_to_bytes(self.iv[:8])
  71. + b'\x17\x15\x93\xab\x8d\x80V\xcdV\xe0\t\xcdo\xc2\xa5\xd8ksM\r\xe27N\xae'
  72. ).decode('utf-8')
  73. decrypted = (aes_decrypt_text(encrypted, password, 16))
  74. self.assertEqual(decrypted, self.secret_msg)
  75. password = intlist_to_bytes(self.key).decode('utf-8')
  76. encrypted = base64.b64encode(
  77. intlist_to_bytes(self.iv[:8])
  78. + b'\x0b\xe6\xa4\xd9z\x0e\xb8\xb9\xd0\xd4i_\x85\x1d\x99\x98_\xe5\x80\xe7.\xbf\xa5\x83'
  79. ).decode('utf-8')
  80. decrypted = (aes_decrypt_text(encrypted, password, 32))
  81. self.assertEqual(decrypted, self.secret_msg)
  82. if __name__ == '__main__':
  83. unittest.main()