
    mbiA4                   	   U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ d dlmZ d dlmZmZ d dlmZ d dlmZmZ d dlmZ d d	lmZmZmZmZmZmZmZ d
dl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 d
dl m9Z:  ej;        d          Z<dZ=dZ>dZ? ed          Z@d dD             ZAdddZB G d de          ZC G d deD          ZE G d deE          ZF G d  d!eE          ZG G d" d#eE          ZH G d$ d%eE          ZI G d& d'eE          ZJ G d( d)eE          ZK G d* d+eE          ZL G d, d-eE          ZM G d. d/e          ZN G d0 d1e          ZO G d2 d3e          ZP G d4 d5          ZQdd;ZRdd>ZSddAZT	 dddFZUddHZVddKZW edLM          	 	 	 dddR            ZX	 	 	 	 	 	 	 dddZZY G d[ d\e          ZZ G d] d^e          Z[ G d_ d`e          Z\ G da dbe          Z] G dc dde          Z^ G de dfe          Z_ G dg dhe          Z`eddm            Zaeddn            ZbddrZcddvZdddwZeddyZfedd{            Zgeeheif         Zjdd}Zkdd~ZlddZmddZneeiehf         ZoddZpddZqddZrddZseeheif         Zte G d d                      Zue G d d                      ZvddZwddZxe G d d                      ZyddZzddZ{e G d d                      Z|ddZ}ddZ~e G d d                      ZddZddZeeieif         Ze G d d                      Z9e G d d                      ZddZddZddZe G d d                      ZddZddZe G d d                      ZddZddZ G d d          Z G d d          ZeZj        deZj        deZj        diZe`j        de`j        de`j        de`j        de`j        de`j        de`j        de`j        de`j        di	Zded<   ddZ	 	 dd dɄZdd̄Zeddτ            Ze G dЄ dѦ                      Zeegdf         Zeeigee         f         Zeegdf         Z G d҄ dӦ          ZdS (      )annotationsN)	unhexlify)contextmanager)	dataclassfield)IntEnum)	lru_cachepartial)HMAC)AnyCallable	GeneratorOptionalSequenceTupleTypeVar   )BufferBufferReadErrorCryptoErrorDsaPrivateKeyECDHP256KeyExchangeECDHP384KeyExchangeECDHP521KeyExchangeEcPrivateKeyEd25519PrivateKeyExpiredCertificateErrorInvalidNameCertificateErrorKeyTypePrivateKeyInfoRsaPrivateKeySelfSignedCertificateErrorServerVerifierSignatureErrorTlsCertUsageUnacceptableCertificateErrorX25519KeyExchangeX25519ML768KeyExchangeidna_encoderebuild_chainverify_with_public_key)Certificatez^[0-9a-fA-F]{8}\.[0-9]$

  i  i  Tc                B    i | ]\  }}|t          t          |d           S N)getattrhashlib).0length	algorithms      W/var/www/html/mdtn/previsions/meteo_cartes/venv/lib/python3.11/site-packages/qh3/tls.py
