o
    .jD1                     @  s   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dZedZdZeegdf Zd+ddZG dd deZd,dd ZG d!d" d"Zd-d%d&Zd.d'd(ZG d)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                 C  s   d S N r   r   r   D/home/thesage/.local/lib/python3.10/site-packages/qh3/quic/crypto.py
NoCallback   s   r   c                   @  s   e Zd ZdS )KeyUnavailableErrorN)__name__
__module____qualname__r   r   r   r   r   !   s    r   cipher_suiter   secretbytesversioninttuple[bytes, bytes, bytes]c                 C  s   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 key    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_sizer   r   r   derive_key_iv_hp%   s    
r+   c                   @  sT   e Zd ZdZdeefd$d
dZd%ddZd&ddZd'ddZd(dd Z	d)d!d"Z
d#S )*r   _innerr   	key_phaser   r    	_setup_cb_teardown_cbr   r.   r!   setup_cbCallbackteardown_cbr   r   c                 C  s.   d | _ d | _|| _d | _d | _|| _|| _d S r   r,   )selfr.   r1   r3   r   r   r   __init__K   s   
zCryptoContext.__init__packetr   encrypted_offsetexpected_packet_numbertuple[bytes, bytes, int, bool]c           	      C  sj   | j d u r	td| j |||\}}}}|r/t| }|j |t|d  ||}|||dfS |||dfS )NzDecryption key is not availableTF)r-   r   decrypt_packetnext_key_phasedecrypt_payloadlen)	r4   r6   r7   r8   plain_headerpayloadpacket_numberkey_phase_changedcryptor   r   r   r:   Y   s   

zCryptoContext.decrypt_packetr>   plain_payloadr@   c                 C  s    |   sJ d| j|||S )NzEncryption key is not available)is_validr-   encrypt_packetr4   r>   rC   r@   r   r   r   rE   n   s   zCryptoContext.encrypt_packetboolc                 C  s
   | j d uS r   )r-   r4   r   r   r   rD   v      
zCryptoContext.is_validr   r   r   r    c          	      C  s^   t | \}}t|||d\}}}t| | |||| j| _|| _|| _|| _| 	d d S )Nr   r   r    tls)
CIPHER_SUITESr+   RustCryptoContextdecoder.   r-   r   r   r    r/   )	r4   r   r   r    hp_cipher_nameaead_cipher_namekeyivhpr   r   r   setupy   s$   	zCryptoContext.setupc                 C  s    d | _ d | _d | _| d d S )NrK   )r-   r   r   r0   rH   r   r   r   teardown   s   zCryptoContext.teardownN)r.   r!   r1   r2   r3   r2   r   r   )r6   r   r7   r!   r8   r!   r   r9   r>   r   rC   r   r@   r!   r   r   )r   rG   )r   r   r   r   r    r!   r   r   r   r   )r   r   r   	__slots__r   r5   r:   rE   rD   rT   rU   r   r   r   r   r   @   s    



r   r4   rB   c                 C  sJ   t |j|j|jd\}}}| j|||j |j| _|j| _| | d S )NrJ   )r+   r   r   r    r-   update_aeadr.   r/   )r4   rB   r   rQ   rR   _r   r   r   apply_key_phase   s   r[   c              
   C  sJ   t | j}tt| j d}|j| jt|| jddt|d | jd |S )Nr.   s   quic kur$      rJ   )	r   r   r   r!   r.   rT   r	   r   r    )r4   r)   rB   r   r   r   r;      s   
r;   c                   @  s   e Zd ZdZeeeefd<d	d
Zd=ddZd>ddZd?ddZd@d(d)Z	dAd,d-Z
dBd.d/ZdBd0d1ZedCd2d3ZdDd6d7ZdEd9d:Zd;S )F
CryptoPair)aead_tag_sizerecvsend_update_key_requested_previous_recv_previous_recv_expires_atrecv_setup_cbr2   recv_teardown_cbsend_setup_cbsend_teardown_cbr   r   c                 C  s8   d| _ t||d| _t||d| _d| _d | _d | _d S )Nr   )r1   r3   F)r_   r   r`   ra   rb   rc   rd   )r4   re   rf   rg   rh   r   r   r   r5      s   
zCryptoPair.__init__nowfloatc                 C  sD   | j dur| jdur|| 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)rc   rd   rU   )r4   ri   r   r   r   expire_previous_keys   s   




zCryptoPair.expire_previous_keysr6   r   r7   r!   r8   tuple[bytes, bytes, int]c                 C  s   z| j |||\}}}}W n  ty.   | jd ur-| j|||\}}}}|||f Y S  w |rW| jd urRz| j|||\}	}
}}|	|
|fW S  tyQ   Y nw | d |||fS )Nremote_update)r`   r:   r   rc   _update_key)r4   r6   r7   r8   r>   r?   r@   
update_keyrZ   plain_header2payload2pn2r   r   r   r:      s4   





