
    <gP                     b   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y^(_      )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 | _        y N)super__init___client_tls_server_tls_custom_server_sni_client_hello)selfctx
client_tls
server_tlscustom_server_sni	__class__s        i/var/www/html/myenv/lib/python3.12/site-packages/seleniumwire/thirdparty/mitmproxy/server/protocol/tls.pyr{   zTlsLayer.__init__   s0    %%"3<@    c                 `   | j                   r9	 t        j                  j                  | j                  j
                        | _        | j                  xr | j                  j                  j                  xr_ | j                  j                  j                  xs= | j                   xr/ | j                  j                   xs | j                  j"                   }| j$                  j'                         xr | j                  xs |}| j                   r|r| j)                          n/| j                   r| j+                          n|r| j-                          | j.                  j1                  |       } |        y# t        j                  $ r(}| j                  dt        |      z  d       Y d}~yd}~ww xY w)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__   si    %,%8%8%B%B4CSCSCYCY%Z"(  KK-- ##FF    &&55 /**... 	. '')>d.>.> 21 	!
  8668++-%++-##D)U 22 847BGLs   8E2 2F-F((F-c                 j    | j                   r| j                  ry| j                   ry| j                  ryy)NzTlsLayer(client and server)zTlsLayer(client)zTlsLayer(server)zTlsLayer(inactive))r|   r}   r   s    r   __repr__zTlsLayer.__repr__  s1     0 00%%'r   c                     | j                   j                         s| j                  j                          | j                  r(| j                   j
                  s| j                          y y y ry   )r   r   r   connectr}   tls_establishedr   r   s    r   r   zTlsLayer.connect)  sP    ))+HHD$4$4$D$D++- %Er   r   r   returnc                      || _         || _        y)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y| j                   r| j                   S | j                  r;| j                  j                  r%| j                  j                  j                  d      S y)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  sa    
 ""e+$$***D$6$6$:$:%%))0088r   c                 6    | j                   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   }| j                  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  sY    "**g54::;FW$<(FQZF&/9r   c                     	 | j                   j                          | j                          | j	                          y # t        $ r 	 | j	                           #  Y  xY ww xY wry   )r   r   r   	Exceptionr   r   s    r   r   z.TlsLayer._establish_tls_with_client_and_serverc  se    
	HH++- 	'')  	//1 	s!   *= 	A AA AA c                    | j                  dd       | j                         \  }}}| j                  j                  j                  r| j
                  j                  }nd }	 t        j                  | j                  j                  j                     \  }}| j                  j                  ||||| j                  j                  j                  xs t        | j                  j                  j                  || j                   |	       | j                  j"                  j%                  d       y # t&        j(                  $ r}| j*                  j,                  xr% | j*                  j,                  j/                  d      }t'        j0                  dj3                  |t5        |            |xs t5        | j
                  j6                              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  s   ,g6 $ 1c:;;AA**77KK	&-&=&=dkk>Q>Q>d>d&e#J++c!# KK//>>XBX..77%%)%@%@"- , 	 ""''*&& 	((,,V1C1C1G1G1N1Nv1VG55DKK47 L  94 0 0 8 89	 	s   !CD- -G BGGc                 Z   | j                  dd       	 d }| j                  r| j                  j                  rE| j                  j                  D cg c]&  }|j	                  d      s|j	                  d      s|( }}|r5d|v r1| j
                  j                  j                  s|j                  d       | j                  j                  r5| j                  j                         r| j                  j                         g}| j
                  j                  j                  }|si| j                  r]g }| j                  j                  D ]1  }|t        j                         v s|j!                  t        |          3 dj#                  |      }t%        j&                  | j
                  j                        }||d<    | j(                  j*                  d| j,                  |d| | j(                  j.                  }|-| j                  t1        |      d       | j                  d	d       | jB                  r| jB                  jE                         nd}| j                  dj=                  |      d       y c c}w # t2        j4                  $ r#}t3        j6                  t1        |            d }~wt2        j8                  $ rn}t3        j:                  d
j=                  | j(                  j>                  d   | j(                  j>                  d   | j,                  tA        |                  d }~ww xY w)NzEstablish TLS with serverr   s   h2-s   spdys   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   
startswithr   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   alpnxr   idargstls_cert_errr   protos	            r   r   z#TlsLayer._establish_tls_with_server  s   ,g69	D%%44
 $(#5#5#D#D\\&1Q\\'5J D  ETM$++2E2E2K2KKK&//D4D4D4^4^4` ((BBDE
 "[[00??N!d&6&6!#,,:: FB/4466&--.@.DEF "%.!9889L9LMD"0D*D** OO  
  ++BBL'\*G4Y[bc =A<[<[//668ad.55e<gFkP 55 	>55c!f==&& 	11KRR))11!4))11!41g	 S  	s>   <I5 +I0;C#I5 CI5 0I5 5L*J&&L*<A)L%%L*c                    d}t               }d}| j                  j                  r(| j                  j                  d   j                  d      }| j                  xr8 | j                  j                  xr  | j
                  j                  j                  }|r| j                  j                  }|j                  |j                         |j                  r;|j                  |       |j                  j                  d      j                  d      }|j                  r|j                  }| j                  j                   r%|j                  | j                  j                          | j"                  r*|j                  | j"                  j                  d             |r|j                  |       | j
                  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  st   
 u
 ####++A.55f=D  .,,.KK-- 	
  ,,11MKK../$''..v6==fE)),99!!HHT''++,""HHT,,33F;< HHTN{{$$--dDJ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      s    A8t(.& &E#tT/4J &VZ &     HSM   < <*!F>G@'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 @ 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tzz jNr   