
    mbi#                    |   d dl mZ d dlZd dlmZ ddlmZmZmZm	Z	m
Z
 ddlmZ ddlmZmZmZmZ dd	l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'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   )AeadAes128GcmAeadAes256GcmAeadChaCha20Poly1305CryptoErrordecode_packet_number)QUICHeaderProtection)CipherSuitecipher_suite_hashhkdf_expand_labelhkdf_extract   )QuicProtocolVersionis_long_header)s   aes-128-ecb   aes-128-gcm)s   chacha20   chacha20-poly1305)s   aes-256-ecb   aes-256-gcm(38762cf7f55934b34d179ae6a4c80cadccbb7f0a(0dede3def700a6db819381be6e269dcbf9bd2ed9   triggerstrreturnNonec                    d S N r   s    _/var/www/html/mdtn/previsions/meteo_cartes/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_hpr7   *   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 )$CryptoContextaeadr)   hp	key_phaser*   r,   	_setup_cb_teardown_cbr   r=   r-   setup_cbCallbackteardown_cbr   r   c                v    d | _         d | _        d | _        || _        d | _        d | _        || _        || _        d S r   r:   )selfr=   r@   rB   s       r!   __init__zCryptoContext.__init__Q   sF     RV	04+/"$(#'!'r#   packetr+   encrypted_offsetexpected_packet_numbertuple[bytes, bytes, int, bool]c                   | j         t          d          | j                            ||          \  }}|d         }|dz  dz   }t	          ||dz  |          }| }t          |          s"|dz  dz	  }	|	| j        k    rt          |           }|j                             ||t          |          d          |          }
||
||| k    fS )NzDecryption key is not availabler      r         r   )
r;   r%   r<   remover
   r   r=   next_key_phasedecryptlen)rD   rF   rG   rH   plain_headerpacket_number