<dictcomp>r7   :   s:       	 GGY--      ))    md5)(   sha1)@   sha256T	remove_tzboolreturndatetime.datetimec                    t           j                             t           j        j                  }| r|                    d           n|S )N)tzinfo)datetimenowtimezoneutcreplace)r?   dts     r6   utcnowrK   E   s<    				x04	5	5B&/72::T:"""R7r8   c                  z    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdS )AlertDescriptionr   
         r;   *   +   ,   -   .   /   0   1   2   3   F   G   P   V   Z   m   n   p   q   s   t   x   N)__name__
__module____qualname__close_notifyunexpected_messagebad_record_macrecord_overflowhandshake_failurebad_certificateunsupported_certificatecertificate_revokedcertificate_expiredcertificate_unknownillegal_parameter
unknown_caaccess_denieddecode_errordecrypt_errorprotocol_versioninsufficient_securityinternal_errorinappropriate_fallbackuser_canceledmissing_extensionunsupported_extensionunrecognized_namebad_certificate_status_responseunknown_psk_identitycertificate_requiredno_application_protocol r8   r6   rM   rM   J   s        LNOO JMLMNM&)#!r8   rM   c                      e Zd ZU ded<   dS )AlertrM   descriptionNrg   rh   ri   __annotations__r   r8   r6   r   r   h   s         !!!!!!r8   r   c                      e Zd Zej        ZdS )AlertBadCertificateN)rg   rh   ri   rM   ro   r   r   r8   r6   r   r   l   s        "2KKKr8   r   c                      e Zd Zej        ZdS )AlertCertificateExpiredN)rg   rh   ri   rM   rr   r   r   r8   r6   r   r   p   s        "6KKKr8   r   c                      e Zd Zej        ZdS )AlertDecryptErrorN)rg   rh   ri   rM   rx   r   r   r8   r6   r   r   t   s        "0KKKr8   r   c                      e Zd Zej        ZdS )AlertHandshakeFailureN)rg   rh   ri   rM   rn   r   r   r8   r6   r   r   x           "4KKKr8   r   c                      e Zd Zej        ZdS )AlertIllegalParameterN)rg   rh   ri   rM   rt   r   r   r8   r6   r   r   |   r   r8   r   c                      e Zd Zej        ZdS )AlertInternalErrorN)rg   rh   ri   rM   r{   r   r   r8   r6   r   r      s        "1KKKr8   r   c                      e Zd Zej        ZdS )AlertProtocolVersionN)rg   rh   ri   rM   ry   r   r   r8   r6   r   r      s        "3KKKr8   r   c                      e Zd Zej        ZdS )AlertUnexpectedMessageN)rg   rh   ri   rM   rk   r   r   r8   r6   r   r      s        "5KKKr8   r   c                      e Zd ZdZdZdS )	Directionr   r   N)rg   rh   ri   DECRYPTENCRYPTr   r8   r6   r   r      s        GGGGr8   r   c                      e Zd ZdZdZdZdZdS )Epochr   r         N)rg   rh   ri   INITIALZERO_RTT	HANDSHAKEONE_RTTr   r8   r6   r   r      s"        GHIGGGr8   r   c                  :    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdS )Stater   r   r   r                  	   rN   N)rg   rh   ri   CLIENT_HANDSHAKE_STARTCLIENT_EXPECT_SERVER_HELLO"CLIENT_EXPECT_ENCRYPTED_EXTENSIONS0CLIENT_EXPECT_CERTIFICATE_REQUEST_OR_CERTIFICATE%CLIENT_EXPECT_CERTIFICATE_CERTIFICATE CLIENT_EXPECT_CERTIFICATE_VERIFYCLIENT_EXPECT_FINISHEDCLIENT_POST_HANDSHAKESERVER_EXPECT_CLIENT_HELLOSERVER_EXPECT_FINISHEDSERVER_POST_HANDSHAKEr   r8   r6   r   r      sR        !")*&784,-)'($!"r8   r   c                  &    e Zd ZddZdd
ZddZdS )
HKDFExpandr5   intr4   infobytes | Nonec                    || _         t          |dz            | _        d| j        z  }||k    rt          d| d          || _        |d}|| _        d| _        d S )Nr      zCannot derive keys larger than z octets.r8   F)
_algorithmr   _digest_size
ValueError_length_info_used)selfr5   r4   r   
max_lengths        r6   __init__zHKDFExpand.__init__   st     $	A..4,,
JSzSSSTTT<D



r8   key_materialbytesrA   c                   dg}d}| j         t          |          dz
  z  | j        k     rt          |d| j                   }|                    |d                    |                    | j                   |                    t          |g                     |                    |	                                           |dz  }| j         t          |          dz
  z  | j        k     d
                    |          d | j                 S )Nr8   r   sha	digestmod)r   lenr   r   r   updater   r   appenddigestjoin)r   r   outputcounterhs        r6   _expandzHKDFExpand._expand   s    3v;;?3dlBB\-D4?-D-DEEEAHHVBZ   HHTZ   HHUG9%%&&&MM!((**%%%qLG 3v;;?3dlBB xx$,//r8   c                V    | j         rt          d| _         |                     |          S )NT)r   r   r   r   r   s     r6   derivezHKDFExpand.derive   s+    : 	
||L)))r8   N)r5   r   r4   r   r   r   )r   r   rA   r   )rg   rh   ri   r   r   r   r   r8   r6   r   r      sP           ,0 0 0 0* * * * * *r8   r   labelr   
hash_valuer4   r   c                    d| z   }t          j        d|t          |                    |z   t          j        dt          |                    z   |z   S )Ns   tls13 z!HBz!B)structpackr   )r   r   r4   
full_labels       r6   
hkdf_labelr      sT    U"JE63z??33
	
+dC
OO
,
,	- 	r8   r5   secretc           	     j    t          | |t          |||                                        |          S )N)r5   r4   r   )r   r   r   r5   r   r   r   r4   s        r6   hkdf_expand_labelr      s=     z622   fVnn	r8   saltr   c                |    t          |d|            }|                    |           |                                S )Nr   r   )r   r   r   )r5   r   r   r   s       r6   hkdf_extractr      s=    T.9..///AHH\88::r8   datapasswordr   @EcPrivateKey | DsaPrivateKey | RsaPrivateKey | Ed25519PrivateKeyc                |   t          | |          }|                                t          j        t          j        t          j        fv rd}|                                t          j        k    rd}nI|                                t          j        k    rd}n$|                                t          j        k    rd}|J t          |                                |d| v          S |                                t          j        k    r!t          |                                          S |                                t          j
        k    r!t          |                                          S |                                t          j        k    r!t          |                                          S t          j        d          )z)
    Load a PEM-encoded private key.
    N     	  s   BEGIN EC PRIVATE KEYzUnsupported private key format)r    get_typer   
ECDSA_P256
ECDSA_P384
ECDSA_P521r   public_bytesDSAr   RSAr!   ED25519r   sslSSLError)r   r   	pkey_info
curve_types       r6   load_pem_private_keyr      s    tX..I   
 
7#555JJ!!W%777JJ!!W%777J%%%""$$j2IQU2U
 
 	
 
					,	,Y3355666						,	,Y3355666						0	0 !7!7!9!9:::
,7
8
88r8   list[X509Certificate]c                d   d| vrdnd}d|z   }g }|                      |          D ]}|r|                    d|z             }|dk    r ngd                    ||d         |g                              d	          }|                    t          t          j        |                               |S )
z8
    Load a chain of PEM-encoded X509 certificates.
    s   -----
   
s   
s   -----END CERTIFICATE-----s   -----BEGIN CERTIFICATE-----r   r8   Nascii)splitfindr   decoder   X509Certificater   PEM_cert_to_DER_cert)r   line_endingboundarycertificateschunkstart_markerpem_reconstructeds          r6   load_pem_x509_certificatesr    s     (t33%%K+k9HLH%% 
 
 		 ::&D{&RSSLr!! #%*>)I J J Q Q! !  89J K KLL   r8   capathstrc                    t           j                            |           sdS t          j        |           D ]}t                              |          r dS  dS )zFCheck whether capath exists and contains certs in the expected format.FT)ospathisdirlistdir_HASHED_CERT_FILENAME_REmatch)r  names     r6   _capath_contains_certsr  +  s]    7==   u
6""  #))$// 	44	5r8   r=   )maxsizecadatacafile
str | NoneJtuple[list[X509Certificate], list[X509Certificate], list[X509Certificate]]c                  	
 g g 	g 
d		
fd}| t          |           D ]} ||           |||rXt          |d          5 }t          |                                          D ]} ||           	 ddd           n# 1 swxY w Y   |rt          |          rrt	          j        | d          D ]Z}t          |d          5 }t          |                                          D ]} ||           	 ddd           n# 1 swxY w Y   [| \|Z|Xt          j                    }|                                 |                    d          D ]} |t          |                     	
fS )
a>  
    Given cadata, cafile and capath load X509 certificates and sort
    them into three distinct list:
        - Trust anchors (ca self-signed)
        - Intermediates (ca signed by other ca)
        - Others (not suitable for our purposes)

    This function consumes a lot of CPU times, so we want to cache it.
    rA   Nonec                    | j         rC| j        t          j        k    r                    |            d S                     |            d S                     |            d S r0   )self_signedusager%   Otherr   )cintermediariesotherstrust_anchorss    r6   _sort_cert_in_appropriate_listz;load_store_and_sort.<locals>._sort_cert_in_appropriate_listH  sm     = 		% w,,,,a     $$Q'''''!!!$$$$$r8   Nrbz/*T)binary_formrA   r!  )
r  openreadr  globr   create_default_contextload_default_certsget_ca_certsr  )r  r  r  r*  certfpr  default_ctxcar'  r(  r)  s            @@@r6   load_store_and_sortr8  5  sl    MNF% % % % % % % % .v66 	1 	1D**40000V/ 	9fd## 9r6rwwyyAA 9 9D224888899 9 9 9 9 9 9 9 9 9 9 9 9 9 9  	=,V44 	=	V---00 = =$%% = :27799 E E = =66t<<<<== = = = = = = = = = = = = = = ~&.V^022&&(((**t*<< 	@ 	@B**?2+>+>????.&00s$   0BBB	0DD
	D
	certificater  chainserver_nameassert_server_nameocsp_responser!  c                   |g }t          |||          \  }}	}
||du r|                                 D ]}|                                }||                    d          dz   |                    d                   }|                    dd           d|v rGt          |          d	k    r3d
                    d |                    d          D                       }n|} |t          d          |st          d          |ss|	rqt          | 
                                d |	D                       }t          |          dk    r0|dd          D ]$}|                    t          |                     %ng }	 t          d |D                       }n"# t          $ r}t          d          |d }~ww xY w	 |                    | 
                                d |D             ||pd           d S # t           t"          t$          t&          f$ r>}t)          |t"                    r
|du rY d }~d S t          |j        d                   d }~ww xY w)N)r  r  r  F(r   )z*.zunverified.:   .c              3  N   K   | ] }t          t          |                    V  !d S r0   )r  r   )r3   ps     r6   	<genexpr>z%verify_certificate.<locals>.<genexpr>  s?       + +()CFF+ + + + + +r8   z&unable to determine server name targetz7unable to get local issuer certificate (empty CA store)c                6    g | ]}|                                 S r   r   r3   r&  s     r6   
<listcomp>z&verify_certificate.<locals>.<listcomp>  s"    666!Q^^666r8   r   c                6    g | ]}|                                 S r   rH  rI  s     r6   rJ  z&verify_certificate.<locals>.<listcomp>  s"    HHHQ 0 0HHHr8   z(unable to create the verifier x509 storec                6    g | ]}|                                 S r   rH  rI  s     r6   rJ  z&verify_certificate.<locals>.<listcomp>  s"    ---!Q^^---r8   r8   r   )r8  get_subject_alt_namesr  r  rI   r   r   r  r   r*   r   r   r  r#   r   verifyr"   r   r   r&   
isinstanceargs)r9  r:  r  r  r  r;  r<  r=  r)  r'  _alt_nameserver_name_candidate	raw_chainistoreeexcs                     r6   verify_certificaterY  o  s    }':( ( ($M>1 0E99
 $99;; 	 	H$,OO$5$5!$9%**3//!36K6P6PQT6U6UU%! "))$>>>+++,--33"%(( + +-B-H-H-M-M+ + + # #KK  4!"JKKK 
!E
 
 	
  
^ 
!$$&&66~666
 
	
 y>>Qqrr] 1 1_Q//00001 EUHH-HHHII U U U!"LMMSTTU/$$&&--u--- S		
 	
 	
 	
 	
 	##$	 / / / c677 	<NRW<W<WFFFFF!#(1+.../s6   :F 
F3F..F376G/ /I
I+II
c                  "    e Zd ZdZdZdZdZdZdS )CipherSuitei  i  i  r   i  N)rg   rh   ri   AES_128_GCM_SHA256AES_256_GCM_SHA384CHACHA20_POLY1305_SHA256EMPTY_RENEGOTIATION_INFO_SCSVGREASEr   r8   r6   r[  r[    s+        %$*!FFFr8   r[  c                      e Zd ZdZdS )CompressionMethodr   N)rg   rh   ri   NULLr   r8   r6   rb  rb    s        DDDr8   rb  c                  J    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdS )ExtensionTyper   r   rN            )   rQ   rR   rS   rT   rZ   9   i  r-   N)rg   rh   ri   SERVER_NAMESTATUS_REQUESTSUPPORTED_GROUPSSIGNATURE_ALGORITHMSALPNCOMPRESS_CERTIFICATEPRE_SHARED_KEY
EARLY_DATASUPPORTED_VERSIONSCOOKIEPSK_KEY_EXCHANGE_MODES	KEY_SHAREQUIC_TRANSPORT_PARAMETERSENCRYPTED_SERVER_NAMEr`  r   r8   r6   re  re    s`        KNDNJFI &!FFFr8   re  c                  .    e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
Group         ic  i        i  N)rg   rh   ri   	SECP256R1	SECP384R1	SECP521R1X25519KYBER768DRAFT00X25519ML768X25519X448r`  r   r8   r6   rz  rz    s7        III"KFDFFFr8   rz  c                  >    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdS )HandshakeTyper   r   r   r   r   rB  rf     rO   r|  r}     N)rg   rh   ri   CLIENT_HELLOSERVER_HELLONEW_SESSION_TICKETEND_OF_EARLY_DATAENCRYPTED_EXTENSIONSCERTIFICATECERTIFICATE_REQUESTCERTIFICATE_VERIFYFINISHED
KEY_UPDATECOMPRESSED_CERTIFICATEMESSAGE_HASHr   r8   r6   r  r    sP        LLKHJLLLr8   r  c                      e Zd ZdZdZdS )PskKeyExchangeModer   r   N)rg   rh   ri   PSK_KE
PSK_DHE_KEr   r8   r6   r  r    s        FJJJr8   r  c                  R    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdS )SignatureAlgorithmi  i  i  i  i  i  i  i  i	  i
  i  i  i  i  i  i  i  N)rg   rh   ri   ECDSA_SECP256R1_SHA256ECDSA_SECP384R1_SHA384ECDSA_SECP521R1_SHA512r   ED448RSA_PKCS1_SHA256RSA_PKCS1_SHA384RSA_PKCS1_SHA512RSA_PSS_PSS_SHA256RSA_PSS_PSS_SHA384RSA_PSS_PSS_SHA512RSA_PSS_RSAE_SHA256RSA_PSS_RSAE_SHA384RSA_PSS_RSAE_SHA512RSA_PKCS1_SHA1SHA1_DSA
ECDSA_SHA1r   r8   r6   r  r    sq        ###GE    NHJJJr8   r  bufr   capacityr   c              #     K   t                               |                     |          d          }|                                 |z   }|V  |                                 |k    sJ d S )Nbig	byteorder)r   
from_bytes
pull_bytestell)r  r  r4   ends       r6   
pull_blockr     sa      ^^CNN844^FFF
((**v
C
LLL88::r8   c              #  J  K   |                                  |z   }|                     |           dV  |                                  }||z
  }|                     ||z
             |                     |                    |d                     |                     |           dS )zi
    Context manager to push a variable-length block, with `capacity` bytes
    to write the length.
    Nr  r  )r  seek
push_bytesto_bytes)r  r  startr  r4   s        r6   
push_blockr  (  s       HHJJ!EHHUOOO	EEE
((**C5[FHHUXNN6??8u?==>>>HHSMMMMMr8   funcCallable[[], T]list[T]c                "   g }t          | |          5 }|                                 |z   }|                                 |k     r5|                     |                       |                                 |k     5ddd           n# 1 swxY w Y   |S )z
    Pull a list of items.
    N)r  r  r   )r  r  r  itemsr4   r  s         r6   	pull_listr  ;  s     E	C	"	" !fhhjj6!hhjj3LL    hhjj3! ! ! ! ! ! ! ! ! ! ! ! ! ! ! Ls   A%BBBCallable[[T], None]valuesSequence[T]c                z    t          | |          5  |D ]} ||           	 ddd           dS # 1 swxY w Y   dS )z
    Push a list of items.
    N)r  )r  r  r  r  values        r6   	push_listr  G  s     
C	"	"   	 	EDKKKK	                 s   044c                    t          | |          5 }|                     |          cddd           S # 1 swxY w Y   dS )z4
    Pull an opaque value prefixed by a length.
    N)r  r  )r  r  r4   s      r6   pull_opaquer  R  s     
C	"	" &f~~f%%& & & & & & & & & & & & & & & & & &s   377r  c                    t          | |          5  |                     |           ddd           dS # 1 swxY w Y   dS )z2
    Push an opaque value prefix by a length.
    N)r  r  )r  r  r  s      r6   push_opaquer  Z  s     
C	"	"  u                 s   488extension_typec              #     K   |                      |           t          | d          5  d V  d d d            d S # 1 swxY w Y   d S Nr   )push_uint16r  )r  r  s     r6   push_extensionr  b  s      OON###	C		                   s   :>>KeyShareEntryc                R    |                                  }t          | d          }||fS r  )pull_uint16r  )r  groupr   s      r6   pull_key_sharer  o  s*    OOEsAD4=r8   c                j    |                      |d                    t          | d|d                    d S )Nr   r   r   )r  r  )r  r  s     r6   push_key_sharer  u  s4    OOE!HQa!!!!!r8   c                H    t          | d                              d          S Nr   r  )r  r  r  s    r6   pull_alpn_protocolr  }  s     sA%%g...r8   protocolc                N    t          | d|                    d                     d S r  )r  encode)r  r  s     r6   push_alpn_protocolr    s&    Q0011111r8   PskIdentityc                R    t          | d          }|                                 }||fS r  )r  pull_uint32)r  identityobfuscated_ticket_ages      r6   pull_psk_identityr    s-    3""HOO--+,,r8   entryc                j    t          | d|d                    |                     |d                    d S )Nr   r   r   )r  push_uint32r  r  s     r6   push_psk_identityr    s4    Qa!!!OOE!Hr8   c                "    t          | d          S Nr   r  r  s    r6   pull_psk_binderr    s    sAr8   binderc                (    t          | d|           d S r  r  )r  r  s     r6   push_psk_binderr    s    Qr8   c                  $    e Zd ZU ded<   ded<   dS )OfferedPskszlist[PskIdentity]
identitieszlist[bytes]bindersNr   r   r8   r6   r  r    s*         !!!!r8   r  c                      e Zd ZU ded<   ded<   ded<   ded<   dZded	<   d
Zded<   dZded<   dZded<   dZded<   dZ	ded<   dZ
ded<   dZded<   dZded<    ee          Zded<   dS )ClientHellor   randomlegacy_session_idz	list[int]cipher_suiteslegacy_compression_methodsNlist[str] | Nonealpn_protocolsFr@   
early_datazlist[KeyShareEntry] | None	key_sharezOfferedPsks | Nonepre_shared_keylist[int] | Nonepsk_key_exchange_modesr  r;  signature_algorithmssupported_groupssupported_versionsdefault_factorylist[Extension]other_extensions)rg   rh   ri   r   r   r  r  r  r  r;  r  r  r  r   listr  r   r8   r6   r  r    s         MMM)))) (,N++++J,0I0000)-N----/33333"K""""-11111)-----+/////(-d(C(C(CCCCCCCr8   r  c                                                      t          j        k    sJ t           d          5                                   t
          k    sJ t                               d          t           d          t           d j                  t           d j                             dd
 fd	}t           d|           d d d            n# 1 swxY w Y   S )Nr   r9   r   r   )r  r  r  r  FrA   r!  c                    rJ                                  }                                  }| t          j        k    r+t          dt	          t
                              _        d S | t          j        k    rt          dj                   _        d S | t          j	        k    rt          dj                   _
        d S | t          j        k    rt          dj                   _        d S | t          j        k    rt          dj                  _        d S | t          j        k    rmt#          d          5                                  dk    sJ t%          d                              d          _        d d d            d S # 1 swxY w Y   d S | t          j        k    r+t          dt	          t,                              _        d S | t          j        k    r	d_        d S | t          j        k    r^t7          t          dt	          t8                              t          dt	          t:                                        _        dd S | t          j        k    r                     |           d S | t          j!        k    rd S j"        #                    |                      |          f           d S )Nr   r   r   r  Tr  r  )$r  re  rv  r  r
   r  r  rs  r  rn  r  rm  r  ru  
