
    F2jD1                    h   d dl mZ d dlZd dlmZ ddlmZ ddlmZ ddl	m
Z
mZmZmZ dd	l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'dZ G d de          Zd(dZ G d d           Zd)d#Zd*d$Z G d% d&          Z dS )+    )annotationsN)Callable   )CryptoContext)CryptoError)CipherSuitecipher_suite_hashhkdf_expand_labelhkdf_extract   )QuicProtocolVersion)s   aes-128-ecbs   aes-128-gcm)s   chacha20s   chacha20-poly1305)s   aes-256-ecbs   aes-256-gcm(38762cf7f55934b34d179ae6a4c80cadccbb7f0a(0dede3def700a6db819381be6e269dcbf9bd2ed9   triggerstrreturnNonec                    d S N r   s    W/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/qh3/quic/crypto.py
NoCallbackr      s    D    c                      e Zd ZdS )KeyUnavailableErrorN)__name__
__module____qualname__r   r   r   r   r   !   s        Dr   r   cipher_suiter   secretbytesversioninttuple[bytes, bytes, bytes]c           	     ^   t          |           }| t          j        t          j        fv rd}nd}|t          j        k    r8t          ||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NisBGGisHMM
 	
 ic8LLiS"EEiS(KK
 	
r   c                  J    e Zd ZdZdeefdd
ZddZd dZd!dZd"dZ	d#dZ
dS )$r   _innerr!   	key_phaser"   r$   	_setup_cb_teardown_cbr   r3   r%   setup_cbCallbackteardown_cbr   r   c                h    d | _         d | _        || _        d | _        d | _        || _        || _        d S r   r1   )selfr3   r6   r8   s       r   __init__zCryptoContext.__init__K   s=     1504"$(#'!'r   packetr#   encrypted_offsetexpected_packet_numbertuple[bytes, bytes, int, bool]c                   | j         t          d          | j                             |||          \  }}}}|rFt          |           }|j                             |t          |          d          ||          }|||dfS |||dfS )NzDecryption key is not availableTF)r2   r   decrypt_packetnext_key_phasedecrypt_payloadlen)	r:   r<   r=   r>   plain_headerpayloadpacket_numberkey_phase_changedcryptos	            r   rA   zCryptoContext.decrypt_packetY   s     ;%&GHHH K&&v/?AWXX 	@g}.?  	>#D))Fm33s<((**+\= G  -==WmU::r   rE   plain_payloadrG   c                v    |                                  s
J d            | j                            |||          S )NzEncryption key is not available)is_validr2   encrypt_packetr:   rE   rJ   rG   s       r   rM   zCryptoContext.encrypt_packetn   s<     }}AA AAA {)),}UUUr   boolc                    | j         d uS r   )r2   r:   s    r   rL   zCryptoContext.is_validv   s    {$&&r   r!   r   r"   r$   c               *   t           |         \  }}t          |||          \  }}}t          |                                |                                |||| j                  | _        || _        || _        || _        | 	                    d           d S )Nr!   r"   r$   tls)
CIPHER_SUITESr/   RustCryptoContextdecoder3   r2   r!   r"   r$   r4   )	r:   r!   r"   r$   hp_cipher_nameaead_cipher_namekeyivhps	            r   setupzCryptoContext.setupy   s    +8+F((&%
 
 
R (##%%!!##N
 
 ) 	ur   c                Z    d | _         d | _        d | _        |                     d           d S )NrT   )r2   r!   r"   r5   rQ   s    r   teardownzCryptoContext.teardown   s4      	%     r   N)r3   r%   r6   r7   r8   r7   r   r   )r<   r#   r=   r%   r>   r%   r   r?   rE   r#   rJ   r#   rG   r%   r   r#   )r   rO   )r!   r   r"   r#   r$   r%   r   r   r   r   )r   r   r    	__slots__r   r;   rA   rM   rL   r]   r_   r   r   r   r   r   @   s        I ' *	( ( ( ( (; ; ; ;*V V V V' ' ' '   2! ! ! ! ! !r   r   r:   rI   c                    t          |j        |j        |j                  \  }}}| j                            |||j                   |j        | _        |j        | _        |                     |           d S )NrS   )r/   r!   r"   r$   r2   update_aeadr3   r4   )r:   rI   r   rZ   r[   _s         r   apply_key_phaserf      sx    !(}  JCQ
 	KCV%5666%DN-DK 	NN7r   c                   t          | j                  }t          t          | j                             }|                    | j        t          || j        ddt          |dz                      | j                   |S )Nr3   s   quic kur      rS   )	r	   r!   r   r%   r3   r]   r
   r"   r$   )r:   r-   rI   s      r   rB   rB      s    !$"344IST^);%<%<===F
