3
b`?                 @   sB  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d2Zd7Zd8Zd9Z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!d&d' Z"d(d) Z#dddd
dgZ$d*S (:      )unicode_literals)ceil   )compat_b64decode)bytes_to_intlistintlist_to_bytes   c       
      C   s   t |}tttt| t }g }x^t|D ]R}|j }| |t |d t  }|dgtt|  7 }t||}	|t	||	7 }q.W |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   ?C:\Users\Broad\Desktop\BeinConnetFix\binaries\youtube_dl\aes.pyaes_ctr_decrypt   s    

r   c       
      C   s   t |}tttt| t }g }|}xZt|D ]N}| |t |d t  }|dgtt|  7 }t||}	|t|	|7 }|}q2W |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 }|}xbt|D ]V}| |t |d t  }tt| }	||	g|	 7 }t||}
t|
|}||7 }|}q2W |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   sP  | dd } d}t | }|d d t }xt | |k r>| d
d }t||}|d7 }| t|| | d|  7 } x8tdD ],}| dd }| t|| | d|  7 } q~W |dkr| dd }t|}| t|| | d|  7 } xTt|dkrdn|dkrdnd	D ].}| dd }| t|| | d|  7 } q
W q,W | 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(   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   s|   t |t d }t| |dt } xTtd|d D ]B}t| } t| } ||krVt| } t| ||t |d t  } q2W | 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   sz   t |t d }xRt|ddD ]B}t| ||t |d t  } ||krPt| } t| } t| } qW 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_inv)r   r   r1   r   r   r   r   r      s    r   c                s   d t t| } t |j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   r7   r   r   )NONCE_LENGTH_BYTESnoncer   r   Counter   s   r?   )
r   r   encoder   r   r   r	   objectr   r   )r   passwordr,   r   cipherr?   r   	plaintextr   )r=   r>   r   aes_decrypt_text   s    rE      r'   r"   r6   r%   @         6   c   |   w   {      k   o      0   g   +            v            }      Y   G                        r               &   ?         4            q      1         #      r&            r#            '      u   	      ,      n   Z      R   ;         )      /      S               [   j         9   J   L   X                  C   M   3      E         P   <         Q               8               !                        _      D            ~   =   d   ]      s   `      O      "   *         F               ^            2   :   
   I      $   \            b            y         7   m      N      l   V         e   z         x   %   .                     t      K            p   >      f   H   r$         a   5   W                              i                           U   (                        B   h   A      -         T         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_INV)r=  r>  r   r   r   r?    s    z!sub_bytes_inv.<locals>.<listcomp>r   )r   r   r   r   r5     s    r5   c             C   s   | dd  | d g S )Nr   r   r   )r   r   r   r   rotate!  s    rA  c             C   s(   t | } t| } | d t| A | d< | S )Nr   )rA  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    rI  c             C   sT   g }xJt dD ]>}d}x*t dD ]}|t| | || | N }q W |j| qW |S )Nr"   r   )r   rI  append)r   matrix
data_mixedrowmixedcolumnr   r   r   
mix_column7  s    rP  c             C   s@   g }x6t dD ]*}| |d |d d  }|t||7 }qW |S )Nr"   r   )r   rP  )r   rK  rL  r   rO  r   r   r   r0   B  s
    r0   c             C   s
   t | tS )N)r0   MIX_COLUMN_MATRIX_INV)r   r   r   r   r3   J  s    r3   c             C   sJ   g }x@t dD ]4}x.t dD ]"}|j| || d@ d |   qW qW |S )Nr"   r$   )r   rJ  )r   data_shiftedrO  rM  r   r   r   r/   N  s
    &r/   c             C   sJ   g }x@t dD ]4}x.t dD ]"}|j| || d@ d |   qW qW |S )Nr"   r$   )r   rJ  )r   rR  rO  rM  r   r   r   r4   V  s
    &r4   c             C   sV   | d d  } xDt t| d ddD ],}| | dkr<d| |< q"| | d | |< P q"W | S )Nr   r   r   r2   r2   )r   r   )r   r   r   r   r   r8   ^  s    
r8   N)rF   r   r'   r"   r6   r   r%   rG   rH   rI   rJ   (   rK   rL   rM   rN   rO   rP   rQ   rR   rS   r   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rJ   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   r"   ry   rz   r{   r&   r|   r}   r~   r#   r   rH   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   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   rG   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   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   rF   r   r   r   r   r   r   r   r   r   r   r6   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"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  (   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'   )rS  rT  rU  rV  r  r   r/  r   r   r  r   r/  r/  r   r  r   r   r/  r   r  )rW  rX  rY  rZ  (   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#   )%
__future__r   mathr   compatr   utilsr   r   r   r   r    r!   r	   r   r   rE   rB  r<  r@  ZMIX_COLUMN_MATRIXrQ  rE  rF  r*   r5   rA  r)   r   rI  rP  r0   r3   r/   r4   r8   __all__r   r   r   r   <module>   s   #&                                                                  