pull_uint8r  rk  r  r  r  r;  ro  r  r   rr  r  rq  r  r  r  r  rl  r  r`  r  r   )r  extension_length	after_pskr  hellos     r6   pull_extensionz)pull_client_hello.<locals>.pull_extension  s    !    __..N"00!888"+CGNC4P4P"Q"Q=#CCC+4S!S_+M+M(((=#EEE-6sAs-O-O***=#AAA)233?)K)K&&&=#GGG/8a/P/P,,,=#<<<Q'' L L>>++q0000(3C(;(;(B(B7(K(KE%L L L L L L L L L L L L L L L L L L  =#555'0G$6<<( ($$$  =#;;;#'   =#???'2(a9JC1P1PQQ%c1gos.K.KLL( ( ($ !			=#???$      =#777&--#S^^4D%E%EF    s   =AFFFr-  )
r  r  r  r  r  TLS_VERSION_1_2r  r  r  r  )r  r  r  r  s   ` @@r6   pull_client_hellor    sB   >>}99999	C		 9* 9*  O3333>>"%%)#q11#CCO<<'0a'H'H	
 
 
 	*	 *	 *	 *	 *	 *	 *	 *	X 	#q.)))s9* 9* 9* 9* 9* 9* 9* 9* 9* 9* 9* 9* 9* 9* 9*v Ls   BCC"Cr  c                
   |                      t          j                   t          | d          5  |                     t
                     |                     |j                   t          | d|j	                   t          | d| j        |j                   t          | d| j         |j                   t          | d          5  t          | t          j                  5  	 d d d            n# 1 swxY w Y   t          | t          j                  5  t          | dt#          t$          |           |j                   d d d            n# 1 swxY w Y   t          | t          j                  5  t          | d| j        |j                   d d d            n# 1 swxY w Y   t          | t          j                  5  t          | d| j        |j                   d d d            n# 1 swxY w Y   t          | t          j                  5  t          | d| j        |j                   d d d            n# 1 swxY w Y   |j        Nt          | t          j                  5  t          | d| j         |j                   d d d            n# 1 swxY w Y   |j        t          | t          j                  5  t          | d          5  |                      d           t          | d|j                            d                     d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |j        \t          | t          j                   5  t          | dt#          tB          |           |j                   d d d            n# 1 swxY w Y   |j"        D ]B\  }}t          | |          5  |                     |           d d d            n# 1 swxY w Y   C|j#        r3t          | t          j$                  5  	 d d d            n# 1 swxY w Y   t          | t          j%                  5  |                      d           t          | d          5  	 d d d            n# 1 swxY w Y   t          | d          5  	 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |j&        t          | t          j'                  5  t          | dt#          tP          |           |j&        j)                   t          | dt#          tT          |           |j&        j+                   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr   r   r   r   r  ),
