
    yfW                     L   d dl Z d dlmZ ddlmZ ddlmZ ddlmZm	Z	 ej                  rd Zd Znd	 Zd
 Zd ZdZd Zd Zd Zd2dZd2dZd Zd Zd ZdddZd Zd Zd Zd ZdZdZdZdZd Z d!Z!d"Z"d# Z#d$ Z$d% Z%d& Z&d' Z'd( Z(d) Z)d* Z*d+ Z+d, Z,d- Z-d. Z.d/ Z/d0 Z0g d1Z1y)3    N)ceil   
compat_ord)
Cryptodome)bytes_to_intlistintlist_to_bytesc                     t         j                  j                  |t         j                  j                  |      j	                  |       S )z/ Decrypt bytes with AES-CBC using pycryptodome )r   AESnewMODE_CBCdecryptdatakeyivs      ,/usr/lib/python3/dist-packages/yt_dlp/aes.pyaes_cbc_decrypt_bytesr   	   s0    ~~!!#z~~'>'>CKKDQQ    c                     t         j                  j                  |t         j                  j                  |      j	                  | |      S )z/ Decrypt bytes with AES-GCM using pycryptodome )r   r   r   MODE_GCMdecrypt_and_verifyr   r   tagnonces       r    aes_gcm_decrypt_and_verify_bytesr      s4    ~~!!#z~~'>'>FYYZ^`cddr   c           
      F    t        t        t        t        | ||f             S )zZ Decrypt bytes with AES-CBC using native implementation since pycryptodome is unavailable )r	   aes_cbc_decryptmapr   r   s      r   r   r      s!    5EcSU1W XYYr   c                 H    t        t        t        t        | |||f             S )zZ Decrypt bytes with AES-GCM using native implementation since pycryptodome is unavailable )r	   aes_gcm_decrypt_and_verifyr   r   r   s       r   r   r      s(     :C@PSWY\^achRi<j kllr   c           
      L    t        t        t        t        | ||f      i |      S N)r	   aes_cbc_encryptr   r   )r   r   r   kwargss       r   aes_cbc_encrypt_bytesr&      s&    OS1AD#r?-S^W]^__r      c                 &    | d t        | d           S )Nr   r   s    r   unpad_pkcs7r+   "   s    &*T"X&&''r   c                 F    t         t        |       t         z  z
  }| |g|z  z   S )zn
    PKCS#7 padding

    @param {int[]} data        cleartext
    @returns {int[]}           padding data
    )BLOCK_SIZE_BYTESlen)r   remaining_lengths     r   pkcs7_paddingr0   &   s.     (#d)6F*FF#$'7777r   c                     t         t        |       z
  }|dddd}|dk  rt        d      ||vrt        d| d      |dk(  r|r| dgz   } |d	z  }| ||   g|z  z   S )
z
    Pad a block with the given padding mode
    @param {int[]} block        block to pad
    @param padding_mode         padding mode
    r       )pkcs7iso7816
whitespacezerozBlock size exceededzPadding mode z is not implementedr4      r   )r-   r.   
ValueErrorNotImplementedError)blockpadding_modepadding_sizePADDING_BYTEs       r   	pad_blockr>   2   s     $c%j0L 	L a.//	\	)!M,?R"STTy \L./,>>>r   c           	          t        |      }t        t        t        t	        |             t
        z              }g }t        |      D ]0  }| |t
        z  |dz   t
        z   }|t        t        |      |      z  }2 |S )a   
    Encrypt with aes in ECB mode. Using PKCS#7 padding

    @param {int[]} data        cleartext
    @param {int[]} key         16/24/32-Byte cipher key
    @param {int[]} iv          Unused for this mode
    @returns {int[]}           encrypted data
    r   )	key_expansionintr   floatr.   r-   rangeaes_encryptr0   r   r   r   expanded_keyblock_countencrypted_datair:   s           r   aes_ecb_encryptrJ   M   s     !%Ld5T+.>>?@KN; JQ))AE5E+EF+mE&:LIIJ r   c           	          t        |      }t        t        t        t	        |             t
        z              }g }t        |      D ]'  }| |t
        z  |dz   t
        z   }|t        ||      z  }) |dt	        |        }|S )z
    Decrypt with aes in ECB mode

    @param {int[]} data        cleartext
    @param {int[]} key         16/24/32-Byte cipher key
    @param {int[]} iv          Unused for this mode
    @returns {int[]}           decrypted data
    r   N)r@   rA   r   rB   r.   r-   rC   aes_decryptrE   s           r   aes_ecb_decryptrM   a   s     !%Ld5T+.>>?@KN; ;Q))AE5E+EF+e\::; $JSY/Nr   c                     t        | ||      S )z
    Decrypt with aes in counter mode

    @param {int[]} data        cipher
    @param {int[]} key         16/24/32-Byte cipher key
    @param {int[]} iv          16-Byte initialization vector
    @returns {int[]}           decrypted data
    )aes_ctr_encryptr   s      r   aes_ctr_decryptrP   v   s     4b))r   c           	      v   t        |      }t        t        t        t	        |             t
        z              }t        |      }g }t        |      D ]W  }t        |      }| |t
        z  |dz   t
        z   }	|	dgt
        t	        |	      z
  z  z  }	t        ||      }
