
    Gfz*                    
   U 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	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mZmZmZmZ d dlZd dlZd dlmZ d dl m!Z! d d	l"m#Z# d d
l$m%Z%m&Z&m'Z' d dl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 d dl1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7m8Z8 d dl9m:Z: ddl;m<Z<m=Z= dZ>dZ?dZ@dZAdZBdZCdZD ed      ZEde j                   fdZF G d de      ZG G d deH      ZI G d  d!eI      ZJ G d" d#eI      ZK G d$ d%eI      ZL G d& d'eI      ZM G d( d)eI      ZN G d* d+eI      ZO G d, d-eI      ZP G d. d/eI      ZQ G d0 d1eI      ZR G d2 d3e      ZS G d4 d5e      ZT G d6 d7e      ZUd8eVd9eVd:eWdeVfd;ZXd<e%j                  d=eVd8eVd9eVd:eWdeVfd>ZZd<e%j                  d?eVd@eVdeVfdAZ[	 ddBeVdCeeV   de3fdDZ\dBeVdeej                     fdEZ^g ddddfdFej                  dGeej                     dHee_   dIeeV   dJee_   dKee_   ddfdLZ` G dM dNe      Za G dO dPe      Zb G dQ dRe      Zc G dS dTe      Zd G dU dVe      Ze G dW dXe      Zf G dY dZe      Zg G d[ d\e      Zhed]e<d^eWdefd_       Zied]e<d^eWdefd`       Zj G da dbeH      Zkd]e<d^eWdceg eEf   deeE   fddZld]e<d^eWdceeEgdf   deeeE   ddf
dfZmd]e<d^eWdeVfdgZnd]e<d^eWdheVddfdiZoed]e<djeWdefdk       Zpd]e<de_fdlZqd]e<dHe_ddfdmZreeWeVf   Zsd]e<desfdnZtd]e<dhesddfdoZud]e<de_fdpZvd]e<dqe_ddfdrZweeVeWf   Zxe	 G ds dt             Zyd]e<dexfduZzd]e<dvexddfdwZ{d]e<deVfdxZ|d]e<dyeVddfdzZ}d]e<deyfd{Z~d]e<d|eyddfd}ZeeWeVf   Ze	 G d~ d             Zd]e<deeddfdZd]e<defdZd]e<deddfdZe	 G d d             Zd]e<defdZd]e<deddfdZe	 G d d             Zd]e<defdZd]e<deddfdZe	 G d d             Zd]e<defdZd]e<deddfdZeeVeVf   Ze	 G d d             Z]d]e<de]fdZd]e<dFe]ddfdZe	 G d d             Zd]e<defdZd]e<deddfdZe	 G d d             Zd]e<defdZd]e<deddfdZe	 G d d             Zd]e<defdZd]e<deddfdZ G d d      Z G d d      Zeaj8                  e%j:                  eaj<                  e%j>                  eaj@                  e%j:                  iZeed<   ehjF                  de%j:                  fehjH                  de%j>                  fehjJ                  de%jL                  fehjN                  e-jP                  e%jR                  fehjT                  e-jP                  e%j:                  fehjV                  e-jP                  e%j>                  fehjX                  e-jP                  e%jL                  fehjZ                  e-j\                  e%j:                  fehj^                  e-j\                  e%j>                  fehj`                  e-j\                  e%jL                  fi
Zeed<   edjd                  e*jd                  edjf                  e*jf                  edjh                  e*jh                  iZeed<    ed ejo                         D              Zdeade%j                  fdZdesdee*jt                  e0jv                  e/jx                  df   fdZdee*jt                  e0jv                  e/jx                  f   desfdZ	 ddeeE   deee      deeI   deEfdZdeWdefdZedeeef   d]e<defd       Ze	 G d d             Zee_gdf   ZeeVgee   f   Zeegdf   Z G d d      Zy)    N)contextmanager)	dataclassfield)EnumIntEnum)partial)AnyCallableDict	GeneratorListOptionalSequenceTupleTypeVarUnioncast)x509)InvalidSignature)default_backend)hasheshmacserialization)dsaeced448ed25519paddingrsax448x25519)CertificateIssuerPublicKeyTypesPrivateKeyTypes)
HKDFExpand)EncodingPublicFormat)crypto   )BufferBufferReadErrori  i  i  i  i  s!   TLS 1.3, client CertificateVerifys!   TLS 1.3, server CertificateVerifyTreturnc                  p    t         j                   j                  t         j                  j                        S N)datetimenowtimezoneutc     K/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/aioquic/tls.pyutcnowr6   @   s%      !2!2!6!677r4   c                   x    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y)AlertDescriptionr   
         (   *   +   ,   -   .   /   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_protocolr3   r4   r5   r8   r8   D   s    LNOO JMLMNM&)#!r4   r8   c                       e Zd ZU eed<   y)AlertdescriptionN)rS   rT   rU   r8   __annotations__r3   r4   r5   rr   rr   b   s    !!r4   rr   c                   $    e Zd Zej                  Zy)AlertBadCertificateN)rS   rT   rU   r8   r[   rs   r3   r4   r5   rv   rv   f   s    "22Kr4   rv   c                   $    e Zd Zej                  Zy)AlertCertificateExpiredN)rS   rT   rU   r8   r^   rs   r3   r4   r5   rx   rx   j   s    "66Kr4   rx   c                   $    e Zd Zej                  Zy)AlertDecodeErrorN)rS   rT   rU   r8   rc   rs   r3   r4   r5   rz   rz   n   s    "//Kr4   rz   c                   $    e Zd Zej                  Zy)AlertDecryptErrorN)rS   rT   rU   r8   rd   rs   r3   r4   r5   r|   r|   r   s    "00Kr4   r|   c                   $    e Zd Zej                  Zy)AlertHandshakeFailureN)rS   rT   rU   r8   rZ   rs   r3   r4   r5   r~   r~   v       "44Kr4   r~   c                   $    e Zd Zej                  Zy)AlertIllegalParameterN)rS   rT   rU   r8   r`   rs   r3   r4   r5   r   r   z   r   r4   r   c                   $    e Zd Zej                  Zy)AlertInternalErrorN)rS   rT   rU   r8   rg   rs   r3   r4   r5   r   r   ~   s    "11Kr4   r   c                   $    e Zd Zej                  Zy)AlertProtocolVersionN)rS   rT   rU   r8   re   rs   r3   r4   r5   r   r      s    "33Kr4   r   c                   $    e Zd Zej                  Zy)AlertUnexpectedMessageN)rS   rT   rU   r8   rW   rs   r3   r4   r5   r   r      s    "55Kr4   r   c                       e Zd ZdZdZy)	Directionr   r(   N)rS   rT   rU   DECRYPTENCRYPTr3   r4   r5   r   r      s    GGr4   r   c                       e Zd ZdZdZdZdZy)Epochr   r(         N)rS   rT   rU   INITIALZERO_RTT	HANDSHAKEONE_RTTr3   r4   r5   r   r      s    GHIGr4   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ZdZy)Stater   r(   r   r                  	   r9         N)rS   rT   rU   CLIENT_HANDSHAKE_STARTCLIENT_EXPECT_SERVER_HELLO"CLIENT_EXPECT_ENCRYPTED_EXTENSIONS0CLIENT_EXPECT_CERTIFICATE_REQUEST_OR_CERTIFICATECLIENT_EXPECT_CERTIFICATE CLIENT_EXPECT_CERTIFICATE_VERIFYCLIENT_EXPECT_FINISHEDCLIENT_POST_HANDSHAKESERVER_EXPECT_CLIENT_HELLOSERVER_EXPECT_CERTIFICATE SERVER_EXPECT_CERTIFICATE_VERIFYSERVER_EXPECT_FINISHEDSERVER_POST_HANDSHAKEr3   r4   r5   r   r      sP    !")*&784 !'($!" !')$r4   r   label
hash_valuelengthc                     d| z   }t        j                  d|t        |            |z   t        j                  dt        |            z   |z   S )Ns   tls13 z!HBz!B)structpacklen)r   r   r   
full_labels       r5   
hkdf_labelr      sN    U"JE63z?3
	
++dC
O
,	- 	r4   	algorithmsecretc           	      R    t        | |t        |||            j                  |      S )N)r   r   info)r$   r   deriver   r   r   r   r   s        r5   hkdf_expand_labelr      s.     z62 fVn	r4   saltkey_materialc                 p    t        j                  ||       }|j                  |       |j                         S r.   )r   HMACupdatefinalize)r   r   r   hs       r5   hkdf_extractr      s,     			$	"AHH\::<r4   datapasswordc                 0    t        j                  | |      S )z)
    Load a PEM-encoded private key.
    )r   )r   load_pem_private_key)r   r   s     r5   r   r      s     --dXFFr4   c                     d}g }| j                  |      D ],  }|s|j                  t        j                  ||z                . |S )z8
    Load a chain of PEM-encoded X509 certificates.
    s   -----END CERTIFICATE-----
)splitappendr   load_pem_x509_certificate)r   boundarycertificateschunks       r5   load_pem_x509_certificatesr      sQ     .HLH% R > >ux?O PQR r4   certificatechainserver_namecadatacafilecapathc           
      *   t               }|| j                  k  rt        d      || j                  kD  rt        d      |\	 t	        j
                  |       d}	 |r!t        j                  j                  | |       n t        j                  j                  | |       t%        j&                         }|'|%|#|j)                  t+        j,                                |>t/        |      D ]0  }|j1                  t$        j2                  j5                  |             2 |||j)                  ||       t%        j6                  |t$        j2                  j5                  |       |D cg c]!  }t$        j2                  j5                  |      # c}      }	 |j9                          y # t        $ r d}Y Vw xY w# t        j                  t        j                  f$ r}t        j                  j                  |       }	t        |	      dk(  rt        |      }
n:t        |	      dk(  rd|d|	d   }
n d	j!                  d
 |	D              }d|d| }
t#        |
      |d }~ww xY wc c}w # t$        j:                  $ r}t#        |j<                  d         d }~ww xY w)NzCertificate is not valid yetzCertificate is no longer validTFr   r(   z	hostname z doesn't match z, c              3   2   K   | ]  }t        |        y wr.   )repr).0patterns     r5   	<genexpr>z%verify_certificate.<locals>.<genexpr>  s     )PG$w-)Ps   z doesn't match either of )r6   not_valid_before_utcrx   not_valid_after_utc	ipaddress
ip_address
ValueErrorservice_identitycryptographyverify_certificate_ip_addressverify_certificate_hostnameCertificateErrorVerificationErrorextract_patternsr   strjoinrv   r'   	X509Storeload_locationscertifiwherer   add_certX509from_cryptographyX509StoreContextverify_certificateX509StoreContextErrorargs)r   r   r   r   r   r   r0   is_ipexcpatternserrmsgpatterns_reprstorecert	store_ctxs                  r5   r   r      sq    (C
[---%&DEE
[,,,%&FGG 	  - E	7 --KK !--II. E~&.V^W]]_-.v6 	@DNN6;;88>?	@ V/VV, ''%%k29>?	&	&t	,?I
/$$&m  	E	  --..
 	7 (44EEkRH8}!SX!#$[O?8A;/R $		)Px)P P /!!.1 
 &f-36!	7H 	@ '' /!#((1+../sJ   F! AF3 "&II" !F0/F03#IA?II"J5JJc                       e Zd ZdZdZdZdZy)CipherSuitei  i  i     N)rS   rT   rU   AES_128_GCM_SHA256AES_256_GCM_SHA384CHACHA20_POLY1305_SHA256EMPTY_RENEGOTIATION_INFO_SCSVr3   r4   r5   r   r   *  s    %$*!r4   r   c                       e Zd ZdZy)CompressionMethodr   N)rS   rT   rU   NULLr3   r4   r5   r  r  1  s    Dr4   r  c                   H    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y)ExtensionTyper   r   r9            )   r=   r>   r?   r@   rF   9   i  i  N)rS   rT   rU   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QUIC_TRANSPORT_PARAMETERS_DRAFTENCRYPTED_SERVER_NAMEr3   r4   r5   r  r  5  sU    KNDNJFI &&,#!r4   r  c                   $    e Zd ZdZdZdZdZdZdZy)Group               i  N)	rS   rT   rU   	SECP256R1	SECP384R1	SECP521R1X25519X448GREASEr3   r4   r5   r  r  G  s     IIIFDFr4   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Zy)HandshakeTyper(   r   r   r   r   r   r     r:   r  r      N)rS   rT   rU   CLIENT_HELLOSERVER_HELLONEW_SESSION_TICKETEND_OF_EARLY_DATAENCRYPTED_EXTENSIONSCERTIFICATECERTIFICATE_REQUESTCERTIFICATE_VERIFYFINISHED
KEY_UPDATECOMPRESSED_CERTIFICATEMESSAGE_HASHr3   r4   r5   r*  r*  P  sD    LLKHJLr4   r*  c                       e Zd ZdZy)NameTyper   N)rS   rT   rU   	HOST_NAMEr3   r4   r5   r:  r:  _  s    Ir4   r:  c                       e Zd ZdZdZy)PskKeyExchangeModer   r(   N)rS   rT   rU   PSK_KE
PSK_DHE_KEr3   r4   r5   r=  r=  c  s    FJr4   r=  c                   P    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y)SignatureAlgorithmi  i  i  i  i  i  i  i  i	  i
  i  i  i  i  i  i  i  N)rS   rT   rU   ECDSA_SECP256R1_SHA256ECDSA_SECP384R1_SHA384ECDSA_SECP521R1_SHA512ED25519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_SHA1r3   r4   r5   rA  rA  h  se    ###GE    NHJr4   rA  bufcapacityc              #      K   t         j                  | j                  |      d      }| j                         |z   }| | j                         |k7  rt	        d      y w)Nbig	byteorderz!extra bytes at the end of a block)int
from_bytes
pull_bytestellrz   )rS  rT  r   ends       r5   
pull_blockr^    sU     ^^CNN84^FF
((*v
C
L
xxzSBCC s   AAc              #     K   | j                         |z   }| j                  |       d | j                         }||z
  }| j                  ||z
         | j                  |j                  |d             | j                  |       yw)zi
    Context manager to push a variable-length block, with `capacity` bytes
    to write the length.
    NrV  rW  )r\  seek
push_bytesto_bytes)rS  rT  startr]  r   s        r5   
push_blockrd    so      HHJ!EHHUO	
((*C5[FHHUXNN6??8u?=>HHSMs   BBc                       e Zd ZdZy)SkipItemzDThere is nothing to append for this invocation of a pull_list() funcN)rS   rT   rU   __doc__r3   r4   r5   rf  rf    s    Jr4   rf  funcc                    g }t        | |      5 }| j                         |z   }| j                         |k  r+	 |j                   |              | j                         |k  r+ddd       |S # t        $ r Y )w xY w# 1 sw Y   |S xY w)z
    Pull a list of items.

    If the callable raises SkipItem, then iteration continues but nothing
    is added to the list.
    N)r^  r\  r   rf  )rS  rT  rh  itemsr   r]  s         r5   	pull_listrk    s     E	C	" fhhj6!hhj3TV$ hhj3 L   Ls.   'A:A+A:+	A74A:6A77A::Bvaluesc                 f    t        | |      5  |D ]
  } ||        	 ddd       y# 1 sw Y   yxY w)z
    Push a list of items.
    N)rd  )rS  rT  rh  rl  values        r5   	push_listro    s9     
C	"  	EK	  s   '0c                 h    t        | |      5 }| j                  |      cddd       S # 1 sw Y   yxY w)z4
    Pull an opaque value prefixed by a length.
    N)r^  r[  )rS  rT  r   s      r5   pull_opaquerq    s1     
C	" &f~~f%& & &s   (1rn  c                 h    t        | |      5  | j                  |       ddd       y# 1 sw Y   yxY w)z2
    Push an opaque value prefix by a length.
    N)rd  ra  )rS  rT  rn  s      r5   push_opaquers    s/     
C	" u  s   (1extension_typec              #   x   K   | j                  |       t        | d      5  d  d d d        y # 1 sw Y   y xY wwNr   )push_uint16rd  )rS  rt  s     r5   push_extensionrx    s3     OON#	C	   s   :.	:7:c                     t        | d      5  | j                         }|t        j                  k7  rt	        d|       t        | d      j                  d      cd d d        S # 1 sw Y   y xY w)Nr   z$ServerName has an unknown name type ascii)r^  
pull_uint8r:  r;  r   rq  decode)rS  	name_types     r5   pull_server_namer~    si    	C	 3NN$	***'6ykB  3"))'23 3 3s   AA##A,c                     t        | d      5  | j                  t        j                         t	        | d|j                  d             d d d        y # 1 sw Y   y xY w)Nr   rz  )rd  
push_uint8r:  r;  rs  encode)rS  r   s     r5   push_server_namer    sJ    	C	 9x))*CK..w789 9 9s   <AAc                 B    | j                         }t        | d      }||fS rv  )pull_uint16rq  )rS  groupr   s      r5   pull_key_sharer    s$    OOEsAD4=r4   c                 L    | j                  |d          t        | d|d          y )Nr   r   r(   )rw  rs  )rS  rn  s     r5   push_key_sharer    s"    OOE!HQa!r4   c                 `    	 t        | d      j                  d      S # t        $ r t        w xY wNr(   rz  )rq  r|  UnicodeDecodeErrorrf  rS  s    r5   pull_alpn_protocolr    s5    3"))'22  	s    -protocolc                 <    t        | d|j                  d             y r  )rs  r  )rS  r  s     r5   push_alpn_protocolr    s    Q01r4   c                   .    e Zd ZU ee   ed<   ee   ed<   y)OfferedPsks
identitiesbindersN)rS   rT   rU   r   PskIdentityrt   bytesr3   r4   r5   r  r    s    [!!%[r4   r  c                 B    t        | d      }| j                         }||fS rv  )rq  pull_uint32)rS  identityobfuscated_ticket_ages      r5   pull_psk_identityr    s'    3"HOO-+,,r4   entryc                 L    t        | d|d          | j                  |d          y )Nr   r   r(   )rs  push_uint32rS  r  s     r5   push_psk_identityr    s"    Qa!OOE!Hr4   c                     t        | d      S Nr(   rq  r  s    r5   pull_psk_binderr  "  s    sAr4   binderc                     t        | d|       y r  rs  )rS  r  s     r5   push_psk_binderr  &  s    Qr4   c                     t        t        | dt        t        |             t        | dt        t        |                   S )Nr   r  r  )r  rk  r   r  r  r  s    r5   pull_offered_psksr  *  s6    S!W->%DE#q'/3"?@ r4   pre_shared_keyc                     t        | dt        t        |       |j                         t        | dt        t        |       |j
                         y rv  )ro  r   r  r  r  r  )rS  r  s     r5   push_offered_psksr  1  sG    	!3'!!	 	%	r4   c                   6   e Zd ZU eed<   eed<   ee   ed<   ee   ed<   dZeee	      ed<   dZ
