
    EgP                     `   d dl mZ d dl mZ d dlmZ d dlmZ d dlm	Z	 i d ddddd	d
dddddddddddddddddddddd d!d"d#d$d%i d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGi dHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdii djdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddēddƓddȓddʓdd̓ddΓi ddГddғddԓdd֓ddؓddړddܓddޓddddddddddddddddddi dddddddddddddddd ddddddddd	d
ddddddddi dddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4i d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSddTddUddVdWdXdYdZZ
d[Z G d\ d]e	j                  Zd^S (_      )Optional)Union)
exceptions)tls)basezNULL-MD5      zNULL-SHA   zEXP-RC4-MD5   zRC4-MD5   zRC4-SHA   zEXP-RC2-CBC-MD5   zIDEA-CBC-SHA   zEXP-DES-CBC-SHA	   zDES-CBC-SHA
   zDES-CBC3-SHA   zEXP-DH-DSS-DES-CBC-SHA   zDH-DSS-DES-CBC-SHA   zDH-DSS-DES-CBC3-SHA   zEXP-DH-RSA-DES-CBC-SHA   zDH-RSA-DES-CBC-SHA   zDH-RSA-DES-CBC3-SHA   zEXP-EDH-DSS-DES-CBC-SHA   zEDH-DSS-DES-CBC-SHA   zEDH-DSS-DES-CBC3-SHA   zEXP-EDH-RSA-DES-CBC-SHA   zEDH-RSA-DES-CBC-SHA   zEDH-RSA-DES-CBC3-SHA   zEXP-ADH-RC4-MD5   zADH-RC4-MD5   zEXP-ADH-DES-CBC-SHA   zADH-DES-CBC-SHA   zADH-DES-CBC3-SHA   zKRB5-DES-CBC-SHA   zKRB5-DES-CBC3-SHA    zKRB5-RC4-SHA!   zKRB5-IDEA-CBC-SHA"   zKRB5-DES-CBC-MD5#   zKRB5-DES-CBC3-MD5$   zKRB5-RC4-MD5%   zKRB5-IDEA-CBC-MD5&   zEXP-KRB5-DES-CBC-SHA'   zEXP-KRB5-RC2-CBC-SHA(   zEXP-KRB5-RC4-SHA)   zEXP-KRB5-DES-CBC-MD5*   zEXP-KRB5-RC2-CBC-MD5+   zEXP-KRB5-RC4-MD5/   z
AES128-SHA0   zDH-DSS-AES128-SHA1   zDH-RSA-AES128-SHA2   zDHE-DSS-AES128-SHA3   zDHE-RSA-AES128-SHA4   zADH-AES128-SHA5   z
AES256-SHA6   zDH-DSS-AES256-SHA7   zDH-RSA-AES256-SHA8   zDHE-DSS-AES256-SHA9   zDHE-RSA-AES256-SHA:   zADH-AES256-SHA;   zNULL-SHA256<   zAES128-SHA256=   zAES256-SHA256>   zDH-DSS-AES128-SHA256?   zDH-RSA-AES128-SHA256@   zDHE-DSS-AES128-SHA256A   zCAMELLIA128-SHAB   zDH-DSS-CAMELLIA128-SHAC   zDH-RSA-CAMELLIA128-SHAD   zDHE-DSS-CAMELLIA128-SHAE   zDHE-RSA-CAMELLIA128-SHAF   zADH-CAMELLIA128-SHAb   zEXP1024-DES-CBC-SHAc   zEXP1024-DHE-DSS-DES-CBC-SHAd   zEXP1024-RC4-SHAe   zEXP1024-DHE-DSS-RC4-SHAf   zDHE-DSS-RC4-SHAg   zDHE-RSA-AES128-SHA256h   zDH-DSS-AES256-SHA256i   zDH-RSA-AES256-SHA256j   zDHE-DSS-AES256-SHA256k   zDHE-RSA-AES256-SHA256l   zADH-AES128-SHA256m   zADH-AES256-SHA256   zGOST94-GOST89-GOST89   zGOST2001-GOST89-GOST89   zGOST94-NULL-GOST94      zCAMELLIA256-SHA   zDH-DSS-CAMELLIA256-SHA   zDH-RSA-CAMELLIA256-SHA   zDHE-DSS-CAMELLIA256-SHA   zDHE-RSA-CAMELLIA256-SHA   zADH-CAMELLIA256-SHA   zPSK-RC4-SHA   zPSK-3DES-EDE-CBC-SHA   zPSK-AES128-CBC-SHA   zPSK-AES256-CBC-SHA   zSEED-SHA   zDH-DSS-SEED-SHA   zDH-RSA-SEED-SHA   zDHE-DSS-SEED-SHA   zDHE-RSA-SEED-SHA   zADH-SEED-SHA   zAES128-GCM-SHA256   zAES256-GCM-SHA384   zDHE-RSA-AES128-GCM-SHA256   zDHE-RSA-AES256-GCM-SHA384   zDH-RSA-AES128-GCM-SHA256   zDH-RSA-AES256-GCM-SHA384   zDHE-DSS-AES128-GCM-SHA256   zDHE-DSS-AES256-GCM-SHA384   zDH-DSS-AES128-GCM-SHA256   zDH-DSS-AES256-GCM-SHA384   zADH-AES128-GCM-SHA256   zADH-AES256-GCM-SHA384i V  TLS_FALLBACK_SCSVi  zECDH-ECDSA-NULL-SHAi  zECDH-ECDSA-RC4-SHAi  zECDH-ECDSA-DES-CBC3-SHAi  zECDH-ECDSA-AES128-SHAi  zECDH-ECDSA-AES256-SHAi  zECDHE-ECDSA-NULL-SHAi  zECDHE-ECDSA-RC4-SHAi  zECDHE-ECDSA-DES-CBC3-SHAi	  zECDHE-ECDSA-AES128-SHAi
  zECDHE-ECDSA-AES256-SHAi  zECDH-RSA-NULL-SHAi  zECDH-RSA-RC4-SHAi  zECDH-RSA-DES-CBC3-SHAi  zECDH-RSA-AES128-SHAi  zECDH-RSA-AES256-SHAi  zECDHE-RSA-NULL-SHAi  zECDHE-RSA-RC4-SHAi  zECDHE-RSA-DES-CBC3-SHAi  zECDHE-RSA-AES128-SHAi  zECDHE-RSA-AES256-SHAi  zAECDH-NULL-SHAi  zAECDH-RC4-SHAi  zAECDH-DES-CBC3-SHAi  zAECDH-AES128-SHAi  zAECDH-AES256-SHAi  zSRP-3DES-EDE-CBC-SHAi  zSRP-RSA-3DES-EDE-CBC-SHAi  zSRP-DSS-3DES-EDE-CBC-SHAi  zSRP-AES-128-CBC-SHAi  zSRP-RSA-AES-128-CBC-SHAi  zSRP-DSS-AES-128-CBC-SHAi   zSRP-AES-256-CBC-SHAi!  zSRP-RSA-AES-256-CBC-SHAi"  zSRP-DSS-AES-256-CBC-SHAi#  zECDHE-ECDSA-AES128-SHA256i$  zECDHE-ECDSA-AES256-SHA384i%  zECDH-ECDSA-AES128-SHA256i&  zECDH-ECDSA-AES256-SHA384i'  zECDHE-RSA-AES128-SHA256i(  zECDHE-RSA-AES256-SHA384i)  zECDH-RSA-AES128-SHA256i*  zECDH-RSA-AES256-SHA384i+  zECDHE-ECDSA-AES128-GCM-SHA256i,  zECDHE-ECDSA-AES256-GCM-SHA384i-  zECDH-ECDSA-AES128-GCM-SHA256i.  zECDH-ECDSA-AES256-GCM-SHA384i/  zECDHE-RSA-AES128-GCM-SHA256i0  zECDHE-RSA-AES256-GCM-SHA384i1  zECDH-RSA-AES128-GCM-SHA256i2  zECDH-RSA-AES256-GCM-SHA384i  zECDHE-RSA-CHACHA20-POLY1305i  zECDHE-ECDSA-CHACHA20-POLY1305i  zDHE-RSA-CHACHA20-POLY1305i   zGOST-MD5i  zGOST-GOST94i  zGOST-GOST89MACi  zGOST-GOST89STREAMi  i  zRC2-CBC-MD5zIDEA-CBC-MD5zDES-CBC-MD5zDES-CBC3-MD5z
RC4-64-MD5)i  i  i  i@  i  i  aF  ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHAc                        e Zd ZdZd fd	Zd Zd Zd Zddede	e
def         d	dfd
Zed             Zed	ee
         fd            Zed             Zd Zd Zd Zd Zd Z xZS )TlsLayeraa  
    The TLS layer implements transparent TLS connections.

    It exposes the following API to child layers:

        - :py:meth:`set_server_tls` to modify TLS settings for the server connection.
        - :py:attr:`server_tls`, :py:attr:`server_sni` as read-only attributes describing the current TLS settings for
          the server connection.
    Nc                     t                                          |           || _        || _        || _        d | _        d S N)super__init___client_tls_server_tls_custom_server_sni_client_hello)selfctx
client_tls
server_tlscustom_server_sni	__class__s        j/var/www/sysmax/venv/lib/python3.11/site-packages/seleniumwire/thirdparty/mitmproxy/server/protocol/tls.pyr{   zTlsLayer.__init__   sA    %%"3<@    c                    | j         rs	 t          j                            | j        j                  | _        nC# t          j        $ r1}| 	                    dt          |          z  d           Y d}~dS d}~ww xY w| j        oA| j        j        j        o0| j        j        j        p| j         o| j        j        p| j        j         }| j                                        r| j        p|}| j         r|r|                                  n2| j         r|                                  n|r|                                  | j                            |           } |             dS )a#  
        The strategy for establishing TLS is as follows:
            First, we determine whether we need the server cert to establish ssl with the client.
            If so, we first connect to the server and then to the client.
            If not, we only connect to the client and do the server handshake lazily.

        An additional complexity is that we need to mirror SNI and ALPN from the client when connecting to the server.
        We manually peek into the connection and parse the ClientHello message to obtain these values.
        zCannot parse Client Hello: %serrorN)r|   net_tlsClientHello	from_fileclient_connrfiler   r   TlsProtocolExceptionlogreprr}   configoptionsupstream_cert"add_upstream_certs_to_client_chainalpn_protocolssniserver_conn	connected%_establish_tls_with_client_and_server_establish_tls_with_client_establish_tls_with_serverr   
next_layer)r   e%client_tls_requires_server_connectionestablish_server_tls_nowlayers        r   __call__zTlsLayer.__call__   s     	%,%8%B%B4CSCY%Z%Z""2   8477BGLLL&  K- #F   &5 /*.. 	. ''))>d.> 21 	!
  	. 8 	.668888 	.++----% 	.++---##D))s   .8 A8&A33A8c                 J    | j         r	| j        rdS | j         rdS | j        rdS dS )NzTlsLayer(client and server)zTlsLayer(client)zTlsLayer(server)zTlsLayer(inactive))r|   r}   r   s    r   __repr__zTlsLayer.__repr__  sE     	( 0 	(00 	(%% 	(%%''r   c                     | j                                         s| j                                         | j        r"| j         j        s|                                  d S d S d S ry   )r   r   r   connectr}   tls_establishedr   r   s    r   r   zTlsLayer.connect)  sq    ))++ 	H 	.D$4$D 	.++-----	. 	. 	. 	.r   r   r   returnc                 "    || _         || _        dS )a  
        Set the TLS settings for the next server connection that will be established.
        This function will not alter an existing connection.

        Args:
            server_tls: Shall we establish TLS with the server?
            sni: ``str`` for a custom SNI value,
                ``None`` for the client SNI value,
                ``False`` if no SNI value should be sent.
        N)r}   r~   )r   r   r   s      r   set_server_tlszTlsLayer.set_server_tls/  s     &"%r   c                     | j         S )zm
        ``True``, if the next server connection that will be established should be upgraded to TLS.
        )r}   r   s    r   r   zTlsLayer.server_tls=  s    
 r   c                     | j         du rdS | j         r| j         S | j        r+| j        j        r| j        j                            d          S dS )z`
        The Server Name Indication we want to send with the next server TLS handshake.
        FNidna)r~   r   r   decoder   s    r   