|t        |	|
      z  }Y |dt	        |        }|S )z
    Encrypt with aes in counter mode

    @param {int[]} data        cleartext
    @param {int[]} key         16/24/32-Byte cipher key
    @param {int[]} iv          16-Byte initialization vector
    @returns {int[]}           encrypted data
    r   r   N)r@   rA   r   rB   r.   r-   iter_vectorrC   nextrD   xor)r   r   r   rF   rG   counterrH   rI   counter_blockr:   cipher_counter_blocks              r   rO   rO      s     !%Ld5T+.>>?@K"oGN; ;WQ))AE5E+EF!(3u:566*=,G#e%9::; $JSY/Nr   c           	      R   t        |      }t        t        t        t	        |             t
        z              }g }|}t        |      D ]N  }| |t
        z  |dz   t
        z   }|dgt
        t	        |      z
  z  z  }t        ||      }	|t        |	|      z  }|}P |dt	        |        }|S )z
    Decrypt with aes in CBC mode

    @param {int[]} data        cipher
    @param {int[]} key         16/24/32-Byte cipher key
    @param {int[]} iv          16-Byte IV
    @returns {int[]}           decrypted data
    r   r   N)	r@   rA   r   rB   r.   r-   rC   rL   rT   )
r   r   r   rF   rG   decrypted_dataprevious_cipher_blockrI   r:   decrypted_blocks
             r   r   r      s     !%Ld5T+.>>?@KN; &Q))AE5E+EF!(3u:566%e\:#o/DEE %& $JSY/Nr   r3   )r;   c          	          t        |      }t        t        t        t	        |             t
        z              }g }|}t        |      D ]C  }| |t
        z  |dz   t
        z   }	t        |	|      }	t        |	|      }
t        |
|      }||z  }|}E |S )a  
    Encrypt with aes in CBC mode

    @param {int[]} data        cleartext
    @param {int[]} key         16/24/32-Byte cipher key
    @param {int[]} iv          16-Byte IV
    @param padding_mode        Padding mode to use
    @returns {int[]}           encrypted data
    r   )
r@   rA   r   rB   r.   r-   rC   r>   rT   rD   )r   r   r   r;   rF   rG   rH   rZ   rI   r:   mixed_blockencrypted_blocks               r   r$   r$      s     !%Ld5T+.>>?@KN; 	0Q))AE5E+EF%.%!67%k<@/) /	0 r   c                    t        dgt        z  t        |            }t        |      dk(  r|g dz   }n`t        t        |      t        z  z
  t        z  dz   }|dg|z  z   t	        dt        |      z  j                  dd            z   }t        ||      }t        |      }t        | ||dgt        t        |      z
  z  z         }	t        |       dz  dz  }
t        || dgt        t        |       z
  |
z   z  z   t	        dj                  dd      t        |       dz  j                  dd      z         z         }|t        |||      k7  rt        d      |	S )a9  
    Decrypt with aes in GBM mode and checks authenticity using tag

    @param {int[]} data        cipher
    @param {int[]} key         16-Byte cipher key
    @param {int[]} tag         authentication tag
    @param {int[]} nonce       IV (recommended 12-Byte)
    @returns {int[]}           decrypted data
    r      )r   r   r   r      bigr'   zMismatching authentication tag)rD   r-   r@   r.   r   to_bytesghashincrP   rO   r8   )r   r   r   r   hash_subkeyj0fillghash_iniv_ctrrY   pad_lens_tags               r   r!   r!      sd    qc$44mC6HIK
5zR\! CJ1A$ABFVVYZZA3:%(8!c%j.9R9RSTV[9\(]];)
 WF$T3!@PSVW]S^@^9_0_`N$i2o"G#!CI-7
