
    @OOf              	          d dl Z d dlmZmZmZ ddlmZmZmZ ddl	m
Z
mZmZmZ ddlmZmZmZ e
j$                  de
j&                  d	e
j(                  d
iZe
j$                  Z e j.                  d      Z e j.                  d      ZdZeegdf   ZdeddfdZ G d de      Zde
dedeeeef   fdZ  G d d      Z!de!de!deddfdZ"de!de!fdZ# G d d      Z$y)    N)CallableOptionalTuple   )AEADCryptoErrorHeaderProtection)CipherSuitecipher_suite_hashhkdf_expand_labelhkdf_extract   )decode_packet_numberis_draft_versionis_long_header)s   aes-128-ecbs   aes-128-gcm)s   aes-256-ecbs   aes-256-gcm)s   chacha20s   chacha20-poly1305(afbfec289993d24c9e9786f19c6111e04390a899(38762cf7f55934b34d179ae6a4c80cadccbb7f0a   triggerreturnc                      y N r   s    T/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/aioquic/quic/crypto.py
NoCallbackr      s        c                       e Zd Zy)KeyUnavailableErrorN)__name__
__module____qualname__r   r   r   r   r      s    r   r   cipher_suitesecretc           	          t        |       }| t        j                  t        j                  fv rd}nd}t	        ||dd|      t	        ||ddd      t	        ||dd|      fS )N    r   s   quic keyr   s   quic iv   s   quic hp)r   r
   AES_256_GCM_SHA384CHACHA20_POLY1305_SHA256r   )r#   r$   	algorithmkey_sizes       r   derive_key_iv_hpr,      ss     ",/I&&,,  )V[#xH)VZbA)VZhG r   c                       e Zd ZdeefdedededdfdZded	ed
edeeeee	f   fdZ
dedededefdZde	fdZdedededdfdZddZy)CryptoContextr   	key_phasesetup_cbteardown_cbr   Nc                 t    d | _         d | _        d | _        || _        d | _        d | _        || _        || _        y r   )aeadr#   hpr/   r$   version	_setup_cb_teardown_cb)selfr/   r0   r1   s       r   __init__zCryptoContext.__init__1   s>     %)	37.2"'+&*!'r   packetencrypted_offsetexpected_packet_numberc                 j   | j                   t        d      | j                  j                  ||      \  }}|d   }|dz  dz   }t	        ||dz  |      }| }t        |      s"|dz  dz	  }	|	| j                  k7  rt        |       }|j                   j                  |t        |      d  ||      }
||
||| k7  fS )NzDecryption key is not availabler      r         r   )
r3   r   r4   remover   r   r/   next_key_phasedecryptlen)r8   r:   r;   r<   plain_headerpacket_number
first_byte	pn_lengthcryptor/   payloads              r   decrypt_packetzCryptoContext.decrypt_packet@   s     99%&GHH '+ggnnV=M&N#m!!_
  $&!+	,9q=*@

 j)#aA-IDNN*'- ++%%3|$&'}
 WmVt^CCr   rE   plain_payloadrF   c                     | j                         sJ d       | j                  j                  |||      }| j                  j	                  ||      S )NzEncryption key is not available)is_validr3   encryptr4   apply)r8   rE   rL   rF   protected_payloads        r   encrypt_packetzCryptoContext.encrypt_packet^   sN     }}A AA !II--<

 ww}}\+<==r   c                     | j                   d uS r   )r3   r8   s    r   rN   zCryptoContext.is_validk   s    yy$$r   r#   r$   r5   c                     t         |   \  }}t        ||      \  }}}t        |||      | _        || _        t        ||      | _        || _        || _        | j                  d       y Ntls)
CIPHER_SUITESr,   r   r3   r#   r	   r4   r$   r5   r6   )	r8   r#   r$   r5   hp_cipher_nameaead_cipher_namekeyivr4   s	            r   setupzCryptoContext.setupn   sg    +8+F((&|V<R)33	(">26 	ur   c                 ^    d | _         d | _        d | _        d | _        | j	                  d       y rV   )r3   r#   r4   r$   r7   rT   s    r   teardownzCryptoContext.teardown{   s/    	  	% r   r   N)r    r!   r"   r   intCallbackr9   bytesr   boolrK   rR   rN   r
   r]   r_   r   r   r   r.   r.   0   s     ' *	(( ( 	(
 
