U
    y^?                     @   s  d dl mZ d dlmZ ddlmZ ddlmZmZ dZ	dd Z
d	d
 Z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dZdZdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zefd*d+Zd,d- Z d.d/ Z!d0d1 Z"d2d3 Z#dddd
dgZ$d4S )5    )unicode_literals)ceil   )compat_b64decode)bytes_to_intlistintlist_to_bytes   c           
      C   s   t |}tttt| t }g }t|D ]R}| }| |t |d t  }|dgtt|  7 }t||}	|t	||	7 }q,|dt|  }|S )aY  
    Decrypt with aes in counter mode

    @param {int[]} data        cipher
    @param {int[]} key         16/24/32-Byte cipher key
    @param {instance} counter  Instance whose next_value function (@returns {int[]}  16-Byte block)
                               returns the next counter block
    @returns {int[]}           decrypted data
    r   r   N)
key_expansionintr   floatlenBLOCK_SIZE_BYTESrange
next_valueaes_encryptxor)
datakeyZcounterexpanded_keyblock_countdecrypted_dataiZcounter_blockblockZcipher_counter_block r   AC:\Users\TaGoRe\Desktop\beinconnect-dl\binaries\youtube_dl\aes.pyaes_ctr_decrypt   s    

r   c           
      C   s   t |}tttt| t }g }|}t|D ]N}| |t |d t  }|dgtt|  7 }t||}	|t|	|7 }|}q0|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   r   r   aes_decryptr   )
r   r   ivr   r   r   previous_cipher_blockr   r   Zdecrypted_blockr   r   r   aes_cbc_decrypt%   s    	
r   c                 C   s   t |}tttt| t }g }|}t|D ]V}| |t |d t  }tt| }	||	g|	 7 }t||}
t|
|}||7 }|}q0|S )z
    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
    r   )	r	   r
   r   r   r   r   r   r   r   )r   r   r   r   r   Zencrypted_datar   r   r   Zremaining_lengthZmixed_blockZencrypted_blockr   r   r   aes_cbc_encrypt?   s    	

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                      r   )r   r   key_schedule_corer   r   	sub_bytes)r   rcon_iterationkey_size_bytesZexpanded_key_size_bytestemp_r   r   r   r	   [   s*    
$ r	   c                 C   sx   t |t d }t| |dt } td|d D ]B}t| } t| } ||krTt| } 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   r)   
shift_rowsmix_columnsr   r   roundsr   r   r   r   r   ~   s     r   c                 C   sv   t |t d }t|ddD ]B}t| ||t |d t  } ||krNt| } 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   N)r   r   r   r   mix_columns_invshift_rows_invsub_bytes_invr0   r   r   r   r      s    
r   c                    s   d t t| } t |d}|d| dg|t|   }t|dt t||t  }| d  |  d }G  fdddt}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
       zutf-8Nr   c                       s&   e Zd Zdge    Zdd ZdS )z!aes_decrypt_text.<locals>.Counterr   c                 S   s   | j }t| j | _ |S N)_Counter__valueinc)selfr,   r   r   r   r      s    z,aes_decrypt_text.<locals>.Counter.next_valueN)__name__