LL& t{JSQ5G5G
 
      Mr   c                      e Zd ZdZeeeefd1d	Zd2dZd3dZd4dZd5d$Z	d6d'Z
d7d(Zd7d)Zed8d*            Zd9d-Zd:d/Zd0S );
CryptoPair)aead_tag_sizerecvsend_update_key_requested_previous_recv_previous_recv_expires_atrecv_setup_cbr7   recv_teardown_cbsend_setup_cbsend_teardown_cbr   r   c                    d| _         t          ||          | _        t          ||          | _        d| _        d | _        d | _        d S )Nr   )r6   r8   F)rl   r   rm   rn   ro   rp   rq   )r:   rr   rs   rt   ru   s        r   r;   zCryptoPair.__init__   sV      !=FVWWW	!=FVWWW	%*" 597;&&&r   nowfloatc                    | j         ;| j        6|| j        k    r-| j                                          d| _         d| _        dS dS dS dS )z>Drop the retained previous receive key once 3*PTO has elapsed.N)rp   rq   r_   )r:   rw   s     r   expire_previous_keyszCryptoPair.expire_previous_keys   sc     +.:t555((***"&D-1D*** ,+::55r   r<   r#   r=   r%   r>   tuple[bytes, bytes, int]c                x   	 | j                             |||          \  }}}}n># t          $ r1 | j        (| j                            |||          \  }}}}|||fcY S  w xY w|rS| j        7	 | j                            |||          \  }	}
}}|	|
|fS # t          $ r Y nw xY w|                     d           |||fS )Nremote_update)rm   rA   r   rp   _update_key)r:   r<   r=   r>   rE   rF   rG   
update_keyre   plain_header2payload2pn2s               r   rA   zCryptoPair.decrypt_packet   s6   	?Cy?W?W(*@@ @<L'=**  	 	 	 ".'66 02H  8g}a
 $Wm;;;;	  	. ".+::"$46L  4M8S!
 )(C77"   D_---Wm33s!   !$ 7AA,%B 
BBrE   rJ   rG   c                r    | j         r|                     d           | j                            |||          S )Nlocal_update)ro   r~   rn   rM   rN   s       r   rM   zCryptoPair.encrypt_packet  s=     % 	-^,,,y''m]SSSr   packet_startpacket_sizepadding_sizeheader_sizeis_long_headerrO   r$   packet_typepeer_cidhost_cid
peer_tokenspin_bitc                    | j         r|                     d           | j        j                            |||||||||	|
|||          S )zDFinalize a packet: write header, pad, encrypt, apply HP in one call.r   )ro   r~   rn   r2   finalize_packet)r:   bufferr   r   r   r   r   r$   r   r   r   r   r   rG   s                 r   r   zCryptoPair.finalize_packet
  sg    " % 	-^,,,y//
 
 	
r   cid	is_clientc           
        |rd\  }}nd\  }}|t           j        k    rt          }nt          }t	          t
                    }t          |dz            }t          |||          }	| j        	                    t
          t          ||	|d|          |           | j        	                    t
          t          ||	|d|          |           d S )N)	   server in	   client in)r   r   ri   r   rS   )r   r,   INITIAL_SALT_VERSION_2INITIAL_SALT_VERSION_1r	   INITIAL_CIPHER_SUITEr%   r   rm   r]   r
   rn   )
r:   r   r   r$   
recv_label
send_labelinitial_saltr-   digest_sizeinitial_secrets
             r   setup_initialzCryptoPair.setup_initial-  s     	@%?"J

%?"J
)3331LL1L%&:;;	)a-((%isCC	-$>:sK   	 	
 	
 	
 		-$>:sK   	 	
 	
 	
 	
 	
r   c                j    | j                                          | j                                         d S r   )rm   r_   rn   rQ   s    r   r_   zCryptoPair.teardownJ  s0    		r   c                    d| _         d S )NT)ro   rQ   s    r   r   zCryptoPair.update_keyN  s    %)"""r   c                \    | j         rt          | j        j                   S | j        j        S r   )ro   r%   rm   r3   rQ   s    r   r3   zCryptoPair.key_phaseQ  s.    % 	'49..///9&&r   r   r   c                   | j                                         rwt          | j         j                  }|                    | j         j        | j         j        | j         j                   | j        | j        	                                 || _        t          | j         t          | j                   |           t          | j        t          | j                  |           d| _        d S )Nrh   rS   r   F)rm   rL   r   r3   r]   r!   r"   r$   rp   r_   rf   rB   rn   ro   )r:   r   snapshots      r   r~   zCryptoPair._update_keyX  s    
 9 
	+$ty/BCCCHNN!Y3y'	)     ".#,,..."*D	>$)#<#<gNNNN	>$)#<#<gNNNN%*"""r   
expires_atc                &    | j         	|| _        dS dS )z
        Schedule the retained previous receive key to be discarded at
        ``expires_at``. Called by the connection after a key update.
        N)rp   rq   )r:   r   s     r   retain_previous_keyszCryptoPair.retain_previous_keysm  s#    
 *-7D*** +*r   N)
rr   r7   rs   r7   rt   r7   ru   r7   r   r   )rw   rx   r   r   )r<   r#   r=   r%   r>   r%   r   r{   r`   )r   r%   r   r%   r   r%   r   r%   r   rO   r$   r%   r   r%   r   r#   r   r#   r   r#   r   r%   rG   r%   r   r%   )r   r#   r   rO   r$   r%   r   r   ra   )r   r%   r   r   r   r   )r   rx   r   r   )r   r   r    rb   r   r;   rz   rA   rM   r   r   r_   r   propertyr3   r~   r   r   r   r   rk   rk      s       I #-%/",%/< < < < < 	2 	2 	2 	2$4 $4 $4 $4LT T T T!
 !
 !
 !
F
 
 
 
:   * * * * ' ' ' X'+ + + +*8 8 8 8 8 8r   rk   r   )r!   r   r"   r#   r$   r%   r   r&   )r:   r   rI   r   r   r   r   r   )r:   r   r   r   )!
__future__r   binasciitypingr   _hazmatr   rV   r   rT   r   r	   r
   r   r<   r   AES_128_GCM_SHA256r+   r*   rU   r   	unhexlifyr   r   SAMPLE_SIZEr   r7   r   r   r/   rf   rB   rk   r   r   r   <module>r      s   " " " " " "                  R Q Q Q Q Q Q Q Q Q Q Q ' ' ' ' ' ' "$D(*M"$D
 #5 ++,VWW ++,VWW  SE4K 	 	 	 		 	 	 	 	+ 	 	 	
 
 
 
6X! X! X! X! X! X! X! X!v      {8 {8 {8 {8 {8 {8 {8 {8 {8 {8r   