(DD/2DLOD	ueS$&	'D<>!>27>HK>	>%$ %+ u s t !r   r.   r8   rI   c                     |j                   | _         |j                  | _        |j                  | _        | j                  |       y r   )r3   r/   r$   r6   )r8   rI   r   s      r   apply_key_phaserf      s3    DI%%DN--DK 	NN7r   c           
         t        | j                        }t        t        | j                               }|j                  | j                  t        || j                  dd|j                        | j                         |S )N)r/   s   quic kur   r#   r$   r5   )
r   r#   r.   ra   r/   r]   r   r$   digest_sizer5   )r8   r*   rI   s      r   rB   rB      so    !$"3"34IST^^);%<=F
LL&& t{{JY5J5J
    Mr   c                       e Zd Zeeeefdededededdf
dZded	ed
edeeeef   fdZ	dedededefdZ
dedededdfdZddZddZedefd       ZdeddfdZy)
CryptoPairrecv_setup_cbrecv_teardown_cbsend_setup_cbsend_teardown_cbr   Nc                 h    d| _         t        ||      | _        t        ||      | _        d| _        y )Nr   )r0   r1   F)aead_tag_sizer.   recvsend_update_key_requested)r8   rl   rm   rn   ro   s        r   r9   zCryptoPair.__init__   s2      !=FVW	!=FVW	%*"r   r:   r;   r<   c                 v    | j                   j                  |||      \  }}}}|r| j                  d       |||fS )Nremote_update)rr   rK   _update_key)r8   r:   r;   r<   rE   rJ   rF   
update_keys           r   rK   zCryptoPair.decrypt_packet   sK     <@99;S;S$&<<
8g}j _-Wm33r   rE   rL   rF   c                 v    | j                   r| j                  d       | j                  j                  |||      S )Nlocal_update)rt   rw   rs   rR   )r8   rE   rL   rF   s       r   rR   zCryptoPair.encrypt_packet   s4     %%^,yy''m]SSr   cid	is_clientr5   c           
      j   |rd\  }}nd\  }}t        |      rt        }nt        }t        t              }t        |||      }| j                  j                  t        t        |||d|j                        |       | j                  j                  t        t        |||d|j                        |       y )N)	   server in	   client in)r   r~   r   rh   )r   INITIAL_SALT_DRAFT_29INITIAL_SALT_VERSION_1r   INITIAL_CIPHER_SUITEr   rr   r]   r   ri   rs   )	r8   r{   r|   r5   
recv_label
send_labelinitial_saltr*   initial_secrets	            r   setup_initialzCryptoPair.setup_initial   s    %?"J
%?"J
G$0L1L%&:;	%isC		-$>:sI<Q<Q  	 	
 			-$>:sI<Q<Q  	 	
r   c                 l    | j                   j                          | j                  j                          y r   )rr   r_   rs   rT   s    r   r_   zCryptoPair.teardown   s"    				r   c                     d| _         y )NT)rt   rT   s    r   rx   zCryptoPair.update_key   s
    %)"r   c                     | j                   r t        | j                  j                         S | j                  j                  S r   )rt   ra   rr   r/   rT   s    r   r/   zCryptoPair.key_phase   s3    %%499...//99&&&r   r   c                     t        | j                  t        | j                        |       t        | j                  t        | j                        |       d| _        y )Nr   F)rf   rr   rB   rs   rt   )r8   r   s     r   rw   zCryptoPair._update_key   s<    		>$))#<gN		>$))#<gN%*"r   r`   )r    r!   r"   r   rb   r9   rc   ra   r   rK   rR   rd   r   r_   rx   propertyr/   strrw   r   r   r   rk   rk      s     #-%/",%/
+
+ #
+  	
+
 #
+ 

+44/24LO4	ueS 	!4T!T27THKT	T
 
4 
# 
$ 
8* '3 ' '+3 +4 +r   rk   )%binasciitypingr   r   r   _cryptor   r   r	   rW   r
   r   r   r   r:   r   r   r   AES_128_GCM_SHA256r(   r)   rX   r   	unhexlifyr   r   SAMPLE_SIZEr   rb   r   r   rc   r,   r.   rf   rB   rk   r   r   r   <module>r      s0    , , 9 9 Q Q J J ""$D""$D((*M
 #55 ***+UV +++,VW  SE4K 	 	 		+ 	',
5%$R! R!j-   QU  = K+ K+r   