eed<   dZeee      ed	<   dZee   ed
<   dZeee      ed<   dZee	   ed<   dZeee      ed<   dZeee      ed<   dZeee      ed<    ee      Zee   ed<   y)ClientHellorandomlegacy_session_idcipher_suiteslegacy_compression_methodsNalpn_protocolsF
early_data	key_sharer  psk_key_exchange_modesr   signature_algorithmssupported_groupssupported_versionsdefault_factoryother_extensions)rS   rT   rU   r  rt   r   rY  r  r   r   r  boolr  KeyShareEntryr  r  r  r   r  r  r  r   listr  	Extensionr3   r4   r5   r  r  E  s    M9 $S	) +/NHT#Y'.J/3Ix]+,3,0NH[)026HT#Y/6!%K#%04(49-4,0htCy)0.2c+2(-d(Cd9oCr4   r  expected_typec                 2    | j                         }||k(  sJ y)zr
    Pull the message type and assert it is the expected one.

    If it is not, we have a programming error.
    N)r{  )rS  r  message_types      r5   pull_handshake_typer  Z  s     >>#L=(((r4   c                     t         t        j                         t         d      5   j	                         t
        k7  rt        d      t         j                  d      t         d      t         d j                        t         d j                              dd	 fd}t         d|       d d d        S # 1 sw Y   S xY w)
Nr   zClientHello version is not 1.2    r(   r   )r  r  r  r  Fc                     rt        d      j                         } j                         }| t        j                  k(  r!t	        dt        t                    _        y | t        j                  k(  rt	        dj                        _	        y | t        j                  k(  rt	        dj                        _        y | t        j                  k(  rt	        dj                        _        y | t        j                  k(  rt	        dj                        _        y | t        j"                  k(  rt%              _        y | t        j(                  k(  r!t	        dt        t*                    _        y | t        j.                  k(  rd_        y | t        j2                  k(  rt5              _        dy j8                  j;                  | j=                  |      f       y )Nz&PreSharedKey is not the last extensionr   r(   T)r   r  r  r  rk  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[  )rt  extension_length	after_pskrS  hellos     r5   pull_extensionz)pull_client_hello.<locals>.pull_extensiont  s    +,TUU __.N"0!8!88"+CGNC4P"Q=#C#CC+4S!S__+M(=#E#EE-6sAs-O*=#A#AA)233??)K&=#G#GG/8a/P,=#<#<<$4S$9!=#5#55'0G$6<($  =#;#;;#' =#?#??'8'=$ 	&&--#S^^4D%EFr4   r,   N)r  r*  r-  r^  r  TLS_VERSION_1_2rz   r  r[  rq  rk  r{  )rS  r  r  r  s   ` @@r5   pull_client_hellor  d  s    ]778	C	 1*??/"#CDD>>"%)#q1#CCOO<'0a'H	
 	!	F 	#q.)c1*f Lg1*f Ls   BC  C
r  c                 @   | j                  t        j                         t        | d      5  | j	                  t
               | j                  |j                         t        | d|j                         t        | d| j                  |j                         t        | d| j                   |j                         t        | d      5  t        | t        j                        5  t        | dt!        t"        |       |j$                         d d d        t        | t        j&                        5  t        | d| j                  |j(                         d d d        t        | t        j*                        5  t        | d| j                  |j,                         d d d        t        | t        j.                        5  t        | d| j                  |j0                         d d d        |j2                  Et        | t        j4                        5  t        | d| j                   |j2                         d d d        |j6                  9t        | t        j8                        5  t;        | |j6                         d d d        |j<                  It        | t        j>                        5  t        | dt!        t@        |       |j<                         d d d        |jB                  D ]+  \  }}t        | |      5  | j                  |       d d d        - |jD                  r$t        | t        jF                        5  	 d d d        |jH                  9t        | t        jJ                        5  tM        | |jH                         d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   LxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   `xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY wNr   r(   r   )'r  r*  r-  rd  rw  r  ra  r  rs  r  ro  r  r  rx  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  rS  r  rt  extension_values       r5   push_client_hellor    sw   NN=--.	C	 .A(u||$CE334#q#//5+>+>?#q#..%*J*JK Q &	A]%<%<= Q#q'.#">PQ  ]%E%EF M#q#//53K3KLM  ]%G%GH O#q#//53M3MNO  ]%C%CD K#q#//53I3IJK ++7#C)M)MN Tc1cnne6R6RST   ,#C)B)BC =$S%*;*;<= ##/#C););< Q(:C @%BVBV
 493I3I 4/#C8 4NN?34 44 #C)A)AB  ##/#C)E)EF A%c5+?+?@AK&	A.A .AQ QM MO OK KT T= = 4 4 
A AK&	A &	A.A .As  BPP'N"P(#N"P-#N""P2#N/.P#N<&.PO	+.P'O &P&O#	80P(O0*.PO</P7PNPNP"N,'P/N94P<OP	OPO P#O-(P0O95P<PPP	PPc                       e Zd ZU eed<   eed<   eed<   eed<   dZee   ed<   dZ	ee   ed<   dZ
ee   ed<    ee	      Zeeeef      ed
<   y)ServerHellor  r  cipher_suitecompression_methodNr  r  supported_versionr  r  )rS   rT   rU   r  rt   rY  r  r   r  r  r  r   r  r  r   r   r3   r4   r5   r  r    se    M *.Ix&-$(NHSM('+x}+05d0Kd5e,-Kr4   r  c                 v    t         t        j                         t         d      5   j	                         t
        k7  rt        d      t         j                  d      t         d       j	                          j                               d fd}t         d|       d d d        S # 1 sw Y   S xY w)	Nr   zServerHello version is not 1.2r  r(   )r  r  r  r  c                     j                         } j                         }| t        j                  k(  rj                         _        y | t        j                  k(  rt              _        y | t        j                  k(  rj                         _        y j                  j                  | j                  |      f       y r.   )r  r  r  r  r  r  r  r  r  r  r   r[  )rt  r  rS  r  s     r5   r  z)pull_server_hello.<locals>.pull_extension  s     __.N"0!A!AA*-//*;'=#:#::"0"5=#?#??'*'8$&&--#S^^4D%EFr4   r   r  )r  r*  r.  r^  r  r  rz   r  r[  rq  r{  rk  )rS  r  r  s   ` @r5   pull_server_hellor    s    ]778	C	 *??/"#CDD>>"%)#q1*"~~/	
	 	#q.)5*8 L9*8 Ls   A;B..B8c           	      H   | j                  t        j                         t        | d      5  | j	                  t
               | j                  |j                         t        | d|j                         | j	                  |j                         | j                  |j                         t        | d      5  |j                  >t        | t        j                        5  | j	                  |j                         d d d        |j                   9t        | t        j"                        5  t%        | |j                          d d d        |j&                  >t        | t        j(                        5  | j	                  |j&                         d d d        |j*                  D ]+  \  }}t        | |      5  | j                  |       d d d        - 	 d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   mxY w# 1 sw Y   mxY w# 1 sw Y   BxY w# 1 sw Y   y xY wr  )r  r*  r.  rd  rw  r  ra  r  rs  r  r  r  r  rx  r  r  r  r  r  r  r  r  r  s       r5   push_server_hellor    s   NN=--.	C	 4(u||$CE334**+u//0 Q 	4&&2#C)I)IJ =OOE$;$;<= *#C)@)@A 9"389 ##/#C)E)EF :OOE$8$89: 493I3I 4/#C8 4NN?34 44	44 4= =9 9: :4 4	4 	44 4s   B
H6'HG9.H'G(>.H,G4&H.H 	 
HHG%!H(G1-H4G=9H H	HH	HH!c                       e Zd ZU dZeed<   dZeed<   dZeed<   dZ	eed<   dZ
ee   ed<    ee	      Zeeeef      ed
<   y)NewSessionTicketr   ticket_lifetimeticket_age_addr4   ticket_nonceticketNmax_early_data_sizer  r  )rS   rT   rU   r  rY  rt   r  r  r  r  r  r   r   r  r  r   r   r3   r4   r5   r  r    sY    OSNCL%FE *.#-05d0Kd5e,-Kr4   r  c                 V    t               t         t        j                         t	         d      5   j                         _         j                         _        t         d      _	        t         d      _
        d fd}t         d|       d d d        S # 1 sw Y   S xY w)Nr   r(   r   c                      j                         } j                         }| t        j                  k(  rj                         _        y j
                  j                  | j                  |      f       y r.   )r  r  r  r  r  r  r   r[  )rt  r  rS  new_session_tickets     r5   r  z/pull_new_session_ticket.<locals>.pull_extension1  s`     __.N"0!9!999<9J"6"33::#S^^4D%EFr4   r  )r  r  r*  r/  r^  r  r  r  rq  r  r  rk  )rS  r  r  s   ` @r5   pull_new_session_ticketr  '  s    )+]==>	C	 *-0__->*,/OO,=)*5c1*='$/Q$7!	 	#q.)!*$ %*$ s   A!BB(r  c           	         | j                  t        j                         t        | d      5  | j	                  |j
                         | j	                  |j                         t        | d|j                         t        | d|j                         t        | d      5  |j                  >t        | t        j                        5  | j	                  |j                         d d d        |j                  D ]+  \  }}t        | |      5  | j                  |       d d d        - 	 d d d        d d d        y # 1 sw Y   UxY w# 1 sw Y   UxY w# 1 sw Y   *xY w# 1 sw Y   y xY wr  )r  r*  r/  rd  r  r  r  rs  r  r  r  rx  r  r  r  ra  )rS  r  rt  r  s       r5   push_new_session_ticketr  @  s8   NN=334	C	 4*::;*99:C.;;<C.556Q 	4!55A#C)A)AB LOO$6$J$JKL 4F3V3V 4/#C8 4NN?34 44	44 4L L4 4	4 	44 4sT   A1E'ED4 &EE 	
