Ë
    š„jV  ã                   ó<  — d dl Z d dlmZ ddlmZ ddlmZ ej                  rd„ Zd„ Z	nd„ Zd	„ Z	d
„ Z
dZd„ Zd„ Zd„ Zd1d„Zd1d„Zd„ Zd„ Zd„ Zddœd„Zd„ Zd„ Zd„ Zd„ ZdZdZdZdZdZd Zd!Zd"„ Z d#„ Z!d$„ Z"d%„ Z#d&„ Z$d'„ Z%d(„ Z&d)„ Z'd*„ Z(d+„ Z)d,„ Z*d-„ Z+d.„ Z,d/„ Z-g d0¢Z.y)2é    N)Úceilé   ©Ú
compat_ord)Ú
Cryptodomec                 ó’   — t         j                  j                  |t         j                  j                  |«      j	                  | «      S )z/ Decrypt bytes with AES-CBC using pycryptodome )r   ÚAESÚnewÚMODE_CBCÚdecrypt©ÚdataÚkeyÚivs      úA/var/www/html/GAP/venv/lib/python3.12/site-packages/yt_dlp/aes.pyÚaes_cbc_decrypt_bytesr      s0   € ä�~‰~×!Ñ! #¤z§~¡~×'>Ñ'>ÀÓC×KÑKÈDÓQÐQó    c                 ó”   — t         j                  j                  |t         j                  j                  |«      j	                  | |«      S )z/ Decrypt bytes with AES-GCM using pycryptodome )r   r	   r
   ÚMODE_GCMÚdecrypt_and_verify©r   r   ÚtagÚnonces       r   Ú aes_gcm_decrypt_and_verify_bytesr      s4   € ä�~‰~×!Ñ! #¤z§~¡~×'>Ñ'>ÀÓF×YÑYÐZ^Ð`cÓdÐdr   c           
      óF   — 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   s      r   r   r      s   € ä”_¤c¬$°°s¸B°Ó&@ÐAÓBÐBr   c                 óH   — 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   s       r   r   r      s#   € äÔ/´´T¸DÀ#ÀsÈEÐ;RÓ1SÐTÓUÐUr   c           
      óL   — t        t        t        t        | ||f«      i |¤Ž«      S ©N)r   Úaes_cbc_encryptr   r   )r   r   r   Úkwargss       r   Úaes_cbc_encrypt_bytesr&      s$   € Ü”¤#¤d¨T°3¸¨OÓ"<ÐGÀÑGÓHÐHr   é   c                 ó&   — | d t        | d   «        S )Néÿÿÿÿr   ©r   s    r   Úunpad_pkcs7r+   !   s   € ØÐ&”*˜T "™XÓ&Ð&Ð'Ð'r   c                 óF   — t         t        | «      t         z  z
  }| |g|z  z   S )zn
    PKCS#7 padding

    @param {int[]} data        cleartext
    @returns {int[]}           padding data
    )ÚBLOCK_SIZE_BYTESÚlen)r   Úremaining_lengths     r   Úpkcs7_paddingr0   %   s.   € ô (¬#¨d«)Ô6FÑ*FÑFÐØÐ#Ð$Ð'7Ñ7Ñ7Ð7r   c                 ó¶   — t         t        | «      z
  }|ddddœ}|dk  rt        d«      ‚||vrt        d|› d�«      ‚|dk(  r|rg | ¢d‘} |d	z  }| ||   g|z  z   S )
z‹
    Pad a block with the given padding mode
    @param {int[]} block        block to pad
    @param padding_mode         padding mode
    r   é    )Úpkcs7Úiso7816Ú