first_byte	pn_lengthcryptor=   payloads              r!   decrypt_packetzCryptoContext.decrypt_packet`   s     9%&GHHH '+gnnV=M&N&N#m!!_
  $&!+	,9q=*@
 

 j)) 	.#aA-IDN**'-- +%%6#l"3"3"5"56
 
 WmVt^CCr#   rR   plain_payloadrS   c                    |                                  s
J d            | j                            |||          }| j                            ||          S )NzEncryption key is not available)is_validr;   encryptr<   apply)rD   rR   rY   rS   protected_payloads        r!   encrypt_packetzCryptoContext.encrypt_packet~   s[     }}AA AAAA !I--=,
 

 w}}\+<===r#   boolc                    | j         d uS r   )r;   rD   s    r!   r[   zCryptoContext.is_valid   s    y$$r#   r)   r   r*   r,   c                  t           |         \  }}t          |||          \  }}}|dk    rt          ||          | _        n\|dk    rt	          ||          | _        n@|dk    rt          ||          | _        n$t          d|                                           || _        t          |                                |          | _
        || _        || _        |                     d           d S )Nr)   r*   r,   r   r   r   zInvalid cipher name: tls)CIPHER_SUITESr7   r   r;   r   r   r	   decoder)   HeaderProtectionr<   r*   r,   r>   )	rD   r)   r*   r,   hp_cipher_nameaead_cipher_namekeyivr<   s	            r!   setupzCryptoContext.setup   s   +8+F((&%
 
 
R 333,S"55DII//%c2..DII//%c2..DIIQ6F6M6M6O6OQQRRR(">#8#8#:#:B?? 	ur#   c                h    d | _         d | _        d | _        d | _        |                     d           d S )Nre   )r;   r)   r<   r*   r?   rb   s    r!   teardownzCryptoContext.teardown   s;    	  	%     r#   N)r=   r-   r@   rA   rB   rA   r   r   )rF   r+   rG   r-   rH   r-   r   rI   rR   r+   rY   r+   rS   r-   r   r+   )r   r`   )r)   r   r*   r+   r,   r-   r   r   r   r   )r&   r'   r(   	__slots__r"   rE   rX   r_   r[   rm   ro   r   r#   r!   r9   r9   E   s        	I ' *	( ( ( ( (D D D D<> > > >% % % %   4! ! ! ! ! !r#   r9   rD   rV   c                x    |j         | _         |j        | _        |j        | _        |                     |           d S r   )r;   r=   r*   r>   )rD   rV   r   s      r!   apply_key_phasert      s8    DI%DN-DK 	NN7r#   c                   t          | j                  }t          t          | j                             }|                    | j        t          || j        ddt          |dz                      | j                   |S )N)r=   s   quic kur#   rL   rd   )	r   r)   r9   r-   r=   rm   r   r*   r,   )rD   r5   rV   s      r!   rO   rO      s    !$"344IST^);%<%<===F
LL& t{JSQ5G5G
 
      Mr#   c                  l    e Zd ZdZeeeefd!d	Zd"dZd#dZd$dZd%dZ	d%dZ
ed&d            Zd'dZd S )(
CryptoPair)aead_tag_sizerecvsend_update_key_requestedrecv_setup_cbrA   recv_teardown_cbsend_setup_cbsend_teardown_cbr   r   c                z    d| _         t          ||          | _        t          ||          | _        d| _        d S )Nr   )r@   rB   F)rx   r9   ry   rz   r{   )rD   r|   r}   r~   r   s        r!   rE   zCryptoPair.__init__   sD      !=FVWWW	!=FVWWW	%*"""r#   rF   r+   rG   r-   rH   tuple[bytes, bytes, int]c                |    | j                             |||          \  }}}}|r|                     d           |||fS )Nremote_update)ry   rX   _update_key)rD   rF   rG   rH   rR   rW   rS   
update_keys           r!   rX   zCryptoPair.decrypt_packet   sY     <@9;S;S$&<<
 <
8g}j  	._---Wm33r#   rR   rY   rS   c                r    | j         r|                     d           | j                            |||          S )Nlocal_update)r{   r   rz   r_   )rD   rR   rY   rS   s       r!   r_   zCryptoPair.encrypt_packet   s=     % 	-^,,,y''m]SSSr#   cid	is_clientr`   r,   c           
        |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   rL   r#   rd   )r   r4   INITIAL_SALT_VERSION_2INITIAL_SALT_VERSION_1r   INITIAL_CIPHER_SUITEr-   r   ry   rm   r   rz   )
rD   r   r   r,   
recv_label
send_labelinitial_saltr5   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   )ry   ro   rz   rb   s    r!   ro   zCryptoPair.teardown  s0    		r#   c                    d| _         d S )NT)r{   rb   s    r!   r   zCryptoPair.update_key  s    %)"""r#   c                \    | j         rt          | j        j                   S | j        j        S r   )r{   r-   ry   r=   rb   s    r!   r=   zCryptoPair.key_phase  s.    % 	'49..///9&&r#   r   r   c                    t          | j        t          | j                  |           t          | j        t          | j                  |           d| _        d S )Nr    F)rt   ry   rO   rz   r{   )rD   r   s     r!   r   zCryptoPair._update_key  sR    	>$)#<#<gNNNN	>$)#<#<gNNNN%*"""r#   N)
r|   rA   r}   rA   r~   rA   r   rA   r   r   )rF   r+   rG   r-   rH   r-   r   r   rp   )r   r+   r   r`   r,   r-   r   r   rq   )r   r-   r   r   r   r   )r&   r'   r(   rr   r"   rE   rX   r_   r   ro   r   propertyr=   r   r   r#   r!   rw   rw      s        I #-%/",%/
+ 
+ 
+ 
+ 
+4 4 4 4T T T T
 
 
 
:   * * * * ' ' ' X'+ + + + + +r#   rw   r   )r)   r   r*   r+   r,   r-   r   r.   )rD   r9   rV   r9   r   r   r   r   )rD   r9   r   r9   )'
__future__r   binasciitypingr   _hazmatr   r   r   r	   r
   r   rh   re   r   r   r   r   rF   r   r   AES_128_GCM_SHA256r3   r2   rf   r   	unhexlifyr   r   SAMPLE_SIZEr   rA   r"   r%   r7   r9   rt   rO   rw   r   r#   r!   <module>r      s-   " " " " " "                     ? > > > > > Q Q Q Q Q Q Q Q Q Q Q Q        "$D(*M"$D
 #5 ++,VWW ++,VWW  SE4K 	 	 	 		 	 	 	 	+ 	 	 	
 
 
 
6j! j! j! j! j! j! j! j!Z      S+ S+ S+ S+ S+ S+ S+ S+ S+ S+r#   