E#E4D=9E E	EE	EE!c                   \    e Zd ZU dZee   ed<   dZeed<    e	e
      Zeeeef      ed<   y)EncryptedExtensionsNalpn_protocolFr  r  r  )rS   rT   rU   r  r   r   rt   r  r  r   r  r  r   r   rY  r  r3   r4   r5   r  r  R  s8    #'M8C='J05d0Kd5e,-Kr4   r  c                      t               t         t        j                         t	         d      5  d fd}t         d|       d d d        S # 1 sw Y   S xY w)Nr   c                  B   j                         } j                         }| t        j                  k(  r$t        dt	        t
                    d   _        y | t        j                  k(  rd_        y j                  j                  | j                  |      f       y )Nr   r   T)r  r  r  rk  r   r  r  r  r  r  r   r[  )rt  r  rS  
extensionss     r5   r  z1pull_encrypted_extensions.<locals>.pull_extension`  s     __.N"0!3!33+4G$6<,,
(  =#;#;;(,
%++22#S^^4D%EFr4   r   r  )r  r  r*  r1  r^  rk  )rS  r  r  s   ` @r5   pull_encrypted_extensionsr  Z  sX    $&J]??@	C	 *	 	#q.)!*$ %*$ s   AAr  c                    | j                  t        j                         t        | d      5  t        | d      5  |j                  Jt        | t        j                        5  t        | dt        t        |       |j                  g       d d d        |j                  r$t        | t        j                        5  	 d d d        |j                  D ]+  \  }}t        | |      5  | j                  |       d d d        - 	 d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   axY w# 1 sw Y   axY w# 1 sw Y   6xY w# 1 sw Y   y xY wNr   r   )r  r*  r1  rd  r  rx  r  r  ro  r   r  r  r  r  ra  )rS  r  rt  r  s       r5   push_encrypted_extensionsr  s  s,   NN=556	C	 4Q 	4''3#C););<  2C8#112	 $$#C)A)AB  4>3N3N 4/#C8 4NN?34 44	44 4  4 4	4 	44 4sj   D<'D0 (D.D06D8&D0D$	0
D0;D<DD0D!D0$D-)D00D9	5D<<Ec                   >    e Zd ZU dZeed<    ee      Ze	e
   ed<   y)Certificater4   request_contextr  r   N)rS   rT   rU   r  r  rt   r   r  r   r   CertificateEntryr3   r4   r5   r  r    s!     OU +0+FL$'(Fr4   r  c           	         t               }t        | t        j                         t	        | d      5  t        | d      |_        dt        dt        fd}t        | dt        ||             |_        d d d        |S # 1 sw Y   |S xY w)Nr   r(   rS  r,   c                 :    t        | d      }t        | d      }||fS r  r  )rS  r   r  s      r5   pull_certificate_entryz0pull_certificate.<locals>.pull_certificate_entry  s%    sA&D$S!,J*%%r4   )r  r  r*  r2  r^  rq  r  r)   r  rk  r   r   )rS  r   r  s      r5   pull_certificater    s    -K]667	C	 

&1#q&9#	& 	&3C 	&
 $-G2C8$
 

 

 s   >A99Bc           	         | j                  t        j                         t        | d      5  t	        | d|j
                         dt        dt        dd fd}t        | dt        ||       |j                         d d d        y # 1 sw Y   y xY w)Nr   r(   rS  r  r,   c                 D    t        | d|d          t        | d|d          y )Nr   r   r   r(   r  r  s     r5   push_certificate_entryz0push_certificate.<locals>.push_certificate_entry  s"    Qa)Qa)r4   )r  r*  r2  rd  rs  r  r)   r  ro  r   r   )rS  r   r  s      r5   push_certificater    s    NN=,,-	C	 	
CK778	* 	*7G 	*D 	* 	G2C8+:R:R	
	
 	
 	
s   ABB
c                   b    e Zd ZU dZeed<   dZeee	      ed<    e
e      Zeee	ef      ed<   y)CertificateRequestr4   r  Nr  r  r  )rS   rT   rU   r  r  rt   r  r   r   rY  r   r  r  r   r3   r4   r5   r  r    s>     OU 04(49-405d0Kd5e,-Kr4   r  c                      t               t         t        j                         t	         d      5  t         d      _        d fd}t         d|       d d d        S # 1 sw Y   S xY w)Nr   r(   c                      j                         } j                         }| t        j                  k(  rt        dj                         _        y j
                  j                  | j                  |      f       y rv  )r  r  r  rk  r  r  r   r[  )rt  r  rS  certificate_requests     r5   r  z0pull_certificate_request.<locals>.pull_extension  sk     __.N"0!C!CC;DCOO<#8 $44;;#S^^4D%EFr4   r   r  )r  r  r*  r3  r^  rq  r  rk  )rS  r  r  s   ` @r5   pull_certificate_requestr    si    ,.]>>?	C	 *.9#q.A+
	 	#q.)*" #*" s   &A##A-r  c           	      $   | j                  t        j                         t        | d      5  t	        | d|j
                         t        | d      5  t        | t        j                        5  t        | d| j                  |j                         d d d        |j                  D ]+  \  }}t        | |      5  | j                  |       d d d        - 	 d d d        d d d        y # 1 sw Y   UxY w# 1 sw Y   UxY w# 1 sw Y   *xY w# 1 sw Y   y xY wr  )r  r*  r3  rd  rs  r  rx  r  r  ro  rw  r  r  ra  )rS  r  rt  r  s       r5   push_certificate_requestr
    s     NN=445	C	 4C/??@Q 	4]%G%GH COO-@-U-U
 4G3W3W 4/#C8 4NN?34 44	44 4 4 4	4 	44 4sS   $DC:+#C"&C:4C.	
C:D"C+'C:.C73C::D	?DDc                   "    e Zd ZU eed<   eed<   y)CertificateVerifyr   	signatureN)rS   rT   rU   rY  rt   r  r3   r4   r5   r  r    s    Nr4   r  c                     t        | t        j                         t        | d      5  | j	                         }t        | d      }d d d        t              S # 1 sw Y   xY w)Nr   r   r   r  )r  r*  r4  r^  r  rq  r  )rS  r   r  s      r5   pull_certificate_verifyr    sX    ]==>	C	 (OO%	Q'	( yIFF	( (s   AA"verifyc                     | j                  t        j                         t        | d      5  | j	                  |j
                         t        | d|j                         d d d        y # 1 sw Y   y xY wr  )r  r*  r4  rd  rw  r   rs  r  )rS  r  s     r5   push_certificate_verifyr    sW    NN=334	C	 .(()CF,,-. . .s   3A((A1c                       e Zd ZU dZeed<   y)Finishedr4   verify_dataN)rS   rT   rU   r  r  rt   r3   r4   r5   r  r    s    Kr4   r  c                 p    t               }t        | t        j                         t	        | d      |_        |S Nr   )r  r  r*  r5  rq  r  rS  finisheds     r5   pull_finishedr    s-    zH]334&sA.HOr4   r  c                 p    | j                  t        j                         t        | d|j                         y r  )r  r*  r5  rs  r  r  s     r5   push_finishedr    s&    NN=))*Q,,-r4   c                   p    e Zd ZdefdZdedefdZdedefdZdedefd	Zdde	e   dd
fdZ
dedd
fdZy
)KeyScheduler  c                 *   t        |      | _        || _        d| _        t	        j
                  | j                        | _        | j                  j                         j                         | _	        t        | j                  j                        | _        y )Nr   )cipher_suite_hashr   r  
generationr   Hashhashcopyr   hash_empty_valuer  digest_sizer   selfr  s     r5   __init__zKeySchedule.__init__  sc    *<8(KK/	 $		 0 9 9 ;DNN667r4   context_stringr,   c                 d    d|z   dz   | j                   j                         j                         z   S )Ns@                                                                       )r$  r%  r   )r)  r+  s     r5   certificate_verify_dataz#KeySchedule.certificate_verify_data  s+    >)G3diinn6F6O6O6QQQr4   r   c                 .   t        | j                  |dd| j                  j                        }t        j                  || j                        }|j                  | j                  j                         j                                |j                         S )Ns   finishedr4   r   )r   )	r   r   r'  r   r   r   r$  r%  r   )r)  r   hmac_keyr   s       r5   finished_verify_dataz KeySchedule.finished_verify_data  sk    $nn>>--
 IIh$..9	!**,-zz|r4   r   c                     t        | j                  | j                  || j                  j	                         j                         | j                  j                        S )Nr   )r   r   r   r$  r%  r   r'  )r)  r   s     r5   derive_secretzKeySchedule.derive_secret)  sD     nn;;yy~~'002>>--
 	
