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rìdn|dkrød	nd
ƒD ],}| dd… }| t|| | d| … ƒ7 } qþq(| 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>   #&