
    iOS                        S SK r S SKrS SKJr   S SKJr  \(       a  S rS rOS rS	 r\rS
 rS rSrS,S jr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& r0S' r1S( r2S) r3S* r4S+ r5g! \ a     S SKJr   N! \ a    Sr  Nf = f\	 aH  r
SrS SKr\R                  " S5      R                  S\
R                  R                  \
5        C Sr
C
NSr
C
ff = f)-    N)ceil)AESaesz8Error when trying to import 'Cryptodome' module (%s: %s)c                 l    [         R                  " U[         R                  U5      R                  U 5      $ )z-Decrypt bytes with AES-CBC using pycryptodome)Cryptodome_AESnewMODE_CBCdecryptdatakeyivs      ;/app/mltbenv/lib/python3.13/site-packages/gallery_dl/aes.pyaes_cbc_decrypt_bytesr      s+    !!(("..5gdm	<    c                 l    [         R                  " U[         R                  U5      R                  X5      $ )z-Decrypt bytes with AES-GCM using pycryptodome)r   r   MODE_GCMdecrypt_and_verifyr   r   tagnonces       r    aes_gcm_decrypt_and_verify_bytesr       s.    !!((%11C1CD1N	Or   c           	      d    [        [        [        U 5      [        U5      [        U5      5      5      $ )z6Decrypt bytes with AES-CBC using native implementation)intlist_to_bytesaes_cbc_decryptbytes_to_intlistr   s      r   r   r   %   s.    T"S!R !
  	r   c           
      x    [        [        [        U 5      [        U5      [        U5      [        U5      5      5      $ )z6Decrypt bytes with AES-GCM using native implementation)r   aes_gcm_decrypt_and_verifyr   r   s       r   r   r   -   s7     :T"S!S!U#	!
  	r   c                 X    U (       d  g[         R                  " [        U 5       S3/U Q76 $ )Nr   B)structpacklen)xss    r   r   r   :   s&    ;;#b'!}*r**r   c                     U S U S   *  $ )N r   s    r   unpad_pkcs7r)   @   s    
$r(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       nU$ )z
Encrypt 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[]}           encrypted data
   N)key_expansionr   r#   BLOCK_SIZE_BYTESrangeaes_encryptr   r   r   expanded_keyblock_countencrypted_dataiblocks           r   aes_ecb_encryptr7   G   w     !%Ls4y#334KN;))AE5E+EF+e::   $JSY/N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       nU$ )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.   r/   aes_decryptr1   s           r   aes_ecb_decryptr;   \   r8   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_decryptr>   q   s     4b))r   c                 P   [        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       nU$ )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_vectorr/   nextr0   xor)r   r   r   r2   r3   counterr4   r5   counter_blockr6   cipher_counter_blocks              r   r=   r=   }   s     !%Ls4y#334K"oGN;W))AE5E+EF!(3u:566*=G#e::   $JSY/N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       nU$ )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:   rB   )
r   r   r   r2   r3   decrypted_dataprevious_cipher_blockr5   r6   decrypted_blocks
             r   r   r      s     !%Ls4y#334KN;))AE5E+EF!(3u:566%e:#oEE %   $JSY/Nr   c                    [        U5      n[        [        U 5      [        -  5      n/ nUn[	        U5       HN  nX[        -  US-   [        -   n[        [        U5      -
  n	X/U	-  -  n[        X5      n
[        X5      nX[-  nUnMP     U$ )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/   rB   r0   )r   r   r   r2   r3   r4   rH   r5   r6   remaining_lengthmixed_blockencrypted_blocks               r   aes_cbc_encryptrN      s     !%Ls4y#334KN;))AE5E+EF+c%j8#&666%7%k@) /   r   c                    [        S/[        -  [        U5      5      n[        U5      S:X  a  U/ SQ-   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   r   r   r,      bigzMismatching authentication tag)r0   r.   r-   r#   r   to_bytesghashincr>   r=   
ValueError)r   r   r   r   hash_subkeyj0fillghash_iniv_ctrrG   pad_lens_tags               r   r   r      sa    qc$44mC6HIK
5zR\! CJ1A$AB !A3:%(8U^%%a/)1 1;)
 WF$6QC#3c&k#ABBDN 
SY)99	:>NN 	
g	Q&$i!m%%a/1	
	
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.   rB   r/   	sub_bytes
shift_rowslistiter_mix_columnsMIX_COLUMN_MATRIXr   r2   roundsr5   s       r   r0   r0      s     "22Q6Ft"3#345D1fqj!$;(/@ABD4  1q5,<"<> ? " 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      n U $ )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.   r/   rB   ra   rb   MIX_COLUMN_MATRIX_INVshift_rows_invsub_bytes_invrd   s       r   r:   r:     s     "22Q6F61b!4  1q5,<"<> ?;(/DEFDd#T" " t"3#345DKr   c           
      L   Sn[        [        R                  " U 5      5      n [        UR                  S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      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
rQ   zutf-8Nr   )
r   binascii
a2b_base64encoder#   r0   r.   r-   r   r>   )r   passwordkey_size_bytesNONCE_LENGTH_BYTESr   r   ciphers          r   aes_decrypt_textrr   +  s      H//56D 89H
?N
#qc^c(m-K&L
LC
c++,mC.@
A	+	+-C $$%E%&FOUaS$47I$IJJ  r   )   r,         rQ   r*       @         6   (   c   |   w   {      k   o      0   r,   g   +            v            }      Y   G                        r               &   rz   ?         4            q      1      ru      #                        rx         '      u   	      ,      ry   n   Z      R   ;         )      /      S      r      rv         [   j         9   J   L   X                  C   M   3      E      rt      P   <         Q      rw            8               !   r*               rP         _      D            ~   =   d   ]      s   `      O      "   *         F               ^            2   :   
   I      $   \            b            y         7   m   rs      N      l   V         e   z      rQ      x   %   .                     t      K            p   >      f   H            a   5   W                              i                           U   (                        B   h   A      -         T         (   r   r   r   r$  r   rz   r   r   rb  rw   r   rM  r  r   r   r   r|   r   r   r   rV  r   r   rX  r   rT  r   r   r   r  rY  r   rk  r~   rU  r  r3  r  r   r   r	  r   r  r  rd  r   r   r%  rQ   r1  r_  rA  r\  rS  r  r   r   r   r   r  r#  r<  r   r0  r   rO  rD  r   rJ  re  rP  rm  r   r   r  r   r   r+  r   r   r'  r>  rB  r   r   r   rI  r   r  r   r  rH  r   rs   r   r   r  r   r   r   r^  r   r  r  r   r  r   r   r
  r   r   r  r   r   rW  r   r   r   ri  rt   rK  r   r;  rC  r,   r   r=  r   r  r  rQ  rf  r  r   r  r*  r   r   r   rZ  r   r4  rc  r   r   r  r8  r  r   r   rG  r   r   r   r"  r6  r2  r   r]  r   r   r   r   r   rL  r   r   r`  r   r   r  rE  r   r   r   ry   r   r(  r?  r:  r5  r   r  rv   r   r  r   r   r/  r   r   r)  r9  r7  r   r   r  r   r   r   r   r   r*   r   r   rx   r   r   r   r   r   r&  r   r@  r   ra  rh  r   r,  r   r   r   r   r   r   r  r   r   r-  r  r   rj  r!  r   rl  r   r   r   rg  rF  r   r   ru   r   r.  r}   r   r   rN  rR  r  r{   r[  r   rP   r   ))rt   rC  r,   r,   )r,   rt   rC  r,   )r,   r,   rt   rC  )rC  r,   r,   rt   ))rE  r  ra  r   )r   rE  r  ra  )ra  r   rE  r  )r  ra  r   rE  (   r,   rC  r   ri  rQ  r   r[  r   r   r1  r   r   r_  rO  r   rG  r   rN  r   rB  r   r   r  r   r   rt   r  r  rW  r  rA  r   r   r   r  r  r"  r   r   r   r   r   rS  r>  r  r   rc  r   r   r   ru   rP   r  r   r   r   r  r   re  r
  r  r   r   r   r   r   r   r&  r  r   r   r   r  r3  r   rQ   r   r\  r/  r  r   rM  rI  r   r   r;  r  r   r  rP  r   rZ  r  r  r   r   r@  r   rH  r   r*   r   r   r   r  rL  r   rR  rl  r   rF  r   r   r   r   r   rX  r   r   r   r   r   r   r-  rY  rv   r   r   r   rm  r  r%  r   r#  r   r  r   r   r  r(  r   r   r   rf  r   r  r   r   r   r   rw   r   r   r   r   r8  r   rb  r   r   r   r.  r$  r   r  r   r  r   r   r   r   r]  r,  rT  r`  rx   rV  r   rK  r   r6  r   r+  r   r*  r0  r   r   r!  r   r   rk  r   r9  r   r{   r   r)  r   r   ry   rh  r}   rg  rj  r   r  r   r   r   r   r  r  r<  rJ  r  r   r   r?  rd  r5  r   r   rE  r   rz   r   r	  r   r~   rs   r^  r   r=  r   rU  r   r   ra  r   r   r:  r7  r|   r   r   r   r   r2  r  r'  r4  r   r   rD  r,   (   r   r   r   r,   r  rt   r   r5  r:  r   ry   re  r   r	  r]  rC  r   ru   r  rE  r   rs   r  r   r   r   rQ   r!  rO  rR  r2  rK  r   r  rL  r@  r   rI  r   r   r   r  r3  r   r   r   r   r/  r+  r   r=  r   r   ri  rN  r  r   r   r   r   rG  r   r   rT  r   r   r  r;  rz   r   rZ  rU  r   r  r   r   rw   r  r   r   rA  r7  r   r   rb  r  r<  r  r   r0  r   rP  r  r  r  r*   r   r   rB  r   r   r   rW  rd  r  r   r\  rk  r   r   r   r.  r   r  r  r   rV  r   r  r   r%  r   r  r   r   r   r   rH  r   r   r   r   r)  r*  r   r8  r  r-  rY  r$  r   rc  r   r6  r   r   r   r,  r   rm  r  r   r   r   r   rj  r   r&  r   r   r   rP   rD  r   r   r   r  r   r   r   r9  rh  r   r   r~   r   r   rl  r?  r   r   r   r   rJ  r   r   r_  r'  r   r[  r   r   r   r   rX  r  rF  r   r  r   r   r  r   r   r"  r   r   r   r   r   r   r   rf  r   r#  r   r  r  rM  r   r(  r   r  r   r   rQ  r   rS  r   rv   r1  r`  r4  r|   r
  r   r}   rg  r   r   r   r   r   r  r   r   r   r   ra  r{   r^  rx   r   r   r>  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 n U $ )zy
Generate key schedule

@param {int[]} data  16/24/32-Byte cipher key
@returns {int[]}     176/208/240-Byte expanded key
Nr,   ru   r   rC  rv   r   rt   r   )r#   r.   key_schedule_corerB   r/   r_   )r   rcon_iterationro   expanded_key_size_bytestemp_s         r   r-   r-     s[    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*b0qa9A9DCN?A4FGHHD9 d)-
-& (()DKr   c              #   .   #     U v   [        U 5      n M  7fN)rU   )r   s    r   r@   r@     s     
W s   c                 @    U  Vs/ s H  n[         U   PM     sn$ s  snf rv  )SBOXr   xs     r   r_   r_     s    !"TDGT"""   c                 @    U  Vs/ s H  n[         U   PM     sn$ s  snf rv  )SBOX_INVry  s     r   ri   ri     s    !%&AHQK&&&r{  c                     U SS  U S   /-   $ )Nr,   r   r'   r(   s    r   rotater    s    8tAwir   c                 V    [        U 5      n [        U 5      n U S   [        U   -  U S'   U $ )Nr   )r  r_   RCON)r   rq  s     r   rp  rp  !  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 rv  )zip)data1data2rz  ys       r   rB   rB   )  s%    !%/0/daAE/000s   #c           	   #      #    S Hh  nU H_  nSn[        S5       HG  nXUS-    U   S:X  d  X5   S:X  a  US-  nM   U[        [        XU-         [        X5      -   S-     -  nMI     Uv   Ma     Mj     g 7f)N)r   ru   rQ   rP   r   ru   r   )r/   RIJNDAEL_EXP_TABLERIJNDAEL_LOG_TABLE)r   matrixr5   rowmixedjs         r   rb   rb   -  s     CE1X!a%=#q(CFaKQJE/+DQK8+CF347;< E	  K  s   A0A2c                     [        S5       VVs/ s H&  n[        S5        H  nXU-   S-  S-  U-      PM     M(     snn$ s  snnf Nru   rC  r/   r   columnr  s      r   r`   r`   <  T     AhF8C 	|t#q(3./ 	0     -A c                     [        S5       VVs/ s H&  n[        S5        H  nXU-
  S-  S-  U-      PM     M(     snn$ s  snnf r  r  r  s      r   rh   rh   D  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  L  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   )r/   r#   )r   r5   s     r   rU   rU   Z  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  bytesrN  r   r,   r   r&   )r#   r.   rV   r/   rB   r  )block_xblock_yblock_rblock_vblock_zr5   r  do_xors           r   block_productr  e  s     7|''3w<;K+K*+;*<FCE 	E 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.   rV   r/   r  rB   )subkeyr   last_yr5   r6   s        r   rT   rT   }  s}     4y##'(8'9@B 	B S##F1c$i!12,,-s616: 3 Mr   rv  )6r!   rk   mathr   Cryptodome.Cipherr   r   ImportErrorCrypto.Cipher	Exceptionexclogging	getLoggerwarning	__class____name__r   r   ra   r   r   r)   r.   r7   r;   r>   r=   r   rN   r   r0   r:   rr   r  rx  r}  rc   rg   r  r  r-   r@   r_   ri   r  rp  rB   rb   r`   rh   r  rU   r  rT   r'   r   r   <module>r     so     7 <
O
  +  **	*448/d,,B!F!F  ! F! H!H#' 10c  7  Ne$$B% 	s5   B C:BB*&C:)B**C:2>C55C: