
    V|hV                     L   S SK r S SKJr  SSKJr  SSKJr  \R                  (       a  S rS r	OS rS	 r	S
 r
SrS rS rS rS1S jrS1S jrS rS rS rSS.S jrS rS rS rS rSrSrSrSrSrS rS!rS" r S# r!S$ r"S% r#S& r$S' r%S( r&S) r'S* r(S+ r)S, r*S- r+S. r,S/ r-/ S0Qr.g)2    N)ceil   
compat_ord)
Cryptodomec                     [         R                  R                  U[         R                  R                  U5      R	                  U 5      $ )z.Decrypt bytes with AES-CBC using pycryptodome )r   AESnewMODE_CBCdecryptdatakeyivs      D/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/aes.pyaes_cbc_decrypt_bytesr      s0    ~~!!#z~~'>'>CKKDQQ    c                     [         R                  R                  U[         R                  R                  U5      R	                  X5      $ )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      s1    ~~!!#z~~'>'>FYYZ^ddr   c           
      D    [        [        [        [        XU45      6 5      $ )zYDecrypt bytes with AES-CBC using native implementation since pycryptodome is unavailable )bytesaes_cbc_decryptmaplistr   s      r   r   r      s    _c$B&@ABBr   c                 D    [        [        [        [        XX#45      6 5      $ )zYDecrypt bytes with AES-GCM using native implementation since pycryptodome is unavailable )r   aes_gcm_decrypt_and_verifyr   r   r   s       r   r   r      s    /TDs;R1STUUr   c           
      J    [        [        [        [        XU45      0 UD65      $ N)r   aes_cbc_encryptr   r   )r   r   r   kwargss       r   aes_cbc_encrypt_bytesr&      s"    #dTO"<GGHHr      c                 &    U S [        U S   5      *  $ )Nr   r   s    r   unpad_pkcs7r+   !   s    &*T"X&&''r   c                 D    [         [        U 5      [         -  -
  nX/U-  -   $ )z^
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                     [         [        U 5      -
  nUSSSS.nUS:  a  [        S5      eX;  a  [        SU S35      eUS:X  a  U(       a  / U QSPn US	-  nXU   /U-  -   $ )
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0L 	L a.//		)!M,?R"STTy \%./,>>>r   c                     [        U5      n[        [        U 5      [        -  5      n/ n[	        U5       H0  nX[        -  US-   [        -   nU[        [        U5      U5      -  nM2     U$ )z
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   sn     !%Ls4y#334KN;))AE5E+EF+mE&:LII   r   c                     [        U5      n[        [        U 5      [        -  5      n/ n[	        U5       H&  nX[        -  US-   [        -   nU[        Xs5      -  nM(     US[        U 5       $ )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   `   sr     !%Ls4y#334KN;))AE5E+EF+e::   *3t9%%r   c                     [        XU5      $ )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     4b))r   c                 L   [        U5      n[        [        U 5      [        -  5      n[	        U5      n/ n[        U5       HU  n[        U5      nX[        -  US-   [        -   n	U	S/[        [        U	5      -
  -  -  n	[        X5      n
U[        X5      -  nMW     US[        U 5       $ )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s4y#334K"oGN;W))AE5E+EF!(3u:566*=G#e::   *3t9%%r   c                 (   [        U5      n[        [        U 5      [        -  5      n/ nUn[	        U5       HL  nX[        -  US-   [        -   nUS/[        [        U5      -
  -  -  n[        X5      n	U[        X5      -  nUnMN     US[        U 5       $ )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s4y#334KN;))AE5E+EF!(3u:566%e:#oEE %   *3t9%%r   r3   )r;   c                    [        U5      n[        [        U 5      [        -  5      n/ nUn[	        U5       H?  nX[        -  US-   [        -   n	[        X5      n	[        X5      n
[        X5      nXk-  nUnMA     U$ )z
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s4y#334KN;))AE5E+EF%.%7%k@) /   r   c                    [        S/[        -  [        U5      5      n[        U5      S:X  a  / UQSPSPSPSPnO_[        [        U5      [        -  -
  [        -  S-   nUS/U-  -   [	        S[        U5      -  R                  SS5      5      -   n[        XG5      n[        U5      n[        XUS/[        [        U5      -
  -  -   5      n	[        [        U 5      [        -  -
  [        -  n
[        UU S/U
-  -   [	        SR                  SS5      [        U 5      S-  R                  SS5      -   5      -   5      nU[        XU5      :w  a  [        S5      eU	$ )a  
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!      sd    qc$44mC6HIK
5zR!u!a!!A!q! CJ1A$ABFVVYZZA3:%a#e*n-F-Fq%-P(QQ;)
 WF$T!@PSVW]S^@^9_0_`N3t9/?#?@DTTG#-	
5)t9q=**1e46 7	7E oe"--9::r   c                 &   [        U5      [        -  S-
  n[        XS[         5      n [        SUS-   5       HV  n[	        U 5      n [        U 5      n X2:w  a  [        [        U [        5      5      n [        XU[        -  US-   [        -   5      n MX     U $ )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2Q6Ft"3#345D1fqj!$;(/@ABD4a*:&:QUFV<VWX " Kr   c                    [        U5      [        -  S-
  n[        USS5       HV  n[        XU[        -  US-   [        -   5      n X2:w  a  [	        [        U [        5      5      n [        U 5      n [        U 5      n MX     [        XS[         5      $ )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2Q6F61b!4a*:&:QUFV<VWX;(/DEFDd#T" " t"3#3455r   c                 N   Sn[        [        R                  " U 5      5      n [        UR                  5       5      nUSU S/U[	        U5      -
  -  -   n[        US[         [        U5      5      U[        -  -  nU SU nXS n[        XdUS/[        U-
  -  -   5      n[        U5      $ )a>  
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HOO%&H
?N
#qc^c(m-K&L
LC
c++,mC.@
A^WgEg
hC$$%E%&F$V%1#AQTfAf:g2ghN  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           	         U SS n Sn[        U 5      nUS-  S-   [        -  n[        U 5      U:  a  U SS n[        XA5      nUS-  nU [        X@U* SU-
   5      -  n [	        S5       H  nU SS nU [        X@U* SU-
   5      -  n M     US:X  a%  U SS n[        U5      nU [        X@U* SU-
   5      -  n [	        US:X  a  SO	US:X  a  S	OS
5       H  nU SS nU [        X@U* SU-
   5      -  n M     [        U 5      U:  a  M  U SU $ )zy
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@     sV    7DNYN-2Q6:JJ
d)-
-BCy 6!DN0BCDDqA9DCN?A4FGHHD  R9DT?DCN?A4FGHHDNb0q>R;OaUVWA9DCN?A4FGHHD X d)-
-$ (())r   c              #   .   #     U v   [        U 5      n M  7fr#   )rc   )r   s    r   rP   rP     s     
W s   c                 @    U  Vs/ s H  n[         U   PM     sn$ s  snf r#   )SBOXr   xs     r   rl   rl     s    !"TDGT"""   c                 @    U  Vs/ s H  n[         U   PM     sn$ s  snf r#   )SBOX_INVr  s     r   ru   ru     s    !%&AHQK&&&r  c                     / U SS  QU S   P$ )Nr   r    r*   s    r   rotater    s    T!"XtAwr   c                 V    [        U 5      n [        U 5      n U S   [        U   -  U S'   U $ )Nr   )r  rl   RCON)r   r{  s     r   rz  rz    s0    $<DT?D1g^,,DGKr   c                 R    [        X5       VVs/ s H	  u  p#X#-  PM     snn$ s  snnf r#   )zip)data1data2r  ys       r   rR   rR     s%    !%/0/daAE/000s   #c           	   #      #    S Hb  nU HY  nSn[        S5       HA  nX@X"S-    U   S:X  d  X5   S:X  a  SO#[        [        XU-         [        X5      -   S-     -  nMC     Uv   M[     Md     g 7f)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1XA!e}Q/14!!,.@!e.MPbcfciPj.jnr-rsu  K  s   A*A,c                     [        S5       VVs/ s H%  n[        S5        H  o X-   S-  S-  U-      PM     M'     snn$ s  snnf Nr   rM  rA   r   columnr  s      r   rm   rm     C    BG(_(V[\]V^s6<4'1,s23V^3(___   ,?c                     [        S5       VVs/ s H%  n[        S5        H  o X-
  S-  S-  U-      PM     M'     snn$ s  snnf r  r  r  s      r   rt   rt     r  r  c                 n    / nSnU  H*  nU(       a  US-  nUS-  nUS-  nUR                  U5        M,     U$ )Nr      r   )append)r   data_shiftedbitns       r   shift_blockr    sJ    L
CJA!e	aA  r   c                     U S S  n [        [        U 5      S-
  SS5       H  nX   S:X  a  SX'   M  X   S-   X'     U $    U $ )Nr   r)   r   r   )rA   r.   )r   rG   s     r   rc   rc     sR    7D3t9q="b)7c>DGgkDGK * Kr   c                 p   [        U 5      [        :w  d  [        U5      [        :w  a  [        S[         S35      eS/S/[        S-
  -  -   nUS S  nS/[        -  nU  HV  n[        SSS5       HB  nUSU-  -  (       a  [	        XC5      nUS   S-  n[        U5      nU(       d  M7  [	        X25      nMD     MX     U$ )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|''3w<;K+K78H7IPQQfs.233GajGc$$GB#CAH~g/R[1_F!'*Gvg/ $  Nr   c                     [        U5      [        -  (       a  [        S[         S35      eS/[        -  n[        S[        U5      [        5       H#  nXU[        -    n[	        [        X$5      U 5      nM%     U$ )NzLength of data should be r  r   )r.   r-   r8   rA   r  rR   )subkeyr   last_yrG   r:   s        r   rb   rb     su     4y##45E4FfMNNS##F1c$i!12,,-s616: 3 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#' 1``.r   