]> jfr.im git - yt-dlp.git/blame - test/test_aes.py
[cleanup] Upgrade syntax
[yt-dlp.git] / test / test_aes.py
CommitLineData
cc52de43 1#!/usr/bin/env python3
a7d9ded4
JMF
2# Allow direct execution
3import os
4import sys
5import unittest
6sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
7
09906f55
ÁS
8from yt_dlp.aes import (
9 aes_decrypt,
10 aes_encrypt,
a04e0055
THD
11 aes_ecb_encrypt,
12 aes_ecb_decrypt,
09906f55
ÁS
13 aes_cbc_decrypt,
14 aes_cbc_decrypt_bytes,
15 aes_cbc_encrypt,
16 aes_ctr_decrypt,
17 aes_ctr_encrypt,
18 aes_gcm_decrypt_and_verify,
19 aes_gcm_decrypt_and_verify_bytes,
a04e0055
THD
20 aes_decrypt_text,
21 BLOCK_SIZE_BYTES,
09906f55
ÁS
22)
23from yt_dlp.compat import compat_pycrypto_AES
7a5c1cfe 24from yt_dlp.utils import bytes_to_intlist, intlist_to_bytes
a7d9ded4
JMF
25import base64
26
27# the encrypted data can be generate with 'devscripts/generate_aes_testdata.py'
28
29
30class TestAES(unittest.TestCase):
31 def setUp(self):
32 self.key = self.iv = [0x20, 0x15] + 14 * [0]
33 self.secret_msg = b'Secret message goes here'
34
35 def test_encrypt(self):
36 msg = b'message'
37 key = list(range(16))
38 encrypted = aes_encrypt(bytes_to_intlist(msg), key)
39 decrypted = intlist_to_bytes(aes_decrypt(encrypted, key))
40 self.assertEqual(decrypted, msg)
41
42 def test_cbc_decrypt(self):
09906f55
ÁS
43 data = b'\x97\x92+\xe5\x0b\xc3\x18\x91ky9m&\xb3\xb5@\xe6\x27\xc2\x96.\xc8u\x88\xab9-[\x9e|\xf1\xcd'
44 decrypted = intlist_to_bytes(aes_cbc_decrypt(bytes_to_intlist(data), self.key, self.iv))
a7d9ded4 45 self.assertEqual(decrypted.rstrip(b'\x08'), self.secret_msg)
09906f55
ÁS
46 if compat_pycrypto_AES:
47 decrypted = aes_cbc_decrypt_bytes(data, intlist_to_bytes(self.key), intlist_to_bytes(self.iv))
48 self.assertEqual(decrypted.rstrip(b'\x08'), self.secret_msg)
a7d9ded4 49
c9619f0a
YCH
50 def test_cbc_encrypt(self):
51 data = bytes_to_intlist(self.secret_msg)
52 encrypted = intlist_to_bytes(aes_cbc_encrypt(data, self.key, self.iv))
53 self.assertEqual(
54 encrypted,
09906f55
ÁS
55 b'\x97\x92+\xe5\x0b\xc3\x18\x91ky9m&\xb3\xb5@\xe6\'\xc2\x96.\xc8u\x88\xab9-[\x9e|\xf1\xcd')
56
57 def test_ctr_decrypt(self):
58 data = bytes_to_intlist(b'\x03\xc7\xdd\xd4\x8e\xb3\xbc\x1a*O\xdc1\x12+8Aio\xd1z\xb5#\xaf\x08')
59 decrypted = intlist_to_bytes(aes_ctr_decrypt(data, self.key, self.iv))
60 self.assertEqual(decrypted.rstrip(b'\x08'), self.secret_msg)
61
62 def test_ctr_encrypt(self):
63 data = bytes_to_intlist(self.secret_msg)
64 encrypted = intlist_to_bytes(aes_ctr_encrypt(data, self.key, self.iv))
65 self.assertEqual(
66 encrypted,
67 b'\x03\xc7\xdd\xd4\x8e\xb3\xbc\x1a*O\xdc1\x12+8Aio\xd1z\xb5#\xaf\x08')
68
69 def test_gcm_decrypt(self):
70 data = b'\x159Y\xcf5eud\x90\x9c\x85&]\x14\x1d\x0f.\x08\xb4T\xe4/\x17\xbd'
71 authentication_tag = b'\xe8&I\x80rI\x07\x9d}YWuU@:e'
72
73 decrypted = intlist_to_bytes(aes_gcm_decrypt_and_verify(
74 bytes_to_intlist(data), self.key, bytes_to_intlist(authentication_tag), self.iv[:12]))
75 self.assertEqual(decrypted.rstrip(b'\x08'), self.secret_msg)
76 if compat_pycrypto_AES:
77 decrypted = aes_gcm_decrypt_and_verify_bytes(
78 data, intlist_to_bytes(self.key), authentication_tag, intlist_to_bytes(self.iv[:12]))
79 self.assertEqual(decrypted.rstrip(b'\x08'), self.secret_msg)
c9619f0a 80
a7d9ded4
JMF
81 def test_decrypt_text(self):
82 password = intlist_to_bytes(self.key).decode('utf-8')
83 encrypted = base64.b64encode(
3089bc74
S
84 intlist_to_bytes(self.iv[:8])
85 + b'\x17\x15\x93\xab\x8d\x80V\xcdV\xe0\t\xcdo\xc2\xa5\xd8ksM\r\xe27N\xae'
4c8fea92 86 ).decode('utf-8')
a7d9ded4
JMF
87 decrypted = (aes_decrypt_text(encrypted, password, 16))
88 self.assertEqual(decrypted, self.secret_msg)
89
f9544f6e
JMF
90 password = intlist_to_bytes(self.key).decode('utf-8')
91 encrypted = base64.b64encode(
3089bc74
S
92 intlist_to_bytes(self.iv[:8])
93 + b'\x0b\xe6\xa4\xd9z\x0e\xb8\xb9\xd0\xd4i_\x85\x1d\x99\x98_\xe5\x80\xe7.\xbf\xa5\x83'
4c8fea92 94 ).decode('utf-8')
f9544f6e
JMF
95 decrypted = (aes_decrypt_text(encrypted, password, 32))
96 self.assertEqual(decrypted, self.secret_msg)
97
a04e0055
THD
98 def test_ecb_encrypt(self):
99 data = bytes_to_intlist(self.secret_msg)
100 data += [0x08] * (BLOCK_SIZE_BYTES - len(data) % BLOCK_SIZE_BYTES)
101 encrypted = intlist_to_bytes(aes_ecb_encrypt(data, self.key, self.iv))
102 self.assertEqual(
103 encrypted,
104 b'\xaa\x86]\x81\x97>\x02\x92\x9d\x1bR[[L/u\xd3&\xd1(h\xde{\x81\x94\xba\x02\xae\xbd\xa6\xd0:')
105
106 def test_ecb_decrypt(self):
107 data = bytes_to_intlist(b'\xaa\x86]\x81\x97>\x02\x92\x9d\x1bR[[L/u\xd3&\xd1(h\xde{\x81\x94\xba\x02\xae\xbd\xa6\xd0:')
108 decrypted = intlist_to_bytes(aes_ecb_decrypt(data, self.key, self.iv))
109 self.assertEqual(decrypted.rstrip(b'\x08'), self.secret_msg)
110
582be358 111
a7d9ded4
JMF
112if __name__ == '__main__':
113 unittest.main()