8	9
E++Au5"4y1}66q%@B C	CE oeS"--9::r   c                 &   t        |      t        z  dz
  }t        | |dt               } t        d|dz         D ]V  }t	        |       } t        |       } ||k7  rt        t        | t                    } t        | ||t        z  |dz   t        z         } X | S )z
    Encrypt one block with aes

    @param {int[]} data          16-Byte state
    @param {int[]} expanded_key  176/208/240-Byte expanded key
    @returns {int[]}             16-Byte cipher
    r   N)	r.   r-   rT   rC   	sub_bytes
shift_rowslistiter_mix_columnsMIX_COLUMN_MATRIXr   rF   roundsrI   s       r   rD   rD      s     "22Q6Ft\"3#345D1fqj! Y$;(/@ABD4a*:&:QUFV<VWXY Kr   c                 "   t        |      t        z  dz
  }t        |dd      D ]V  }t        | ||t        z  |dz   t        z         } ||k7  rt	        t        | t                    } t        |       } t        |       } X t        | |dt               } | S )z
    Decrypt one block with aes

    @param {int[]} data          16-Byte cipher
    @param {int[]} expanded_key  176/208/240-Byte expanded key
    @returns {int[]}             16-Byte state
    r   r   r)   N)	r.   r-   rC   rT   rp   rq   MIX_COLUMN_MATRIX_INVshift_rows_invsub_bytes_invrs   s       r   rL   rL     s     "22Q6F61b! #4a*:&:QUFV<VWX;(/DEFDd#T"# t\"3#345DKr   c                 T   d}t        t        j                  |             } t        |j                               }|d| dg|t	        |      z
  z  z   }t        |dt         t        |            |t        z  z  }| d| }| |d }t        |||dgt        |z
  z  z         }t        |      }|S )af  
    Decrypt text
    - The first 8 Bytes of decoded 'data' are the 8 high Bytes of the counter
    - The cipher key is retrieved by encrypting the first 16 Byte of 'password'
      with the first 'key_size_bytes' Bytes from 'password' (if necessary filled with 0's)
    - Mode of operation is 'counter'

    @param {str} data                    Base64 encoded string
    @param {str,unicode} password        Password (will be encoded with utf-8)
    @param {int} key_size_bytes          Possible values: 16 for 128-Bit, 24 for 192-Bit or 32 for 256-Bit
    @returns {str}                       Decrypted data
    ra   Nr   )
