a
    ;hV                     @   sj  d dl Z d dlmZ ddlmZ ddlmZ ejrDdd Zdd	 Z	nd
d Zdd	 Z	dd Z
dZdd Zdd Zdd ZdOddZdPddZdd Zdd Zdd Zdd d!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zd+Zd,Zd-Zd.Zd/Zd0Zd1Zd2d3 Z d4d5 Z!d6d7 Z"d8d9 Z#d:d; Z$d<d= Z%d>d? Z&d@dA Z'dBdC Z(dDdE Z)dFdG Z*dHdI Z+dJdK Z,dLdM Z-g dNZ.dS )Q    N)ceil   
compat_ord)
Cryptodomec                 C   s   t j|t jj|| S )z/ Decrypt bytes with AES-CBC using pycryptodome )r   AESnewZMODE_CBCZdecryptdatakeyiv r   O/var/www/html/swiplay.fr/scambot/venv/lib/python3.9/site-packages/yt_dlp/aes.pyaes_cbc_decrypt_bytes   s    r   c                 C   s   t j|t jj|| |S )z/ Decrypt bytes with AES-GCM using pycryptodome )r   r   r   ZMODE_GCMZdecrypt_and_verifyr
   r   tagnoncer   r   r    aes_gcm_decrypt_and_verify_bytes   s    r   c                 C   s   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	   r   r   r   r      s    c                 C   s   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   r   r   r   r      s    c                 K   s   t ttt| ||fi |S N)r   aes_cbc_encryptr   r   )r
   r   r   kwargsr   r   r   aes_cbc_encrypt_bytes   s    r      c                 C   s   | d t | d   S )Nr   r
   r   r   r   unpad_pkcs7!   s    r    c                 C   s   t t| t   }| |g|  S )zn
    PKCS#7 padding

    @param {int[]} data        cleartext
    @returns {int[]}           padding data
    )BLOCK_SIZE_BYTESlen)r
   Zremaining_lengthr   r   r   pkcs7_padding%   s    r#   c                 C   sv   t t|  }|dddd}|dk r,tdn||vrDtd| d|dkrd|rdg | d} |d	8 }| || g|  S )
z
    Pad a block with the given padding mode
    @param {int[]} block        block to pad
    @param padding_mode         padding mode
    r       )pkcs7iso7816
whitespaceZzerozBlock size exceededzPadding mode z is not implementedr&      r   )r!   r"   
ValueErrorNotImplementedError)blockpadding_modeZpadding_sizeZPADDING_BYTEr   r   r   	pad_block1   s    
r-   c                 C   sX   t |}tt| t }g }t|D ].}| |t |d t  }|tt||7 }q$|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_encryptr#   r
   r   r   expanded_keyblock_countencrypted_datair+   r   r   r   aes_ecb_encryptL   s    	r6   c                 C   s`   t |}tt| t }g }t|D ]*}| |t |d t  }|t||7 }q$|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!   r/   aes_decryptr1   r   r   r   aes_ecb_decrypt`   s    	r8   c                 C   s   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	   r   r   r   aes_ctr_decrypts   s    	r:   c                 C   s   t |}tt| t }t|}g }t|D ]R}t|}| |t |d t  }	|	dgtt|	  7 }	t||}
|t|	|
7 }q,|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_vectorr/   nextr0   xor)r
   r   r   r2   r3   counterr4   r5   Zcounter_blockr+   Zcipher_counter_blockr   r   r   r9      s    	
r9   c           
      C   s   t |}tt| t }g }|}t|D ]N}| |t |d t  }|dgtt|  7 }t||}	|t|	|7 }|}q(|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!   r/   r7   r=   )
r
   r   r   r2   r3   decrypted_dataprevious_cipher_blockr5   r+   Zdecrypted_blockr   r   r   r      s    	