server_snizTlsLayer.server_sniD  sb    
 "e++4$ 	** 	D$6$: 	%)008884r   c                 4    | j                                         S ry   )r   get_alpn_proto_negotiatedr   s    r   alpn_for_client_connectionz#TlsLayer.alpn_for_client_connectionR  s    99;;;r   c                     d}| j         |v rt          | j                   }n||v rt          |          }n|d         }|                     d|z  d           |S )Ns   http/1.1r   zALPN for client: %sdebug)r   bytesr   )r   conn_r   default_alpnchoices        r   __alpn_select_callbackzTlsLayer.__alpn_select_callbackV  si    "*g554:;;FFW$$<((FFQZF&/999r   c                     	 | j                                          |                                  n,# t          $ r 	 |                                  n#  Y nxY w w xY w|                                  d S ry   )r   r   r   	Exceptionr   r   s    r   r   z.TlsLayer._establish_tls_with_client_and_serverc  s    
	H++---- 	 	 	//1111	 	'')))))s    -0 
AAAAAc                    |                      dd           |                                 \  }}}| j        j        j        r| j        j        }nd }	 t          j        | j        j        j	                 \  }}| j
                            ||||| j        j        j        pt          | j        j        j        || j        |	  	         | j
        j                            d           d S # t&          j        $ r}| j        j        o| j        j                            d          }t'          j        d                    |t5          |                    |pt5          | j        j                            d }~ww xY w)NzEstablish TLS with clientr   )methodr   cipher_listdhparams
