U
    $Pf?                     @   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keycounterexpanded_keyblock_countdecrypted_dataiZcounter_blockblockZcipher_counter_block r   2/tmp/pip-unpacked-wheel-7zdooeg3/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_invr1   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   r9   r   r   ZNONCE_LENGTH_BYTESnoncer   r   Counter   s   rA   )
r   r   encoder   r   r   r	   objectr   r   )r   passwordr,   r   cipherrA   r   	plaintextr   r?   r   aes_decrypt_text   s    rG   )   r   r(   r"   r7   r   r&   @         6   (   c   |   w   {      k   o      0   r   g   +            v            }      Y   G                        r               &   rL   ?         4            q      1      r"      #      r'            r#      rJ         '      u   	      ,      rK   n   Z      R   ;         )      /      S      r      r&         [   j         9   J   L   X                  C   M   3      E      r(      P   <         Q      rI            8               !   r                        _      D            ~   =   d   ]      s   `      O      "   *         F               ^            2   :   
   I      $   \            b            y         7   m   rH      N      l   V         e   z      r7      x   %   .                     t      K            p   >      f   H   r%         a   5   W                              i                           U   (                        B   h   A      -         T         (   r   r   r   r   rU   rL   rt   r   r2  rI   r   r  r   r   rY   r   rN   r   r   r]   r&  r   r   r(  rs   r$  r   r   r   r   r)  r   r;  rP   r%  r   r  r   r|   r   r   r   r   r   r4  r`   r}   r   r7   r  r/  r  r,  r#  r   r   r[   r   rf   r   r   r  r   r  rj   r  r  r   r  r5  r   r=  re   ri   r   rr   r   r   r   r   r   r  r  r   rm   r   r  r   r   rz   r   r  r   rH   r   r   r   rx   rZ   r   r.  r   r   r   rq   r   r   r   r   r   r   r   r   r   r'  r   r\   rp   r9  r(   r  rg   r  r%   r   r   r  rR   r   r   r!  r6  r   rV   r   r   r   rQ   r   r*  rc   r  r3  r   r~   r   r	  r   r   rd   r  r   r   r   r   r  r  r   r-  r   rb   rv   r   rw   r  r   rT   r0  rS   rl   r   r  r   r'   r   rK   r   r   r  r  r  r   r   r&   r   r   rk   rX   r   r   r   r   r
  r  r   r   r   r#   r{   ry   r   r   r   ra   r   rJ   r   r   r   r   r   r   r   r  r   r1  r8  ru   r   r   rn   r^   rh   r   r   r   r   r   r   r   r   r:  r   r   r<  r   r   r   r7  r  r   rW   r"   r   r   rO   r   ro   r  r"  r   rM   r+  r   r   r_   ))r(   r%   r   r   )r   r(   r%   r   )r   r   r(   r%   )r%   r   r   r(   ))r  r   r1  r   )r   r  r   r1  )r1  r   r  r   )r   r1  r   r  (   r   r%   r   r9  r!  r   r+  r   r   r  rj   r~   r/  r  r   r  r   r  r   r  rx   r   r   ri   rq   r(   r   r   r'  r   r  r   ru   rs   r   r   r   ra   r   ro   r   r   r#  r  r   rZ   r3  ry   r   r   r"   r   r   r   r   rr   r   r   r5  r   r   r   r   r   r   re   rV   r   r   r   r   rY   r   r  rv   r7   r'   r,  r   r   r   r  r  r   rR   r  r   r   r   r   r   r*  r   r   r[   r   r  r   r  r   r   rU   r   rc   r   r  r   r"  r<  r   r  r   rX   r   rW   r_   r(  r   rd   r   r   rw   rn   r   r)  r&   r   r   r   r=  r   r   r   r   rl   r   r   r   r   r   r`   rz   rp   r6  r}   r   r   r   rb   r^   rI   rk   r   r   r   r	  rh   r2  r   r   r   r   r   r   r   r   r   r   r]   r   r   r-  r   r$  r0  rJ   r&  r   r  r   r  r|   r   rg   r   r  rS   r   r   r   rT   r;  r   r
  r   rM   rt   r   r#   r   rK   r8  rO   r7  r:  r   r   r\   r   r   r   r   r   r  r  r   r   r   r  r4  r  r   r   r  r   rL   r   r   r   rP   rH   r.  r   r  r   r%  r   rQ   r1  r   r   r  r  rN   r   r   rf   rm   r  r   r   r  r{   r   r  r   (   r   r   r   r   r   r(   r   r  r  r{   rK   r5  r   r   r-  r%   r   r"   r   r  rs   rH   r   r   r   rw   r7   r   r  r"  r  r  r_   r   r  r  r   r  r   r   r   r   r  rj   r   r^   r   r   r   r   r  r   r   r9  r  r   r   rc   r]   r   r  rn   r   r$  r~   r   r   r  rL   r   r*  r%  r   r   r   rv   rI   r   r   r   r  r  rm   rU   r2  r   r  r   r   r  r   r   r   r   r   r   r   r   r  r}   r   r   r'  r4  r   rR   r,  r;  r`   r   r   r   rW   r   r   rz   r&  r   r   r\   r   re   r   ru   r   r   r   r  rg   r   r   r   r   r   r   r	  r   r   r)  r   r   r3  rd   r  r   rY   r   r   r   r=  r   r   ra   r   r   r:  rh   r   r   r   r   r   r  rS   r   r   r   r   rx   r   r
  r8  ri   r[   rP   rl   rr   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   rp   r   r   r   r   r   r   r6  rf   r   rb   r   r   r  r   r   rQ   r   rZ   r   r!  r   r#  r|   r&   r  r0  r  rN   r   ro   rO   r7  r   rt   rV   r   r   r   rT   ry   rX   r'   r1  rM   r.  rJ   rk   rq   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   rB    s     z!sub_bytes_inv.<locals>.<listcomp>r   rC  r   r   r   r6     s    r6   c                 C   s   | dd  | d g S )Nr   r   r   rC  r   r   r   rotate!  s    rE  c                 C   s(   t | } t| } | d t| A | d< | S )Nr   )rE  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@  rA  yr   r   r   rB  .  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    rM  c                 C   sL   g }t dD ]:}d}t dD ]}|t| | || | N }q|| q|S )Nr"   r   )r   rM  append)r   matrix
data_mixedrowmixedcolumnr   r   r   
mix_column7  s    rT  c                 C   s<   g }t dD ]*}| |d |d d  }|t||7 }q|S )Nr"   r   )r   rT  )r   rO  rP  r   rS  r   r   r   r0   B  s
    r0   c                 C   s
   t | tS r8   )r0   MIX_COLUMN_MATRIX_INVrC  r   r   r   r4   J  s    r4   c                 C   sB   g }t dD ]0}t dD ]"}|| || d@ d |   qq|S Nr"   r%   r   rN  r   Zdata_shiftedrS  rQ  r   r   r   r/   N  s
    "r/   c                 C   sB   g }t dD ]0}t dD ]"}|| || d@ d |   qq|S rV  rW  rX  r   r   r   r5   V  s
    "r5   c                 C   sT   | d d  } t t| d ddD ].}| | dkr:d| |< q | | d | |<  qPq | S )Nr   r3   r   r   )r   r   )r   r   r   r   r   r:   ^  s    
r:   N)%
__future__r   mathr   compatr   utilsr   r   r   r   r    r!   r	   r   r   rG   rF  r>  rD  ZMIX_COLUMN_MATRIXrU  rI  rJ  r*   r6   rE  r)   r   rM  rT  r0   r4   r/   r5   r:   __all__r   r   r   r   <module>   s>   #&