zCryptoPair.decrypt_packetr>   rC   r@   c                 C  s    | j r| d | j|||S )Nlocal_update)rb   rn   ra   rE   rF   r   r   r   rE     s   
zCryptoPair.encrypt_packetpacket_startpacket_sizepadding_sizeheader_sizeis_long_headerrG   r    packet_typepeer_cidhost_cid
peer_tokenspin_bitc                 C  s6   | j r| d | jj|||||||||	|
|||S )zDFinalize a packet: write header, pad, encrypt, apply HP in one call.rs   )rb   rn   ra   r-   finalize_packet)r4   bufferrt   ru   rv   rw   rx   r    ry   rz   r{   r|   r}   r@   r   r   r   r~   
  s"   
zCryptoPair.finalize_packetcid	is_clientc           
      C  s   |rd\}}nd\}}|t jkrt}nt}tt}t|d }t|||}	| jj	tt
||	|d||d | jj	tt
||	|d||d d S )N)	   server in	   client in)r   r   r]   r$   rJ   )r   r(   INITIAL_SALT_VERSION_2INITIAL_SALT_VERSION_1r   INITIAL_CIPHER_SUITEr!   r
   r`   rT   r	   ra   )
r4   r   r   r    
recv_label
send_labelinitial_saltr)   digest_sizeinitial_secretr   r   r   setup_initial-  s.   




zCryptoPair.setup_initialc                 C  s   | j   | j  d S r   )r`   rU   ra   rH   r   r   r   rU   J  s   
zCryptoPair.teardownc                 C  s
   d| _ d S )NT)rb   rH   r   r   r   ro   N  rI   zCryptoPair.update_keyc                 C  s   | j r
t| jj S | jjS r   )rb   r!   r`   r.   rH   r   r   r   r.   Q  s   zCryptoPair.key_phaser   r   c                 C  s   | j  r't| j jd}|j| j j| j j| j jd | jd ur$| j	  || _t
| j t| j |d t
| jt| j|d d| _d S )Nr\   rJ   r   F)r`   rD   r   r.   rT   r   r   r    rc   rU   r[   r;   ra   rb   )r4   r   snapshotr   r   r   rn   X  s   



zCryptoPair._update_key
expires_atc                 C  s   | j dur
|| _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)rc   rd   )r4   r   r   r   r   retain_previous_keysm  s   

zCryptoPair.retain_previous_keysN)
re   r2   rf   r2   rg   r2   rh   r2   r   r   )ri   rj   r   r   )r6   r   r7   r!   r8   r!   r   rl   rV   )rt   r!   ru   r!   rv   r!   rw   r!   rx   rG   r    r!   ry   r!   rz   r   r{   r   r|   r   r}   r!   r@   r!   r   r!   )r   r   r   rG   r    r!   r   r   rW   )r   r!   r   r   r   r   )r   rj   r   r   )r   r   r   rX   r   r5   rk   r:   rE   r~   r   rU   ro   propertyr.   rn   r   r   r   r   r   r^      s$    


&

#


r^   r   )r   r   r   r   r    r!   r   r"   )r4   r   rB   r   r   r   r   r   )r4   r   r   r   )!
__future__r   binasciitypingr   _hazmatr   rM   r   rK   r   r   r	   r
   r6   r   AES_128_GCM_SHA256r'   r&   rL   r   	unhexlifyr   r   SAMPLE_SIZEr   r2   r   r   r+   r[   r;   r^   r   r   r   r   <module>   s.    




[