chain_filealpn_select_callbackextra_chain_certsr   r   z2Cannot establish TLS with client (sni: {sni}): {e})r   r   )r   
_find_certr   r   r   r   server_certsr   VERSION_CHOICESssl_version_clientr   convert_to_tlsciphers_clientDEFAULT_CLIENT_CIPHERS	certstorer   _TlsLayer__alpn_select_callbackr   peekr   TlsExceptionr   r   r   ClientHandshakeExceptionformatr   address)	r   certkeyr   extra_certs
tls_methodtls_optionsr   sni_strs	            r   r   z#TlsLayer._establish_tls_with_clientr  sz   ,g666 $ 1 1c:;A 	*7KKK	&-&=dk>Q>d&e#J++c!# K/>XBX.7%%)%@"- , 	 	 	 "''*****& 	 	 	(,V1C1G1N1Nv1V1VG5DKK477 L   94 0 899	  	s   BC" "E11A;E,,E1c                 D   |                      dd           	 d }| j        rN| j        j        rd | j        j        D             }|r*d|v r&| j        j        j        s|                    d           | j        j	        r3| j        
                                r| j        
                                g}| j        j        j        }|sh| j        rag }| j        j        D ]=}|t                                          v r |                    t          |                    >d                    |          }t#          j        | j        j                  }||d<    | j        j        d| j        |d| | j        j        }|9|                      t/          |          d           |                      dd           n# t0          j        $ r&}t1          j        t/          |                    d }~wt0          j        $ rb}t1          j        d	                    | j        j        d
         | j        j        d         | j        t?          |                              d }~ww xY w| j         r| j         !                                nd}|                      d                    |          d           d S )NzEstablish TLS with serverr   c                 f    g | ].}|                     d           |                     d          ,|/S )s   h2-s   spdy)