r   base64	b64decodeencoder.   rD   r-   r@   rP   r	   )	r   passwordkey_size_bytesNONCE_LENGTH_BYTESr   r   cipherrY   	plaintexts	            r   aes_decrypt_textr   (  s     F,,T23D 12H
?N
#qc^c(m-K&L
LC
c++,mC.@
A^WgEg
hC$$%E$%&F$VS%1#AQTfAf:g2ghN 0Ir   )   r         ra   r'   r2   @   r7      6   (   c   |   w   {      k   o      0   r   g   +            v            }      Y   G                        r               &   r   ?         4            q      1      r      #                        r7         '      u   	      ,      r   n   Z      R   ;         )      /      S      r      r2         [   j         9   J   L   X                  C   M   3      E      r      P   <         Q      r            8               !   r'               r`         _      D            ~   =   d   ]      s   `      O      "   *         F               ^            2   :   
   I      $   \            b            y         7   m   r      N      l   V         e   z      ra      x   %   .                     t      K            p   >      f   H            a   5   W                              i                           U   (                        B   h   A      -         T         (   r   r   r   r2  r   r   r   r   rp  r   r   r[  r  r   r   r   r   r   r   r   rd  r   r   rf  r   rb  r   r  r  r  rg  r   ry  r   rc  r  rA  r&  r   r	  r  r   r+  r  rr  r   r   r3  ra   r?  rm  rO  rj  ra  r$  r   r   r   r   r"  r1  rJ  r   r>  r   r]  rR  r
  rX  rs  r^  r{  r   r   r%  r   r  r9  r   r   r5  rL  rP  r   r   r   rW  r   r  r   r  rV  r  r   r   r   r  r   r   r   rl  r   r'  r!  r   r,  r   r   r  r   r   r#  r   r   re  r   r   r   rw  r   rY  r   rI  rQ  r   r   rK  r   r   r*  r_  rt  r  r   r  r8  r  r   r   rh  r   rB  rq  r  r   r(  rF  r  r.  r   rU  r   r   r   r0  rD  r@  r   rk  r   r   r   r   r   rZ  r   r   rn  r   r   r)  rS  r   r   r   r   r   r6  rM  rH  rC  r   r-  r2   r   r  r   r   r=  r   r   r7  rG  rE  r   r   r  r   r   r   r   r   r'   r   r   r7   r  r  r  r   r   r4  r  rN  r   ro  rv  r   r:  r   r   r   r   r   r   r  r   r   r;  r  r   rx  r/  r   rz  r   r   r   ru  rT  r  r   r   r  r<  r   r   r   r\  r`  r  r   ri  r   r`   r   ))r   rQ  r   r   )r   r   rQ  r   )r   r   r   rQ  )rQ  r   r   r   ))rS  r  ro  r   )r   rS  r  ro  )ro  r   rS  r  )r  ro  r   rS  (   r   rQ  r   rw  r_  r   ri  r   r   r?  r   r   rm  r]  r   rU  r  r\  r   rP  r   r  r+  r   r   r   r#  r!  re  r  rO  r   r   r   r%  r,  r0  r   r   r   r   r   ra  rL  r  r   rq  r   r   r   r   r`   r  r   r  r   r  r   rs  r  r'  r   r   r   r   r   r   r4  r  r   r   r   r)  rA  r   ra   r   rj  r=  r  r   r[  rW  r   r   rI  r  r   r  r^  r   rh  r"  r  r   r   rN  r  rV  r   r'   r   r   r   r  rZ  r   r`  rz  r   rT  r   r   r  r   r   rf  r   r   r  r   r   r   r;  rg  r2   r  r   r   r{  r   r3  r   r1  r   r&  r  r.  r  r6  r   r   r   rt  r   r  r   r	  r   r   r   r   r   r   r   rF  r   rp  r   r   r   r<  r2  r
  r(  r   r  r  r   r   r   rk  r:  rb  rn  r7   rd  r   rY  r   rD  r   r9  r   r8  r>  r   r   r/  r   r   ry  r   rG  r   r   r   r7  r   r   r   rv  r   ru  rx  r   r  r   r   r   r   r  r-  rJ  rX  r*  r   r   rM  rr  rC  r   r   rS  r   r   r   r  r   r   r   rl  r   rK  r   rc  r  r   ro  r  r   rH  rE  r   r   r  r   r   r@  r$  r5  rB  r   r   rR  r   (   r   r   r  r   r  r   r   rC  rH  r   r   rs  r   r  rk  rQ  r
  r   r  rS  r   r   r  r   r   r   ra   r/  r]  r`  r@  rY  r   r&  rZ  rN  r   rW  r   r   r   r,  rA  r   r   r   r   r=  r9  r   rK  r   r   rw  r\  r$  r   r   r   r   rU  r   r   rb  r   r   r  rI  r   r   rh  rc  r   r%  r   r   r   r  r   r   rO  rE  r   r   rp  r#  rJ  r)  r   r>  r   r^  r  r  r*  r'   r  r   rP  r   r   r   re  rr  r   r   rj  ry  r   r   r	  r<  r   r-  r!  r   rd  r   r  r   r3  r   r(  r   r   r  r  rV  r   r   r   r   r7  r8  r   rF  r  r;  rg  r2  r.  rq  r   rD  r   r   r   r:  r   r{  r  r   r   r   r  rx  r   r4  r   r   r   r`   rR  r   r  r  r"  r  r   r   rG  rv  r   r   r   r   r   rz  rM  r   r   r  r   rX  r   r   rm  r5  r   ri  r   r   r  r   rf  r  rT  r   r  r   r   r+  r   r   r0  r   r   r   r   r   r   r   rt  r   r1  r   r  r  r[  r  r6  r   r'  r   r  r_  r   ra  r   r2   r?  rn  rB  r   r  r   r   ru  r   r   r   r   r   r  r   r   r   r   ro  r   rl  r7   r   r   rL  r   c           	         | dd } d}t        |       }|dz  dz   t        z  }t        |       |k  r| dd }t        ||      }|dz  }| t        || | d|z
         z  } t	        d      D ]  }| dd }| t        || | d|z
         z  }  |dk(  r&| dd }t        |      }| t        || | d|z
         z  } t	        |dk(  rdn|dk(  rd	nd
      D ]  }| dd }| t        || | d|z
         z  }  t        |       |k  r| d| } | S )z
    Generate key schedule

    @param {int[]} data  16/24/32-Byte cipher key
    @returns {int[]}     176/208/240-Byte expanded key
    Nr   r   r   rQ  r2   r   r   r   )r.   r-   key_schedule_corerT   rC   rn   )r   rcon_iterationr~   expanded_key_size_bytestemp_s         r   r@   r@     sq    7DNYN-2Q6:JJ