r4   Nr   c                 d   |t        | j                  j                        }| j                  rGt	        | j                  | j
                  d| j                  | j                  j                        | _        | xj                  dz  c_        t        | j                  | j
                  |      | _        y )Ns   derivedr   r(   )r   r   r   )r  r   r'  r"  r   r   r&  r   )r)  r   s     r5   extractzKeySchedule.extract2  s     !;!;<L??+..{{ 00~~11DK 	1"nn4;;\
r4   r   c                 :    | j                   j                  |       y r.   )r$  r   )r)  r   s     r5   update_hashzKeySchedule.update_hashD  s    		r4   r.   )rS   rT   rU   r   r*  r  r.  r1  r3  r   r5  r7  r3   r4   r5   r  r    st    8[ 8Re R R5 U 
5 
U 

HUO 
t 
$ $ r4   r  c                   V    e Zd Zdee   fdZddee   ddfdZdede	fdZ
d	eddfd
Zy)KeyScheduleProxyr  c                 :    t        t        d |            | _        y )Nc                     | t        |       fS r.   )r  )cs    r5   <lambda>z+KeyScheduleProxy.__init__.<locals>.<lambda>J  s    q+a..A r4   )dictmap_KeyScheduleProxy__schedules)r)  r  s     r5   r*  zKeyScheduleProxy.__init__I  s    $A= QRr4   Nr   r,   c                 d    | j                   j                         D ]  }|j                  |        y r.   )r@  rl  r5  )r)  r   ks      r5   r5  zKeyScheduleProxy.extractL  s,    !!((* 	$AIIl#	$r4   r  c                      | j                   |   S r.   )r@  r(  s     r5   selectzKeyScheduleProxy.selectP  s    --r4   r   c                 d    | j                   j                         D ]  }|j                  |        y r.   )r@  rl  r7  )r)  r   rB  s      r5   r7  zKeyScheduleProxy.update_hashS  s,    !!((* 	 AMM$	 r4   r.   )rS   rT   rU   r   r   r*  r   r  r5  r  rD  r7  r3   r4   r5   r9  r9  H  sR    Sd;&7 S$HUO $t $.; .; .   $  r4   r9  CIPHER_SUITESr  GROUP_TO_CURVEc              #   *   K   | ]  \  }}||f  y wr.   r3   )r   rB  vs      r5   r   r   p  s     @Aq!f@s   r  c                     t        |           S r.   )rF  )r  s    r5   r!  r!  s  s    &((r4   r  c                 \   | d   t         j                  k(  r"t        j                  j	                  | d         S | d   t         j
                  k(  r"t        j                  j	                  | d         S | d   t        v r1t        j                  j                  t        | d             | d         S y Nr   r(   )r  r&  r!   X25519PublicKeyfrom_public_bytesr'  r    X448PublicKeyrG  r   EllipticCurvePublicKeyfrom_encoded_point)r  s    r5   decode_public_keyrR  w  s     |u||#%%77	!EE	1	#!!33IaLAA	1	'((;;9Q<(*IaL
 	
 r4   
public_keyc                    t        | t        j                        r>t        j                  | j                  t        j                  t        j                        fS t        | t        j                        r>t        j                  | j                  t        j                  t        j                        fS t        | j                  j                     | j                  t        j                  t        j                         fS r.   )
isinstancer!   rM  r  r&  public_bytesr%   Rawr&   r    rO  r'  CURVE_TO_GROUPcurve	__class__X962UncompressedPoint)rS  s    r5   encode_public_keyr]    s    
 *f445j55hllLDTDTUVV	J 2 2	3

J33HLL,BRBRSTTz''112|/M/MN r4   	supportedofferedr   c                 .    || D ]
  }||v s|c S  ||y r.   r3   )r^  r_  r   r<  s       r5   	negotiatera    s4      	AG|	 	r4   signature_algorithmc                 B   | t         j                  t         j                  fv r
t               S t        |    \  }} |       }|t        j                  |      fS |t        j                  k(  r+ |t        j                  |      |j                        }||fS  |       }||fS )N)mgfsalt_length)rA  rE  rF  tupler  r   ECDSAr   PSSMGF1r'  )rb  padding_clsalgorithm_clsr   padding_objs        r5   signature_algorithm_paramsrm    s    199;M;S;STTw!56I!JKI#%%		#!Y'Y5J5J

 	!! "m	!!r4   key_schedulec              #      K   |j                         }d  | j                  |j                  ||j                                      y wr.   )r\  r7  
data_slice)rn  rS  
hash_starts      r5   push_messagerr    s5      J	S^^J
CDs   AAc                       e Zd ZU dZeed<   eed<   ej                  ed<   ej                  ed<   eed<   e	ed<   eed<   d	Z
ee   ed
<    ee      Zeeeef      ed<   edefd       Zedefd       Zy	)SessionTicketz6
    A TLS session ticket for session resumption.
    age_addr  not_valid_afternot_valid_beforeresumption_secretr   r  Nr  r  r  r,   c                 V    t               }|| j                  k\  xr || j                  k  S r.   )r6   rw  rv  )r)  r0   s     r5   is_validzSessionTicket.is_valid  s*    hd+++Kt7K7K0KKr4   c                     t        t               | j                  z
  j                         dz        }|| j                  z   dz  S )Ni  l        )rY  r6   rw  total_secondsru  )r)  ages     r5   obfuscated_agezSessionTicket.obfuscated_age  s;    68d333BBDtKLdll"w//r4   )rS   rT   rU   rg  rY  rt   r   r/   r  r   r  r   r   r  r  r   r   propertyr  rz  r~  r3   r4   r5   rt  rt    s     L&&&'''M)-#-05d0Kd5e,-KL$ L L 0 0 0r4   rt  c                   z   e Zd Z	 	 	 	 	 	 	 	 	 d3dedeee      dee   dee   dee   deee      dee	e
j                  e
j                  f      d	ee   d
ee   dee   fdZedefd       Zdedeeef   ddfdZdededeeef   ddfdZdedee   defdZdeddfdZdeddfdZdededdfdZdeddfdZdeddfdZdeddfdZ deddfdZ!dededdfd Z"deddfd!Z#d"efd#Z$ded$ed%ed"eddf
d&Z%dededdfd'Z&dededdfd(Z'dededdfd)Z(d*e)d+ed,eddfd-Z*d.e+ddfd/Z,d0e-ddfd1Z.dee/   fd2Z0y)4ContextN	is_clientr  r   r   r   r  loggermax_early_datar   verify_modec                 6   || _         || _        || _        || _        d | _        g | _        d | _        g | _        || _        || _	        d | _
        d| _        |	| _        |
|
| _        n'|rt        j                  nt        j                   | _        d | _        d | _        d | _        d | _        ||| _        n4t,        j.                  t,        j0                  t,        j2                  g| _        t4        j6                  g| _        t:        j<                  g| _        t@        jB                  t@        jD                  t@        jF                  t@        jH                  t@        jJ                  t@        jL                  t@        jN                  g| _(        tS               jU                         r)| jP                  jW                  t@        jX                         tS               j[                         r)| jP                  jW                  t@        j\                         t^        j`                  t^        jb                  g| _2        tS               jg                         r)| jd                  jW                  t^        jh                         tS               jk                         r)| jd                  jW                  t^        jl                         tn        g| _8        d | _9        d| _:        d | _;        d | _<        d | _=        d | _>        d | _?        d | _@        d | _A        g | _B        d | _C        d| _D        d| _E        d | _F        d | _G        || _H        g | _I        d | _J        d | _K        |r7t        j                  d      | _N        d| _O        t        j                  | _R        y d | _N        d | _O        t        j                  | _R        y )NFc                      y r.   r3   )der<  ss       r5   r=  z"Context.__init__.<locals>.<lambda>	  s    r4   r4   r  )T_alpn_protocols_cadata_cafile_capathr   certificate_chaincertificate_private_keyhandshake_extensions
_is_client_max_early_datasession_ticket_request_client_certificate_server_name_verify_modesslCERT_REQUIRED	CERT_NONEalpn_cbget_session_ticket_cbnew_session_ticket_cbupdate_traffic_key_cb_cipher_suitesr   r   r   r  r  r  _legacy_compression_methodsr=  r?  _psk_key_exchange_modesrA  rB  rM  rG  rC  rN  rH  rP  _signature_algorithmsr   ed25519_supportedr   rE  ed448_supportedrF  r  r#  r$  _supported_groupsx25519_supportedr&  x448_supportedr'  TLS_VERSION_1_3_supported_versionsalpn_negotiatedearly_data_acceptedrn  received_extensions_certificate_request_key_schedule_psk_key_schedule_proxy_new_session_ticket_peer_certificate_peer_certificate_chain_psk_key_exchange_mode_receive_buffer_session_resumed_enc_key_dec_key_Context__logger_ec_private_keys_x25519_private_key_x448_private_keyosurandomclient_randomr  r   r   stater   )r)  r  r  r   r   r   r  r  r  r   r  s              r5   r*  zContext.__init__  s     .7;9;  	$ 68!#-7;+0('" +D5> 1 1CMMD /3EI"EI" $ 	"
 $"/D ....44#D
 8I7M7M6N(3E3P3P2Q$5522//5522//--1
" ..0&&--.@.H.HI,,.&&--.@.F.FG"'//5??!C--/""))%,,7++-""))%**5$3#4  /3#( 37>B BF!8<?C ?C =A?A$59#" %)-)-BDFJ @D!#BD%(D"55DJ!%D%)D"99DJr4   r,   c                     | j                   S )zK
        Returns True if session resumption was successfully used.
        )r  )r)  s    r5   session_resumedzContext.session_resumedI  s    
 $$$r4   