startswith).0xs     r   
<listcomp>z7TlsLayer._establish_tls_with_server.<locals>.<listcomp>  sN       \\&1156\\'5J5J  r   s   h2:r   )r   alpn_protosz>Ignoring server verification error, continuing with connectionz9Cannot establish TLS with {host}:{port} (sni: {sni}): {e}r   r   )hostportr   r   -zALPN selected by server: {} )"r   r|   r   r   r   r   http2remover   r   r   ciphers_servercipher_suitesCIPHER_ID_NAME_MAPkeysappendjoinr   client_arguments_from_optionsr   establish_tlsr   ssl_verification_errorstrr   InvalidCertificateExceptionInvalidServerCertificater   r   r   r   r   r   r   )r   alpnr   idargstls_cert_errr   protos           r   r   z#TlsLayer._establish_tls_with_server  s   ,g6669	D 
'%4  #'#5#D  D  'ETMM$+2E2KMKK&&&/ 	FD4D4^4^4`4` 	F (BBDDE
 "[0?N! :d&6 :!#,: F FB/446666&--.@.DEEE!$.!9!989LMMD"0D*D* O     
  +BL'\**G444Y[bccc5 	> 	> 	>5c!ff===& 	 	 	1KRR)1!4)1!41gg	 S    	 =A<[d/66888ad.55e<<gFFFFFs%   FF. .I=!GI0AIIc                    d}t                      }d}| j        j        r%| j        j        d                             d          }| j        o| j        j        o| j        j        j        }|r}| j        j        }|	                    |j
                   |j        rB|                    |           |j                            d                              d          }|j        r|j        }| j        j        r|                    | j        j                   | j        r-|                    | j                            d                     |r|                    |           | j        j                            |t)          |          |          S )z
        This function determines the Common Name (CN), Subject Alternative Names (SANs) and Organization Name
        our certificate should have and then fetches a matching cert from the certstore.
        Nr   r   utf8)setr   r   encoder   r   r   r   r   updatealtnamescnaddr   organizationr   r   r~   r   get_certlist)r   r   sansr   use_upstream_certr   s         r   r   zTlsLayer._find_cert  s|   
 uu
 # 	>#+A.55f==D  .,.K- 	
  	: ,1MKK./// F$'..v66==fEE) :,9! 	-HHT'+,,," 	=HHT,33F;;<<<  	HHTNNN{$--dDJJMMMr   ry   )__name__