__module____qualname__r   r8   r   r   ZNONCE_LENGTH_BYTESnoncer   r   Counter   s   r@   )
r   r   encoder   r   r   r	   objectr   r   )r   passwordr+   r   cipherr@   r   Z	plaintextr   r>   r   aes_decrypt_text   s    rE   )   r   r'   r!   r6   r   r%   @         6   (   c   |   w   {      k   o      0   r   g   +            v            }      Y   G                        r               &   rJ   ?         4            q      1      r!      #      r&            r"      rH         '      u   	      ,      rI   n   Z      R   ;         )      /      S      r      r%         [   j         9   J   L   X                  C   M   3      E      r'      P   <         Q      rG            8               !   r                        _      D            ~   =   d   ]      s   `      O      "   *         F               ^            2   :   
   I      $   \            b            y         7   m   rF      N      l   V         e   z      r6      x   %   .                     t      K            p   >      f   H   r$         a   5   W                              i                           U   (                        B   h   A      -         T         (   r   r   r   r   rS   rJ   rr   r   r0  rG   r   r  r   r   rW   r   rL   r   r   r[   r$  r   r   r&  rq   r"  r   r   r   r   r'  r   r9  rN   r#  r   r  r   rz   r   r   r   r   r   r2  r^   r{   r   r6   r   r-  r  r*  r!  r   r   rY   r   rd   r   r   r  r   r   rh   r  r  r   r  r3  r  r;  rc   rg   r   rp   r   r   r   r   r   r  r  r   rk   r   r  r   r   rx   r   r  r   rF   r   r   r   rv   rX   r   r,  r   r   r   ro   r   r   r}   r   r   r   r   r   r   r%  r   rZ   rn   r7  r'   r  re   r
  r$   r   r   r  rP   r   r   r  r4  r   rT   r   r   r   rO   r   r(  ra   r  r1  r   r|   r   r  r   r   rb   r  r   r   r   r   r  r  r   r+  r   r`   rt   r   ru   r  r   rR   r.  rQ   rj   r   r  r   r&   r   rI   r   r   r  r	  r  r   r   r%   r~   r   ri   rV   r   r   r   r   r  r  r   r   r   r"   ry   rw   r   r   r   r_   r   rH   r   r   r   r   r   r   r   r  r   r/  r6  rs   r   r   rl   r\   rf   r   r   r   r   r   r   r   r   r8  r   r   r:  r   r   r   r5  r  r   rU   r!   r   r   rM   r   rm   r  r   r   rK   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   r  r   r/  )r/  r   r  r   )r   r/  r   r  (   r   r$   r}   r7  r  r   r)  r   r   r   rh   r|   r-  r  r   r  r   r  r   r  rv   r   r   rg   ro   r'   r   r   r%  r   r  r   rs   rq   r   r   r   r_   r   rm   r   r   r!  r  r   rX   r1  rw   r   r   r!   r   r   r   r   rp   r   r   r3  r   r   r   r   r   r   rc   rT   r   r   r   r   rW   r   r  rt   r6   r&   r*  r   r   r   r  r  r   rP   r
  r   r   r   r  r   r(  r   r   rY   r~   r  r   r  r   r   rS   r   ra   r   r  r   r   r:  r   r  r   rV   r   rU   r]   r&  r   rb   r   r   ru   rl   r   r'  r%   r   r   r   r;  r   r   r   r   rj   r   r   r   r   r   r^   rx   rn   r4  r{   r   r   r   r`   r\   rG   ri   r   r   r   r  rf   r0  r   r   r   r   r   r   r   r   r   r   r[   r   r   r+  r   r"  r.  rH   r$  r   r  r   r  rz   r   re   r   r   rQ   r   r   r   rR   r9  r   r  r   rK   rr   r   r"   r   rI   r6  rM   r5  r8  r   r   rZ   r   r   r   r   r   r  r  r   r   r   r  r2  r  r   r   r  r   rJ   r   r   r   rN   rF   r,  r   r  r   r#  r   rO   r/  r   r   r	  r  rL   r   r   rd   rk   r  r   r   r  ry   r   r  r   (   r   r   r   r   r   r'   r   r  r	  ry   rI   r3  r   r   r+  r$   r   r!   r   r  rq   rF   r   r   r   ru   r6   r   r  r   r  r  r]   r   r  r  r   r  r   r   r   r   r  rh   r~   r\   r   r   r   r   r  r}   r   r7  r  r   r   ra   r[   r   r  rl   r   r"  r|   r   r   r
  rJ   r   r(  r#  r   r   r   rt   rG   r   r   r   r  r  rk   rS   r0  r   r  r   r   r   r   r  r   r   r   r   r   r   r  r{   r   r   r%  r2  r   rP   r*  r9  r^   r   r   r   rU   r   r   rx   r$  r   r   rZ   r   rc   r   rs   r   r   r   r  re   r   r   r   r   r   r   r  r   r   r'  r   r   r1  rb   r  r   rW   r   r   r   r;  r   r   r_   r   r   r8  rf   r   r   r   r   r   r  rQ   r   r   r   r   rv   r   r  r6  rg   rY   rN   rj   rp   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   r   r   r   rn   r   r   r   r   r   r   r4  rd   r   r`   r   r   r  r   r   rO   r   rX   r   r  r   r!  rz   r%   r   r.  r  rL   r   rm   rM   r5  r   rr   rT   r   r   r   rR   rw   rV   r&   r/  rK   r,  rH   ri   ro   r  r"   c                 C   s   dd | D S )Nc                 S   s   g | ]}t | qS r   )SBOX.0xr   r   r   
<listcomp>  s     zsub_bytes.<locals>.<listcomp>r   r   r   r   r   r)     s    r)   c                 C   s   dd | D S )Nc                 S   s   g | ]}t | qS r   )SBOX_INVr=  r   r   r   r@    s     z!sub_bytes_inv.<locals>.<listcomp>r   rA  r   r   r   r5     s    r5   c                 C   s   | dd  | d g S )Nr   r   r   rA  r   r   r   rotate!  s    rC  c                 C   s(   t | } t| } | d t| A | d< | S )Nr   )rC  r)   RCON)r   r*   r   r   r   r(   %  s    r(   c                 C   s   dd t | |D S )Nc                 S   s   g | ]\}}||A qS r   r   )r>  r?  yr   r   r   r@  .  s     zxor.<locals>.<listcomp>)zip)Zdata1Zdata2r   r   r   r   -  s    r   c                 C   s,   | dks|dkrdS t t|  t|  d  S )Nr   r   )RIJNDAEL_EXP_TABLERIJNDAEL_LOG_TABLE)abr   r   r   rijndael_mul1  s    rK  c                 C   sL   g }t dD ]:}d}t dD ]}|t| | || | N }q|| q|S )Nr!   r   )r   rK  append)r   matrix
data_mixedrowmixedcolumnr   r   r   
mix_column7  s    rR  c                 C   s<   g }t dD ]*}| |d |d d  }|t||7 }q|S )Nr!   r   )r   rR  )r   rM  rN  r   rQ  r   r   r   r/   B  s
    r/   c                 C   s
   t | tS r7   )r/   MIX_COLUMN_MATRIX_INVrA  r   r   r   r3   J  s    r3   c                 C   sB   g }t dD ]0}t dD ]"}|| || d@ d |   qq|S Nr!   r$   r   rL  r   Zdata_shiftedrQ  rO  r   r   r   r.   N  s
    "r.   c                 C   sB   g }t dD ]0}t dD ]"}|| || d@ d |   qq|S rT  rU  rV  r   r   r   r4   V  s
    "r4   c                 C   sT   | d d  } t t| d ddD ].}| | dkr:d| |< q | | d | |<  qPq | S )Nr   r2   r   r   )r   r   )r   r   r   r   r   r9   ^  s    
r9   N)%
__future__r   mathr   compatr   utilsr   r   r   r   r   r    r	   r   r   rE   rD  r<  rB  ZMIX_COLUMN_MATRIXrS  rG  rH  r)   r5   rC  r(   r   rK  rR  r/   r3   r.   r4   r9   __all__r   r   r   r   <module>   s>   #&