push_uint8r  r  r  r  r  r  r  r  r  r  r  r  r  re  r`  rv  r
   r  r  rs  r  rn  r  rm  r  r  ru  r;  rk  r  r   ro  r  r  r  rr  rl  r  rq  r  r  r  r  r  r  r  extension_values       r6   push_client_hellor    s	   NN=-...	C		 E E(((u|$$$CE3444#q#/5+>???#q#.%*JKKK Q =	 =	]%9::                  ]%<== Q Q#q'.#">">PPPQ Q Q Q Q Q Q Q Q Q Q Q Q Q Q  ]%EFF M M#q#/53KLLLM M M M M M M M M M M M M M M  ]%GHH O O#q#/53MNNNO O O O O O O O O O O O O O O  ]%CDD K K#q#/53IJJJK K K K K K K K K K K K K K K +7#C)MNN T Tc1cne6RSSST T T T T T T T T T T T T T T  ,#C)BCC O O#C++ O Oq)))#CE,=,D,DW,M,MNNNO O O O O O O O O O O O O O OO O O O O O O O O O O O O O O
 #/#C);<<  Q(:C @ @%BV                
 493I 4 4/#C88 4 4NN?3334 4 4 4 4 4 4 4 4 4 4 4 4 4 4  #C)ABB                  ]%ABB  q!!!Q''                Q''                	               #/#C)EFF   1377,7	   55,4	                c=	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	 =	E E E E E E E E E E E E E E E E E EsS  BU,UC, U,C00U3C04U+E<UEUEU-F
UFUFU;G$U$G((U+G(,U	H2&U2H66U9H6:$UJ;UJUJ$U3L&?L	L&LL&LL&U&L**U-L*.$U+N	=U	NUNU0O	UOUO%U?PUPUPU2&R&Q&	R&&Q**R&-Q*.R&R	R&RR&RR&U&R**U-R*.$UAT=1U=UUUUU,U	U,U	U,,U03U0c                      e Zd ZU ded<   ded<   ded<   ded<   dZded	<   dZd
ed<   dZd
ed<    ee          Z	ded<   dS )ServerHellor   r  r  r   cipher_suitecompression_methodNzKeyShareEntry | Noner  
int | Noner  supported_versionr	  list[tuple[int, bytes]]r  )
rg   rh   ri   r   r  r  r"  r   r  r  r   r8   r6   r  r  G  s         MMM '+I****!%N%%%%$(((((05d0K0K0KKKKKKKr8   r  c                                                      t          j        k    sJ t           d          5                                   t
          k    sJ t                               d          t           d                                                                                       d	 fd}t           d|           d d d            n# 1 swxY w Y   S )
Nr   r9   r   )r  r  r  r   rA   r!  c                                                     }                                  }| t          j        k    r                                 _        d S | t          j        k    rt                    _        d S | t          j        k    r                                 _        d S j	        
                    |                     |          f           d S r0   )r  re  rs  r"  rv  r  r  rq  r  r  r   r  )r  r  r  r  s     r6   r  z)pull_server_hello.<locals>.pull_extensionb  s     __..N"00!AAA*-//*;*;'''=#:::"0"5"5=#???'*'8'8$$$&--#S^^4D%E%EF    r8   r   r-  )
r  r  r  r  r  r  r  r  r  r  )r  r  r  s   ` @r6   pull_server_hellor&  U  s*   >>}99999	C		 * *  O3333>>"%%)#q11**"~~//	
 
 
	 	 	 	 	 	 	 	#q.)))3* * * * * * * * * * * * * * *6 Ls   BCCCc           	     `   |                      t          j                   t          | d          5  |                     t
                     |                     |j                   t          | d|j	                   |                     |j
                   |                      |j                   t          | d          5  |j        Lt          | t          j                  5  |                     |j                   d d d            n# 1 swxY w Y   |j        Gt          | t          j                  5  t%          | |j                   d d d            n# 1 swxY w Y   |j        Lt          | t          j                  5  |                     |j                   d d d            n# 1 swxY w Y   |j        D ]B\  }}t          | |          5  |                     |           d d d            n# 1 swxY w Y   C	 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S Nr   r   r   )r  r  r  r  r  r  r  r  r  r  r  r   r"  r  re  rs  r  rv  r  r  rq  r  r  s       r6   push_server_hellor)  u  s   NN=-...	C		 4 4(((u|$$$CE3444*+++u/000 Q 	4 	4&2#C)IJJ = =OOE$;<<<= = = = = = = = = = = = = = = *#C)@AA 9 9"38889 9 9 9 9 9 9 9 9 9 9 9 9 9 9 #/#C)EFF : :OOE$8999: : : : : : : : : : : : : : : 493I 4 4/#C88 4 4NN?3334 4 4 4 4 4 4 4 4 4 4 4 4 4 44	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	44 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4s   BH#?"H!D<HDHD$H4E
HEHE$HF)H)F--H0F-1HG2	&H2G66H9G6:H?H#H	H#H	H##H'*H'c                  x    e Zd ZU dZded<   dZded<   dZded<   dZded<   d	Zd
ed<    e	e
          Zded<   d	S )NewSessionTicketr   r   ticket_lifetimeticket_age_addr8   r   ticket_nonceticketNr!  max_early_data_sizer	  r#  r  )rg   rh   ri   r,  r   r-  r.  r/  r0  r   r  r  r   r8   r6   r+  r+    s         ONLF '+****05d0K0K0KKKKKKKr8   r+  c                    t                                                       t          j        k    sJ t	           d          5                                   _                                         _        t           d          _	        t           d          _
        d fd}t           d|           d d d            n# 1 swxY w Y   S )Nr   r   r   rA   r!  c                                                     }                                  }| t          j        k    r                                _        d S j                            |                     |          f           d S r0   )r  re  rr  r  r0  r  r   r  )r  r  r  new_session_tickets     r6   r  z/pull_new_session_ticket.<locals>.pull_extension  s     __..N"00!9999<9J9J"666"3::#S^^4D%E%EF    r8   r-  )r+  r  r  r  r  r  r,  r-  r  r.  r/  r  )r  r  r3  s   ` @r6   pull_new_session_ticketr4    s   )++>>}?????	C		 * *-0__->->*,/OO,=,=)*5c1*=*='$/Q$7$7!	 	 	 	 	 	 	 	#q.)))!* * * * * * * * * * * * * * *$ s   A5CC
C
r3  c           	        |                      t          j                   t          | d          5  |                     |j                   |                     |j                   t          | d|j                   t          | d|j	                   t          | d          5  |j
        Lt          | t          j                  5  |                     |j
                   d d d            n# 1 swxY w Y   |j        D ]B\  }}t          | |          5  |                     |           d d d            n# 1 swxY w Y   C	 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S r(  )r  r  r  r  r  r,  r-  r  r.  r/  r0  r  re  rr  r  r  )r  r3  r  r  s       r6   push_new_session_ticketr6    sw   NN=3444	C		 4 4*:;;;*9:::C.;<<<C.5666Q 	4 	4!5A#C)ABB L LOO$6$JKKKL L L L L L L L L L L L L L L 4F3V 4 4/#C88 4 4NN?3334 4 4 4 4 4 4 4 4 4 4 4 4 4 44	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	44 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4s~   A1E$!"EC*E*C..E1C.2ED3	'E3D77E:D7;E E$E	E$E	E$$E(+E(c                  N    e Zd ZU dZded<   dZded<    ee          Zded	<   dS )
EncryptedExtensionsNr  alpn_protocolFr@   r  r	  r#  r  )	rg   rh   ri   r9  r   r  r   r  r  r   r8   r6   r8  r8    sS          $M$$$$J05d0K0K0KKKKKKKr8   r8  c                     t                                                       t          j        k    sJ t	           d          5  d fd}t           d|           d d d            n# 1 swxY w Y   S )Nr   rA   r!  c                 j                                    }                                  }| t          j        k    r1t          dt	          t
                              d         _        d S | t          j        k    r	d_        d S j	        
                    |                     |          f           d S )Nr   r   T)r  re  ro  r  r
   r  r9  rr  r  r  r   r  )r  r  r  
extensionss     r6   r  z1pull_encrypted_extensions.<locals>.pull_extension  s     __..N"00!333+4G$6<<, ,,
(((  =#;;;(,
%%%+22#S^^4D%E%EF    r8   r   r-  )r8  r  r  r  r  r  )r  r  r<  s   ` @r6   pull_encrypted_extensionsr=    s    $&&J>>}AAAAA	C		 * *	 	 	 	 	 	 	 	#q.)))!* * * * * * * * * * * * * * *$ s   A**A.1A.r<  c                   |                      t          j                   t          | d          5  t          | d          5  |j        ]t          | t          j                  5  t          | dt          t          |           |j        g           d d d            n# 1 swxY w Y   |j        r3t          | t          j                  5  	 d d d            n# 1 swxY w Y   |j        D ]B\  }}t          | |          5  |                     |           d d d            n# 1 swxY w Y   C	 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S Nr   r   )r  r  r  r  r9  r  re  ro  r  r
   r  r  rr  r  r  )r  r<  r  r  s       r6   push_encrypted_extensionsr@    s   NN=5666	C		 4 4Q 	4 	4'3#C);<<   2C88#12	                 $ #C)ABB                 4>3N 4 4/#C88 4 4NN?3334 4 4 4 4 4 4 4 4 4 4 4 4 4 44	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	44 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4s   E"D7#,BD7BD7"B#$D7C	D7CD7CD7<D	D7D""D7%D"&D7+E7D;	;E>D;	?EEEc                  @    e Zd ZU dZded<    ee          Zded<   dS )r,   r8   r   request_contextr	  zlist[CertificateEntry]r  N)rg   rh   ri   rB  r   r   r  r  r   r8   r6   r,   r,     sA          O    +05+F+F+FLFFFFFFr8   r,   c                  N    e Zd ZU dZded<   dZded<    ee          Zded	<   dS )
CertificateRequestr8   r   rB  Nr  r  r	  r#  r  )	rg   rh   ri   rB  r   r  r   r  r  r   r8   r6   rD  rD  	  sT          O    -1111105d0K0K0KKKKKKKr8   rD  c           	     4   t                      }|                                 t          j        k    sJ t	          | d          5  t          | d          |_        dd}t          | dt          ||                     |_	        d d d            n# 1 swxY w Y   |S )	Nr   r   r  r   rA   CertificateEntryc                J    t          | d          }t          | d          }||fS r?  r  )r  r   r<  s      r6   pull_certificate_entryz0pull_certificate.<locals>.pull_certificate_entry  s+    sA&&D$S!,,J*%%r8   )r  r   rA   rF  )
r,   r  r  r  r  r  rB  r  r
   r  )r  r9  rH  s      r6   pull_certificaterI    s    --K>>}88888	C		 

 

&1#q&9&9#	& 	& 	& 	&
 $-G2C88$
 $
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 s   >BBBc                    t                                                       t          j        k    sJ t	           d          5  t           d          _        d fd}t           d|           d d d            n# 1 swxY w Y   S )Nr   r   rA   r!  c                                                     }                                  }| t          j        k    rt          dj                   _        d S j                            |                     |          f           d S r  )r  re  rn  r  r  r  r   r  )r  r  r  certificate_requests     r6   r  z0pull_certificate_request.<locals>.pull_extension*  s     __..N"00!CCC;DCO< <#888 $4;;#S^^4D%E%EF    r8   r   r-  )rD  r  r  r  r  r  rB  r  )r  r  rL  s   ` @r6   pull_certificate_requestrM  #  s    ,..>>}@@@@@	C		 * *.9#q.A.A+
	 
	 
	 
	 
	 
	 
	 	#q.)))* * * * * * * * * * * * * * *" s   .A??BBc           	        |                      t          j                   t          | d          5  t	          | d|j                   d
d	}t          | dt          ||           |j                   d d d            d S # 1 swxY w Y   d S )Nr   r   r  r   r  rF  rA   r!  c                b    t          | d|d                    t          | d|d                    d S )Nr   r   r   r   r  r  s     r6   push_certificate_entryz0push_certificate.<locals>.push_certificate_entry@  s4    Qa)))Qa)))))r8   )r  r   r  rF  rA   r!  )	r  r  r  r  r  rB  r  r
   r  )r  r9  rP  s      r6   push_certificaterQ  ;  s    NN=,---	C		 	
 	