__module____qualname____doc__r{   r   r   r   boolr   r   r   propertyr   r   r   r   r   r   r   r   r   __classcell__)r   s   @r   rw   rw      sm        A A A A A A8 8 8t( ( (. . .& & &E#tT/4J &VZ & & & &     X  HSM    X < < X<  * * *! ! !F>G >G >G@'N 'N 'N 'N 'N 'N 'Nr   rw   N)typingr   r   !seleniumwire.thirdparty.mitmproxyr   %seleniumwire.thirdparty.mitmproxy.netr   r   1seleniumwire.thirdparty.mitmproxy.server.protocolr   r   r   Layerrw   r   r   r   <module>r     s               8 8 8 8 8 8 @ @ @ @ @ @ B B B B B B{*{*{ 	*{ 	-	{
 	){ 	){ 	
{ 	.{ 	
{ 	-{ 	.{ 	
"{ 	
{ 	
{ 	
"{  	
!{" 	
#{ {$ 	
#%{& 	
'{( 	
 ){* 	
#+{, 	
-{. 	
 /{0 	
1{2 	-3{4 	
5{6 	
7{8 	
9{> 	
?{@ 	
A{B 	.C{D 	
E{F 	
G{H 	
I{ { {J 	.K{L 	
M{N 	
 O{P 	
 Q{R 	
S{T 	
 U{V 	
 W{X 	
Y{Z 	,[{\ 	
]{^ 	
_{` 	
a{b 	
c{d 	
e{f 	,g{h 	
i{j 	
k{ { {l 	
m{n 	
o{p 	
q{r 	-s{t 	/u{v 	/w{x 	
 y{z 	
 {{| 	
!}{~ 	
{@ 	
"A{B 	
"C{D 	
#E{F 	
#G{H 	
I{J 	
K{L 	
'M{ { {N 	
O{P 	
#Q{R 	
S{T 	
!U{V 	
 W{X 	
 Y{Z 	
![{\ 	
!]{^ 	
_{` 	
a{b 	
 c{d 	
"e{f 	
g{h 	
"i{j 	
k{l 	
"m{n 	
"o{ { {p 	
#q{r 	
#s{t 	
u{v 	-w{x 	
 y{z 	
{{| 	
}{N 	*O{P 	
Q{R 	
S{T 	
U{V 	
W{X 	.Y{Z 	
[{\ 	
]{^ 	
%_{` 	
%a{ { {b 	
$c{d 	
$e{f 	
%g{h 	
%i{j 	
$k{l 	
$m{n 	
!o{p 	
!q{r s{t !u{v  w{x %y{z #{{| #}{~ "{@ !A{B &C{ { {D $E{F $G{H I{J K{L #M{N !O{P !Q{R  S{T U{V $W{X "Y{Z "[{\ ]{^ O_{`  a{b c{d e{ { {f "g{h &i{j &k{l !m{n %o{p %q{r !s{t %u{v %w{x 'y{z '{{| &}{~ &{@ %A{B %C{D $E{F $G{ { {H +I{J +K{L *M{N *O{P )Q{R )S{T (U{V (W{X )Y{Z +[{\ ']{^ J_{` Ma{b c{d e{f ig{h mi{ {j u{ { { @W jN jN jN jN jNtz jN jN jN jN jNr   