
    vKgHD                        S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKJr  S SK	J
r
  S SKrS SKJrJr  S SKJr  S SKJr  \
R(                  r\" \
S5      (       a  \\
R.                  -  r\
R0                  r\
R4                  \
R6                  -  \-  r \
R0                  \4\\4\
R:                  \4\
R<                  \4\
R>                  \4S.r \
R0                  S	\
R:                  S
\
R<                  S\
R>                  S0r!SSS\"4S jr# " S S5      r$\$RK                  \RL                  " S5      =(       d    \RL                  " S5      5      r'\\SSSSSS\
RP                  S4
S\)S\)S\*S\*S\*S\RV                  \,   S\RZ                  \R\                  \R\                  /\,4   S\)S\R^                  \RZ                  \
R`                  \
Rb                  \)\)\2/\24      S\
Rf                  4S jjr4SSS\
Rj                  4S\*S\*S \*S\)S\
Rf                  4
S! jjr6S"\
R`                  S#\
Rb                  S$\)S%\)S&\2S\24S' jr7     S1S\Rp                  \Rr                  \*4   S(\
Rt                  S)\R^                  \RZ                  \
R`                  /S4      S*\2S+\RV                  \Rr                     S\
Rf                  4S, jjr;S- r<S. r= " S/ S05      r>g)2    N)KaitaiStream)SSL)certs
exceptions)tls_client_hello)checkOP_NO_COMPRESSION)allsecureTLSv1TLSv1_1TLSv1_2SSLv23r   zTLSv1.1zTLSv1.2optionsz1seleniumwire.thirdparty.mitmproxy.options.Optionsreturnc                     U R                   (       a  [        R                  nO[        R                  n[        U R
                     u  p#UUUU R                  U R                  U R                  U R                  S.$ )N)verifymethodr   ca_path
ca_pemfileclient_certscipher_list)
ssl_insecurer   VERIFY_NONEVERIFY_PEERVERSION_CHOICESssl_version_server#ssl_verify_upstream_trusted_confdirssl_verify_upstream_trusted_car   ciphers_server)r   r   r   tls_optionss       i/var/www/highfloat_scraper/venv/lib/python3.13/site-packages/seleniumwire/thirdparty/mitmproxy/net/tls.pyclient_arguments_from_optionsr#   8   si    )'*D*DEF >><<,,--     c                   :    \ rS rSrS rS r S rS r\S 5       rSr	g)MasterSecretLoggerL   c                 R    Xl         S U l        [        R                  " 5       U l        g N)filenamef	threadingLocklock)selfr*   s     r"   __init__MasterSecretLogger.__init__M   s     NN$	r$   c                    U[         R                  :H  =(       a    US:H  n[        US5      nU(       d  U(       Ga_  U R                     U R                  (       d  [
        R                  R                  U R                  5      n[
        R                  R                  U5      (       d  [
        R                  " U5        [        U R                  S5      U l        U R                  R                  S5         [        R                  " UR                  5       5      n[        R                  " UR!                  5       5      nU R                  R                  SXx4-  5        U R                  R#                  5         [        US5      (       a  [%        US5        S S S 5        g g ! [&        [         R(                  4 a
    SUl         N-f = f! , (       d  f       g = f)N   _still_needs_masterkeyabs   
s   CLIENT_RANDOM %s %s
T)r   SSL_CB_HANDSHAKE_DONEhasattrr.   r+   ospathdirnamer*   isdirmakedirsopenwritebinasciihexlifyclient_random
master_keyflushdelattrAssertionErrorErrorr4   )	r/   
connectionwhereretdone_now"done_previously_but_not_logged_yetdrA   	masterkeys	            r"   __call__MasterSecretLogger.__call__U   sK   S...;3!8 	 J 89 	+ 9vv6A77==++A!$--6DFFFLL)	F$,$4$4Z5M5M5O$PM ( 0 01F1F1H II FFLL!;}>X!XYFFLLNz+CDD
,DE!  : '		2 =8<J5= s3   B+G3AF;AG!F?<G>F??G
Gc                     U R                      U R                  (       a  U R                  R                  5         S S S 5        g ! , (       d  f       g = fr)   )r.   r+   closer/   s    r"   rQ   MasterSecretLogger.closet   s'    YYvv YYs   ,A
Ac                 (    U (       a  [        U 5      $ g r)   )r&   )r*   s    r"   create_logfun MasterSecretLogger.create_logfuny   s    %h//r$   )r+   r*   r.   N)
__name__
__module____qualname____firstlineno__r0   rN   rQ   staticmethodrU   __static_attributes__ r$   r"   r&   r&   L   s-    % $HF>
  r$   r&   MITMPROXY_SSLKEYLOGFILESSLKEYLOGFILEr   r   r   r   alpn_protosalpn_select_callbackr   verify_callbackc
                 P  ^  [         R                  " U 5      n
Ub  U
R                  U5        Ub>  U
R                  X5        Uc  Uc  [        R                  " 5       n U
R                  X25        U
R                  [         R                  R                   5        U(       a    U
R#                  UR%                  5       5        [(        (       a  U
R+                  [(        5        Ub  U
R-                  U5        U
$ Tb  Uc  U4S jnU
R/                  U5        U
$ Ub<  Tc9  [1        U5      (       d  [
        R                  " S5      eU
R/                  U5        U
$ Ub  Tb  [
        R                  " S5      eU
$ ! [         a0    [        R	                  U S5      n[
        R                  " SU-  5      ef = f! [         R                   a&    [
        R                  " SR                  X25      5      ef = f! [         R                   a'  n[
        R                  " S['        U5      -  5      eSnAff = f)	a  
Creates an SSL Context.

:param method: One of SSLv23_METHOD, TLSv1_METHOD, TLSv1_1_METHOD, or TLSv1_2_METHOD
:param options: A bit field consisting of OpenSSL.SSL.OP_* values
:param verify: A bit field consisting of OpenSSL.SSL.VERIFY_* values
:param ca_path: Path to a directory of trusted CA certificates prepared using the c_rehash tool
:param ca_pemfile: Path to a PEM formatted trusted CA certificate
:param cipher_list: A textual OpenSSL cipher list, see https://www.openssl.org/docs/apps/ciphers.html
:rtype : SSL.Context
unknownzSSL method "%s" is most likely not supported or disabled (for security reasons) in your libssl. Please refer to https://github.com/mitmproxy/mitmproxy/issues/1101 for more details.Nz*Cannot load trusted certificates ({}, {}).z"SSL cipher specification error: %sc                 0   > TU;   a  [        T5      $ US   $ )Nr   )bytes)conn_r   alpn_selects     r"   ra   1_create_ssl_context.<locals>.alpn_select_callback   s     g%[))qz!r$   z4ALPN error: alpn_select_callback must be a function.zPALPN error: only define alpn_select (string) OR alpn_select_callback (function).)r   Context
ValueErrorMETHOD_NAMESgetr   TlsExceptionset_options
set_verifycertifirH   load_verify_locationsrF   formatset_mode_libSSL_MODE_AUTO_RETRYset_cipher_listencodestrlog_master_secretset_info_callbackset_alpn_protosset_alpn_select_callbackcallable)r   r   r   r   r   r`   rh   ra   r   rb   contextmethod_namevs         `      r"   _create_ssl_contextr      s#   2	
++f% G$ 63?z1 J	))*> SXX112 	Y##K$6$6$89
 !!"34,$ N# 
	 %9%A	" 	(()=> N 
	)k.A,--))*`aa(()=>
 N	 
	)k.E%%^` 	` NA  
"&&vy9%%  #..
 	

( yy 	))<CC 	" yy 	Y))*NQTUVQW*WXX	Ys/   E0 F- G* 0:F*-:G'*H%>"H  H%certsniaddressc                 j  ^^ Tc*  U[         R                  :w  a  [        R                  " S5      eS[         R                  S[         R
                  S[        S[        S[        S[        4UU4S	 jjn[        SUUS
.UD6nT(       a  [         R                  R                  UR                  5      n[         R                  R                  U[         R                  R                  [         R                  R                  -  5        [         R                  " [         R                  R!                  UTR#                  S5      S5      S:H  5        U (       a%   UR%                  U 5        UR'                  U 5        U$ U$ ! [         R(                   a'  n[        R                  " S[+        U5      -  5      eSnAff = f)a  
Args:
    cert: Path to a file containing both client cert and private key.
    sni: Server Name Indication. Required for VERIFY_PEER
    address: server address, used for expressive error messages only
    verify: A bit field consisting of OpenSSL.SSL.VERIFY_* values
Nz0Cannot validate certificate hostname without SNIconnx509errnodepthis_cert_verifiedr   c           
      t  > U(       a0  US:X  a*  T(       d#  [         R                  " ST S35      U l        SnU$ U(       a   U$ [         R                  " SR                  T[        R
                  R                  [        R                  R                  U5      5      R                  5       UU5      5      U l        U$ )Nr   z#Certificate verification error for z(: Cannot validate hostname, SNI missing.Fz@Certificate verification error for {}: {} (errno: {}, depth: {}))
r   InvalidCertificateException
cert_errorrs   r   _ffistringru   X509_verify_cert_error_stringdecode)r   r   r   r   r   r   r   s        r"   rb   .create_client_context.<locals>.verify_callback   s     
3(DD5gY>fgDO  %      )DDRYYHHOOCHH$J$J5$QRYY[	DO  r$   )r   rb   idnar   r3   z SSL client certificate error: %sr]   )r   r   r   rn   
ConnectionX509intboolr   ru   SSL_CTX_get0_param_contextX509_VERIFY_PARAM_set_hostflags$X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS#X509_CHECK_FLAG_NEVER_CHECK_SUBJECT_openssl_assertX509_VERIFY_PARAM_set1_hostrx   use_privatekey_fileuse_certificate_chain_filerF   ry   )	r   r   r   r   sslctx_kwargsrb   r   paramr   s	    ``      r"   create_client_contextr      s    {v0%%&XYY .. ((    	 
 #  
   6 " ' G  ++G,<,<= 	00HH99CHH<h<hh	
 	HH00

68JANRSS	

 	W''-..t4 N7N yy 	W))*LsSTv*UVV	Ws   "E7 7F2"F--F2rg   r   r   	err_depthr   c                     g)NTr]   )rg   r   r   r   r   s        r"   
accept_allr   .  s     r$   key
handle_snirequest_client_certextra_chain_certsc                    U(       a  [         R                  nO[         R                  n[        SUU[        S.UD6n	U	R                  U5        [        U [        R                  5      (       a  U	R                  U R                  5        OU	R                  U 5        U(       a$  U H  n
U	R                  U
R                  5        M      U(       a  U	R                  U5        U(       a*  [         R                  R                  U	R                   U5        U	$ )a  
cert: A certs.Cert object or the path to a certificate
chain file.

handle_sni: SNI handler, should take a connection object. Server
name can be retrieved like this:

        connection.get_servername()

The request_client_cert argument requires some explanation. We're
supposed to be able to do this with no negative effects - if the
client has no cert to present, we're notified and proceed as usual.
Unfortunately, Android seems to have a bug (tested on 4.2.2) - when
an Android client is asked to present a certificate it does not
have, it hangs up, which is frankly bogus. Some time down the track
we may be able to make the proper behaviour the default again, but
until then we're conservative.
)r   r   rb   r]   )r   r   r   r   r   use_privatekey
isinstancer   Certuse_certificater   r   add_extra_chain_certset_tlsext_servername_callbackru   SSL_CTX_set_tmp_dhr   )r   r   r   r   
chain_filedhparamsr   r   r   r   is              r"   create_server_contextr   9  s    : ! " 	G 3$

##		***40"A((0 # ..z:##G$4$4h?Nr$   c                     U SS n [        U 5      S:H  =(       a6    U S   S:H  =(       a'    U S   S:H  =(       a    SU S   s=:*  =(       a    S:*  $ s  $ )ze
Returns:
    True, if the passed bytes start with the TLS record magic bytes.
    False, otherwise.
N   r      r3      )len)rL   s    r"   is_tls_record_magicr   v  sf     	
"1A
 	A! 		!		!	 	qtt	 		r$   c                 
   SnSnSn[        U5      U:  a  U R                  US-   5      US n[        U5      (       a  [        U5      S:  a  [        R                  " SU-  5      e[
        R                  " SUS5      S   S-   nU R                  X5-   5      US-   S n[        U5      US-
  :w  a  [        R                  " S	U-  5      eX-  nX5-  n[
        R                  " S
SUSS -   5      S   S-   n[        U5      U:  a  M  U$ )a  
Peek into the socket and read all records that contain the initial client hello message.

client_conn:
    The :py:class:`client connection <seleniumwire.thirdparty.mitmproxy.connections.ClientConnection>`.

Returns:
    The raw handshake packet bytes, without TLS record header(s).
r$   r3   r      Nz&Expected TLS record, got "%s" instead.z!Hr   z#Unexpected EOF in TLS handshake: %sz!I       )r   peekr   r   TlsProtocolExceptionstructunpack_fromunpack)rfileclient_helloclient_hello_sizeoffsetrecord_headerrecord_sizerecord_bodys          r"   get_client_hellor     s'    LF
l
/
/

6A:.vw7"=11S5G!5K118=HJ J((}a@CaGjj!56vz{C{{Q.115CE E#"MM$,q:K0KLQORSS l
/
/ r$   c                       \ rS rSrS r\S 5       r\S\R                  \	   4S j5       r
\S 5       r\S\R                  \R                  \\	4      4S j5       r\SS j5       rS	 rS
rg)ClientHelloi  c                 t    [         R                  " [        [        R                  " U5      5      5      U l        g r)   )r   TlsClientHellor   ioBytesIO_client_hello)r/   raw_client_hellos     r"   r0   ClientHello.__init__  s'    -<<$456
r$   c                 B    U R                   R                  R                  $ r)   )r   cipher_suitesrR   s    r"   r   ClientHello.cipher_suites  s    !!//===r$   r   c                 &   U R                   R                  (       a  U R                   R                  R                   H  nUR                  S:H  =(       a    [        UR                  R
                  5      S:H  =(       ad    UR                  R
                  S   R                  S:H  =(       a7    [        R                  " UR                  R
                  S   R                  5      nU(       d  M  UR                  R
                  S   R                  s  $    g )Nr   r3   )
r   
extensionstyper   bodyserver_names	name_typer   is_valid_host	host_name)r/   	extensionis_valid_sni_extensions      r"   r   ClientHello.sni  s    ((!//::EE	NNd* R	3349RNN//2<<AR ''	(C(CA(F(P(PQ	 ' *)$>>66q9CCC F r$   c                     U R                   R                  (       a_  U R                   R                  R                   H;  nUR                  S:X  d  M  [        S UR                  R
                   5       5      s  $    / $ )N   c              3   6   #    U H  oR                   v   M     g 7fr)   )name).0xs     r"   	<genexpr>-ClientHello.alpn_protocols.<locals>.<genexpr>  s     N0M10Ms   )r   r   r   listr   alpn_protocols)r/   r   s     r"   r   ClientHello.alpn_protocols  s\    ((!//::EE	>>T)N	0M0MNNN F 	r$   c                     / nU R                   R                  (       a[  U R                   R                  R                   H7  n[        USUR                  5      nUR	                  UR
                  U45        M9     U$ )N	_raw_body)r   r   getattrr   appendr   )r/   rI   r   r   s       r"   r   ClientHello.extensions  sa    ((!//::EE	y+y~~F

INND12 F 
r$   c           	      6    [        U5      SS n U " U5      $ ! [        R                   a'  n[        R                  " S[	        U5      -  5      eSnAff = f! [
         a7  n[        R                  " SU< S[        R                  " U5      < 35      eSnAff = f)a1  
Peek into the connection, read the initial client hello and parse it to obtain ALPN values.
client_conn:
    The :py:class:`client connection <seleniumwire.thirdparty.mitmproxy.connections.ClientConnection>`.
Returns:
    :py:class:`client hello <seleniumwire.thirdparty.mitmproxy.net.tls.ClientHello>`.
r   Nz Cannot read raw Client Hello: %szCannot parse Client Hello: z, Raw Client Hello: )r   r   ProtocolExceptionr   reprEOFErrorr?   r@   )clsclient_connr   es       r"   	from_fileClientHello.from_file  s    	`/<QR@	'((	 ++ 	`112TW[\]W^2^__	`
  	11-aU2FxGWGWXhGiFlm 	s+    A A"AA
B!2BBc                 <    SU R                    SU R                   S3$ )NzClientHello(sni: z, alpn_protocols: ))r   r   rR   s    r"   __repr__ClientHello.__repr__  s$    "488*,>t?R?R>SSTUUr$   )r   N)r   r   )rW   rX   rY   rZ   r0   propertyr   typingOptionalrf   r   r   ListTupler   r   classmethodr   r  r\   r]   r$   r"   r   r     s    

 > > V__U+     FKKS%Z(@A    (Vr$   r   )NFNNN)?r?   r   r8   r   r,   r  rq   kaitaistructr   OpenSSLr   )seleniumwire.thirdparty.mitmproxy.optionsseleniumwire!seleniumwire.thirdparty.mitmproxyr   r   6seleniumwire.thirdparty.mitmproxy.contrib.kaitaistructr   %seleniumwire.thirdparty.mitmproxy.netr   OP_CIPHER_SERVER_PREFERENCEBASIC_OPTIONSr7   r	   SSLv23_METHODDEFAULT_METHODOP_NO_SSLv2OP_NO_SSLv3DEFAULT_OPTIONSTLSv1_METHODTLSv1_1_METHODTLSv1_2_METHODr   rl   dictr#   r&   rU   getenvrz   r   r   ry   Iterablerf   CallableAnyr  r   r   r   rj   r   r   r   r   Unionr   PKeyr   r   r   r   r]   r$   r"   <module>r!     s    	 	     %  0 ? S 7 ##  3#$$S***M""OOOO  }- /.""M2""M2 xg			+^ cg (1 1h '44II'(FBIIo,F  %&.2QUoo [[[ [ 	[
 [ __U+[ %oovzz6::.F.MN[ [  OOS^^SXXsCFLM
[ 	[[[~ oo	HHH H 	H 	[[HV~~hh  	
  
 PT$)9=:ll5::s?+:XX: OOFOOS^^4Dd4J$KL: "	: "??5::6: 	[[:z$:@V @Vr$   