input_data
output_bufc                 d   | j                   t        j                  k(  r#| j                  |t        j
                            y | xj                  |z  c_        t        | j                        dk\  r| j                  d   }dt        j                  | j                  dd d      z   }t        | j                        |k  ry | j                  d | }| j                  |d  | _        	 | j                  |t        |      |       t        | j                        dk\  ry y # t        $ r t        d      w xY w)	Nr   r   r(   rV  rW  )r   )r  	input_bufr  zCould not parse TLS message)r  r   r   _client_send_hellor   r   r  r   rY  rZ  _handle_reassembled_messager)   r*   rz   )r)  r  r  r  message_lengthmessages         r5   handle_messagezContext.handle_messageP  s*    ::555##Ju}}$=>
*$&&'1,//2L$$Qq)U "0 " N
 4''(>9**?N;G#'#7#7#HD F00!-$'2) 1  $&&'1,( # F&'DEEFs   !D D/r  r  c                    | j                   t        j                  k(  r>|t        j                  k(  r%| j                  ||t        j                            nt        | j                   t        j                  k(  r,|t        j                  k(  r| j                  |       n[t        | j                   t        j                  k(  rR|t        j                  k(  r| j                  |       n|t        j                  k(  r| j!                  |       nt        | j                   t        j"                  k(  r,|t        j                  k(  r| j                  |       nt        | j                   t        j$                  k(  r,|t        j&                  k(  r| j)                  |       nZt        | j                   t        j*                  k(  r>|t        j,                  k(  r%| j/                  ||t        j0                            nt        | j                   t        j2                  k(  r,|t        j4                  k(  r| j7                  |       nt        | j                   t        j8                  k(  rb|t        j:                  k(  rI| j=                  ||t        j                     |t        j0                     |t        j>                            n7t        | j                   t        j@                  k(  r=|t        j                  k(  r$| jC                  ||t        j>                            nt        | j                   t        jD                  k(  r=|t        j&                  k(  r$| jG                  ||t        j>                            nt        | j                   t        jH                  k(  r=|t        j,                  k(  r$| jK                  ||t        j>                            n)t        | j                   t        jL                  k(  rt        |jO                         sJ y r.   )(r  r   r   r*  r.  _client_handle_hellor   r   r   r   r1  #_client_handle_encrypted_extensionsr   r2  _client_handle_certificater3  "_client_handle_certificate_requestr   r   r4  !_client_handle_certificate_verifyr   r5  _client_handle_finishedr   r   r/  !_client_handle_new_session_ticketr   r-  _server_handle_hellor   r   _server_handle_certificater   !_server_handle_certificate_verifyr   _server_handle_finishedr   eof)r)  r  r  r  s       r5   r  z#Context._handle_reassembled_messageo  s   
 ::999}999)))Z5NO,,ZZ5CCC}AAA88C,,ZZ5QQQ}888//	:!B!BB77	B,,ZZ5:::}888//	:,,ZZ5AAA}???66yA,,ZZ5777}555,,Y
5??8ST,,ZZ5666}???66yA,, ZZ5;;;}999))u}}-u/u}}-	 -,ZZ5:::}888//	:emm;TU,,ZZ5AAA}???66z%--8 -,ZZ5777}555,,Y
5==8QR,,ZZ5666((
 }}r4   r  r  c                    | j                   j                  d      }t        | j                   j                  |d|j                  | j                   j                  j
                        }t               }t        |j                  | j                   j                  |j                  |t        j                  |j                        z   |||| j                  |j                  	      S )Ns
   res masters
   resumptionr   )seconds)	ru  r  r  rv  rw  r  rx  r   r  )rn  r3  r   r   r  r'  r6   rt  r  r  r  r/   	timedeltar  r  r  )r)  r  r  resumption_master_secretrx  	timestamps         r5   _build_session_ticketzContext._build_session_ticket  s     $(#4#4#B#B=#Q -''11+)66$$..::
 H	&55**77 2 F F%  );)K)KLM&-/))%,,
 	
r4   r  c                    |j                   | j                  vrt        d      	 t        t        | j
                  j                               } |j                  |j                  | j                  j                  | j                  rt        nt              gt        |j                           y # t        $ r t        w xY w)Nz@CertificateVerify has a signature algorithm we did not advertise)r   r  r|   r   r"   r  rS  r  r  rn  r.  r  SERVER_CONTEXT_STRINGCLIENT_CONTEXT_STRINGrm  r   )r)  r  rS  s      r5   #_check_certificate_verify_signaturez+Context._check_certificate_verify_signature  s    4#=#==#R 	$ /1G1G1R1R1TJ J  !!99-1__)BW
 ,F,<,<=   	$##	$s   BB. .B>c                 |   g }g }| j                   D ]  }|t        j                  k(  rut        j                  j                         | _        |j                  t        | j                  j                                      |j                  t        j                         |t        j                  k(  rvt        j                  j                         | _        |j                  t        | j                  j                                      |j                  t        j                         |t        j                  k(  rB|j                  t        j                  df       |j                  t        j                         j|t        v stt!        j"                  t        |                }| j$                  j                  |       |j                  t        |j                                      |j                  |        t'        |      sJ d       	 t)        j*                  | j,                         d }t1        | j2                  | j4                  | j6                  D cg c]  }t9        |       c}| j:                  | j<                  || j>                  s| j@                  | jB                  nd || jD                  || jF                  | jH                        }| j>                  r2| j>                  jJ                  rtM        | j>                  jN                        | _(        | jP                  jS                  | j>                  jT                         | jP                  jW                  d      }	| jP                  jX                  jZ                  }
| j>                  j\                  d|_/        ta        | j>                  jb                  | j>                  jd                  fgtg        |
      g      |_4        tk        d      }tm        ||       |jo                         |
z
  d	z
  }| jP                  jq                  |js                  d
|             | jP                  ju                  |	      }||jh                  jv                  d
<   | jP                  jq                  |js                  ||d	z         |z          |j^                  r_| jP                  jW                  d      }| jy                  tz        j|                  t~        j                  | jP                  jN                  |       t        | j6                        | _B        | j                  jS                  d        t        | j                  |      5  tm        ||       d d d        | j                  t        j                         y # t.        $ r | j,                  }Y yw xY wc c}w # 1 sw Y   JxY w)Nr-  zno key share entries)r  r  r  r  r  r  r  r   r  r  r  r  
   res binderTr  i   rT  r   r      c e traffic)Gr  r  r&  r!   X25519PrivateKeygenerater  r   r]  rS  r'  r    X448PrivateKeyr  r(  rG  r   generate_private_keyr  r   r   r   r  r   r  r  r  r  rY  r  r  r  r  r  r  r  r  rz  r  r  r  r5  rx  r3  r   r'  r  r  r  r  r~  r  r  r)   r  r\  r7  rp  r1  r  r  r   r   r   r   r9  r  rr  
_set_stater   r   )r)  r  r  r  r  ec_private_keyr   xr  
binder_keybinder_lengthtmp_bufhash_offsetr  	early_keys                  r5   r  zContext._client_send_hello  s   )+	&(++ 	/E$+1+B+B+K+K+M(  %d&>&>&I&I&KL !''5%**$)-)<)<)E)E)G&  !243I3I3T3T3V!WX ''