CK7888	* 	* 	* 	* 	G2C88+:R	
 	
 	
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
s   A A==BBc                  $    e Zd ZU ded<   ded<   dS )CertificateVerifyr   r5   r   	signatureNr   r   r8   r6   rS  rS  I  s'         NNNr8   rS  c                   |                                  t          j        k    sJ t          | d          5  |                                 }t          | d          }d d d            n# 1 swxY w Y   t          ||          S )Nr   r   r5   rT  )r  r  r  r  r  r  rS  )r  r5   rT  s      r6   pull_certificate_verifyrW  O  s    >>}?????	C		 ( (OO%%	Q''	( ( ( ( ( ( ( ( ( ( ( ( ( ( ( yIFFFFs   %A&&A*-A*rN  c                    |                      t          j                   t          | d          5  |                     |j                   t          | d|j                   d d d            d S # 1 swxY w Y   d S r?  )r  r  r  r  r  r5   r  rT  )r  rN  s     r6   push_certificate_verifyrY  X  s    NN=3444	C		 . .()))CF,---. . . . . . . . . . . . . . . . . .s   1A..A25A2c                      e Zd ZU dZded<   dS )Finishedr8   r   verify_dataN)rg   rh   ri   r\  r   r   r8   r6   r[  r[  _  s#         Kr8   r[  c                    t                      }|                                 t          j        k    sJ t	          | d          |_        |S Nr   )r[  r  r  r  r  r\  r  finisheds     r6   pull_finishedra  d  s@    zzH>>}55555&sA..HOr8   r`  c                p    |                      t          j                   t          | d|j                   d S r^  )r  r  r  r  r\  r_  s     r6   push_finishedrc  m  s2    NN=)***Q,-----r8   c                  @    e Zd ZddZddZdd	ZddZdddZddZdS )KeyScheduler  r[  c                V   t          |          | _        t          | j        dz            | _        || _        d| _        t          j        d| j                   | _        | j        	                                
                                | _        t          | j                  | _        d S )Nr   r   r   )cipher_suite_hashr5   r   digest_sizer  
generationr2   newhashcopyr   hash_empty_valuer   r   r   r  s     r6   r   zKeySchedule.__init__s  s    *<88t~122(K 6dn 6 677	 $	 0 0 7 7 9 9D,--r8   context_stringr   rA   c                j    d|z   dz   | j                                                                         z   S )Ns@                                                                       )rk  rl  r   )r   ro  s     r6   certificate_verify_dataz#KeySchedule.certificate_verify_data|  s/    >)G3dinn6F6F6M6M6O6OOOr8   r   c                   t          | j        |dd| j                  }t          |d| j                   }|                    | j                                                                                   |                                S )Ns   finishedr8   r   r   r   )r   r5   rh  r   r   rk  rl  r   )r   r   hmac_keyr   s       r6   finished_verify_dataz KeySchedule.finished_verify_data  s    $n#
 
 
 %;4>%;%;<<<	!!((**+++xxzzr8   r   c                    t          | j        | j        || j                                                                        | j                  S )Nr   )r   r5   r   rk  rl  r   rh  )r   r   s     r6   derive_secretzKeySchedule.derive_secret  sG     n;y~~''..00#
 
 
 	
r8   Nr   r   r!  c                    |t          | j                  }| j        r-t          | j        | j        d| j        | j                  | _        | xj        dz  c_        t          | j        | j        |          | _        d S )Ns   derivedr   r   )r5   r   r   )r   rh  ri  r   r5   r   rm  r   r   s     r6   extractzKeySchedule.extract  s     !122L? 	+.{ 0'  DK 	1"n4;\
 
 
r8   r   c                :    | j                             |           d S r0   )rk  r   )r   r   s     r6   update_hashzKeySchedule.update_hash  s    	r8   )r  r[  )ro  r   rA   r   )r   r   rA   r   )r   r   rA   r   r0   r   r   rA   r!  r   r   rA   r!  )	rg   rh   ri   r   rr  ru  rw  ry  r{  r   r8   r6   re  re  r  s        . . . .P P P P   
 
 
 

 
 
 
 
$     r8   re  c                  0    e Zd ZddZddd	ZddZddZdS )KeyScheduleProxyr  list[CipherSuite]c                L    t          t          d |                    | _        d S )Nc                $    | t          |           fS r0   )re  )r&  s    r6   <lambda>z+KeyScheduleProxy.__init__.<locals>.<lambda>  s    q+a...A r8   )dictmap_KeyScheduleProxy__schedules)r   r  s     r6   r   zKeyScheduleProxy.__init__  s&    $A$A= Q QRRr8   Nr   r   rA   r!  c                h    | j                                         D ]}|                    |           d S r0   )r  r  ry  )r   r   ks      r6   ry  zKeyScheduleProxy.extract  s?    !((** 	$ 	$AIIl####	$ 	$r8   r  r[  re  c                    | j         |         S r0   )r  rn  s     r6   selectzKeyScheduleProxy.select  s    --r8   r   r   c                h    | j                                         D ]}|                    |           d S r0   )r  r  r{  )r   r   r  s      r6   r{  zKeyScheduleProxy.update_hash  s?    !((** 	  	 AMM$	  	 r8   )r  r  r0   r|  )r  r[  rA   re  r}  )rg   rh   ri   r   ry  r  r{  r   r8   r6   r  r    sm        S S S S$ $ $ $ $. . . .           r8   r  r   r   )Nr   )Nr   )N   )Fr   )Fr   )Fr  )Tr   )Tr   )Tr  z1dict[SignatureAlgorithm, tuple[bool | None, int]]rn  r  c                    t           |          S r0   )CIPHER_SUITES)r  s    r6   rg  rg    s    &&r8   	supportedofferedlist[Any] | NonerX  Alert | NoneexclT | Nonec                >    || D ]}||v r|||k    r|c S ||d S r0   r   )r  r  rX  r  r&  s        r6   	negotiater    sR      	 	AG||#		 
 	4r8   signature_algorithmtuple[Any, ...]c                    | t           j        t           j        fv rdS t          t          |                    \  }}|dS ||fS )Nr   )r  r   r  rn  )r  is_pss	hash_sizes      r6   signature_algorithm_paramsr    sT    19;M;STTTr,-?@S-T-TUFI~r 	 r8   key_scheduleKeySchedule | KeyScheduleProxyc              #     K   |                                 }d V  |                     |                    ||                                                      d S r0   )r  r{  
data_slice)r  r  
hash_starts      r6   push_messager    sN       J	EEES^^J

CCDDDDDr8   c                      e Zd ZU dZded<   ded<   ded<   ded<   d	ed
<   ded<   d	ed<   dZded<    ee          Zded<   e	dd            Z
e	dd            ZdS )SessionTicketz6
    A TLS session ticket for session resumption.
    r   age_addr[  r  rB   not_valid_afternot_valid_beforer   resumption_secretr  r;  r/  Nr!  r0  r	  r#  r  rA   r@   c                J    t                      }|| j        k    o
|| j        k    S r0   )rK   r  r  )r   rF   s     r6   is_validzSessionTicket.is_valid  s&    hhd++Kt7K0KKr8   c                    t          t                      | j        z
                                  dz            }|| j        z   dz  S )Ni  l        )r   rK   r  total_secondsr  )r   ages     r6   obfuscated_agezSessionTicket.obfuscated_age  s>    688d33BBDDtKLLdl"w//r8   rA   r@   )rA   r   )rg   rh   ri   __doc__r   r0  r   r  r  propertyr  r  r   r8   r6   r  r    s           LLL&&&&''''MMM&*****05d0K0K0KKKKKL L L XL 0 0 0 X0 0 0r8   r  c                      e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 dCdDdZedEd            ZedFd            ZedGd            ZdHd$ZdId*Z	dJd,Z
dKd.ZdLd/ZdLd0ZdLd1ZdLd2ZdKd3ZdLd4ZdMd8ZdKd9ZdNd?ZdOdBZdS )PContextNFT	is_clientr@   r   r  r  r   r  r  r  r  list[CipherSuite] | Nonelogger-logging.Logger | logging.LoggerAdapter | Nonemax_early_datar!  r;  verify_modehostname_checks_common_nameassert_fingerprintverify_hostnamec           	        || _         || _        || _        || _        || _        || _        || _        d | _        g | _        d | _	        g | _
        || _        d | _        |	5|	                                s!t          |	                                          }	|	| _        |
