diff options
| -rw-r--r-- | test/test_aes.py | 9 | ||||
| -rw-r--r-- | youtube_dl/aes.py | 28 | 
2 files changed, 36 insertions, 1 deletions
| diff --git a/test/test_aes.py b/test/test_aes.py index 54078a66d..78a28751b 100644 --- a/test/test_aes.py +++ b/test/test_aes.py @@ -8,7 +8,7 @@ import sys  import unittest  sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from youtube_dl.aes import aes_decrypt, aes_encrypt, aes_cbc_decrypt, aes_decrypt_text +from youtube_dl.aes import aes_decrypt, aes_encrypt, aes_cbc_decrypt, aes_cbc_encrypt, aes_decrypt_text  from youtube_dl.utils import bytes_to_intlist, intlist_to_bytes  import base64 @@ -34,6 +34,13 @@ class TestAES(unittest.TestCase):          decrypted = intlist_to_bytes(aes_cbc_decrypt(data, self.key, self.iv))          self.assertEqual(decrypted.rstrip(b'\x08'), self.secret_msg) +    def test_cbc_encrypt(self): +        data = bytes_to_intlist(self.secret_msg) +        encrypted = intlist_to_bytes(aes_cbc_encrypt(data, self.key, self.iv)) +        self.assertEqual( +            encrypted, +            b"\x97\x92+\xe5\x0b\xc3\x18\x91ky9m&\xb3\xb5@\xe6'\xc2\x96.\xc8u\x88\xab9-[\x9e|\xf1\xcd") +      def test_decrypt_text(self):          password = intlist_to_bytes(self.key).decode('utf-8')          encrypted = base64.b64encode( diff --git a/youtube_dl/aes.py b/youtube_dl/aes.py index b8ff45481..c5bb3c4ef 100644 --- a/youtube_dl/aes.py +++ b/youtube_dl/aes.py @@ -60,6 +60,34 @@ def aes_cbc_decrypt(data, key, iv):      return decrypted_data +def aes_cbc_encrypt(data, key, iv): +    """ +    Encrypt with aes in CBC mode. Using PKCS#7 padding + +    @param {int[]} data        cleartext +    @param {int[]} key         16/24/32-Byte cipher key +    @param {int[]} iv          16-Byte IV +    @returns {int[]}           encrypted data +    """ +    expanded_key = key_expansion(key) +    block_count = int(ceil(float(len(data)) / BLOCK_SIZE_BYTES)) + +    encrypted_data = [] +    previous_cipher_block = iv +    for i in range(block_count): +        block = data[i * BLOCK_SIZE_BYTES: (i + 1) * BLOCK_SIZE_BYTES] +        remaining_length = BLOCK_SIZE_BYTES - len(block) +        block += [remaining_length] * remaining_length +        mixed_block = xor(block, previous_cipher_block) + +        encrypted_block = aes_encrypt(mixed_block, expanded_key) +        encrypted_data += encrypted_block + +        previous_cipher_block = encrypted_block + +    return encrypted_data + +  def key_expansion(data):      """      Generate key schedule | 