r   r%   )r,   c                C   st   t |}tt| t }g }|}t|D ]F}| |t |d t  }	t|	|}	t|	|}
t|
|}||7 }|}q(|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!   r/   r-   r=   r0   )r
   r   r   r,   r2   r3   r4   r@   r5   r+   Zmixed_blockZencrypted_blockr   r   r   r      s    



r   c              	   C   s  t dgt t|}t|dkr:g |dddd}nHtt|t  t d }|dg|  tdt| dd }t||}t|}t| ||dgtt|   }	tt| t  t }
t|| dg|
  tdddt| d dd  }|t	|||k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)r0   r!   r.   r"   r   to_bytesghashincr:   r9   r)   )r
   r   r   r   Zhash_subkeyZj0fillZghash_inZiv_ctrr?   Zpad_lenZs_tagr   r   r   r      s,    &
r   c                 C   s~   t |t d }t| |dt } td|d D ]H}t| } t| } ||krZtt| t} t| ||t |d t  } q0| 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!   r=   r/   	sub_bytes
shift_rowsr   iter_mix_columnsMIX_COLUMN_MATRIXr
   r2   roundsr5   r   r   r   r0      s     r0   c                 C   sx   t |t d }t|ddD ]H}t| ||t |d t  } ||krTtt| t} t| } t| } q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!   r/   r=   r   rJ   MIX_COLUMN_MATRIX_INVshift_rows_invsub_bytes_invrL   r   r   r   r7     s    
r7   c                 C   s   d}t t| } t | }|d| dg|t|   }t|dt t||t  }| d| }| |d }t|||dgt|   }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
    rB   Nr   )
