
    kj                        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 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   )QuicProtocolVersiondecode_packet_numberis_long_header)s   aes-128-ecbs   aes-128-gcm)s   aes-256-ecbs   aes-256-gcm)s   chacha20s   chacha20-poly1305(38762cf7f55934b34d179ae6a4c80cadccbb7f0a(0dede3def700a6db819381be6e269dcbf9bd2ed9   triggerreturnc                      y N r   s    \/home/ubuntu/.cache/pipx/cdb5059130eadca/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secretversionc           	      <   t        |       }| t        j                  t        j                  fv rd}nd}|t        j
                  k(  r,t        ||dd|      t        ||ddd      t        ||dd|      fS t        ||dd|      t        ||d	dd      t        ||d
d|      fS )N    r   s
   quicv2 keyr   s	   quicv2 iv   s	   quicv2 hps   quic keys   quic ivs   quic hp)r   r
   AES_256_GCM_SHA384CHACHA20_POLY1305_SHA256r   	VERSION_2r   )r#   r$   r%   	algorithmkey_sizes        r   derive_key_iv_hpr.   "   s     ",/I&&,,  %///iXNisBGisHM
 	
 ic8LiS"EiS(K
 	
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#   hpr1   r$   r%   	_setup_cb_teardown_cb)selfr1   r2   r3   s       r   __init__zCryptoContext.__init__<   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   )
r5   r   r6   remover   r   r1   next_key_phasedecryptlen)r9   r;   r<   r=   plain_headerpacket_number
first_byte	pn_lengthcryptor1   payloads              r   decrypt_packetzCryptoContext.decrypt_packetK   s     99%&GHH '+ggnnV=M&N#m!!_
  $&!+	,9q=*@

 j)#aA-IDNN*'- ++%%3|$&'}
 WmVt^CCr   rF   plain_payloadrG   c                     | j                         sJ d       | j                  j                  |||      }| j                  j	                  ||      S )NzEncryption key is not available)is_validr5   encryptr6   apply)r9   rF   rM   rG   protected_payloads        r   encrypt_packetzCryptoContext.encrypt_packeti   sN     }}A AA !II--<

 ww}}\+<==r   c                     | j                   d uS r   )r5   r9   s    r   rO   zCryptoContext.is_validv   s    yy$$r   r#   r$   r%   c                    t         |   \  }}t        |||      \  }}}t        |||      | _        || _        t        ||      | _        || _        || _        | j                  d       y )Nr#   r$   r%   tls)
CIPHER_SUITESr.   r   r5   r#   r	   r6   r$   r%   r7   )	r9   r#   r$   r%   hp_cipher_nameaead_cipher_namekeyivr6   s	            r   setupzCryptoContext.setupy   sp    +8+F((&%
R
 )33	(">26 	ur   c                 ^    d | _         d | _        d | _        d | _        | j	                  d       y )NrX   )r5   r#   r6   r$   r8   rU   s    r   teardownzCryptoContext.teardown   s/    	  	% r   r   N)r    r!   r"   r   intCallbackr:   bytesr   boolrL   rS   rO   r
   r^   r`   r   r   r   r0   r0   ;   s     ' *	(( ( 	(
 
(DD/2DLOD	ueS$&	'D<>!>27>HK>	>%$ %[ % # RV "!r   r0   r9   rJ   c                     |j                   | _         |j                  | _        |j                  | _        | j                  |       y r   )r5   r1   r$   r7   )r9   rJ   r   s      r   apply_key_phaserg      s3    DI%%DN--DK 	NN7r   c           
         t        | j                        }t        t        | j                               }|j                  | j                  t        || j                  dd|j                        | j                         |S )N)r1   s   quic kur   rW   )
r   r#   r0   rb   r1   r^   r   r$   digest_sizer%   )r9   r,   rJ   s      r   rC   rC      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   )r2   r3   F)aead_tag_sizer0   recvsend_update_key_requested)r9   rl   rm   rn   ro   s        r   r:   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   rL   _update_key)r9   r;   r<   r=   rF   rK   rG   
update_keys           r   rL   zCryptoPair.decrypt_packet   sK     <@99;S;S$&<<
8g}j _-Wm33r   rF   rM   rG   c                 v    | j                   r| j                  d       | j                  j                  |||      S )Nlocal_update)rt   rw   rs   rS   )r9   rF   rM   rG   s       r   rS   zCryptoPair.encrypt_packet   s4     %%^,yy''m]SSr   cid	is_clientr%   c           
      z   |rd\  }}nd\  }}|t         j                  k(  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   rW   )r   r+   INITIAL_SALT_VERSION_2INITIAL_SALT_VERSION_1r   INITIAL_CIPHER_SUITEr   rr   r^   r   ri   rs   )	r9   r{   r|   r%   
recv_label
send_labelinitial_saltr,   initial_secrets	            r   setup_initialzCryptoPair.setup_initial   s    %?"J
%?"J
)3331L1L%&:;	%isC		-$>:sI<Q<Q  	 	
 			-$>:sI<Q<Q  	 	
r   c                 l    | j                   j                          | j                  j                          y r   )rr   r`   rs   rU   s    r   r`   zCryptoPair.teardown   s"    				r   c                     d| _         y )NT)rt   rU   s    r   rx   zCryptoPair.update_key   s
    %)"r   c                     | j                   r t        | j                  j                         S | j                  j                  S r   )rt   rb   rr   r1   rU   s    r   r1   zCryptoPair.key_phase   s3    %%499...//99&&&r   r   c                     t        | j                  t        | j                        |       t        | j                  t        | j                        |       d| _        y )Nr   F)rg   rr   rC   rs   rt   )r9   r   s     r   rw   zCryptoPair._update_key   s<    		>$))#<gN		>$))#<gN%*"r   ra   )r    r!   r"   r   rc   r:   rd   rb   r   rL   rS   re   r   r`   rx   propertyr1   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	   rX   r
   r   r   r   r;   r   r   r   AES_128_GCM_SHA256r)   r*   rY   r   	unhexlifyr   r   SAMPLE_SIZEr   rc   r   r   rd   rb   r.   r0   rg   rC   rk   r   r   r   <module>r      s<    , , 9 9 Q Q  ""$D""$D((*M
 #55 +++,VW +++,VW  SE4K 	 	 		+ 	
 
*/
:=

5%
2V! V!r-   QU  = K+ K+r   