whitespaceÚzerozBlock size exceededzPadding mode z is not implementedr4   é€   r   )r-   r.   Ú
ValueErrorÚNotImplementedError)ÚblockÚpadding_modeÚpadding_sizeÚPADDING_BYTEs       r   Ú	pad_blockr>   1   s“   € ô $¤c¨%£jÑ0€Lð ØØØñ	€Lð �aÒÜÐ.Ó/Ð/Ø	˜\Ñ	)Ü! M°,°Ð?RÐ"SÓTÐTà�yÒ ¡\Ø�%�˜�ˆØ˜Ñˆà�L Ñ.Ð/°,Ñ>Ñ>Ð>r   c                 óÒ   — t        |«      }t        t        | «      t        z  «      }g }t	        |«      D ]0  }| |t        z  |dz   t        z   }|t        t        |«      |«      z  }Œ2 |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_encryptr0   ©r   r   r   Úexpanded_keyÚblock_countÚencrypted_dataÚir:   s           r   Úaes_ecb_encryptrH   L   sw   € ô ! Ó%€LÜ”s˜4“yÔ#3Ñ3Ó4€Kà€NÜ�;Óò JˆØ�QÔ)Ñ)¨A°©EÔ5EÑ+EÐFˆØœ+¤m°EÓ&:¸LÓIÑI‰ðJð Ðr   c                 óØ   — t        |«      }t        t        | «      t        z  «      }g }t	        |«      D ]'  }| |t        z  |dz   t        z   }|t        ||«      z  }Œ) |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-   rA   Úaes_decryptrC   s           r   Úaes_ecb_decryptrK   `   s{   € ô ! Ó%€LÜ”s˜4“yÔ#3Ñ3Ó4€Kà€NÜ�;Óò ;ˆØ�QÔ)Ñ)¨A°©EÔ5EÑ+EÐFˆØœ+ e¨\Ó:Ñ:‰ð;ð ˜*œ3˜t›9Ð%Ð%r   c                 ó   — 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   s      r   Úaes_ctr_decryptrN   s   s   € ô ˜4  bÓ)Ð)r   c                 óN  — t        |«      }t        t        | «      t        z  «      }t	        |«      }g }t        |«      D ]W  }t        |«      }| |t        z  |dz   t        z   }	|	dgt        t        |	«      z
  z  z  }	t        ||«      }
|t        |	|
«      z  }ŒY |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_vectorrA   ÚnextrB   Úxor)r   r   r   rD   rE   ÚcounterrF   rG   Úcounter_blockr:   Úcipher_counter_blocks              r   rM   rM      s¶   € ô ! Ó%€LÜ”s˜4“yÔ#3Ñ3Ó4€KÜ˜"‹o€Gà€NÜ�;Óò ;ˆÜ˜W›ˆØ�QÔ)Ñ)¨A°©EÔ5EÑ+EÐFˆØ�!�Ô(¬3¨u«:Ñ5Ñ6Ñ6ˆä*¨=¸,ÓGÐØœ#˜eÐ%9Ó:Ñ:‰ð;ð ˜*œ3˜t›9Ð%Ð%r   c                 ó*  — t        |«      }t        t        | «      t        z  «      }g }|}t	        |«      D ]N  }| |t        z  |dz   t        z   }|dgt        t        |«      z
  z  z  }t        ||«      }	|t        |	|«      z  }|}ŒP |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-   rA   rJ   rR   )
r   r   r   rD   rE   Údecrypted_dataÚprevious_cipher_blockrG   r:   Údecrypted_blocks
             r   r   r   —   s¯   € ô ! Ó%€LÜ”s˜4“yÔ#3Ñ3Ó4€Kà€NØÐÜ�;Óò &ˆØ�QÔ)Ñ)¨A°©EÔ5EÑ+EÐFˆØ�!�Ô(¬3¨u«:Ñ5Ñ6Ñ6ˆä% e¨\Ó:ˆØœ#˜oÐ/DÓEÑEˆØ %Ñð&ð ˜*œ3˜t›9Ð%Ð%r   r3   )r;   c                óü   — t        |«      }t        t        | «      t        z  «      }g }|}t	        |«      D ]C  }| |t        z  |dz   t        z   }	t        |	|«      }	t        |	|«      }