r   base64	b64decodeencoder"   r0   r!   r.   r:   r   )r
   passwordkey_size_bytesZNONCE_LENGTH_BYTESr   r   cipherr?   r   r   r   aes_decrypt_text  s    rW   )   r         rB   r   r$   @   r(      6   (   c   |   w   {      k   o      0   r   g   +            v            }      Y   G                        r               &   r]   ?         4            q      1      rZ      #                        r(         '      u   	      ,      r\   n   Z      R   ;         )      /      S      r      r$         [   j         9   J   L   X                  C   M   3      E      rY      P   <         Q      r[            8               !   r               rA         _      D            ~   =   d   ]      s   `      O      "   *         F               ^            2   :   
   I      $   \            b            y         7   m   rX      N      l   V         e   z      rB      x   %   .                     t      K            p   >      f   H            a   5   W                              i                           U   (                        B   h   A      -         T         (   r   r   r   r  rf   r]   r   r   rE  r[   r   r0  r   r   rj   r   r_   r   r   rn   r9  r   r   r;  r   r7  r   r   r   r   r<  r   rN  ra   r8  r   r  r   r   r   r   r   r   r   rG  rq   r   r  rB   r  rB  r$  r?  r6  r   r   rl   r   rw   r   r  r  r   r  r{   r2  r'  r   r-  rH  r3  rP  rv   rz   r   r   r   r  r   r   r
  r!  r%  r   r~   r   r,  r   r   r   r   r+  r   rX   r   r   r   r   rk   r   rA  r   r   r   r   r  r   r   r   r   r   r   r   r   r:  r   rm   r   rL  rY   r.  rx   r  r&  r   r   r   rc   r   r   r4  rI  r   rg   r   r  r   rb   r   r=  rt   r  rF  r   r   r   r  r   r  ru   r*  r   r   r   r  r  r  r   r@  r   rs   r   r   r   r/  r   re   rC  rd   r}   r   r(  r   r   r   r\   r   r  r"  r  r  r   r  r$   r   r   r|   ri   r  r   r   r  r  r  r   r   r   r   r   r   r   r   r   rr   r   r(   r   r   r   r   r   r	  r   r#  r   rD  rK  r   r  r   r   ro   ry   r   r   r   r   r   r  r   r   rM  r  r   rO  r   r   r   rJ  r)  r   rh   rZ   r   r  r`   r   r   r1  r5  r   r^   r>  r   rA   rp   ))rY   r&  r   r   )r   rY   r&  r   )r   r   rY   r&  )r&  r   r   rY   ))r(  r   rD  r   )r   r(  r   rD  )rD  r   r(  r   )r   rD  r   r(  (   r   r&  r   rL  r4  r   r>  r   r   r  r{   r   rB  r2  r   r*  r   r1  r   r%  r   r   r   rz   r   rY   r   r   r:  r   r$  r   r   r   r   r  r  rr   r   r   r   r   r6  r!  r   rk   rF  r   r   r   rZ   rA   r   r   r   r   r   r   rH  r   r   r   r   r   r   rv   rg   r	  r   r   r   rj   r   r  r   rB   r   r?  r  r   r   r0  r,  r   rc   r  r   r   r   r3  r   r=  r   r   rl   r   r#  r   r+  r   r   rf   r   rt   r   r/  r   r5  rO  r   r)  r   ri   r   rh   rp   r;  r   ru   r   r   r   r   r  r<  r$   r   r   r   rP  r   r  r   r  r}   r   r   r  r   r  rq   r   r   rI  r   r   r   r   rs   ro   r[   r|   r   r   r   r  ry   rE  r   r   r   r  r  r   r   r   r   r   rn   r   r   r@  r  r7  rC  r(   r9  r   r.  r   r  r   r  rx   r  r  rd   r   r  r   re   rN  r   r  r   r^   r   r  r   r   r\   rK  r`   rJ  rM  r   r   rm   r   r   r   r   r  r  r-  r   r   r   r"  rG  r  r   r   r(  r   r]   r   r   r   ra   rX   rA  r   r   r   r8  r   rb   rD  r   r   r  r  r_   r   r   rw   r~   r  r   r
  r  r   r   r'  r   (   r   r   r   r   r   rY   r   r  r  r   r\   rH  r   r   r@  r&  r   rZ   r   r(  r   rX   r   r   r   r   rB   r  r2  r5  r  r.  rp   r   r/  r#  r   r,  r   r   r   r  r  r{   r   ro   r   r  r  r   r   r   r   rL  r1  r   r   rt   rn   r   r*  r   r   r7  r   r   r   r  r]   r   r=  r8  r   r   r   r   r[   r   r   r   r$  r  r~   rf   rE  r   r  r   r   r  r   r3  r   r   r   r   r   r   r%  r   r   r   r:  rG  r   rc   r?  rN  rq   r   r   r  rh   r  r   r   r9  r   r   rm   r  rv   r   r   r   r   r   r+  rx   r   r   r   r  r  r   r  r   r  r<  r  r  rF  ru   r  r   rj   r   r  r   rP  r   r   rr   r   r   rM  ry   r	  r   r   r   rA   r'  rd   r   r   r   r   r   r   r  rK  rz   rl   ra   r}   r   rO  r"  r   r   r   r   r-  r   r   rB  r
  r   r>  r   r   r   r   r;  r   r)  r   r   r   r   r   r   r   r  r   r   r   r   r   r   r   rI  rw   r  rs   r   r   r0  r   r  rb   r   rk   r   r4  r   r6  r   r$   r  rC  r  r_   r   r   r`   rJ  r   r   rg   r   r   r   re   r   ri   r   rD  r^   rA  r(   r|   r   r!  r   c                 C   s:  | dd } d}t | }|d d t }t | |k r.| dd }t||}|d7 }| t|| | d|  7 } tdD ],}| dd }| t|| | d|  7 } qx|dkr| dd }t|}| t|| | d|  7 } t|dkrdn|dkrd	nd
D ],}| dd }| t|| | d|  7 } qq(| d| S )z
    Generate key schedule

    @param {int[]} data  16/24/32-Byte cipher key
    @returns {int[]}     176/208/240-Byte expanded key
    Nr   rZ   r   r&  r$   r   rY   r   )r"   r!   key_schedule_corer=   r/   rH   )r
   rcon_iterationrU   Zexpanded_key_size_bytestemp_r   r   r   r.     s(    
$ r.   c                 c   s   | V  t | } q d S r   )rF   )r   r   r   r   r;     s    r;   c                 C   s   dd | D S )Nc                 S   s   g | ]}t | qS r   )SBOX.0xr   r   r   
<listcomp>      zsub_bytes.<locals>.<listcomp>r   r   r   r   r   rH     s    rH   c                 C   s   dd | D S )Nc                 S   s   g | ]}t | qS r   )SBOX_INVrW  r   r   r   rZ    r[  z!sub_bytes_inv.<locals>.<listcomp>r   r   r   r   r   rP     s    rP   c                 C   s   g | dd  | d S )Nr   r   r   r   r   r   r   rotate  s    r]  c                 C   s(   t | } t| } | d t| A | d< | S )Nr   )r]  rH   RCON)r
   rS  r   r   r   rR    s    rR  c                 C   s   dd t | |D S )Nc                 S   s   g | ]\}}||A qS r   r   )rX  rY  yr   r   r   rZ    r[  zxor.<locals>.<listcomp>)zip)Zdata1Zdata2r   r   r   r=     s    r=   c              	   c   s   dD ]v}|D ]l}d}t dD ]T}|| ||d  | dksF|| dkrJdn"tt| ||   t||   d  N }q|V  qqd S )N)r   rZ   rB   rA   r   rZ   r   )r/   RIJNDAEL_EXP_TABLERIJNDAEL_LOG_TABLE)r
   Zmatrixr5   rowmixedjr   r   r   rJ     s    *"rJ   c                    s    fddt dD S )Nc                    s2   g | ]*}t d D ]} || d@ d  |  qqS rZ   r&  r/   rX  columnrc  r   r   r   rZ    r[  zshift_rows.<locals>.<listcomp>rZ   rg  r   r   r   r   rI     s    rI   c                    s    fddt dD S )Nc                    s2   g | ]*}t d D ]} || d@ d  |  qqS rf  rg  rh  r   r   r   rZ    r[  z"shift_rows_inv.<locals>.<listcomp>rZ   rg  r   r   r   r   rO     s    rO   c                 C   s<   g }d}| D ]*}|r|dO }|d@ }|dL }| | q|S )Nr      r   )append)r
   Zdata_shiftedbitnr   r   r   shift_block  s    rn  c                 C   sT   | d d  } t t| d ddD ].}| | dkr:d| |< q | | d | |<  qPq | S )Nr   r   r   r   )r/   r"   )r
   r5   r   r   r   rF     s    
rF   c                 C   s   t | tkst |tkr(tdt ddgdgtd   }|d d  }dgt }| D ]N}tdddD ]<}|d|> @ rt||}|d d@ }t|}|rft||}qfqV|S )NzLength of blocks need to be  bytesr1  r   r   r   r   )r"   r!   r)   r/   r=   rn  )Zblock_xZblock_yZblock_rZblock_vZblock_zr5   rl  Zdo_xorr   r   r   block_product  s    

rp  c                 C   s`   t |t rtdt ddgt }tdt |tD ]$}|||t  }tt||| }q6|S )NzLength of data should be ro  r   )r"   r!   r)   r/   rp  r=   )subkeyr
   Zlast_yr5   r+   r   r   r   rE     s    
rE   )r   r   r   r   r:   r9   r7   rW   r8   r6   r0   r   r   r.   r-   r#   r    )N)N)/rQ   mathr   compatr   Zdependenciesr   r   r   r   r   r!   r    r#   r-   r6   r8   r:   r9   r   r   r   r0   r7   rW   r^  rV  r\  rK   rN   ra  rb  r.   r;   rH   rP   r]  rR  r=   rJ   rI   rO   rn  rF   rp  rE   __all__r   r   r   r   <module>   sZ   


+!