
    VGhV                     <   d dl Z d dlmZ ddlmZ ddlmZ ej                  rd Zd Z	nd Zd	 Z	d
 Z
dZd Zd Zd Zd1dZd1d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,d/ Z-g d0Z.y)2    N)ceil   
compat_ord)
Cryptodomec                     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      S/var/www/it7/html/youtubeDownloader/venv/lib/python3.12/site-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 )bytesaes_cbc_decryptmaplistr   s      r   r   r      s    _c$sB&@ABBr   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#    /TD#sE;R1STUUr   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$    #dT3O"<GGHHr      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g | d} |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>   1   s     $c%j0L 	L a.//	\	)!M,?R"STTy \%L./,>>>r   c                     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_expansionr   r.   r-   rangeaes_encryptr0   r   r   r   expanded_keyblock_countencrypted_datair:   s           r   aes_ecb_encryptrH   L   sw     !%Ls4y#334KN; JQ))AE5E+EF+mE&:LIIJ r   c                     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@   r   r.   r-   rA   aes_decryptrC   s           r   aes_ecb_decryptrK   `   s{     !%Ls4y#334KN; ;Q))AE5E+EF+e\::; *3t9%%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_decryptrN   s   s     4b))r   c                 N   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@   r   r.   r-   iter_vectorrA   nextrB   xor)r   r   r   rD   rE   counterrF   rG   counter_blockr:   cipher_counter_blocks              r   rM   rM      s     !%Ls4y#334K"oGN; ;WQ))AE5E+EF!(3u:566*=,G#e%9::; *3t9%%r   c                 *   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@   r   r.   r-   rA   rJ   rR   )
r   r   r   rD   rE   decrypted_dataprevious_cipher_blockrG   r:   decrypted_blocks
             r   r   r      s     !%Ls4y#334KN; &Q))AE5E+EF!(3u:566%e\:#o/DEE %& *3t9%%r   r3   )r;   c                    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@   r   r.   r-   rA   r>   rR   rB   )r   r   r   r;   rD   rE   rF   rX   rG   r:   mixed_blockencrypted_blocks               r   r$   r$      s     !%Ls4y#334K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ddd}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        t        |       t        z  z
  t        z  }