|
| _        n|rt$          j        nt$          j        | _        d | _        d | _        d | _        d | _        ||| _        n3t4          j        t4          j        t4          j        t4          j        g| _        t>          j         g| _!        tD          j#        g| _$        tJ          j&        tJ          j'        tJ          j(        tJ          j)        tJ          j*        tJ          j+        tJ          j,        tJ          j-        tJ          j.        g	| _/        t`          j        t`          j1        t`          j2        t`          j3        t`          j4        g| _5        tl          tn          g| _8        d | _9        d| _:        d | _;        d | _<        d | _=        d | _>        d | _?        d | _@        g | _A        d | _B        d| _C        d| _D        d | _E        d | _F        d | _G        || _H        d | _I        d | _J        d | _K        d | _L        d | _M        |r3t          jO        d          | _P        d| _Q        t          jS        | _T        d S d | _P        d | _Q        t          jU        | _T        d S )Nc                    d S r0   r   )drW  r&  ss       r6   r  z"Context.__init__.<locals>.<lambda>S  s    t r8   Fr8   r9   )V_alpn_protocols_cadata_cafile_capath_hostname_checks_common_name_assert_fingerprint_verify_hostnamer9  certificate_chaincertificate_private_keyhandshake_extensions_max_early_datasession_ticketisasciir)   r  _server_name_verify_moder   CERT_REQUIRED	CERT_NONEalpn_cbget_session_ticket_cbnew_session_ticket_cbupdate_traffic_key_cb_cipher_suitesr[  r`  r\  r^  r]  rb  rc  _legacy_compression_methodsr  r  _psk_key_exchange_modesr  r  r  r  r  r  r  r  r  r   _signature_algorithmsrz  r  r  r  r  _supported_groupsTLS_VERSION_GREASETLS_VERSION_1_3_supported_versionsalpn_negotiatedearly_data_acceptedr  received_extensions_key_schedule_psk_key_schedule_proxy_new_session_ticket_peer_certificate_peer_certificate_chain_ocsp_response_receive_buffer_session_resumed_enc_key_dec_key_certificate_request_Context__logger_ec_p256_private_key_ec_p384_private_key_ec_p521_private_key_x25519_private_key_x25519_kyber_768_private_keyr  urandomclient_randomr  r   r   stater   )r   r  r   r  r  r  r  r  r  r;  r  r  r  r  s                 r6   r   zContext.__init__!  s   "  .,G)#5  /378:  	$ 68!-48 ";+>+>+@+@"%k2299;;K'" +D5> Q 1 1CMD ,0BF"BF" $# 	"
 $"/D ".4.	#D 8I7M6N(3E3P2Q$52/52/2/&
1
" LLOO"
 %7#H  ,0). 04;? 59<@ <@ 9=>@$,0" %&*&*?C! AE!@D!@D!=A LP* 	:!#BD%(D"5DJJJ!%D%)D"9DJJJr8   rA   X509Certificate | Nonec                    | j         S r0   )r  r   s    r6   peer_certificatezContext.peer_certificate  s    %%r8   r   c                    | j         S r0   )r  r  s    r6   peer_certificate_chainzContext.peer_certificate_chain  s    ++r8   c                    | j         S )zK
        Returns True if session resumption was successfully used.
        )r  r  s    r6   session_resumedzContext.session_resumed  s    
 $$r8   
input_datar   
output_bufdict[Epoch, Buffer]r!  c                   | j         t          j        k    r'|                     |t          j                            d S | xj        |z  c_        t          | j                  dk    ru| j        d         }dt          	                    | j        dd         d          z   }t          | j                  |k     rd S | j        d |         }| j        |d          | _        t          |          }| j         t          j        k    r?|t          j        k    r(|                     ||t          j                            nqt          | j         t          j        k    r.|t          j        k    r|                     |           n.t          | j         t          j        k    rU|t          j        k    r|                     |           n|t          j        k    r|                     |           nt          | j         t          j        k    r.|t          j        k    r|                     |           nt          | j         t          j        k    r?|t          j        k    r(|                     ||t          j                            n-t          | j         t          j        k    r-|t          j         k    r| !                    |           nt          | j         t          j"        k    r`|t          j#        k    rI| $                    ||t          j                 |t          j                 |t          j%                            nvt          | j         t          j&        k    r>|t          j        k    r'| '                    ||t          j%                            n#t          | j         t          j(        k    rt          |)                                sJ t          | j                  dk    sd S d S )Nr   r   r   r  r  r   )*r  r   r   _client_send_hellor   r   r  r   r   r  r   r   r  r  _client_handle_hellor   r   r  #_client_handle_encrypted_extensionsr   r  _client_handle_certificater  "_client_handle_certificate_requestr   r  !_client_handle_certificate_verifyr   r  _client_handle_finishedr   r   r  !_client_handle_new_session_ticketr   r  _server_handle_hellor   r   _server_handle_finishedr   eof)r   r  r  message_typemessage_lengthmessage	input_bufs          r6   handle_messagezContext.handle_message  s    :555##Ju}$=>>>F
*$&''1,,/2L$QqS)U "0 " " N
 4'((>99*?N?;G#'#7#HD G,,,I zU====#===--iEM9RSSSS00uGGG=#EEE<<YGGGG00uUUU=#<<<33I>>>>!]%FFF;;IFFFF00uEEE=#CCC::9EEEE00u;;;=#99900Ju<WXXXX00u:::=#CCC::9EEEE00 u???=#===--!"5=1"5?3"5=1	    10u;;;=#99900Ju}<UVVVV00u:::,,==??"""M $&''1,,,,,,r8   r3  r+  r  r  r  c                N   | j                             d          }t          | j         j        |d|j        | j         j                  }t                      }t          |j        | j         j	        |j
        |t          j        |j                  z   |||| j        |j        	  	        S )Ns
   res masters
   resumptionr   )seconds)	r  r  r0  r  r  r  r  r;  r/  )r  rw  r   r5   r.  rh  rK   r  r-  r  r0  rE   	timedeltar,  r  r/  )r   r3  r  resumption_master_secretr  	timestamps         r6   _build_session_ticketzContext._build_session_ticket  s     $(#4#B#B=#Q#Q -'1+)6$0
 
 
 HH	&5*7 2 F% );)KLLLM&-/)%,
 
 
 	
r8   r   c                   g }g }| j         D ]}|t          j        k    rkt                      | _        |                    t          j        | j                                        f           |                    t          j                   ~|t          j        k    rkt                      | _	        |                    t          j        | j	                                        f           |                    t          j                   |t          j
        k    rlt                      | _        |                    t          j
        | j                                        f           |                    t          j
                   u|t          j        k    rlt                      | _        |                    t          j        | j                                        f           |                    t          j                   |t          j        k    rt#                      | _        |                    t          j        | j                                        f           |                    t          j                   | j        | j                            d           |t          j        k    r@|                    t          j        df           |                    t          j                   t-          |          s
J d            t/          | j        | j        d | j        D             | j        | j        || j        s| j        | j        nd | j         | j!        || j"        | j#                  }| j        r| j        j$        rtK          | j        j&                  | _'        | j'        (                    | j        j)                   | j'        *                    d          }| j'        j+        }| j        j,        d|_-        t]          | j        j/        | j        j0        fgtc          |          g          |_2        tg          d	
          }ti          ||           |5                                |z
  dz
  }	| j'        6                    |7                    d|	                     | j'        8                    |          }
|
|j2        j9        d<   | j'        6                    |7                    |	|	dz             |
z              |j-        rP| j'        *                    d          }| :                    tv          j<        tz          j>        | j'        j&        |           t          d | j        D                       | _@        | j@        (                    d            t          | j@        |          5  ti          ||           d d d            n# 1 swxY w Y   | B                    t          jD                   d S )NzJTLS: Advertising to peer post-quantum algorithm using X25519ML768 (0x11EC)rq  zno key share entriesc                ,    g | ]}t          |          S r   )r   r3   xs     r6   rJ  z.Context._client_send_hello.<locals>.<listcomp>D  s    ???a3q66???r8   )r  r  r  r  r   r  r  r;  r  r  r  r  
   res binderTr  i   r  r   r      c e trafficc                2    g | ]}|t           j        k    |S r   )r[  r`  )r3   css     r6   rJ  z.Context._client_send_hello.<locals>.<listcomp>}  s%    JJJB{7I1I1IR1I1I1Ir8   )Er  rz  r  r   r  r   
public_keyr  r   r  r  r   r  r  r'   r  r  r(   r  r  debugr`  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  re  r  r  ry  r  rw  rh  r0  r  r  r/  r  r   r  r   r  r  r{  r  ru  r  r  r   r   r   r   r  r  r  
_set_stater   r   )r   r  r  r  r  r  
binder_keybinder_lengthtmp_bufhash_offsetr  	early_keys               r6   r  zContext._client_send_hello  s   )+	&(+ '	6 '	6E'',?,A,A)  _d&?&J&J&L&LM   !''8888%/)),?,A,A)  _d&?&J&J&L&LM   !''8888%/)),?,A,A)  _d&?&J&J&L&LM   !''8888%,&&+<+>+>(  %,0H0S0S0U0U!VWWW ''5555%+++5K5M5M2  ):EEGG   !''(9:::=,M''5   %,&&  %,!8999 ''5559~~555555%"4??4+>???'+'G/ '+/+E+Q ,,)!%!;-#7!6!
 
 
(  %	4#6#? %	%01D1Q%R%RD""**4+>+PQQQ/==mLLJ 2>M "6B#' #.(/1D1ST }--.	$ $ $E  d+++Ggu--- ",,..=81<K"..w/A/A![/Q/QRRR+@@LLF.4E (+".."";a@@6I  
   2@@PP	**%N*7	   $4JJ$-JJJ$
 $
  	 ((...$2J?? 	1 	1j%000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	899999s   %WW	Wr  c                r   t          |          }t          | j        |j        gt	          d          t
          j                  }|j        | j        v sJ |j	        | j
        v sJ |j        =| j        |j        dk    s|| j        j        k    rt          | j        | _        d| _        n| j                            |          | _        d | _        d | _        |j        d         }d }|j        d         t&          j        k    r#| j        | j                            |          }n|j        d         t&          j        k    r<| j                            |          }| j        | j                            d           n|j        d         t&          j        k    r"| j        | j                            |          }ny|j        d         t&          j        k    r"| j        | j                            |          }n<|j        d         t&          j        k    r!| j         | j                             |          }|J | j        !                    |j"                   | j        #                    |           | $                    tJ          j&        tN          j(        d           | )                    tT          j+                   d S )NzUnsupported cipher suiter  r   Tr   zBTLS: Post-quantum safety achieved using X25519ML768 (key-exchange)   s hs traffic),r&  r  r  r  r   r[  r`  r   r  r"  r  r  r  r   r  r  r  r  r  rz  r  r  exchanger  r  r  r"  r  r  r  r  r  r  r{  r   ry  _setup_traffic_protectionr   r   r   r   r#  r   r   )r   r  r  