t        |
|«      }||z  }|}ŒE |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-   rA   r>   rR   rB   )r   r   r   r;   rD   rE   rF   rX   rG   r:   Úmixed_blockÚencrypted_blocks               r   r$   r$   ¯   sš   € ô ! Ó%€LÜ”s˜4“yÔ#3Ñ3Ó4€Kà€NØÐÜ�;Óò 	0ˆØ�QÔ)Ñ)¨A°©EÔ5EÑ+EÐFˆÜ˜% Ó.ˆä˜%Ð!6Ó7ˆä% k°<Ó@ˆØ˜/Ñ)ˆà /Ñð	0ð Ðr   c                 ó¦  — t        dgt        z  t        |«      «      }t        |«      dk(  rg |¢d‘d‘d‘d‘}n`t        t        |«      t        z  z
  t        z  dz   }|dg|z  z   t	        dt        |«      z  j                  dd«      «      z   }t        ||«      }t        |«      }t        | ||dgt        t        |«      z
  z  z   «      }	t        t        | «      t        z  z
  t        z  }
t        || dg|
z  z   t	        dj                  dd«      t        | «      dz  j                  dd«      z   «      z   «      }|t        |||«      k7  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)rB   r-   r@   r.   r   Úto_bytesÚghashÚincrN   rM   r8   )r   r   r   r   Úhash_subkeyÚj0ÚfillÚghash_inÚiv_ctrrW   Úpad_lenÚs_tags               r   r!   r!   Ì   sj  € ô ˜q˜cÔ$4Ñ4´mÀCÓ6HÓI€Kä
ˆ5ƒz�RÒØ!ˆuÐ!�aÐ!˜Ð!˜AÐ!˜qÐ!‰ä ¤C¨£JÔ1AÑ$AÑBÔFVÑVÐYZÑZˆØ˜A˜3 ™:Ñ%¬¨a´#°e³*©n×-FÑ-FÀqÈ%Ó-PÓ(QÑQˆÜ�; Ó)ˆô
 �‹W€Fä$ T¨3°¸!¸Ô@PÔSVÐW]ÓS^Ñ@^Ñ9_Ñ0_Ó`€NÜ¤3 t£9Ô/?Ñ#?Ñ@ÔDTÑT€GÜØØØˆ#�‰-ñ	ä
�×Ñ  5Ó)Ü�t“9˜q‘=×*Ñ*¨1¨eÓ4ñ6ó 7ñ	7ó€Eð Œo˜e S¨"Ó-Ò-ÜÐ9Ó:Ð:àÐr   c                 ó&  — t        |«      t        z  dz
  }t        | |dt         «      } t        d|dz   «      D ]V  }t	        | «      } t        | «      } ||k7  rt        t        | t        «      «      } t        | ||t        z  |dz   t        z   «      } ŒX | 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-   rR   rA   Ú	sub_bytesÚ
shift_rowsr   Úiter_mix_columnsÚMIX_COLUMN_MATRIX©r   rD   ÚroundsrG   s       r   rB   rB   ÷   s¡   € ô �ÓÔ"2Ñ2°QÑ6€Fäˆt�\Ð"3Ô#3Ð4Ó5€DÜ�1�f˜q‘jÓ!ò YˆÜ˜‹ˆÜ˜$ÓˆØ�Š;ÜÔ(¨Ô/@ÓAÓBˆDÜ�4˜ aÔ*:Ñ&:¸QÀ¹UÔFVÑ<VÐWÓX‰ðYð €Kr   c                 ó  — t        |«      t        z  dz
  }t        |dd«      D ]V  }t        | ||t        z  |dz   t        z   «      } ||k7  rt	        t        | t        «      «      } t        | «      } t        | «      } ŒX 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-   rA   rR   r   rn   ÚMIX_COLUMN_MATRIX_INVÚshift_rows_invÚsub_bytes_invrp   s       r   rJ   rJ     sš   € ô �ÓÔ"2Ñ2°QÑ6€Fä�6˜1˜bÓ!ò #ˆÜ�4˜ aÔ*:Ñ&:¸QÀ¹UÔFVÑ<VÐWÓXˆØ�Š;ÜÔ(¨Ô/DÓEÓFˆDÜ˜dÓ#ˆÜ˜TÓ"‰ð#ô ˆt�\Ð"3Ô#3Ð4Ó5Ð5r   c                 óP  — d}t        t        j                  | «      «      } t        |j                  «       «      }|d| dg|t	        |«      z
  z  z   }t        |dt         t        |«      «      |t        z  z  }| d| }| |d }t        |||dgt        |z
  z  z   «      }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
    r_   Nr   )
r   Úbase64Ú	b64decodeÚencoder.   rB   r-   r@   rN   r   )r   ÚpasswordÚkey_size_bytesÚNONCE_LENGTH_BYTESr   r   ÚcipherrW   s           r   Úaes_decrypt_textr~     s¾   € ð Ðä”× Ñ  Ó&Ó'€DÜ�H—O‘OÓ%Ó&€Hà
�?�NÐ
# q c¨^¼cÀ(»mÑ-KÑ&LÑ
L€CÜ
�cÐ+Ô+Ð,¬m¸CÓ.@Ó
AÀ^ÔWgÑEgÑ
h€CàÐ$Ð$Ð%€EØÐ$Ð%Ð&€Fä$ V¨S°%¸1¸#ÔAQÐTfÑAfÑ:gÑ2gÓh€NÜ�Ó Ð r   )é�   r   é   é   r_   r'   r2   é@   r7   é   é6   (   éc   é|   éw   é{   éò   ék   éo   éÅ   é0   r   ég   é+   éþ   é×   é«   év   éÊ   é‚   éÉ   é}   éú   éY   éG   éð   é­   éÔ   é¢   é¯   éœ   é¤   ér   éÀ   é·   éý   é“   é&   r„   é?   é÷   éÌ   é4   é¥   éå   éñ   éq   éØ   é1   é   r�   éÇ   é#   éÃ   é   é–   é   éš   é   é   r7   éâ   éë   é'   é²   éu   é	   éƒ   é,   é   rƒ   én   éZ   é    éR   é;   éÖ   é³   é)   éã   é/   é„   éS   éÑ   r   éí   r2   éü   é±   é[   éj   éË   é¾   é9   éJ   éL   éX   éÏ   éÐ   éï   éª   éû   éC   éM   é3   é…   éE   éù   r€   é   éP   é<   éŸ   é¨   éQ   é£   r‚   é�   é’   é�   é8   éõ   é¼   é¶   éÚ   é!   r'   éÿ   éó   éÒ   éÍ   r^   é   éì   é_   é—   éD   é   éÄ   é§   é~   é=   éd   é]   é   és   é`   é�   éO   éÜ   é"   é*   é�   éˆ   éF   éî   é¸   é   éÞ   é^   é   éÛ   éà   é2   é:   é
   éI   é   é$   é\   éÂ   éÓ   é¬   éb   é‘   é•   éä   éy   éç   éÈ   é7   ém   r   éÕ   éN   é©   él   éV   éô   éê   ée   éz   é®   r_   éº   éx   é%   é.   é   é¦   é´   éÆ   éè   éÝ   ét   é   éK   é½   é‹   éŠ   ép   é>   éµ   éf   éH   é   éö   é   éa   é5   éW   é¹   é†   éÁ   é   éž   éá   éø   é˜   é   éi   éÙ   éŽ   é”   é›   é   é‡   éé   éÎ   éU   é(   éß   éŒ   é¡   é‰   é   é¿   éæ   éB   éh   éA   é™   é-   é   é°   éT   é»   é   (   rÈ   rÁ   rÖ   r.  r�   r„   r¬   rò   rl  r‚   rî   rW  r  rù   r‘   rá   r†   rÍ   rÙ   r•   r`  rÎ   rø   rb  r«   r^  râ   r   r  r  rc  r×   ru  rˆ   r_  r  r=  r"  r´   r  r  rÛ   r'  r  rn  r˜   rµ   r/  r_   r;  ri  rK  rf  r]  r   r¿   r“   rÕ   rž   r  r-  rF  rÑ   r:  r¢   rY  rN  r  rT  ro  rZ  rw  r�   r¡   r!  rª   r  r5  rõ   rð   r1  rH  rL  ré   r¥   rÒ   rS  rö   r  r²   r  rR  r  r   rñ   rÏ   r  r°   r’   r   rh  rô   r#  r  r©   r(  rÜ   r¸   r  rË   ræ   r  rÞ   rÃ   ra  rï   r”   r¨   rs  r€   rU  rŸ   rE  rM  r   rü   rG  rŠ   r  r&  r[  rp  r  rŽ   r  r4  rÿ   r‰   rÝ   rd  r›   r>  rm  r	  r·   r$  rB  r  r*  rœ   rQ  rå   r¼   rç   r,  r@  r<  rÀ   rg  rÅ   rš   r®   rÄ   r¯   rV  rÌ   rŒ   rj  r‹   r¤   r%  rO  rà   r¶   rØ   rƒ   rÓ   r2  rI  rD  r?  rú   r)  r2   r¹   r  r£   r�   r9  rû   rÆ   r3  rC  rA  rì   rä   r  rº   r³   r±   rÔ   r»   r'   r™   r¾   r7   rý   rþ   r
  rí   rè   r0  r  rJ  rÚ   rk  rr  r­   r6  rë   r¦   r–   r    rß   rÇ   r  rÉ   rã   r7  r  ró   rt  r+  r½   rv  rê   rÂ   rÐ   rq  rP  r  r�   r�   r  r8  r‡   rÊ   r§   rX  r\  r  r…   re  r÷   r^   r—   ))r€   rM  r   r   )r   r€   rM  r   )r   r   r€   rM  )rM  r   r   r€   ))rO  r  rk  rÁ   )rÁ   rO  r  rk  )rk  rÁ   rO  r  )r  rk  rÁ   rO  (   r   rM  r¸   rs  r[  rä   re  rø   rÄ   r;  r¢   r·   ri  rY  rü   rQ  rþ   rX  rò   rL  r°   r	  r'  r¡   r©   r€   r  r  ra  r  rK  rà   r­   r«   r!  r(  r,  r™   r½   r§   rÖ   rØ   r]  rH  r  r’   rm  r±   rÐ   ró   r�   r^   r  rê   r   rª   r  rÑ   ro  r  r#  rÅ   r¿   rû   rÛ   r�   rŽ   r0  r  rÉ   rã   r‘   r%  r=  r®   r_   r¶   rf  r9  r  rÂ   rW  rS  rÞ   rŠ   rE  r  rè   r  rZ  rË   rd  r  r  r“   r¹   rJ  r  rR  rç   r'   r�   ré   r›   r  rV  r¾   r\  rv  rÊ   rP  rî   r�   r  r�   r—   rb  rð   rœ   rý   rÎ   r¯   r¦   r7  rc  r2   r
  rÇ   rá   rw  r  r/  rú   r-  r¤   r"  r  r*  r  r2  r˜   r²   r¨   rp  rµ   r  r¼   r  rš   r–   r‚   r£   rÕ   rÒ   rÃ   rB  r    rl  rö   rÀ   rë   r8  r.  r  r$  rß   r  r  r•   rñ   rô   rg  r6  r^  rj  r7   r`  rõ   rU  rÜ   r@  r´   r5  rŸ   r4  r:  r‹   rÔ   r+  râ   rŒ   ru  rÓ   rC  r÷   r…   r¬   r3  rº   rÁ   rƒ   rr  r‡   rq  rt  r×   r  r”   ræ   rÝ   rÚ   r  r)  rF  rT  r&  rì   rÍ   rI  rn  r?  rí   rù   rO  r»   r„   rÆ   r  rÌ   rˆ   r   rh  rï   rG  rå   r_  r  r‰   rk  r  rÙ   rD  rA  r†   rÏ   rÿ   rž   r¥   r<  r   r1  r>  r³   rÈ   rN  r   (   r   r   r  r   r  r€   rÄ   r?  rD  r³   rƒ   ro  rä   r  rg  rM  r  r�   r  rO  r«   r   r  rß   rÛ   r¯   r_   r+  rY  r\  r<  rU  r—   r"  rV  rJ  rç   rS  r¾   rÖ   rã   r(  r=  r¢   r¹   r–   rÁ   r9  r5  rÎ   rG  r¸   r÷   rs  rX  r   r»   r›   r•   ræ   rQ  r¦   rö   r^  r·   rï   r  rE  r„   rÞ   rd  r_  rü   r!  rú   r®   r‚   r  rÂ   rò   rK  rA  r¥   r�   rl  r  rF  r%  rË   r:  r¼   rZ  r  r  r&  r'   r  rÅ   rL  rµ   rî   rõ   ra  rn  r  rŠ   rf  ru  r˜   rå   r  r8  r�   r)  r  r²   r`  rë   r  r”   r/  r�   r$  r­   rù   r	  r  rR  rŸ   rÜ   rì   ré   r3  r4  rÊ   rB  r  r7  rc  r.  r*  rm  rœ   r@  rÃ   r‘   rÀ   r6  r½   rw  r  ró   r™   r×   rþ   rt  r    r0  rí   rÇ   rè   r^   rN  r‹   r  r  r  rý   r°   râ   rC  rr  r¡   r“   rˆ   r¤   rª   rv  rI  rÆ   rá   r
  rÔ   rT  rÉ   rÈ   ri  r1  rà   re  rÌ   rñ   rÿ   r¿   rb  r  rP  rØ   r  rÓ   rô   r'  rÝ   rû   r,  r¨   rÕ   rÑ   rÐ   rÙ   rÏ   rê   rp  rž   r-  rš   r  r  rW  r  r2  r‰   r#  r’   r   r[  rð   r]  r´   r2   r;  rj  r>  r†   r  r§   r‡   rq  rÍ   r¬   rŽ   rÚ   rÒ   r  rŒ   r±   r�   r¶   rk  r…   rh  r7   r£   r©   rH  rº   c           	      óþ  — | dd } d}t        | «      }|dz  dz   t        z  }t        | «      |k  rÊ| dd }t        ||«      }|dz  }| t        || | d|z
   «      z  } t	        d«      D ]  }| dd }| t        || | d|z
   «      z  } Œ |dk(  r&| dd }t        |«      }| t        || | d|z
   «      z  } t	        |dk(  rdn|dk(  rd	nd
«      D ]  }| dd }| t        || | d|z
   «      z  } Œ t        | «      |k  rŒÊ| 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º   éüÿÿÿrM  r2   r¶   r€   r   )r.   r-   Úkey_schedule_corerR   rA   rl   )r   Úrcon_iterationr{   Úexpanded_key_size_bytesÚtempÚ_s         r   r@   r@   †  sm  € ð ‘ˆ7€DØ€NÜ˜“Y€NØ-°Ñ2°QÑ6Ô:JÑJÐä
ˆd‹)Ð-Ò
-Ø�B�CˆyˆÜ   ~Ó6ˆØ˜!ÑˆØ”�D˜$ ˜°°NÑ0BÐCÓDÑDˆä�q“ò 	IˆAØ˜˜�9ˆDØ”C˜˜d N ?°A¸Ñ4FÐGÓHÑH‰Dð	Ið ˜RÒØ˜˜�9ˆDÜ˜T“?ˆDØ”C˜˜d N ?°A¸Ñ4FÐGÓHÑHˆDä˜N¨bÒ0‘q¸>ÈRÒ;O±aÐUVÓWò 	IˆAØ˜˜�9ˆDØ”C˜˜d N ?°A¸Ñ4FÐGÓHÑH‰Dð	Iô ˆd‹)Ð-Ó
-ð$ Ð(Ð(Ð)Ð)r   c              #   ó,   K  — 	 | –— t        | «      } Œ­wr#   )rc   )r   s    r   rP   rP   §  s   è ø€ Ø
ØŠÜ�‹Wˆð ùs   ‚c                 ó:   — | D �cg c]  }t         |   ‘Œ c}S c c}w r#   )ÚSBOX©r   Úxs     r   rl   rl   ­  s   € Ø!Ö"˜ŒD�‹GÒ"Ð"ùÒ"ó   …c                 ó:   — | D �cg c]  }t         |   ‘Œ c}S c c}w r#   )ÚSBOX_INVr‚  s     r   ru   ru   ±  s   € Ø!%Ö&˜AŒH�Q‹KÒ&Ð&ùÒ&r„  c                 ó   — g | dd  ¢| d   ‘S )Nr   r   © r*   s    r   Úrotater‰  µ  s   € ØˆT�!�"ˆXÐ�t˜A‘wÐÐr   c                 óV   — t        | «      } t        | «      } | d   t        |   z  | d<   | S )Nr   )r‰  rl   ÚRCON)r   r{  s     r   rz  rz  ¹  s0   € Ü�$‹<€DÜ�T‹?€DØ�1‰gœ˜^Ñ,Ñ,€Dˆ�Gà€Kr   c                 óV   — t        | |d¬«      D ��cg c]
  \  }}||z  ‘Œ c}}S c c}}w )NF)Ústrict)Úzip)Údata1Údata2rƒ  Úys       r   rR   rR   Á  s'   € Ü! %¨°uÔ=×>‘d�a˜ˆA�‹EÓ>Ð>ùÓ>s   ’%c           	   #   óÖ   K  — dD ]`  }|D ]Y  }d}t        d«      D ]C  }|| ||dz    |   dk(  s||   dk(  rdn%t        t        | ||z         t        ||      z   dz     z  }ŒE |–— Œ[ Œb y ­w)N)r   r�   r_   r^   r   r�   rø   )rA   ÚRIJNDAEL_EXP_TABLEÚRIJNDAEL_LOG_TABLE)r   ÚmatrixrG   ÚrowÚmixedÚjs         r   rn   rn   Å  s    è ø€ Øò ˆØò 	ˆCØˆEÜ˜1“Xò u�à˜t A a¨!¡e˜}¨QÑ/°1Ò4¸¸A¹À!º™!Ü,Ô.@ÀÀaÈ!ÁeÁÑ.MÔPbÐcfÐghÑciÑPjÑ.jÐnrÑ-rÑsñu‘ðuð ‹Kñ	ñùs   ‚A'A)c                 ó‚   — t        d«      D ��cg c]#  }t        d«      D ]  }| ||z   dz  dz  |z      ‘Œ Œ% c}}S c c}}w ©Nr�   rM  ©rA   ©r   Úcolumnr–  s      r   rm   rm   Ð  óF   € ÜBGÈÃ(×_¸ÔV[Ð\]ÓV^Ò_ÈsˆD�6˜C‘< 4Ñ'¨1Ñ,¨sÑ2Ó3Ð_Ð3Ó_Ð_ùÓ_ó   �(;c                 ó‚   — t        d«      D ��cg c]#  }t        d«      D ]  }| ||z
  dz  dz  |z      ‘Œ Œ% c}}S c c}}w rš  r›  rœ  s      r   rt   rt   Ô  rž  rŸ  c                 ó`   — g }d}| D ]$  }|r|dz  }|dz  }|dz  }|j                  |«       Œ& |S )Nr   é   r   )Úappend)r   Údata_shiftedÚbitÚns       r   Úshift_blockr§  Ø  sO   € Ø€Là
€CØò ˆÙØ�‰JˆAØ�!‰eˆØ	ˆa‰ˆØ×Ñ˜AÕðð Ðr   c                 ó‚   — | d d  } t        t        | «      dz
  dd«      D ]  }| |   dk(  rd| |<   Œ| |   dz   | |<    | S  | S )Nr   r)   rø   r   )rA   r.   )r   rG   s     r   rc   rc   æ  s_   € Ø‘ˆ7€DÜ”3�t“9˜q‘= " bÓ)ò ˆØ�‰7�cŠ>ØˆD�ŠGà˜1‘g ‘kˆD�‰GØØ€Kðð €Kr   c                 óR  — t        | «      t        k7  st        |«      t        k7  rt        dt        › d�«      ‚dgdgt        dz
  z  z   }|d d  }dgt        z  }| D ]J  }t        ddd«      D ]8  }|d|z  z  rt	        ||«      }|d   dz  }t        |«      }|sŒ-t	        ||«      }Œ: ŒL |S )NzLength of blocks need to be ú bytesrX  r   r   rº   r)   )r.   r-   r8   rA   rR   r§  )Úblock_xÚblock_yÚblock_rÚblock_vÚblock_zrG   r¥  Údo_xors           r   Úblock_productr±  ñ  sÎ   € ô ˆ7ƒ|Ô'Ò'¬3¨w«<Ô;KÒ+KÜÐ7Ô8HÐ7IÈÐPÓQÐQàˆf˜�sÔ.°Ñ2Ñ3Ñ3€GØ‘aˆj€GØˆcÔ$Ñ$€Gàò 0ˆÜ˜˜B Ó#ò 	0ˆCØ�A˜‘HŠ~Ü˜g wÓ/�à˜R‘[ 1‘_ˆFÜ! 'Ó*ˆGÚÜ˜g wÓ/‘ñ	0ð0ð €Nr   c                 óæ   — t        |«      t        z  rt        dt        › d�«      ‚dgt        z  }t        dt        |«      t        «      D ]$  }|||t        z    }t	        t        ||«      | «      }Œ& |S )NzLength of data should be rª  r   )r.   r-   r8   rA   r±  rR   )Úsubkeyr   Úlast_yrG   r:   s        r   rb   rb     s~   € ô ˆ4ƒyÔ#Ò#ÜÐ4Ô5EÐ4FÀfÐMÓNÐNàˆSÔ#Ñ#€FÜ�1”c˜$“iÔ!1Ó2ò ;ˆØ�Q˜Ô,Ñ,Ð-ˆÜœs 6¨5Ó1°6Ó:‰ð;ð €Mr   )r   r   r$   r&   rN   rM   rJ   r~   rK   rH   rB   r!   r   r@   r>   r0   r+   r#   )/rw   Úmathr   Úcompatr   Údependenciesr   r	   r   r   r&   r-   r+   r0   r>   rH   rK   rN   rM   r   r$   r!   rB   rJ   r~   r‹  r�  r†  ro   rs   r“  r”  r@   rP   rl   ru   r‰  rz  rR   rn   rm   rt   r§  rc   r±  rb   Ú__all__rˆ  r   r   ú<module>r¹     s  ðÛ Ý å Ý $à‡>‚>òRóeò
CòVò
Ið Ð ò(ò	8ò?ó6ó(&ò&	*ò&ò0&ð0 4;ô ò:(òVò*6ò&!ð8 J€ðh€ð l€ð +Ð ð/Ð ðvÐ ð vÐ ò$*òBò#ò'ò òò?òò`ò`òòòò.ò�r   