d)-
-BCy ~6!D$N0BCDDq 	IA9DCdN?A4FGHHD	I R9DT?DCdN?A4FGHHDNb0q>R;OaUVW 	IA9DCdN?A4FGHHD	I d)-
-$ (()DKr   c              #   ,   K   	 |  t        |       } wr#   )re   )r   s    r   rR   rR     s     
W s   c                 :    | D cg c]  }t         |    c}S c c}w r#   )SBOXr   xs     r   rn   rn     s    !"DG"""   c                 :    | D cg c]  }t         |    c}S c c}w r#   )SBOX_INVr  s     r   rx   rx     s    !%&AHQK&&&r  c                     | dd  | d   gz   S )Nr   r    r*   s    r   rotater    s    8tAwir   c                 V    t        |       } t        |       } | d   t        |   z  | d<   | S )Nr   )r  rn   RCON)r   r  s     r   r~  r~    s0    $<DT?D1g^,,DGKr   c                 R    t        | |      D cg c]
  \  }}||z   c}}S c c}}w r#   )zip)data1data2r  ys       r   rT   rT     s%    !%/0daAE000s   #c           	   #      K   dD ]`  }|D ]Y  }d}t        d      D ]C  }|| ||dz    |   dk(  s||   dk(  rdn%t        t        | ||z         t        ||      z   dz     z  }E | [ b y w)N)r   r   ra   r`   r   r   r   )rC   RIJNDAEL_EXP_TABLERIJNDAEL_LOG_TABLE)r   matrixrI   rowmixedjs         r   rq   rq     s       	CE1X utAa!e}Q/14A!!,.@a!e.MPbcfghciPj.jnr-rsuu K	s   A'A)c                     t        d      D cg c]#  }t        d      D ]  }| ||z   dz  dz  |z       % c}}S c c}}w Nr   rQ  rC   r   columnr  s      r   ro   ro     F    BG(_V[\]V^_sD6C<4'1,s23_3___   (;c                     t        d      D cg c]#  }t        d      D ]  }| ||z
  dz  dz  |z       % c}}S c c}}w r  r  r  s      r   rw   rw     r  r  c                 `    g }d}| D ]$  }|r|dz  }|dz  }|dz  }|j                  |       & |S )Nr      r   )append)r   data_shiftedbitns       r   shift_blockr    sO    L
C JA!e	aA r   c                     | d d  } t        t        |       dz
  dd      D ]  }| |   dk(  rd| |<   | |   dz   | |<    | S  | S )Nr   r)   r   r   )rC   r.   )r   rI   s     r   re   re     s_    7D3t9q="b) 7c>DG1gkDGK Kr   c                 P   t        |       t        k7  st        |      t        k7  rt        dt        z        dgdgt        dz
  z  z   }|d d  }dgt        z  }| D ]J  }t        ddd      D ]8  }|d|z  z  rt	        ||      }|d   dz  }t        |      }|s-t	        ||      }: L |S )Nz$Length of blocks need to be %d bytesr\  r   r   r   r)   )r.   r-   r8   rC   rT   r  )block_xblock_yblock_rblock_vblock_zrI   r  do_xors           r   block_productr    s     7|''3w<;K+K?BRRSSfs.233GajGc$$G 0B# 	0CAH~gw/R[1_F!'*Ggw/	00 Nr   c                     t        |      t        z  rt        dt        z        dgt        z  }t        dt        |      t              D ]$  }|||t        z    }t	        t        ||      |       }& |S )Nz!Length of data should be %d bytesr   )r.   r-   r8   rC   r  rT   )subkeyr   last_yrI   r:   s        r   rd   rd     sy     4y##<?OOPPS##F1c$i!12 ;Q,,-s6516:; Mr   )r   r   rP   r   rL   rM   r!   r   r$   r&   rO   rJ   rD   r@   r>   r0   r+   r#   )2rz   mathr   compatr   dependenciesr   utilsr   r	   r   r   r   r&   r-   r+   r0   r>   rJ   rM   rP   rO   r   r$   r!   rD   rL   r   r  r  r  rr   rv   r  r  r@   rR   rn   rx   r  r~  rT   rq   ro   rw   r  re   r  rd   __all__r  r   r   <module>r     s      $ 5>>Re
Zm
`  (	8?6(*	*44 4; :(V**< Jh l + / v  v $ F#' 1``.r   