peer_hellor  peer_public_key
shared_keys          r6   r  zContext._client_handle_hello  s   &y11
 $%!"<==#	
 
 
 ,0PPPPP+t/GGGGG $0&.,114#9#FFF++ $ 6D$(D!! $ 8 ? ? M MD!%#'  %.q1#'
  #u|33(41::?KKJJ!!$(999;DD_UUJ}(##X    #u66)52;;OLLJJ #u66)52;;OLLJJ #u66)52;;OLLJ%%%%%in555!!*---&&u	
 	
 	
 	@AAAAAr8   c                   t          |          }|j        | _        |j        | _        |j        | _        | j        r|                     | j                   |                     t          j
        t          j        d           | j                            |j                   | j        r!|                     t$          j                   d S |                     t$          j                   d S )N   c hs traffic)r=  r9  r  r  r  r  r  r  r-  r   r   r   r   r  r{  r   r  r#  r   r   r   )r   r  encrypted_extensionss      r6   r  z+Context._client_handle_encrypted_extensions  s    8CC3A#7#B #7#H < 	/LL-...&&u	
 	
 	
 	%%in555   	TOOE899999OOERSSSSSr8   c                >   t          |          t          j        d         d                   }	 |                                s|                                }|                                }|t
          j        k    rb|                                }|dk    r/|                                }|	                    |          | _
        n.|	                    |dz
             nn|                                n# t          $ r Y nw xY wt          j        d         d                   | _        fdt          dt          j                            D             | _        | j                            |j                   |                     t*          j                   d S )Nr   r   r  c                P    g | ]"}t          j        |         d                    #S )r   )r  r  )r3   rU  r9  s     r6   rJ  z6Context._client_handle_certificate.<locals>.<listcomp>  s>     (
 (
 (
 K4Q7:;;(
 (
 (
r8   )rI  r   r  r  r  re  rl  r  pull_uint24r  r  r   r  r  ranger   r  r  r{  r   r#  r   r   )r   r  ext_bufext_typeext_lenstatus_typeresp_lenr9  s          @r6   r  z"Context._client_handle_certificate  s   &y11 k6q9!<===	 kkmm "..00!--//};;;")"4"4"6"6K"a''#*#6#6#8#8.5.@.@.J.J+**7Q;7777 kkmm   	 	 	D	 "11I!1LQ1O!P!P(
 (
 (
 (
1c+":;;<<(
 (
 (
$
 	%%in555>?????s   CC7 7
DDc                    t          |          | _        | j                            |j                   |                     t          j                   d S r0   )rM  r  r  r{  r   r#  r   r   )r   r  s     r6   r  z*Context._client_handle_certificate_request  sF    $<Y$G$G!%%in555NOOOOOr8   c           
     j   t          |          }|j        | j        v sJ 	 t          | j                                        |j        | j                            d          |j                   n.# t          $ r!}t          t          |                    d }~ww xY w| j        t          j        k    r?t          | j        | j        | j        | j        | j        | j        | j        | j                   | j        | j                            dd                                          }t5          |          }t6                              |          }|st;          d|           t=          |                                          } || j                                                   !                                }||k    r:t;          d|"                                 d|"                                 d          | j        #                    |j$                   | %                    tL          j'                   d S )	N!   TLS 1.3, server CertificateVerify)r  r  r  r9  r:  r;  r<  r=  rA   zFingerprint of invalid length: z&Fingerprints did not match. Expected "z", got "")(rW  r5   r  r+   r  r!  r  rr  rT  r$   r   r  r  r   r  rY  r  r  r  r  r  r  r  r  rI   lowerr   HASHFUNC_MAPgetr   r   r  r   r   hexr{  r   r#  r   r   )	r   r  rN  rW  fingerprintdigest_lengthhashfuncexpect_fingerprintpeer_fingerprints	            r6   r  z)Context._client_handle_certificate_verify	  sQ   (334#=====
	,"&1133 !998        	, 	, 	,#CFF+++	, --||| 22 -#'#8"1	 	 	 	 #/2::3CCIIKKK,,M#''66H )CkCC   "+;+=+=+?+?!@!@'x(>(K(K(M(MNNUUWW#555)6!3!7!7!9!96 6,00226 6 6   	%%in555455555s   AA- -
B7BBc           
     >   t          |          }| j                            | j                  }|j        |k    rt
          | j                            |j                   | j        j        dk    sJ | j        	                    d            | 
                    t          j        t          j        d           | j                            d          }| j        t#          | j        |          5  t%          |t'          | j        j        d | j        g| j        z   D                                  d d d            n# 1 swxY w Y   d | j        | j        fvr|g }t1          | j        t2                    rt4          j        t4          j        g}nt1          | j        t:                    rZ| j        j        dk    rt4          j        g}nc| j        j        dk    rt4          j         g}nE| j        j        dk    rt4          j!        g}n't1          | j        tD                    rt4          j#        g}tI          || j        j%        tM          d	                    } | j        j'        | j        (                    d
          gtS          |          R  }t#          | j        |          5  tU          |tW          ||                     d d d            n# 1 swxY w Y   t#          | j        |          5  tY          |t[          | j                            | j.                                       d d d            n# 1 swxY w Y   || _.        | /                    t          j0        t          j        | j        j1        | j.                   | 2                    tf          j4                   d S )Nr      s ap traffic   c ap trafficc                >    g | ]}||                                 dfS )Nr8   rH  )r3   r4  s     r6   rJ  z3Context._client_handle_finished.<locals>.<listcomp>W  s9     & & & $#/ "..00#6///r8   rB  r  r   r   r    No supported signature algorithms!   TLS 1.3, client CertificateVerifyrV  r\  )5ra  r  ru  r  r\  r   r{  r   ri  ry  r-  r   r   r   r   rw  r  r  rQ  r,   rB  r9  r  r  rO  r!   r  r  r  r   r   r  r  r  r   r   r  r  r   signrr  r  rY  rS  rc  r[  r  r  r   r  r#  r   r   )	r   r  r  r`  expected_verify_datanext_enc_keyr  r  rT  s	            r6   r  zContext._client_handle_finished@  s    ++  $0EEdmTT#777##%%in555  +q0000!!$'''&&u}o	
 	
 	
 (66GG$0d/<<   (,(A(Q& &)-)9(:T=S(S& & &  
 
 
               D,d.JKKKAC$d:MJJ H*>*;,((   <lKK H3>#EE.E0,, 5@CGG.E0,, 5@CGG.E0,   <>OPP H,>,F+G(&/(-B)*LMM' '# >D8=%==<  00CDD	  	 "$"3Z@@  +")&9Y                   $+Z88 	 	 $ 1 F Ft} U U    	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 %""M*M		
 	
 	
 	344444s7   .AD<<E E  K		KK)<L11L58L5c                    t          |          }| j        2|                     || j                  }|                     |           d S d S r0   )r4  r  r  r  )r   r  r3  r/  s       r6   r	  z)Context._client_handle_new_session_ticket  s\    4Y?? %1//"D$< F &&v.....	 21r8   initial_bufhandshake_buf
onertt_bufc           
        t          |          }g }t          | j        t                    rt          j        t          j        g}nt          | j        t                    rZ| j        j        dk    rt          j	        g}nc| j        j        dk    rt          j
        g}nE| j        j        dk    rt          j        g}n't          | j        t                    rt          j        g}t          | j        |j        t#          d          t$          j                  }t          | j        |j        t#          d                    }t          | j        |j                  }	t          ||j        t#          d                    }
t          | j        |j        t7          d                    }| j        -t          | j        |j        t#          d	                    | _        |j        | _         tC          j"        d
          | _#        |j$        | _$        |j%        | _&        | j'        r| '                    | j                   d }| j(        |	|j)        
tU          |j)        j+                  dk    rtU          |j)        j,                  dk    r|j)        j+        d         }| (                    |d                   }||j-        r|j.        |k    rt_          |          | _0        | j0        1                    |j2                   | j0        3                    d          }| j0        j4        }|5                                |z
  dz
  }|6                    |dz   |dz   |z             }| j0        7                    |6                    d|                     | j0        8                    |          }||k    rt#          d          | j0        7                    |6                    ||dz   |z                        d| _9        |j:        rW| j0        3                    d          }d| _;        | <                    tz          j>        t~          j@        | j0        j.        |           d}|Mt_          |          | _0        | j0        1                    d            | j0        7                    |jA                   d }d }d }|jB        D ]}|d         }|d         t          jD        k    rUt                      | _F        | jF        G                                }| jF        H                    |          }t          jD        } n|d         t          jI        k    rUt                      | _K        | jK        H                    |          }| jK        L                                }t          jI        } n@|d         t          jM        k    rTt                      | _O        | jO        G                                }| jO        H                    |          }t          jM        } n|d         t          jP        k    rTt                      | _R        | jR        G                                }| jR        H                    |          }t          jP        } nl|d         t          jS        k    rTt                      | _U        | jU        G                                }| jU        H                    |          }t          jS        } n!|J t          | j#        | j$        ||||f||          }t          | j0        |          5  t          ||           d d d            n# 1 swxY w Y   | j0        1                    |           | Y                    tz          jZ        t~          j[        d           | Y                    tz          j>        t~          j[        d           t          | j0        |          5  t          |t          | j        | j;        | j^                             d d d            n# 1 swxY w Y   |t          | j0        |          5  t          |t          dd | ja        g| jb        z   D                                  d d d            n# 1 swxY w Y    | j        jc        | j0        d                    d          gt          |
          R  }t          | j0        |          5  t          |t          |