3%,,&  %,,!89 ''5.(!#!8!89N9P!Q%%,,^<  !2>3L3L3N!OP ''.%	/( 9~555~	  !2!23 K%%"44+/+>+>?a3q6?'+'G'G// ''4+E+E+Q ,,#!%!;!;-#77!66!
( 4#6#6#?#?%01D1D1Q1Q%RD"""**4+>+>+P+PQ//==mLJ 22<<HHM ""66B#' #.((//1D1D1S1ST }-.	$E  d+Ggu- ",,.=81<K""..w/A/A![/QR++@@LF.4E  ((+"".."";a@6I
  22@@P	**%%NN**77	 $4D4G4G#H   ((.$22J? 	1j%0	1 	889M  	,++K	, @v	1 	1s$   V V-V2V*)V*2V;c                    t        |      }t        | j                  |j                  gt	        d            }|j
                  | j                  vrt        d      |j                  | j                  vrt        d      |j                  S| j                  (|j                  dk7  s|| j                  j                  k7  rt        | j                  | _        d| _        n | j                  j                  |      | _        d | _        d | _        t!        |j"                        }d }t%        |t&        j(                        r(| j*                  | j*                  j-                  |      }nt%        |t.        j0                        r(| j2                  | j2                  j-                  |      }nt%        |t4        j6                        rq| j8                  D ]b  }|j;                         j<                  j>                  |j<                  j>                  k(  s?|j-                  t5        j@                         |      }d |J | j                  jC                  |jD                         | j                  jG                  |       | jI                  tJ        jL                  tN        jP                  d       | jS                  tT        jV                         y )NzUnsupported cipher suitez9ServerHello has a compression method we did not advertisez.ServerHello has a version we did not advertiser   T   s hs traffic),r  ra  r  r  r~   r  r  r   r  r  r  r  rn  r  r  rD  rR  r  rU  r!   rM  r  exchanger    rO  r  r   rP  r  rS  rY  rZ  ECDHr7  r   r5  _setup_traffic_protectionr   r   r   r   r  r   r   )r)  r  r  
peer_hellor  peer_public_key
shared_keyr  s           r5   r  zContext._client_handle_helloY  sV   &y1
 $$%!"<=

 ((0P0PP'K  ''t/G/GG'@ 
 $$0&&.,,14#9#9#F#FF++ $ 6 6D$(D! $ 8 8 ? ? MD!%#'  ,J,@,@A&*
(>(>?((411::?KJ(:(:;&&2//88IJ)B)BC"&"7"7 U"--/55??&,,667 "0!8!8O!TJU %%%%%inn5!!*-&&u	
 	@@Ar4   c                    t        |      }|j                  | _        |j                  | _        |j
                  | _        | j                  r| j                  | j                         | j                  t        j                  t        j                  d       | j                  j                  |j                         | j                   r | j#                  t$        j&                         y | j#                  t$        j(                         y )N   c hs traffic)r  r  r  r  r  r  r  r  r  r   r   r   r   rn  r7  r   r  r  r   r   r   )r)  r  encrypted_extensionss      r5   r  z+Context._client_handle_encrypted_extensions  s    8C3AA#7#B#B #7#H#H  <<LL--.&&u	
 	%%inn5   OOE889OOERRSr4   c                     t        |      | _        | j                  j                  |j                         | j                  t        j                         y r.   )r  r  rn  r7  r   r  r   r   )r)  r  s     r5   r  z*Context._client_handle_certificate_request  s9    $<Y$G!%%inn5778r4   c                     t        |      }| j                  j                  |j                         | j	                  |       | j                  t        j                         y r.   )r  rn  r7  r   _set_peer_certificater  r   r   )r)  r  r   s      r5   r  z"Context._client_handle_certificate  sD    &y1%%inn5"";/>>?r4   c                    t        |      }| j                  |       | j                  t        j                  k7  rMt        | j                  | j                  | j                  | j                  | j                  | j                         | j                  j                  |j                         | j                  t         j"                         y )N)r   r   r   r   r   r   )r  r  r  r  r  r   r  r  r  r  r  r  rn  r7  r   r  r   r   )r)  r  r  s      r5   r  z)Context._client_handle_certificate_verify  s    (3 	008 -|||||| 2222 -- 	%%inn5445r4   c                    t        |      }| j                  j                  | j                        }|j                  |k7  rt
        | j                  j                  |j                         | j                  j                  dk(  sJ | j                  j                  d        | j                  t        j                  t        j                  d       | j                  j                  d      }| j                   W| j"                  ;| j$                  /t'        | j)                         | j                   j*                        }nd }t-        | j                  |      5  t/        |t1        | j                   j2                  |rG| j"                  g| j4                  z   D cg c]#  }|j7                  t8        j:                        df% c}ng              d d d        |ry | j$                  j<                  | j                  j?                  t@              gtC        |       }t-        | j                  |      5  tE        |tG        ||             d d d        t-        | j                  |      5  tI        |tK        | j                  j                  | jL                                     d d d        || _&        | jO                  t        jP                  t        j                  | j                  jR                  | jL                         | jU                  tV        jX                         y c c}w # 1 sw Y   WxY w# 1 sw Y   xY w# 1 sw Y   xY w)Nr      s ap traffic   c ap trafficr4   r  r   r  r  )-r  rn  r1  r  r  r|   r7  r   r"  r5  r  r   r   r   r   r3  r  r   r  ra  %_signature_algorithms_for_private_keyr  rr  r  r  r  r  rV  r%   DERsignr.  r  rm  r  r  r  r  r  r  r   r  r  r   r   )	r)  r  r  r  expected_verify_datanext_enc_keyrb  r  r  s	            r5   r  zContext._client_handle_finished  s    +  $00EEdmmT#77##%%inn5   ++q000!!$'&&u}}o	
 ((66G$$0   ,00<&/>>@--BB'#
 '+# d//<  (,(A(A(Q(Q  3 +/*:*:);d>T>T)T$% "#!=s C
 "$
" #=D88==%%==>ST/0CD	 "$"3"3Z@ +")&9Y $++Z8 	 $ 1 1 F Ft}} U	 %""MM**MM		
 	334U , 	 	s6   ?L!(L>L!/L.%:L:L!!L+.L7:Mc                     t        |      }| j                  .| j                  || j                        }| j                  |       y y r.   )r  r  r  r  )r)  r  r  r  s       r5   r  z)Context._client_handle_new_session_ticket  sK    4Y? %%1//"D$<$<F &&v.	 2r4   
onertt_bufc           	         | j                   j                  | j                        | _        t	        d      }t        |t        | j                               | j                   j                  |j                         | j                  | j                  t        dt        j                  dt        j                  d            d   dt        j                  d      | j                   	      | _        t%        || j"                         | j'                  | j"                  | j(                        }| j                  |       | j+                  t,        j.                         y )
N@   r  r  iQ Ir   r   r4   )r  r  r  r  r  )rn  r1  r  _expected_verify_datar)   r  r  r7  r   r  r  r  r   unpackr  r  r  r  r  r  r  r  r   r   )r)  r  rS  r  s       r5   _server_expect_finishedzContext._server_expect_finished)  s   %)%6%6%K%KMM&
" b!c80J0JKL%%chh/ &&2++7'7 %%}}S"**Q-@C zz"~$($8$8(D$ $J0H0HI //(($*C*CF &&v.445r4   initial_bufhandshake_bufc                 R   t        |      }t        | j                  |j                  t	        d            }t        | j
                  |j                  t	        d            }t        | j                  |j                        }t        | j                         |j                  t	        d            }	t        | j                  |j                  t        d            }
| j                  /t        | j                  |j                  t	        d            | _        |j"                  | _        t'        j(                  d      | _        |j,                  | _        |j.                  | _        | j2                  r| j3                  | j                          d }| j4                  F|C|j6                  6t9        |j6                  j:                        dk(  rt9        |j6                  j<                        dk(  r|j6                  j:                  d   }| j5                  |d         }||j>                  r|j@                  |k(  rtC        |      | _"        | jD                  jG                  |jH                         | jD                  jK                  d	      }| jD                  jL                  jN                  }|jQ                         |z
  d
z
  }|jS                  |d
