mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2024-11-15 13:43:04 +00:00
Compare commits
No commits in common. "0f44636597636cfa9065ee2fa4b7308b203c6a8e" and "4e7f375c949cb152ae953aa834098351f8e5a872" have entirely different histories.
0f44636597
...
4e7f375c94
@ -24,8 +24,6 @@ from yt_dlp.aes import (
|
|||||||
aes_encrypt,
|
aes_encrypt,
|
||||||
aes_gcm_decrypt_and_verify,
|
aes_gcm_decrypt_and_verify,
|
||||||
aes_gcm_decrypt_and_verify_bytes,
|
aes_gcm_decrypt_and_verify_bytes,
|
||||||
key_expansion,
|
|
||||||
pad_block,
|
|
||||||
)
|
)
|
||||||
from yt_dlp.dependencies import Cryptodome_AES
|
from yt_dlp.dependencies import Cryptodome_AES
|
||||||
from yt_dlp.utils import bytes_to_intlist, intlist_to_bytes
|
from yt_dlp.utils import bytes_to_intlist, intlist_to_bytes
|
||||||
@ -114,41 +112,6 @@ class TestAES(unittest.TestCase):
|
|||||||
decrypted = intlist_to_bytes(aes_ecb_decrypt(data, self.key, self.iv))
|
decrypted = intlist_to_bytes(aes_ecb_decrypt(data, self.key, self.iv))
|
||||||
self.assertEqual(decrypted.rstrip(b'\x08'), self.secret_msg)
|
self.assertEqual(decrypted.rstrip(b'\x08'), self.secret_msg)
|
||||||
|
|
||||||
def test_key_expansion(self):
|
|
||||||
key = '4f6bdaa39e2f8cb07f5e722d9edef314'
|
|
||||||
|
|
||||||
self.assertEqual(key_expansion(bytes_to_intlist(bytearray.fromhex(key))), [
|
|
||||||
0x4F, 0x6B, 0xDA, 0xA3, 0x9E, 0x2F, 0x8C, 0xB0, 0x7F, 0x5E, 0x72, 0x2D, 0x9E, 0xDE, 0xF3, 0x14,
|
|
||||||
0x53, 0x66, 0x20, 0xA8, 0xCD, 0x49, 0xAC, 0x18, 0xB2, 0x17, 0xDE, 0x35, 0x2C, 0xC9, 0x2D, 0x21,
|
|
||||||
0x8C, 0xBE, 0xDD, 0xD9, 0x41, 0xF7, 0x71, 0xC1, 0xF3, 0xE0, 0xAF, 0xF4, 0xDF, 0x29, 0x82, 0xD5,
|
|
||||||
0x2D, 0xAD, 0xDE, 0x47, 0x6C, 0x5A, 0xAF, 0x86, 0x9F, 0xBA, 0x00, 0x72, 0x40, 0x93, 0x82, 0xA7,
|
|
||||||
0xF9, 0xBE, 0x82, 0x4E, 0x95, 0xE4, 0x2D, 0xC8, 0x0A, 0x5E, 0x2D, 0xBA, 0x4A, 0xCD, 0xAF, 0x1D,
|
|
||||||
0x54, 0xC7, 0x26, 0x98, 0xC1, 0x23, 0x0B, 0x50, 0xCB, 0x7D, 0x26, 0xEA, 0x81, 0xB0, 0x89, 0xF7,
|
|
||||||
0x93, 0x60, 0x4E, 0x94, 0x52, 0x43, 0x45, 0xC4, 0x99, 0x3E, 0x63, 0x2E, 0x18, 0x8E, 0xEA, 0xD9,
|
|
||||||
0xCA, 0xE7, 0x7B, 0x39, 0x98, 0xA4, 0x3E, 0xFD, 0x01, 0x9A, 0x5D, 0xD3, 0x19, 0x14, 0xB7, 0x0A,
|
|
||||||
0xB0, 0x4E, 0x1C, 0xED, 0x28, 0xEA, 0x22, 0x10, 0x29, 0x70, 0x7F, 0xC3, 0x30, 0x64, 0xC8, 0xC9,
|
|
||||||
0xE8, 0xA6, 0xC1, 0xE9, 0xC0, 0x4C, 0xE3, 0xF9, 0xE9, 0x3C, 0x9C, 0x3A, 0xD9, 0x58, 0x54, 0xF3,
|
|
||||||
0xB4, 0x86, 0xCC, 0xDC, 0x74, 0xCA, 0x2F, 0x25, 0x9D, 0xF6, 0xB3, 0x1F, 0x44, 0xAE, 0xE7, 0xEC])
|
|
||||||
|
|
||||||
def test_pad_block(self):
|
|
||||||
block = [0x21, 0xA0, 0x43, 0xFF]
|
|
||||||
|
|
||||||
self.assertEqual(pad_block(block, 'pkcs7'),
|
|
||||||
block + [0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C])
|
|
||||||
|
|
||||||
self.assertEqual(pad_block(block, 'iso7816'),
|
|
||||||
block + [0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
|
|
||||||
|
|
||||||
self.assertEqual(pad_block(block, 'whitespace'),
|
|
||||||
block + [0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20])
|
|
||||||
|
|
||||||
self.assertEqual(pad_block(block, 'zero'),
|
|
||||||
block + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
|
|
||||||
|
|
||||||
block = list(range(16))
|
|
||||||
for mode in ('pkcs7', 'iso7816', 'whitespace', 'zero'):
|
|
||||||
self.assertEqual(pad_block(block, mode), block, mode)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
@ -430,15 +430,13 @@ class YoutubeDL:
|
|||||||
retry_sleep_functions: Dictionary of functions that takes the number of attempts
|
retry_sleep_functions: Dictionary of functions that takes the number of attempts
|
||||||
as argument and returns the time to sleep in seconds.
|
as argument and returns the time to sleep in seconds.
|
||||||
Allowed keys are 'http', 'fragment', 'file_access'
|
Allowed keys are 'http', 'fragment', 'file_access'
|
||||||
download_ranges: A callback function that gets called for every video with
|
download_ranges: A function that gets called for every video with the signature
|
||||||
the signature (info_dict, ydl) -> Iterable[Section].
|
(info_dict, *, ydl) -> Iterable[Section].
|
||||||
Only the returned sections will be downloaded.
|
Only the returned sections will be downloaded. Each Section contains:
|
||||||
Each Section is a dict with the following keys:
|
|
||||||
* start_time: Start time of the section in seconds
|
* start_time: Start time of the section in seconds
|
||||||
* end_time: End time of the section in seconds
|
* end_time: End time of the section in seconds
|
||||||
* title: Section title (Optional)
|
* title: Section title (Optional)
|
||||||
* index: Section number (Optional)
|
* index: Section number (Optional)
|
||||||
force_keyframes_at_cuts: Re-encode the video when downloading ranges to get precise cuts
|
|
||||||
|
|
||||||
The following parameters are not used by YoutubeDL itself, they are used by
|
The following parameters are not used by YoutubeDL itself, they are used by
|
||||||
the downloader (see yt_dlp/downloader/common.py):
|
the downloader (see yt_dlp/downloader/common.py):
|
||||||
|
@ -31,33 +31,6 @@ def unpad_pkcs7(data):
|
|||||||
BLOCK_SIZE_BYTES = 16
|
BLOCK_SIZE_BYTES = 16
|
||||||
|
|
||||||
|
|
||||||
def pad_block(block, padding_mode):
|
|
||||||
"""
|
|
||||||
Pad a block with the given padding mode
|
|
||||||
@param {int[]} block block to pad
|
|
||||||
@param padding_mode padding mode
|
|
||||||
"""
|
|
||||||
padding_size = BLOCK_SIZE_BYTES - len(block)
|
|
||||||
|
|
||||||
PADDING_BYTE = {
|
|
||||||
'pkcs7': padding_size,
|
|
||||||
'iso7816': 0x0,
|
|
||||||
'whitespace': 0x20,
|
|
||||||
'zero': 0x0,
|
|
||||||
}
|
|
||||||
|
|
||||||
if padding_size < 0:
|
|
||||||
raise ValueError('Block size exceeded')
|
|
||||||
elif padding_mode not in PADDING_BYTE:
|
|
||||||
raise NotImplementedError(f'Padding mode {padding_mode} is not implemented')
|
|
||||||
|
|
||||||
if padding_mode == 'iso7816' and padding_size:
|
|
||||||
block = block + [0x80] # NB: += mutates list
|
|
||||||
padding_size -= 1
|
|
||||||
|
|
||||||
return block + [PADDING_BYTE[padding_mode]] * padding_size
|
|
||||||
|
|
||||||
|
|
||||||
def aes_ecb_encrypt(data, key, iv=None):
|
def aes_ecb_encrypt(data, key, iv=None):
|
||||||
"""
|
"""
|
||||||
Encrypt with aes in ECB mode
|
Encrypt with aes in ECB mode
|
||||||
@ -164,14 +137,13 @@ def aes_cbc_decrypt(data, key, iv):
|
|||||||
return decrypted_data
|
return decrypted_data
|
||||||
|
|
||||||
|
|
||||||
def aes_cbc_encrypt(data, key, iv, padding_mode='pkcs7'):
|
def aes_cbc_encrypt(data, key, iv):
|
||||||
"""
|
"""
|
||||||
Encrypt with aes in CBC mode
|
Encrypt with aes in CBC mode. Using PKCS#7 padding
|
||||||
|
|
||||||
@param {int[]} data cleartext
|
@param {int[]} data cleartext
|
||||||
@param {int[]} key 16/24/32-Byte cipher key
|
@param {int[]} key 16/24/32-Byte cipher key
|
||||||
@param {int[]} iv 16-Byte IV
|
@param {int[]} iv 16-Byte IV
|
||||||
@param padding_mode Padding mode to use
|
|
||||||
@returns {int[]} encrypted data
|
@returns {int[]} encrypted data
|
||||||
"""
|
"""
|
||||||
expanded_key = key_expansion(key)
|
expanded_key = key_expansion(key)
|
||||||
@ -181,8 +153,8 @@ def aes_cbc_encrypt(data, key, iv, padding_mode='pkcs7'):
|
|||||||
previous_cipher_block = iv
|
previous_cipher_block = iv
|
||||||
for i in range(block_count):
|
for i in range(block_count):
|
||||||
block = data[i * BLOCK_SIZE_BYTES: (i + 1) * BLOCK_SIZE_BYTES]
|
block = data[i * BLOCK_SIZE_BYTES: (i + 1) * BLOCK_SIZE_BYTES]
|
||||||
block = pad_block(block, padding_mode)
|
remaining_length = BLOCK_SIZE_BYTES - len(block)
|
||||||
|
block += [remaining_length] * remaining_length
|
||||||
mixed_block = xor(block, previous_cipher_block)
|
mixed_block = xor(block, previous_cipher_block)
|
||||||
|
|
||||||
encrypted_block = aes_encrypt(mixed_block, expanded_key)
|
encrypted_block = aes_encrypt(mixed_block, expanded_key)
|
||||||
@ -538,6 +510,5 @@ __all__ = [
|
|||||||
'aes_gcm_decrypt_and_verify',
|
'aes_gcm_decrypt_and_verify',
|
||||||
'aes_gcm_decrypt_and_verify_bytes',
|
'aes_gcm_decrypt_and_verify_bytes',
|
||||||
'key_expansion',
|
'key_expansion',
|
||||||
'pad_block',
|
|
||||||
'unpad_pkcs7',
|
'unpad_pkcs7',
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user