|                     d d d            n# 1 swxY w Y   t          | j0        |          5  t          |t          | j0        8                    | jj                                       d d d            n# 1 swxY w Y   | j0        jk        dk    sJ | j0        1                    d            | Y                    tz          jZ        t~          jl        d           | j0        3                    d          | _m        | j0        8                    | jn                  | _o        t          d           }t          |t          | jo                             | j0        7                    |jA                   | jq        |	t          d!t          jt        d"tC          j"        d#                    d         dtC          j"        d          | ju        $          | _v        t          || jv                   | x                    | jv        | j^                  }| q                    |           | y                    t          j{                   d S )%Nr   r   r   zNo supported cipher suiter*  zNo supported compression methodrP  zNo supported protocol versionzNo common ALPN protocolsr9   r   r   r  r   zPSK validation failedTr  )r  r  r  r   r  r  r"  r+  r2  )r9  r  r  r8   c                :    g | ]}|                                 d fS )r8   rH  r  s     r6   rJ  z0Context._server_handle_hello.<locals>.<listcomp>~  s7     & & & ! ^^--s3& & &r8   rO  r?  rV  rQ  r   rL  rM  r=   r  iQ Ir   )r,  r-  r.  r/  r0  )|r  rO  r  r!   r  r  r  r   r   r  r  r  r   r   r  r  r  r   r[  r`  r  r  r  r  r  r  r  r   r  r   r  r  r  r  r  server_randomr  r  r  r  r  r  r   r  r  r  r  re  r  ry  r  rw  rh  r  r  r{  ru  r  r  r  r  r   r   r   r   r   r  rz  r  r'   r  r!  r,  r  r(   r  shared_ciphertextr  r   r  r  r   r  r  r   r  r  r  r)  r-  r   r   r@  r8  r  rQ  r,   r9  r  rR  rr  r  rY  rS  rc  r[  r  ri  r   _next_dec_keyr  _expected_verify_datar   r  r+  r   unpackr  r  r6  r  r#  r   r   )r   r  rV  rW  rX  r.  r  r  r   psk_key_exchange_moder  r"  r  r  r  r$  r%  r'  r  expected_binderr(  r!  group_kxr0  r  r/  r  rT  r  r/  s                                 r6   r
  zContext._server_handle_hello  s(    'y11
 :<d2MBB 	@"6"3$   4lCC 	@+6#==(:(Q'R$$-8C??(:(Q'R$$-8C??(:(Q'R$46GHH 	@$6$>#?  !$!"=>>#	
 
 
 ',1!"CDD
 

 !*(**K!
 !
 ( +!"DEE
 

 &$) !@AA
 
 +#,$)%&@AA$ $D  (.Z^^!+!=#-#> < 	/LL-... &2%1)5J-899Q>>J-566!;; "0;A>H!77DDN *"+ +"/<??$/$=$=!!)).*JKKK!.<<]KK
 $ 1 ='nn..>B"--!O[1_}%D  !--i.B.B1k.R.RSSS"&"3"H"H"T"T_,,/0GHHH!--((kAo6UVV   )-% (  $ 1 ? ? O OI/3D,..!))6!	   "# ! +L 9 9D%%d+++))).999 $(
!%#'
#- "	 "	I'lO|u|+++<+>+>(!5@@BB
!5>>OO
 <1!2225K5M5M2!?HH# 
 "?QQSS
 ,100,?,A,A)!6AACC
!6??PP
 ?100,?,A,A)!6AACC
!6??PP
 ?100,?,A,A)!6AACC
!6??PP
 ? 1 %%% %"4%1,)/
 
 
 $+[99 	2 	2k5111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2!!*---&&u	
 	
 	
 	&&u	
 	
 	

 $+];; 	 	%#"&"6#7%)%>    	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 !d/?? 
 
 !(+& &&*&6%7$:P%P& & &  	 	 	
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 :49!998  ,,?@@	  I d/??  '!%"5                   $+];; 	 	 $ 1 F Ft} U U    	 	 	 	 	 	 	 	 	 	 	 	 	 	 	  +q0000!!$'''&&u}o	
 	
 	
 ".<<_MM &*%6%K%KM&
 &
" b!!!c80JKKKLLL%%ch/// %16K6W'7 %%}S"*Q--@@C z"~~$($8( ( (D$ $J0HIII //($*C F &&v...455555sZ   
\''\+.\+70_33_7:_78aa a1 cc!$c!=<ee	e	c                ,   t          |          }|j        | j        k    rt          | j        | _        d | _        |                     t          j        t          j
        | j        j        | j                   |                     t          j                   d S r0   )ra  r\  r_  r   r^  r  r  r   r   r   r   r  r  r#  r   r   )r   r  r  r`  s       r6   r  zContext._server_handle_finished  s     ++ 4#===## *!""M*M		
 	
 	
 	344444r8   	directionr   epochr   r   c                    | j                             |          }|t          j        k    r|| _        n|| _        |                     ||| j         j        |           d S r0   )r  rw  r   r   r  r  r  r  )r   re  rf  r   keys        r6   r-  z!Context._setup_traffic_protection  si     --e44	)))DMMDM""ud/<c	
 	
 	
 	
 	
r8   r  r   c                x    | j         r+| j                             d| j        j        |j                   || _        d S )NzTLS %s -> %s)r  r"  r  r  )r   r  s     r6   r#  zContext._set_state  s8    = 	MM
LLL


r8   )NNNNNNNNNFNT)r  r@   r   r  r  r   r  r  r  r  r  r  r  r  r  r!  r;  r  r  r!  r  r@   r  r  r  r@   )rA   r  )rA   r   r  )r  r   r  r  rA   r!  )r3  r+  r  r  rA   r  )r  r   rA   r!  )r  r   r  r   rA   r!  )r  r   rA   r!  )
r  r   rV  r   rW  r   rX  r   rA   r!  )re  r   rf  r   r   r   rA   r!  )r  r   rA   r!  )rg   rh   ri   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r
  r  r-  r#  r   r8   r6   r  r     s        ,0#!!26@D%)"&"&,1)- $v: v: v: v: v:p & & & X& , , , X, % % % X%N# N# N# N#`
 
 
 
4r: r: r: r:hCB CB CB CBJT T T T(#@ #@ #@ #@JP P P P
56 56 56 56n_5 _5 _5 _5B/ / / /U6 U6 U6 U6n5 5 5 5&
 
 
 
     r8   r  )T)r?   r@   rA   rB   )r   r   r   r   r4   r   rA   r   )r5   r   r   r   r   r   r   r   r4   r   rA   r   )r5   r   r   r   r   r   rA   r   r0   )r   r   r   r   rA   r   )r   r   rA   r   )r  r  rA   r@   )NNN)r  r   r  r  r  r  rA   r  )NNNNNTN)r9  r  r:  r   r  r   r  r  r  r  r;  r  r<  r@   r=  r   rA   r!  )r  r   r  r   rA   r   )r  r   r  r   r  r  rA   r  )
r  r   r  r   r  r  r  r  rA   r!  )r  r   r  r   rA   r   )r  r   r  r   r  r   rA   r!  )r  r   r  r   rA   r   )r  r   rA   r  )r  r   r  r  rA   r!  )r  r   rA   r  )r  r   r  r  rA   r!  )r  r   rA   r  )r  r   r  r  rA   r!  )r  r   rA   r   )r  r   r  r   rA   r!  )r  r   rA   r  )r  r   r  r  rA   r!  )r  r   rA   r  )r  r   r  r  rA   r!  )r  r   rA   r+  )r  r   r3  r+  rA   r!  )r  r   rA   r8  )r  r   r<  r8  rA   r!  )r  r   rA   r,   )r  r   rA   rD  )r  r   r9  r,   rA   r!  )r  r   rA   rS  )r  r   rN  rS  rA   r!  )r  r   rA   r[  )r  r   r`  r[  rA   r!  )r  r[  rA   r   )NN)
r  r  r  r  rX  r  r  r  rA   r.   )r  r   rA   r  )r  r  r  r   rA   r   )
__future__r   rE   r0  r2   loggingr  rer   r   binasciir   
contextlibr   dataclassesr   r   enumr   	functoolsr	   r
   hmacr   typingr   r   r   r   r   r   r   _hazmatr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r  compiler  r  r  r  r.   rC  rK   rM   	Exceptionr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r8  rY  r[  rb  re  rz  r  r  r  r  r  r  r  r  r  r  r   r   r  r  r  r  r  r  r  r  r  r  	Extensionr  r  r  r  r  r&  r)  r+  r4  r6  r8  r=  r@  rF  rD  rI  rM  rQ  rS  rW  rY  r[  ra  rc  re  r  r\  r]  r^  r  r  r  r  r  r  r  r  r  r  rn  r   rg  r  r  r  r  r  AlpnHandlerSessionTicketFetcherSessionTicketHandlerr  r   r8   r6   <module>r{     s   " " " " " " "     				 				 



        % % % % % % ( ( ( ( ( ( ( (       ( ( ( ( ( ( ( (       O O O O O O O O O O O O O O O O O O                                                   4      &2:&@AA  GCLL   8 8 8 8 8
" " " " "w " " "<" " " " "I " " "3 3 3 3 3% 3 3 37 7 7 7 7e 7 7 71 1 1 1 1 1 1 15 5 5 5 5E 5 5 55 5 5 5 5E 5 5 52 2 2 2 2 2 2 24 4 4 4 45 4 4 46 6 6 6 6U 6 6 6       
    G       G   ** ** ** ** ** ** ** **Z          +/!9 !9 !9 !9 !9H   *    261 61 61 61 61v $("#"&X/ X/ X/ X/ X/v    '              G   $    G       G          
       2        $	 	 	 	   & & & &        c5j!   " " " "/ / / /2 2 2 2 E3J- - - -   
           #u*	        
 D D D D D D D D(= = = =@G G G GT 
L 
L 
L 
L 
L 
L 
L 
L   @4 4 4 4: L L L L L L L L   24 4 4 4$ L L L L L L L L   24 4 4 4, &  G G G G G G G G
 L L L L L L L L   &   0
 
 
 
        
G G G G. . . .           . . . .
6 6 6 6 6 6 6 6r               " "C"C(# -{-{-{'''*K*K*K
K  
 
 
 
' ' ' ' 	    $    E E E E 0 0 0 0 0 0 0 06 ud{#-)@ @A  56 F F F F F F F F F Fr8   