z   |d
z   |z         }| jD                  jU                  |jS                  d|             | jD                  jW                  |      }||k7  rt	        d      | jD                  jU                  |jS                  ||d
z   |z                d| _,        |jZ                  rf| jD                  jK                  d      }d| _.        | j_                  t`        jb                  td        jf                  | jD                  j@                  |       d}|PtC        |      | _"        | jD                  jG                  d        | jD                  jU                  |jh                         d }|jj                  D ]  }tm        |      }to        |tp        jr                        r[tp        jt                  jw                         | _<        | jx                  j{                         }| jx                  j}                  |      } nto        |t~        j                        rZt~        j                  jw                         | _B        | j                  j{                         }| j                  j}                  |      } nto        |t        j                        st        j                  t        |d                   }| j                  j                  |       |j{                         }|j}                  t        j                         |      } n |J t        | j*                  | j,                  ||t              ||
      }t        | jD                  |      5  t        ||       d d d        | jD                  jG                  |       | j                  t`        j                  td        j                  d       | j                  t`        jb                  td        j                  d       t        | jD                  |      5  t        |t        | j                   | j\                  | j                               d d d        |@| j                  r@t        | jD                  |      5  t        |t        d| j                               d d d        t        | jD                  |      5  t        |t        d| j                  g| j                  z   D cg c]#  }|j                  t        j                        df% c}             d d d         | j                  j                  | jD                  j                  t              gt        |	       }t        | jD                  |      5  t        |t        |	|             d d d        t        | jD                  |      5  t        |t        | jD                  jW                  | j                                     d d d        | jD                  j                  dk(  sJ | jD                  jG                  d        | j                  t`        j                  td        j                  d       | jD                  jK                  d      | _k        || _l        | j                  r | j                  t        j                         y | j                  |       y # 1 sw Y   =xY w# 1 sw Y   |xY w# 1 sw Y   :xY wc c}w # 1 sw Y   xY w# 1 sw Y   exY w# 1 sw Y   xY w)NzNo supported cipher suitezNo supported compression methodz No supported signature algorithmzNo supported protocol versionzNo common ALPN protocolsr  r(   r   r  r   zPSK validation failedTr  )r  r  r  r  r  r  r  r  r  )r  r  r  r4   )r  r  r  r  r  r   r  r  )qr  ra  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  rz  r  r  rn  r5  rx  r3  r   r'  r\  rp  r7  r1  r  r  r  r  r   r   r   r   r   r  rR  rU  r!   rM  r  r  r  rS  r  r    rO  r  r  r   rP  r  rG  r  r   r  r  r]  rr  r  r  r   r   r  r  r  r  r
  r  r  r  r  r   r  rV  r%   r  r  r  r.  r  rm  r  r  r  r  r  r"  r   _next_dec_keyr  r  r   r   r  )r)  r  r  r  r  r  r  r  psk_key_exchange_moderb  r  r  r  r  r  r  r  r  expected_binderr  r  r  r  rS  r  r  r  r  s                               r5   r  zContext._server_handle_helloJ  s>    'y1
 !$$!"=>

 ',,11!"CD

 !*((**K*K!
 (668++!"DE

 &$$)) !@A
 +#,$$))%&@A$D  (..ZZ^!+!=!=#-#>#>  <<LL--. &&2%1))5J--889Q>J--556!; "00;;A>H!77DN *"++"//<?$/$=!!!)).*J*JK!..<<]K
 $ 1 1 ; ; G G'nn.>B"--!O[1_}%D !!--i.B.B1k.RS"&"3"3"H"H"T_,/0GHH!!--((kAo6UV )-% (( $ 1 1 ? ? OI/3D,..!))))66!	 "# ! +L 9D%%d+)))..9 '+
#-- 	I/	:O/6+A+AB+1+B+B+K+K+M(!55@@B
!55>>O
OT-?-?@)-)<)<)E)E)G&!33>>@
!33<<_M
OR-F-FG!#!8!8	RS9U9W!X%%,,^<+668
+44RWWYP
#	$ %%% %%"44%1'
3)/
 $++[9 	2k51	2!!*-&&u	
 	&&u	

 $++]; 	%#"&"6"6#77%)%>%>	 !//!$"3"3]C ,%*,/151K1K d//? 
 !(+ '+&6&6%7$:P:P%P& ! ^^HLL93?&	
 :4499!!99:OP+,?@I d//? '!%"5 $++]; 	 $ 1 1 F Ft}} U	   ++q000!!$'&&u}}o	
 "..<<_M&;#++OOE;;<((4c	2 	2	 	 &
 
" 	 	sZ   e27e#"e0)f?(e='ff
:fe #e-0e:=ffff&c                     t        |      }| j                  j                  |j                         |j                  r1| j                  |       | j                  t        j                         y | j                  |       y r.   )
r  rn  r7  r   r   r  r  r   r   r  )r)  r  r  r   s       r5   r  z"Context._server_handle_certificate/  s[    &y1%%inn5##&&{3OOEBBC((4r4   c                     t        |      }| j                  |       | j                  j                  |j                         | j                  |       y r.   )r  r  rn  r7  r   r  )r)  r  r  r  s       r5   r  z)Context._server_handle_certificate_verify9  sD     )3 	008%%inn5$$Z0r4   c                 b   t        |      }|j                  | j                  k7  rt        | j                  | _        d | _        | j                  t        j                  t        j                  | j                  j                  | j
                         | j                  t        j                         y r.   )r  r  r  r|   r  r  r  r   r   r   r   rn  r  r  r   r   )r)  r  r  r  s       r5   r  zContext._server_handle_finishedD  s     + 4#=#==## **!""MM**MM		
 	334r4   	directionepochr   c                     | j                   j                  |      }|t        j                  k(  r|| _        n|| _        | j                  ||| j                   j                  |       y r.   )rn  r3  r   r   r  r  r  r  )r)  r  r  r   keys        r5   r  z!Context._setup_traffic_protectionW  sY     --e4	)))DMDM""ud//<<c	
r4   r   c                    t        j                  |j                  d   d         | _        t	        dt        |j                              D cg c]'  }t        j                  |j                  |   d         ) c}| _        y c c}w rL  )r   load_der_x509_certificater   r  ranger   r  )r)  r   is      r5   r  zContext._set_peer_certificatee  sw    !%!?!?$$Q'*"

 1c+":":;<(
 **;+C+CA+Fq+IJ(
$ (
s   ,Br  c                 x    | j                   r'| j                   j                  d| j                  |       || _        y )NzTLS %s -> %s)r  debugr  )r)  r  s     r5   r  zContext._set_staten  s*    ==MM

EB
r4   c                 \   g }t        | j                  t        j                        rOt        j
                  t        j                  t        j                  t        j                  t        j                  g}|S t        | j                  t        j                        rAt        | j                  j                  t        j                        rt        j                  g}|S t        | j                  t        j                        rAt        | j                  j                  t        j                        rt        j                   g}|S t        | j                  t"        j$                        rt        j&                  g}|S t        | j                  t(        j*                        rt        j,                  g}|S r.   )rU  r  r   RSAPrivateKeyrA  rM  rG  rN  rH  rP  r   EllipticCurvePrivateKeyrY  r#  rB  r$  rC  r   Ed25519PrivateKeyrE  r   Ed448PrivateKeyrF  )r)  r  s     r5   r  z-Context._signature_algorithms_for_private_keys  sO   9;d22C4E4EF"66"33"66"33"11$ & $# (("*D*D
55;;R\\J$6$M$M#N  $# (("*D*D
55;;R\\J$6$M$M#N 
 $#	 44g6O6OP$6$>$>#?  $# 44e6K6KL$6$<$<#= ##r4   )	NNNNNNNNN)1rS   rT   rU   r  r   r   r   r  r   r   loggingLoggerLoggerAdapterrY  r*  r  r  r   r   r)   r  r  r  r  rt  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r   r  rA  r  r3   r4   r5   r  r    s9    /3"& $ $59IM(,%)%)f:f: !c+f: 	f:
 f: f:  [ 12f: w~~w/D/DDEFf: !f: c]f: c]f:P % % %FF-1%--@F	F>NN,2N@DUF]@SN	N`
"2
FJ9o
	
4$:K $PT $4d:V d: d:L=Bf =B& =BT =B~TV T T,9F 9t 9
@F @t @66 6d 6(O5 O5V O5PT O5b/6 /d /6& 6Bc5c5 c5 	c5
 c5 
c5J5F 5 5SW 5	1	1-3	1		15 5V 5PT 5&
"
+0
9>
	

 
 
 $ 
$t<N7O $r4   r  r.   )r/   r   r,  r  r  r   
contextlibr   dataclassesr   r   enumr   r   	functoolsr   typingr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   cryptography.exceptionsr   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   r   r   )cryptography.hazmat.primitives.asymmetricr   r   r   r   r   r   r    r!   /cryptography.hazmat.primitives.asymmetric.typesr"   r#   'cryptography.hazmat.primitives.kdf.hkdfr$   ,cryptography.hazmat.primitives.serializationr%   r&   OpenSSLr'   bufferr)   r*   r  r  TLS_VERSION_1_3_DRAFT_28TLS_VERSION_1_3_DRAFT_27TLS_VERSION_1_3_DRAFT_26r  r  r+   r6   r8   	Exceptionrr   rv   rx   rz   r|   r~   r   r   r   r   r   r   r   r  rY  r   HashAlgorithmr   r   r   r  r   r   r   r   r  r  r  r*  r:  r=  rA  r^  rd  rf  rk  ro  rq  rs  rx  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  r  r
  r  r  r  r  r  r  r  r9  r   SHA256r   SHA384r  rF  rt   rB  rC  rD  SHA512rP  PKCS1v15SHA1rG  rH  rI  rM  rh  rN  rO  r  r#  r$  r%  rG  r>  rj  rX  r!  rP  rM  rO  rR  r]  ra  rm  rr  rt  AlpnHandlerSessionTicketFetcherSessionTicketHandlerr  r3   r4   r5   <module>rJ     s3      	 
  % (         4 8 F F	 	 	 ? O  +! ! ! < < CL8!! 8"w "<"I "3% 37e 70u 01 15E 55E 52 245 46U 6 
D D "e    ##  	
  ##+0@E
 .2G
G#E?GG	U 	tD4D4D/E 	 %'!%"  K/!!K/  !K/ #K/ UO	K/
 SMK/ SMK/ 
K/\+' + "G "$G G w  
 2 DF Dc Di D D F c i  $Ky K6 S Q DG $	&.sDy&9CKA;	&V &s &u &V s 5 T    	  3& 3S 39& 9s 9t 9 c5j! = " "} " "F s 2F 2c 2d 2 E3J   
-6 -k -6 + $ 
 E      4  6 k 6 ; 4 " #u*	 D D D()V )M )d )56 5k 5p0A6 0A+ 0A$ 0Af 
L 
L 
L6 k B46 4+ 4$ 4: L L L ,< 24 4=M 4RV 4$ L L L6 .A 246 47J 4t 4, &  G G G
& [ &
& 
{ 
t 
 L L L& -? 04	4&84	4$   
G G,= G. .1B .t .   v ( .v . .d .5 5p   " ""FMM""FMM((&--t  --fmm/D--fmm/D--fmm/D%%(8(8&++'F'''*:*:FMM)J'''*:*:FMM)J'''*:*:FMM)J**W[[&--,H**W[[&--,H**W[[&--,H d  
OOR\\	OOR\\	OOR\\ 
 @)=)=)?@@)K )F4H4H )
2$$f&<&<d>P>PRVVW
!!6#9#94;M;MM 	  NR
Aw
!)$s)!4
;CE?

"C "E "" E%556E=CEE E 0 0 06 ud{#-)@ @A  56 i$ i$r4   