t        || dg|
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      bigzMismatching authentication tag)rB   r-   r@   r.   r   to_bytesghashincrN   rM   r8   )r   r   r   r   hash_subkeyj0fillghash_iniv_ctrrW   pad_lens_tags               r   r!   r!      sj    qc$44mC6HIK
5zR!u!a!!A!q! CJ1A$ABFVVYZZA3:%a#e*n-F-Fq%-P(QQ;)
 WF$T3!@PSVW]S^@^9_0_`N3t9/?#?@DTTG#-	
5)t9q=**1e46 7	7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-   rR   rA   	sub_bytes
shift_rowsr   iter_mix_columnsMIX_COLUMN_MATRIXr   rD   roundsrG   s       r   rB   rB      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-   rA   rR   r   rn   MIX_COLUMN_MATRIX_INVshift_rows_invsub_bytes_invrp   s       r   rJ   rJ     s     "22Q6F61b! #4a*:&:QUFV<VWX;(/DEFDd#T"# t\"3#3455r   c                 P   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
    r_   Nr   )
r   base64	b64decodeencoder.   rB   r-   r@   rN   r   )r   passwordkey_size_bytesNONCE_LENGTH_BYTESr   r   cipherrW   s           r   aes_decrypt_textr~     s       &'DHOO%&H
?N
#qc^c(m-K&L
LC
c++,mC.@
A^WgEg
hC$$%E$%&F$VS%1#AQTfAf:g2ghN  r   )   r         r_   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      r_      x   %   .                     t      K            p   >      f   H            a   5   W                              i                           U   (                        B   h   A      -         T         (   r   r   r   r.  r   r   r   r   rl  r   r   rW  r  r   r   r   r   r   r   r   r`  r   r   rb  r   r^  r   r   r  r  rc  r   ru  r   r_  r  r=  r"  r   r  r  r   r'  r  rn  r   r   r/  r_   r;  ri  rK  rf  r]  r   r   r   r   r   r  r-  rF  r   r:  r   rY  rN  r  rT  ro  rZ  rw  r   r   r!  r   r  r5  r   r   r1  rH  rL  r   r   r   rS  r   r  r   r  rR  r  r   r   r   r  r   r   r   rh  r   r#  r  r   r(  r   r   r  r   r   r  r   r   ra  r   r   r   rs  r   rU  r   rE  rM  r   r   rG  r   r  r&  r[  rp  r  r   r  r4  r   r   r   rd  r   r>  rm  r	  r   r$  rB  r  r*  r   rQ  r   r   r   r,  r@  r<  r   rg  r   r   r   r   r   rV  r   r   rj  r   r   r%  rO  r   r   r   r   r   r2  rI  rD  r?  r   r)  r2   r   r  r   r   r9  r   r   r3  rC  rA  r   r   r  r   r   r   r   r   r'   r   r   r7   r   r   r
  r   r   r0  r  rJ  r   rk  rr  r   r6  r   r   r   r   r   r   r  r   r   r7  r  r   rt  r+  r   rv  r   r   r   rq  rP  r  r   r   r  r8  r   r   r   rX  r\  r  r   re  r   r^   r   ))r   rM  r   r   )r   r   rM  r   )r   r   r   rM  )rM  r   r   r   ))rO  r  rk  r   )r   rO  r  rk  )rk  r   rO  r  )r  rk  r   rO  (   r   rM  r   rs  r[  r   re  r   r   r;  r   r   ri  rY  r   rQ  r   rX  r   rL  r   r	  r'  r   r   r   r  r  ra  r  rK  r   r   r   r!  r(  r,  r   r   r   r   r   r]  rH  r  r   rm  r   r   r   r   r^   r  r   r   r   r  r   ro  r  r#  r   r   r   r   r   r   r0  r  r   r   r   r%  r=  r   r_   r   rf  r9  r  r   rW  rS  r   r   rE  r  r   r  rZ  r   rd  r  r  r   r   rJ  r  rR  r   r'   r   r   r   r  rV  r   r\  rv  r   rP  r   r   r  r   r   rb  r   r   r   r   r   r   r7  rc  r2   r
  r   r   rw  r  r/  r   r-  r   r"  r  r*  r  r2  r   r   r   rp  r   r  r   r  r   r   r   r   r   r   r   rB  r   rl  r   r   r   r8  r.  r  r$  r   r  r  r   r   r   rg  r6  r^  rj  r7   r`  r   rU  r   r@  r   r5  r   r4  r:  r   r   r+  r   r   ru  r   rC  r   r   r   r3  r   r   r   rr  r   rq  rt  r   r  r   r   r   r   r  r)  rF  rT  r&  r   r   rI  rn  r?  r   r   rO  r   r   r   r  r   r   r   rh  r   rG  r   r_  r  r   rk  r  r   rD  rA  r   r   r   r   r   r<  r   r1  r>  r   r   rN  r   (   r   r   r  r   r  r   r   r?  rD  r   r   ro  r   r  rg  rM  r  r   r  rO  r   r   r  r   r   r   r_   r+  rY  r\  r<  rU  r   r"  rV  rJ  r   rS  r   r   r   r(  r=  r   r   r   r   r9  r5  r   rG  r   r   rs  rX  r   r   r   r   r   rQ  r   r   r^  r   r   r  rE  r   r   rd  r_  r   r!  r   r   r   r  r   r   rK  rA  r   r   rl  r  rF  r%  r   r:  r   rZ  r  r  r&  r'   r  r   rL  r   r   r   ra  rn  r  r   rf  ru  r   r   r  r8  r   r)  r  r   r`  r   r  r   r/  r   r$  r   r   r	  r  rR  r   r   r   r   r3  r4  r   rB  r  r7  rc  r.  r*  rm  r   r@  r   r   r   r6  r   rw  r  r   r   r   r   rt  r   r0  r   r   r   r^   rN  r   r  r  r  r   r   r   rC  rr  r   r   r   r   r   rv  rI  r   r   r
  r   rT  r   r   ri  r1  r   re  r   r   r   r   rb  r  rP  r   r  r   r   r'  r   r   r,  r   r   r   r   r   r   r   rp  r   r-  r   r  r  rW  r  r2  r   r#  r   r   r[  r   r]  r   r2   r;  rj  r>  r   r  r   r   rq  r   r   r   r   r   r  r   r   r   r   rk  r   rh  r7   r   r   rH  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   rM  r2   r   r   r   )r.   r-   key_schedule_corerR   rA   rl   )r   rcon_iterationr{   expanded_key_size_bytestemp_s         r   r@   r@     sm    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)-
-$ (())r   c              #   ,   K   	 |  t        |       } wr#   )rc   )r   s    r   rP   rP     s     
W s   c                 :    | D cg c]  }t         |    c}S c c}w r#   )SBOXr   xs     r   rl   rl     s    !"DG"""   c                 :    | D cg c]  }t         |    c}S c c}w r#   )SBOX_INVr  s     r   ru   ru     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  rl   RCON)r   r{  s     r   rz  rz    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   rR   rR     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   r_   r^   r   r   r   )rA   RIJNDAEL_EXP_TABLERIJNDAEL_LOG_TABLE)r   matrixrG   rowmixedjs         r   rn   rn     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   rM  rA   r   columnr  s      r   rm   rm     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   rt   rt     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   )rA   r.   )r   rG   s     r   rc   rc     s_    7D3t9q="b) 7c>DG1gkDGK Kr   c                 R   t        |       t        k7  st        |      t        k7  rt        dt         d      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  bytesrX  r   r   r   r)   )r.   r-   r8   rA   rR   r  )block_xblock_yblock_rblock_vblock_zrG   r  do_xors           r   block_productr    s     7|''3w<;K+K78H7IPQQ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         d      dgt        z  }t        dt        |      t              D ]$  }|||t        z    }t	        t        ||      |       }& |S )NzLength of data should be r  r   )r.   r-   r8   rA   r  rR   )subkeyr   last_yrG   r:   s        r   rb   rb     s~     4y##45E4FfMNNS##F1c$i!12 ;Q,,-s6516:; Mr   )r   r   r$   r&   rN   rM   rJ   r~   rK   rH   rB   r!   r   r@   r>   r0   r+   r#   )/rw   mathr   compatr   dependenciesr   r	   r   r   r&   r-   r+   r0   r>   rH   rK   rN   rM   r   r$   r!   rB   rJ   r~   r  r  r  ro   rs   r  r  r@   rP   rl   ru   r  rz  rR   rn   rm   rt   r  rc   r  rb   __all__r  r   r   <module>r     s      $>>Re
CV
I  (	8?6(&&	*&0&0 4; :(V*6&!8 Jh l + / v  v $*B#' 1``.r   