
    @OOf}                    `   d dl m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	 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 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 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" 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) d dl*m+Z+ d dl*m,Z, d dl*m-Z- d dl.m/Z/ d dl.m0Z0 d d l.m1Z1 d d!l2m3Z3 d d"l4m5Z5 d d#l4m6Z6 d dl4mZ d d$l4m7Z7 d d%l4m8Z8 d d&l9m:Z: d d'l;m<Z< d d(l=m>Z> d d)l=m?Z? d d*l=m@Z@ d d+l=mAZA d d,l=mBZB d d-lCmDZD d d.lEmFZF d d/lEmGZG d d0lEmHZH e G d1 d2             ZIe G d3 d4eH             ZJe G d5 d6e5j                               ZLe G d7 d8e5j                               ZMe G d9 d:ej                               ZOe G d; d<eO             ZPe G d= d>eO             ZQ G d? d@e5j                        ZS G dA dBeS      ZT G dC dDeS      ZU G dE dFeS      ZV G dG dHe5j                        ZX G dI dJej                        ZZ G dK dL      Z[d_dMZ\d`dNZ]	 da	 	 	 	 	 	 	 dbdOZ^e G dP dQe_             Z`dcdRZa G dS dTe7j                        Zc G dU dVe7j                        Ze G dW dXe7j                        Zf G dY dZe8j                        Zh G d[ d\eh      Zi G d] d^eh      Zjy)d    )annotationsN)Callable)	dataclass)field)DEBUG)ERROR)WARNING)
VerifyMode)Buffer)	ErrorCode)events)QuicConfiguration)QuicConnection)QuicConnectionError)QuicConnectionState)QuicErrorCode)stream_is_client_initiated)stream_is_unidirectional)encode_quic_version_negotiation)PACKET_TYPE_INITIAL)pull_quic_header)QuicProtocolVersion)CipherSuite)HandshakeType)x509)dsa)ec)rsa)certs)
connection)ctx)tls)commands)context)layer)tunnel)TransparentProxy)TCPLayer)TlsClienthelloHook)TlsEstablishedClientHook)TlsEstablishedServerHook)TlsFailedClientHook)TlsFailedServerHook)UDPLayer)ClientHello)ClientHelloData)TlsDatac                      e Zd ZU dZdZded<   	 dZded<   	  ee      Z	ded	<   	 dZ
d
ed<   	 dZded<   	 dZded<   	 dZded<   	 dZded<   y)QuicTlsSettingsz=
    Settings necessary to establish QUIC's TLS context.
    Nzlist[str] | Nonealpn_protocolszx509.Certificate | Nonecertificate)default_factoryzlist[x509.Certificate]certificate_chainzIdsa.DSAPrivateKey | ec.EllipticCurvePrivateKey | rsa.RSAPrivateKey | Nonecertificate_private_keyzlist[CipherSuite] | Nonecipher_suites
str | Noneca_pathca_filezVerifyMode | Noneverify_mode)__name__
__module____qualname____doc__r4   __annotations__r5   r   listr7   r8   r9   r;   r<   r=        \/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/mitmproxy/proxy/layers/quic.pyr3   r3   7   s     (,N$+-+/K(/405d0K-K@ 	 Q ).2M+2?GZqGZZ%)K")\rE   r3   c                       e Zd ZU dZdZded<   y)QuicTlsDatazQ
    Event data for `quic_start_client` and `quic_start_server` event hooks.
    NQuicTlsSettings | Nonesettings)r>   r?   r@   rA   rJ   rB   rD   rE   rF   rH   rH   Q   s     (,H$+rE   rH   c                      e Zd ZU dZded<   y)QuicStartClientHookz
    TLS negotiation between mitmproxy and a client over QUIC is about to start.

    An addon is expected to initialize data.settings.
    (by default, this is done by `mitmproxy.addons.tlsconfig`)
    rH   dataNr>   r?   r@   rA   rB   rD   rE   rF   rL   rL   ^        rE   rL   c                      e Zd ZU dZded<   y)QuicStartServerHookz
    TLS negotiation between mitmproxy and a server over QUIC is about to start.

    An addon is expected to initialize data.settings.
    (by default, this is done by `mitmproxy.addons.tlsconfig`)
    rH   rM   NrN   rD   rE   rF   rQ   rQ   j   rO   rE   rQ   c                      e Zd ZU dZded<   y)QuicStreamEventz&Base class for all QUIC stream events.int	stream_idNrN   rD   rE   rF   rS   rS   v   s    0N7rE   rS   c                  0    e Zd ZU dZded<   	 ded<   	 d Zy)QuicStreamDataReceivedz:Event that is fired whenever data is received on a stream.bytesrM   bool
end_streamc                    t        | j                        j                  j                         }| j                  rdnd}d| d| j
                   d| | j                  dS )N[end_stream]  zQuicStreamDataReceived( on , )typer    r>   lowerrZ   rU   rM   selftargetrZ   s      rF   __repr__zQuicStreamDataReceived.__repr__   sY    doo&//557(,_R
(T^^4DBzlSWS\S\R__`aarE   N)r>   r?   r@   rA   rB   rg   rD   rE   rF   rW   rW   ~   s    D
K&7brE   rW   c                      e Zd ZU dZded<   y)QuicStreamResetz9Event that is fired when the remote peer resets a stream.rT   
error_codeNrN   rD   rE   rF   ri   ri      s    CO2rE   ri   c                  2     e Zd ZU dZded<   	 d fdZ xZS )QuicStreamCommandz(Base class for all QUIC stream commands.rT   rU   c                2    t         |   |       || _        y N)super__init__rU   )re   r    rU   	__class__s      rF   rp   zQuicStreamCommand.__init__   s    $"rE   )r    connection.ConnectionrU   rT   returnNoner>   r?   r@   rA   rB   rp   __classcell__rq   s   @rF   rl   rl      s    2N:# #rE   rl   c                  Z     e Zd ZU dZded<   	 ded<   	 	 d	 	 	 	 	 	 	 	 	 d	 fdZd Z xZS )
SendQuicStreamDataz$Command that sends data on a stream.rX   rM   rY   rZ   c                B    t         |   ||       || _        || _        y rn   )ro   rp   rM   rZ   )re   r    rU   rM   rZ   rq   s        rF   rp   zSendQuicStreamData.__init__   s"     	Y/	$rE   c                    t        | j                        j                  j                         }| j                  rdnd}d| d| j
                   d| | j                  dS )Nr\   r]   zSendQuicStreamData(r^   r_   r`   ra   rd   s      rF   rg   zSendQuicStreamData.__repr__   sU    doo&//557(,_R
$VHD0@:,tyym[\]]rE   F)
r    rr   rU   rT   rM   rX   rZ   rY   rs   rt   )r>   r?   r@   rA   rB   rp   rg   rv   rw   s   @rF   ry   ry      sW    .
K(@ !	%)	% 	% 		%
 	% 
	%^rE   ry   c                  B     e Zd ZU dZded<   	 	 	 	 	 	 	 	 	 d fdZ xZS )ResetQuicStreamz0Abruptly terminate the sending part of a stream.rT   rj   c                4    t         |   ||       || _        y rn   ro   rp   rj   re   r    rU   rj   rq   s       rF   rp   zResetQuicStream.__init__        	Y/$rE   r    rr   rU   rT   rj   rT   rs   rt   ru   rw   s   @rF   r~   r~      s8    :OA%/%<?%MP%	% %rE   r~   c                  B     e Zd ZU dZded<   	 	 	 	 	 	 	 	 	 d fdZ xZS )StopQuicStreamz6Request termination of the receiving part of a stream.rT   rj   c                4    t         |   ||       || _        y rn   r   r   s       rF   rp   zStopQuicStream.__init__   r   rE   r   ru   rw   s   @rF   r   r      s8    @OC%/%<?%MP%	% %rE   r   c                  ^     e Zd ZU dZded<   	 ded<   	 ded<   	 	 	 	 	 	 	 	 	 	 	 d	 fdZ xZS )
CloseQuicConnectionzClose a QUIC connection.rT   rj   
int | None
frame_typestrreason_phrasec                N    t         |   |       || _        || _        || _        y rn   ro   rp   rj   r   r   re   connrj   r   r   rq   s        rF   rp   zCloseQuicConnection.__init__   (     	$$*rE   
r   rr   rj   rT   r   r   r   r   rs   rt   ru   rw   s   @rF   r   r      sZ    "OEID
+#
+ 
+ 	
+
 
+ 

+ 
+rE   r   c                  ^     e Zd ZU dZded<   	 ded<   	 ded<   	 	 	 	 	 	 	 	 	 	 	 d	 fdZ xZS )
QuicConnectionClosedz QUIC connection has been closed.rT   rj   r   r   r   r   c                N    t         |   |       || _        || _        || _        y rn   r   r   s        rF   rp   zQuicConnectionClosed.__init__   r   rE   r   ru   rw   s   @rF   r   r      sZ    *OEID
+#
+ 
+ 	
+
 
+ 

+ 
+rE   r   c                  <     e Zd ZU ded<   d fdZddZddZ xZS )	QuicSecretsLoggertls.MasterSecretLoggerloggerc                0    t         |           || _        y rn   )ro   rp   r   )re   r   rq   s     rF   rp   zQuicSecretsLogger.__init__	  s    rE   c                ~    |dd  dk(  r|d d }|j                  d      }| j                  d |       t        |      dz   S )N
ascii   )encoder   len)re   srM   s      rF   writezQuicSecretsLogger.write  sD    RS6T>#2Axx D$4y1}rE   c                     y rn   rD   re   s    rF   flushzQuicSecretsLogger.flush  s    rE   )r   r   rs   rt   )r   r   rs   rT   rs   rt   )r>   r?   r@   rB   rp   r   r   rv   rw   s   @rF   r   r     s    ""rE   r   c                    	 t        |       j                  S # t        $ r1 	 t        |       j                  cY S # t        $ r d| ddcY cY S w xY ww xY w)z`Returns the corresponding name of the given error code or a string containing its numeric value.zunknown error (0xxr`   )H3ErrorCodename
ValueErrorr   rj   s    rF   error_code_to_strr     s]    7:&+++ 7	7 ,111 	7&z!nA66	77s)    	A8AAAAAc                F    | t         j                  t        j                  fv S )zAReturns whether the given error code actually indicates no error.)r   NO_ERRORr   H3_NO_ERRORr   s    rF   is_success_error_coder   %  s      -00+2I2IJJJrE   c                "   t        | j                  |t        j                  t	        t        j                        nd|| j
                  | j                  | j                  | j                  | j                  | j                  | j                  d      S )z2Converts `QuicTlsSettings` to `QuicConfiguration`.Ni   )r4   	is_clientsecrets_log_fileserver_namecafilecapathr5   r7   r9   private_keyr=   max_datagram_frame_size)r   r4   r"   log_master_secretr   r<   r;   r5   r7   r9   r8   r=   rJ   r   r   s      rF   tls_settings_to_configurationr   +  s     .. $$0 c334(("44,,44(( %! rE   c                      e Zd ZU dZded<   y)QuicClientHelloz4Helper error only used in `quic_parse_client_hello`.rX   rM   NrN   rD   rE   rF   r   r   F  s
    >
KrE   r   c                "   t        |       }t        |d      }|j                  t        k7  rt	        d      t        t        ddd      |j                        j                  	 	 	 	 	 	 	 	 	 	 dddfd	}|_        	 j                  | d
d       t	        d      # t        $ r=}	 t        |j                        cY d}~S # t        $ r}t	        d      |d}~ww xY wd}~wt        $ r}t	        |j                        |d}~ww xY w)z2Helper function that parses a client hello packet.rM      zPacket is not initial one.Fr]   )r   r5   r   configuration"original_destination_connection_idc                    | j                         t        j                  k(  sJ d}| j                  d      D ]
  }|dz  |z  } | j	                         }t        | j                  |||z               )Nr      r   )
pull_uint8r   CLIENT_HELLO
pull_bytestellr   
data_slice)	input_bufinitial_bufhandshake_buf
onertt_buflengthboffsets          rF   server_handle_hello_replacementz@quic_parse_client_hello.<locals>.server_handle_hello_replacementa  sv     ##%)C)CCCC%%a( 	'AkQ&F	'!i2266F?KLLrE   c                d    	  |       j                   _        S # j                   _        w xY wrn   )r"   _server_handle_hello)peer_cid_initializequicr   s    rF   initialize_replacementz7quic_parse_client_hello.<locals>.initialize_replacementn  s+    	Lx(,KDHH),KDHH)s    /)z0.0.0.0r   r   nowNzInvalid ClientHello data.zNo ClientHello returned.)
r   
QuicBufferr   r   r   r   r   r   rs   rt   )r   rX   rs   rt   )r   r   packet_typer   r   r   r   destination_cidr   receive_datagramr   r/   rM   EOFErrorr   r   )	rM   bufferheaderr   helloer   r   r   s	         @@@rF   quic_parse_client_hellor   M  s=    T"Ffa(F00566 '

 ,2+A+AD ""KMMM "M 	M
 
ML .D1dN: /
00  A	Auzz** 	A89q@	A 1)q01sB   B& &	D0C
D
	C$CC$$C''D3D		Dc                  n     e Zd ZdZ	 d	 	 	 	 	 	 	 d fdZedd       Zej                  dd       Z xZS )	QuicStreamNextLayerzJ`NextLayer` variant that callbacks `QuicStreamLayer` after layer decision.c                B    t         |   ||       || _        d | _        y rn   )ro   rp   _stream_layer)re   r$   streamask_on_startrq   s       rF   rp   zQuicStreamNextLayer.__init__  s"     	,/*.rE   c                    | j                   S rn   )r   r   s    rF   r%   zQuicStreamNextLayer.layer  s    {{rE   c                `    || _         | j                   r| j                  j                          y y rn   )r   r   refresh_metadata)re   values     rF   r%   zQuicStreamNextLayer.layer  s%    ;;LL))+ rE   r|   )r$   context.Contextr   QuicStreamLayerr   rY   rs   rt   )rs   layer.Layer | None)r   r   rs   rt   )	r>   r?   r@   rA   rp   propertyr%   setterrv   rw   s   @rF   r   r     sb    T #	/ /  / 	/
 
/   \\, ,rE   r   c                  j     e Zd ZU dZded<   	 ded<   	 ded<   	 d fdZdd	Zdd
ZddZddZ	 xZ
S )r   zp
    Layer for QUIC streams.
    Serves as a marker for NextLayer and keeps track of the connection states.
    zconnection.Clientclientzconnection.Serverserverlayer.Layerchild_layerc                   |j                   j                         x| _         |_         d| j                   _        t        j                  j
                  | j                   _        t        |      rNt        |      rt        j                  j                  nt        j                  j                  | j                   _        || _        t        j                  |j                  j                  d      x| _        |_        d | _        t         | E  |       |rt%        |d      nt'        ||       | _        | j+                          | j(                  j,                  | _        | j(                  j.                  | _        y )Ntcp)addresstransport_protocolTignore)r   copyr   r    ConnectionStateOPENstater   r   CAN_READ	CAN_WRITE_client_stream_idServerr   r   _server_stream_idro   rp   r(   r   r   r   handle_event_handle_event)re   r$   r  rU   rq   s       rF   rp   zQuicStreamLayer.__init__  s-   '.~~':':'<<gn).&&66;; $I. .i8 **33//99 KK
 "+ (2'8'8NN**$(
 	
gn .2 	!  WT*$Wd3 	
 	 !,,99!--;;rE   c                    t         rn   )AssertionErrorre   events     rF   r  zQuicStreamLayer._handle_event  s    rE   c                z   | j                   J || _         t        j                         | j                  _        t	        |      r?t        |      rt        j                  j                  n3t        j                  j                  nt        j                  j                  | j                  _        | j                          y rn   )r
  timer   timestamp_startr   r   r    r  r  r  r  r  r   )re   server_stream_ids     rF   open_server_streamz"QuicStreamLayer.open_server_stream  s    %%---!1&*iik# ((89 ..>? **44//88 ++00 	 	rE   c                J   | j                   }	 t        |t        j                        r|j                  }n(t        |t        j
                        r|j                   }nnPt        |t        t        f      r|j                  rt        | j                        |j                  j                  d<   t        | j                        rdnd|j                  j                  d<   | j                  |j                  j                  d<   | j                  |j                  j                  d<   y y y )Nquic_is_unidirectionalr   r   quic_initiatorquic_stream_id_clientquic_stream_id_server)r   
isinstancer%   	NextLayerr&   TunnelLayerr.   r(   flowr   r  metadatar   r
  )re   r   s     rF   r   z QuicStreamLayer.refresh_metadata  s    *.*:*:+u7)//K););<)55  kHh#78[=M=M()?)?@ %%&>?
 .d.D.DE  %%&67
 BFAWAWK%%&=>AEAWAWK%%&=> >N8rE   c                6    |r| j                   S | j                  S rn   )r  r
  )re   r   s     rF   rU   zQuicStreamLayer.stream_id  s    )/t%%KT5K5KKrE   )r$   r   r  rY   rU   rT   rs   rt   r  events.Eventrs   layer.CommandGenerator[None]r   )r   rY   rs   r   )r>   r?   r@   rA   rB   rp   r  r  r   rU   rv   rw   s   @rF   r   r     sA    
 jj#!<F X,LrE   r   c                       e Zd ZU dZded<   	 ded<   	 ded<   	 ded<   	 d	ed
<   	 ded<   	 ded<   	 dd fdZddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 d	 	 	 	 	 ddZ	ddZ
 xZS )RawQuicLayerzo
    This layer is responsible for de-multiplexing QUIC streams into an individual layer stack per stream.
    rY   r  r   datagram_layerzdict[int, QuicStreamLayer]client_stream_idsserver_stream_idsz(dict[connection.Connection, layer.Layer]connectionsz#dict[commands.Command, layer.Layer]command_sourcesz	list[int]next_stream_idc                   t         |   |       || _        |r%t        | j                  j                         d      n,t        j                  | j                  j                               | _        i | _	        i | _
        |j                  | j                  |j                  | j                  i| _        i | _        g d| _        y )NTr   )r   r      r   )ro   rp   r  r.   r$   forkr%   r  r&  r'  r(  r   r   r)  r*  r+  )re   r$   r  rq   s      rF   rp   zRawQuicLayer.__init__  s    !  T\\&&(6!2!2!45 	
 "$!#NND//NND//
  "*rE   c              #  "  K   t        |t        j                        r| j                  j                  j
                  jt        j                  | j                  j                        }|r=t        j                  | j                  j                         | j                  | _        y | j                  | j                  |      E d {    y t        |t        j                        r>| j                  | j                  j!                  |j"                        |      E d {    y t        |t        j$                        r|j&                  j(                  | j*                  v r<| j                  | j*                  |j&                  j(                     |      E d {    y |j&                  j,                  | j*                  v r<| j                  | j*                  |j&                  j,                     |      E d {    y t/        d|j&                        t        |t0              r |j2                  | j                  j                  u s#|j2                  | j                  j                  u r|j2                  | j                  j                  u }|r| j4                  n| j6                  }|j8                  |v r||j8                     }nt;        |j8                        |k(  sJ |r|j8                  }d }n2| j=                  dt?        |j8                              }|j8                  }tA        | j                  jC                         | jD                  |      }|| j4                  |<   | |jG                  |       || j6                  |<   || j*                  |j                  <   || j*                  |j                  <   | j                  |t        j                               E d {    |r|j                  n|j                  }t        |tH              rk|jJ                  r8| j                  |t        jL                  ||jJ                              E d {    |jN                  r| jQ                  ||      E d {    y t        |tR              r| jQ                  ||      D ]{  }	t        |	tT              re|	j8                  |j9                  |       k(  rF|	jN                  r:|	jJ                  s.tW        |	j2                  |	j8                  |jX                         x|	 } y t/        d|      y t        |tZ              r|j2                  | j                  j                  u s#|j2                  | j                  j                  u r|j2                  | j                  j                  u }|r| j                  j                  n| j                  j                  }
|
j\                  r/t_        |
|jX                  |j`                  |jb                         n| j                  | _        | j                  | j                  |      D ]/  }	t        |	t        j                        r|	j2                  |
us,|	 1 | j*                  je                         D ]  \  }}t        |t@              s|r||j                  u s(n||j                  u s8|xjf                  t2        jh                  jj                   z  c_3        | jQ                  ||      D ]#  }	t        |	tT              r|	jJ                  s |	 %  y t        |t        jl                        r2| j                  | j*                  |j2                     |      E d {    y t/        d|      7 7 ]7 7 7 7 @7 7 (w)NzFlow not associated: Fr   is_unidirectionalzUnexpected stream event: Unexpected event: )7r  r   Startr$   r   r  r#   OpenConnectionCloseConnectionr   doner  event_to_childr&  CommandCompletedr*  popcommandMessageInjectedr  client_connr)  server_connr  rS   r    r'  r(  rU   r   get_next_available_stream_idr   r   r.  r  r  rW   rM   DataReceivedrZ   close_stream_layerri   ry   r~   rj   r   	connectedr   r   r   itemsr  r  r  ConnectionEvent)re   r  errfrom_client
stream_idsstream_layerclient_stream_idr  r   r:  
other_connr   s               rF   r  zRawQuicLayer._handle_event  sb    eV\\*||""22:$33DLL4G4GHH"224<<3F3FGG)-D&**4+>+>FFF v667**$$((7  
 v556zz%%)9)99..$$UZZ%;%;<e   ''4+;+;;..$$UZZ%;%;<e   %'<UZZN%KLL / 3 334<<#6#66**dll.A.AAK +6&&4;Q;Q  *,)%//: 2%//BkQQQ ',$'+$'+'H'H"'*B5??*S (I ($ (-$  /LL%%'6F  <H&&'78#/ 334DE?KD**+;<8D  !4!458D  !4!45..|V\\^LLL +6<&&<;N;ND%!78::#22$f&9&9$

&K    ###66|[QQQE?3#66|[Q &G"7,>?#--1G1GK1XX#.. '-#..0A0A5CSCS  && %'@	%JKK# $( 34 3 334<<#6#66**dll.A.AAK0;,,ATATJ ##) 0 0%2B2BEDWDW  &*YY"  ..t/B/BEJ ""7H,D,DE));!M" &*%5%5%;%;%= 	*!kk?;" [///+"4"44JJ:#=#=#G#G"GGJ#'#:#:;#T *)'3EF',,")M*	* v556**4+;+;E<L<L+MuUUU !#5eY!?@@A GX M Rp Vs   C^]8A^];A7^]>A^4^5G$^^A-^^%^-^
.G.^6^^%^5A^A^$^%^;^>^^^^
^^c              #  b  K   |r|j                   n|j                  }|xj                  t        j                  j
                   z  c_        |j                  J |j                  Gt        j                         |_        | j                  |t        j                  |            E d{    yy7 w)z)Closes the incoming part of a connection.N)r   r   r  r    r  r  r  timestamp_endr  r7  r   ConnectionClosed)re   rG  r   r   s       rF   r@  zRawQuicLayer.close_stream_layer  s     
 '-|"",2E2E

z11::::
##///%!%D**<9P9PQU9VWWW &Ws   B$B/&B-'B/c              #    K   |j                  |      D ]W  }t        |t              rt        |t        j                        r|j
                  |j                  u s|j
                  |j                  u r|j
                  |j                  u }|r| j                  j                  n| j                  j                  }|j                  |      }t        |t        j                        rR|J |j
                  j                  t
        j                  j                  z  s	t        |||j                         $t        |t        j                         r|J |j
                  j                  t
        j                  j                  z  rI|j
                  xj                  t
        j                  j                   z  c_        t        ||dd       t        |t        j"                        xr |j$                  }|rt'        |      |k(  st)        |      st+        ||t,        j.                         | j1                  ||      E d{    :t        |t        j2                        r|rJ |J |j                  d      }|J | j5                  dt)        |            }|j7                  |       || j8                  |<   | j;                  |t=        j>                  |d            E d{    tA        d|      |jB                  st        |t        jD                        r|| jF                  |<   t        |t        j2                        r|| jH                  |j
                  <   | Z y7 )7 w)z8Forwards events to child layers and translates commands.NrE   T)rZ   )r   r0  z&Unexpected stream connection command: )%r  r  r   r#   ConnectionCommandr    r   r   r$   rU   SendDatar  r  r  ry   rM   r5  CloseTcpConnection
half_closer   r   r   r   r   r@  r4  r>  r  r(  r7  r   OpenConnectionCompletedr  blockingRequestWakeupr*  r)  )	re   r   r  r:  	to_client	quic_connrU   only_close_our_halfrH  s	            rF   r7  zRawQuicLayer.event_to_child  s"    
 #//6 H	G ;8w(B(BC&&+*<*<<))[-?-?? $..+2D2DD	3<DLL//$,,BUBU	'11)<	 gx'8'89$000))//*2L2L2V2VV0Iw||TT  )A)AB$000))//*2L2L2V2VV**00'77AAA0 1%y#$ 
 #7H,G,GH /#.. ( /5%&'.Fy.Q"0 )9m6L6L#  $(#:#:;	#RRR  )@)@A((=$,,,'2'<'<D'<'I$+777 $ A A"&*BCS*T !B !I  229=8CD**95#22#V%C%CGT%R   
 )@L  ##z'8;Q;Q'R4?D((1gx'>'>?;FD$$W%7%78QH	V Ss4   DM5CM5<AM5M0B#M5+M3,BM53M5c                ~    t        |      dz  t        |       z  }| j                  |   }|dz   | j                  |<   |S )Nr      )rT   r+  )re   r   r1  indexrU   s        rF   r>  z)RawQuicLayer.get_next_available_stream_id  sJ     &'1,	M0BB''.	%.]E"rE   c              #  $   K   dE d {    y 7 wNrD   rD   )re   _s     rF   r6  zRawQuicLayer.done          r|   )r$   r   r  rY   rs   rt   r!  )rG  r   r   rY   rs   r#  )r   r   r  r"  rs   r#  )r   rY   r1  rY   rs   rT   rs   r#  )r>   r?   r@   rA   rB   rp   r  r@  r7  r>  r6  rv   rw   s   @rF   r%  r%    s     L; 21F11F99%88?c+"IAV
X+
X59
X	%
XM&M/;M	%M` :?26	rE   r%  c                       e Zd ZU dZded<   dZded<   	 	 	 	 	 	 	 	 d fdZd fdZd fdZ	 	 	 	 d fd	Z		 	 	 	 dd
Z
ddZ	 	 	 	 ddZd fdZddZddZddZ	 	 	 	 d fdZ xZS )	QuicLayerNzQuicConnection | Noner   rI   r"   c                    t         |   |||       t        j                  | j                  d      | _        |xs$ t        j                  j                  j                  | _
        t               | _        d|_        y )N)tunnel_connectionr   T)r   )ro   rp   r%   r  r$   r   r!   master
event_loopr  _timedict_wakeup_commandsr"   re   r$   r   r  rq   s       rF   rp   zQuicLayer.__init__  s]     	DtD ??4<<dK7SZZ2277
EIVrE   c              #  2  K   t        |t        j                        r|j                  | j                  v r| j
                  sJ | j                  j                  |j                        }| j
                  j                  t        j                  urkt        || j                               }| j
                  j                  |       t        | 9  t        j                  | j                   d            E d {    y y t        | 9  |      E d {    y 7 7 w)NrE   )r  r   Wakeupr:  ri  r   r9  _stater   
TERMINATEDmaxrg  handle_timerro   r  r?  rd  )re   r  scheduled_timer   rq   s       rF   r  zQuicLayer._handle_event!  s     eV]]+AVAV0V 999!2266u}}ENyy':'E'EE.$**,7		&&s+ 70''(>(>D  	 F w,U333	 4s$   C1D4D5DDDDc              #     K   t         |   |      E d {    | j                  r| j                         E d {    y y 7 *7 wrn   )ro   r7  r   tls_interact)re   r  rq   s     rF   r7  zQuicLayer.event_to_child1  sC      7)%00099((***  	1*s   AA#AAAAc              #    K   t        |t              r&|j                  | j                  u r| j                  sJ t        |t
              r<| j                  j                  |j                  |j                  |j                         yt        |t              r1| j                  j                  |j                  |j                         yt        |t              rS|j                  | j                  j                  v r?| j                  j                  |j                  |j                         yt!        d|      yt"        | I  |      E d{    y7 w)z:Turns stream commands into aioquic connection invocations.zUnexpected stream command: N)r  rl   r    r   r   ry   send_stream_datarU   rM   rZ   r~   reset_streamrj   r   _streamsstop_streamr  ro   _handle_commandre   r:  rq   s     rF   ry  zQuicLayer._handle_command8  s      g01g6H6HDII6U999'#56		**%%w||W5G5G G_5		&&w'8'8':L:LMG^4$$		(:(::II))'*;*;W=O=OP$'B7+%NOO ;
 w.w777s   E
EEEc              #  (  K   | j                   rJ | j                  rJ t        | j                  | j                        }| j                  | j                  j
                  u rt        |       nt        |       |j                  s>t        j                  dt               t        j                  | j                         yt        |j                  | j                  | j                  j                  u | j                  j                        }t!        ||      | _         |j                  | _        |X| j                   j#                  | j                  j$                  | j'                                | j)                         E d{    yy7 w)z!Initiates the aioquic connection.z1No QUIC context was provided, failing connection.Nr   r   r   )r   r"   rH   r   r$   r   rL   rQ   rJ   r#   Logr   r5  r   r   snir   connectpeernamerg  rs  )re   r   tls_datar   s       rF   	start_tlszQuicLayer.start_tlsM  s=     99}88| tyy$,,799+++%h//%h//  ,,Ce  **49955 6&&ii4<<#6#66		

 #'/Q
	 $$ .5IIdii00djjlC((*** 6*s   FF	F
Fc              #     K   | j                   sJ | j                         }| j                   j                  |      D ]B  \  }}|| j                  j                  k(  sJ t        j                  | j                  |       D | j                   j                         }|^|dz   t        fd| j                  j                         D              s,t        j                  ||z
        }|| j                  |<   | yyyw)zGRetrieves all pending outgoing packets from aioquic and sends the data.r   NgMb`?c              3  (   K   | ]	  }|k    y wrn   rD   ).0existingsmootheds     rF   	<genexpr>z)QuicLayer.tls_interact.<locals>.<genexpr>  s      )1H$s   )r   rg  datagrams_to_sendr   r  r#   rO  rd  	get_timeranyri  valuesrT  )re   r   rM   addrtimerr:  r  s         @rF   rs  zQuicLayer.tls_interactt  s      yyyjjl))55#5> 	BJD$499-----##D$:$:DAA	B 		##%u}H 595J5J5Q5Q5S  #00=16%%g.	 s   C;C>c              #    K   | j                   sJ |r@| j                   j                  || j                  j                  | j	                                | j                   j                         x}r=t        |t        j                        r'|j                  xs t        |j                        }d|fS t        |t        j                        rlg }| j                   j                  j                  r/|j                  | j                   j                  j                         |j!                  | j                   j                  j"                         t%        j$                         | j                  _        |j(                  r*|j(                  j+                  d      | j                  _        |D cg c]  }t/        j0                  |       c}| j                  _        | j                   j                  j4                  sJ | j                   j                  j4                  j6                  j8                  | j                  _        d| j                  _        | j>                  r5tA        jB                  | j>                   d| j                   tD               | j                  | jF                  jH                  u r8tK        tM        | j                  | jF                  | j                               n7tO        tM        | j                  | jF                  | j                               | jQ                         E d {    yt        |t        jR                  t        jT                  t        jV                  t        jX                  f      rnt[        d|      | j                   j                         x}r=| jQ                         E d {    y	c c}w 7 7 w)
Nr   Fr   QUICz[quic] tls established: rJ   TNr2  FN).r   r   r   r  rg  
next_eventr  quic_eventsConnectionTerminatedr   r   rj   HandshakeCompletedr"   _peer_certificateappendextend_peer_certificate_chainr  timestamp_tls_setupalpn_protocolr   alpnr   Certcertificate_listkey_schedulecipher_suiter   ciphertls_versiondebugr#   r|  r   r$   r   r*   rH   r+   rs  ConnectionIdIssuedConnectionIdRetiredPingAcknowledgedProtocolNegotiatedr  )re   rM   r  rD  	all_certscerts         rF   receive_handshake_dataz QuicLayer.receive_handshake_data  s     yyy II&&tTYY-?-?TZZ\&R yy++--e-%!A!AB))P->u?O?O-Pcz!E;#A#AB46	99==22$$TYY]]%D%DE  !F!FG 15				-&&%*%8%8%?%?%HDIINKT-U4ejj.>-U		*yy}}1111#'99==#=#=#J#J#O#O		 (.		% ::",,::,&>tyykJE  99 3 332#DIIt||dhhO  3#DIIt||dhhO   ,,...!22330022	 $'9%%CDD_ yy++--e-d $$&&&I .V& /  	's8   F'O)OE-O2O3A8O-O OOOc              #    K   || j                   _        | j                   | j                  j                  u r8t	        t        | j                   | j                  | j                               n7t        t        | j                   | j                  | j                               t        | %  |      E d {    y 7 w)Nr  )
r   errorr$   r   r,   rH   r"   r-   ro   on_handshake_errorre   rD  rq   s     rF   r  zQuicLayer.on_handshake_error  s     		99+++%DIIt||dhhG  &DIIt||dhhG  7-c222s   B5C 8B>9C c              #    K   | j                   sJ |r@| j                   j                  || j                  j                  | j	                                | j                   j                         x}r;t        |t        j                        r| j                  r\|j                  xs t        |j                        }t        j                  | j                   d| j                   d| dt               t        j                   | j"                         y t        |t        j$                        rC| j'                  t)        j*                  | j                  |j,                              E d {    nt        |t        j.                        rN| j'                  t1        | j                  |j2                  |j,                  |j4                              E d {    nt        |t        j6                        rC| j'                  t9        | j                  |j2                  |j                              E d {    nWt        |t        j:                  t        j<                  t        j>                  t        j@                  f      rntC        d|      | j                   j                         x}r;| jE                         E d {    y 7 Z7 7 7 w)Nr   z[quic] close_notify z	 (reason=r`   r2  )#r   r   r   r  rg  r  r  r  r  r  r   r   rj   r#   r|  r   r5  rd  DatagramFrameReceivedr7  r   r?  rM   StreamDataReceivedrW   rU   rZ   StreamResetri   r  r  r  r  r  rs  )re   rM   r  reasons       rF   receive_datazQuicLayer.receive_data  sC    yyy II&&tTYY-?-?TZZ\&R yy++--e-%!A!AB::"00W4EeFVFV4WF",,::,&:499+YvhVWX  ..t/E/EFFE;#D#DE..''		5::>   E;#A#AB..*		5??EJJ@P@P  
 E;#:#:;..#DIIu@P@PQ   22330022	 $'9%%CDDQ yy++--e-V $$&&&7" 	'sQ   E(K*K+A(KKAK0K	1A8K+K>K?KK	KKc              #  @  K   | j                   sJ | j                   j                  xs% t        j                  t        j
                  d d      }| j                  t        | j                  |j                  |j                  |j                              E d {    y 7 w)NzConnection closed.)r   _close_eventr  r  r   r   r7  r   r   rj   r   r   )re   close_events     rF   receive_closezQuicLayer.receive_close  s     yyy ii,, 
0P0P""D*>1
 && 		&&&&))	
 	
 	
s   BBBBc              #     K   | j                   sJ |r| j                   j                  |       | j                         E d {    y 7 wrn   )r   send_datagram_framers  )re   rM   s     rF   	send_datazQuicLayer.send_data  s9     yyyII))$/$$&&&s   ?A	AA	c              #  X  K   | j                   r~t        |t              r<| j                   j                  |j                  |j
                  |j                         n| j                   j                          | j                         E d {    t        | %  |      E d {    y 7 7 wrn   )
r   r  r   closerj   r   r   rs  ro   
send_closerz  s     rF   r  zQuicLayer.send_close"  s      99'#67		&&(:(:G<Q<Q 		!((***7%g... +.s$   BB*	B&
B* B(!B*(B*)r$   r   r   rr   r  Callable[[], float] | Noners   rt   r!  )r:  zcommands.Commandrs   r#  )r   zbytes | Noners   r#  r`  rM   rX   rs   z/layer.CommandGenerator[tuple[bool, str | None]]rD  r   rs   r#  )rM   rX   rs   r#  )r:  zcommands.CloseConnectionrs   r#  )r>   r?   r@   r   rB   r"   rp   r  r7  ry  r  rs  r  r  r  r  r  r  rv   rw   s   @rF   rb  rb    s    "&D
&"&C	&
 
 $
 )	

 

4 +8'8	%8*%+2>%+	%%+N.==	8=~
33'j
 '///	%/ /rE   rb  c                  d     e Zd ZU dZdZded<   	 	 d		 	 	 	 	 d
 fdZddZd fdZd fdZ	 xZ
S )ServerQuicLayerzE
    This layer establishes QUIC for a single server connection.
    FrY   wait_for_clienthelloc                D    t         |   ||xs |j                  |       y rn   )ro   rp   r   rj  s       rF   rp   zServerQuicLayer.__init__8  s     	$"8'..$?rE   c              #     K   | j                    xr t        | j                  t              }|r'd| _        t
        j                  j                  | _        y | j                  d       E d {    y 7 w)NT)
command_to_reply_tor  r   ClientQuicLayerr  r&   TunnelStateCLOSEDtunnel_stater  )re   r  s     rF   start_handshakezServerQuicLayer.start_handshake@  s`     #'#;#;;  

oA
  (,D% & 2 2 9 9D~~d+++s   A'A1)A/*A1c              #     K   | j                   rTt        | 	  |      D ]A  }t        |t        j
                        r!|j                  | j                  k(  rd| _         >| C y t        | 	  |      E d {    y 7 w)NF)r  ro   r7  r  r#   r4  r    r   )re   r  r:  rq   s      rF   r7  zServerQuicLayer.event_to_childJ  sm     $$ 71%8 "w(?(?@**dii705D-!M" w-e444s   A3A>6A<7A>c              #     K   t        j                  d| t               t        |   |      E d {    y 7 w)NzServer QUIC handshake failed. level)r#   r|  r	   ro   r  r  s     rF   r  z"ServerQuicLayer.on_handshake_errorW  s3     ll;C5AQQ7-c222s   3><>)NN)r$   r   r   zconnection.Server | Noner  r  r`  r!  r  )r>   r?   r@   rA   r  rB   rp   r  r7  r  rv   rw   s   @rF   r  r  1  sV     "'$&
 *.+/	@ @ '@ )	@,53 3rE   r  c                  x     e Zd ZU dZded<   	 	 d
	 	 	 	 	 d fdZddZ	 	 	 	 d fdZddZd fdZ	dd	Z
 xZS )r  zD
    This layer establishes QUIC on a single client connection.
    rY   server_tls_availablec                :   |j                   j                  rd |j                   _        d |j                   _        d |j                   _        d |j                   _        d |j                   _        g |j                   _        d |j                   _        g |j                   _	        g |j                   _
        t        | 1  ||j                   |       t        | j                  j                        dk\  xr' t!        | j                  j                  d   t"              | _        y )Nr-  )r   r"   r  r  r}  r  r  r  mitmcertalpn_offerscipher_listro   rp   r   r$   layersr  r  r  )re   r$   r  rq   s      rF   rp   zClientQuicLayer.__init__d  s     >>"&GNN$(GNN!!%GNN15GNN.)-GNN&.0GNN+&*GNN#)+GNN&)+GNN&'..$7$'(;(;$<$A %
jLL#_G
!rE   c              #  $   K   dE d {    y 7 wr\  rD   r   s    rF   r  zClientQuicLayer.start_handshakex  r^  r_  c              #  2	  K   t        | j                  j                  d   t              rt	        j
                  dt               y| j                  j                  j                  st	        j
                  dt               y| j                  rt        | -  |      E d {   S t        |      }	 t        |      }t"        D cg c]   }|t"        j$                  ur|j&                  " }}|j(                  Q|j(                  |vrCt	        j*                  | j,                  t/        |j0                  |j2                  |             yt5        |      dk  s|j6                  t8        k7  rdd|j                          dfS 	 t;        |      }|j>                  | j@                  _        |jB                  | j@                  _"        tG        | j                  |      }tI        |       |jJ                  rTtM        jN                  dddtL        jP                  jR                        x| _         | _        | j                  j                  | j                  j                  jU                  |       dz
     }	t        |	tV              r"tM        jX                  d       x|	_         |	_        t[        | j                  d      }
|
j\                  |	_.        |
j^                  |	_/        |	j]                  ta        jb                               E d {    |	j]                  ta        jd                  | j                  jf                  |            E d {    y|jh                  rU| j                  jj                  jl                  s5| jo                         E d {   }|rt	        j
                  d| d       | jq                  |j0                        E d {    | j@                  jr                  syt        | -  |      E d {   S 7 X# t        $ r dd|j                          dfcY S t         $ r#}dd	| d
|j                          dfcY d }~S d }~ww xY wc c}w # t         $ r,}ddt=        |       d
|j                          dfcY d }~S d }~ww xY w7 7 J7 7 7 w)Nr   zOSwallowing QUIC handshake because HTTP/3 does not support transparent mode yet.r  z5Swallowing QUIC handshake because HTTP/3 is disabled.r   Fz*Cannot parse QUIC header: Malformed head (r`   zCannot parse QUIC header: z ()
source_cidr   supported_versionsi  z4Invalid handshake received, roaming not supported. (zCannot parse ClientHello: )zignore-connr   udp)r  socknamer   r  r   )r   Tr   r  z1Unable to establish QUIC connection with server (z). Trying to establish QUIC with client anyway. If you plan to redirect requests away from this server, consider setting `connection_strategy` to `lazy` to suppress early connections.)Fzconnection closed early):r  r$   r  r'   r#   r|  r   optionshttp3r"   ro   r  r   r   	TypeErrorhexr   r   NEGOTIATIONr   versionrO  rd  r   r   r  r   r   r   r   r   r}  r   r4   r  r0   r)   ignore_connectionr    Clientr  r  rZ  r  r	  r.   r  r  r   r3  r?  r   establish_server_tls_firstr   tls_establishedstart_server_tlsr  rA  )re   rM   r   r   r   r  r  client_hellotls_clienthelloparent_layerreplacement_layerrD  rq   s               rF   r  z&ClientQuicLayer.receive_handshake_data{  s*     dll))!,.>?,,a  ||##)),,G%   88$w=dCCD &	J%f-F /
1=== MM
 

 >>%&..@R*R##&&/%55$*$5$5'9   t9tv115HHFtxxzlRST 	O248L
 %((		 , ; ;		 *$,,E 11 ,,1;1B1B++#( 0055	2 DI.  <<..t||/B/B/H/H/NQR/RSL,8EOEVEV F !L$B !)d C(9(F(FL%):)H)HL&#00@@@#00##DLL$7$7>    66LL''77!2244CllGu Mf g  >>&"8"8999yy""3 !79$??@} D  	UFtxxzlRSTTT 	J6qcDHHJ<qIII	J
4  	O6s1vhbANNN	O: A 5 	: @s   B R#O;$R5O>  R%Q-BRQ E3RR
A RRARR	?RR	-R6R7R>Q
RQ
'Q?Q
 RQ

R	R!R<R=RRRRRRRc              #  ~   K   | j                   syt        j                  | j                  j                        }|S w)NzNo server QUIC available.)r  r#   r4  r$   r   )re   rD  s     rF   r  z ClientQuicLayer.start_server_tls  s4     ((/++DLL,?,?@@
   ;=c              #     K   t        j                  d| t               t        |   |      E d {    | j
                  | _        y 7 w)NzClient QUIC handshake failed. r  )r#   r|  r	   ro   r  erroredr7  r  s     rF   r  z"ClientQuicLayer.on_handshake_error  sD     ll;C5AQQ7-c222"ll 	3s   3AAAc              #  ~   K   | j                   -t        j                  | j                    d| dt               y y w)Nz[quic] Swallowing z as handshake failed.)r  r#   r|  r   r  s     rF   r  zClientQuicLayer.errored  s>     ::!,,::,07LMu  "r  rn   )r$   r   r  r  rs   rt   r`  r  )rs   z"layer.CommandGenerator[str | None]r  r!  )r>   r?   r@   rA   rB   rp   r  r  r  r  r  rv   rw   s   @rF   r  r  \  sg     B LP
&
.H
	
(oAoA	8oAb+
rE   r  )rj   rT   rs   r   )rj   rT   rs   rY   rn   )rJ   r3   r   rY   r   r:   rs   r   )rM   rX   rs   r/   )k
__future__r   r  collections.abcr   dataclassesr   r   loggingr   r   r	   sslr
   aioquic.bufferr   r   aioquic.h3.connectionr   r   aioquic.quicr   r  aioquic.quic.configurationr   aioquic.quic.connectionr   r   r   r   r   r   aioquic.quic.packetr   r   r   r   aioquic.tlsr   r   cryptographyr   )cryptography.hazmat.primitives.asymmetricr   r   r   	mitmproxyr   r    r!   mitmproxy.netr"   mitmproxy.proxyr#   r$   r%   r&   mitmproxy.proxy.layers.modesr'   mitmproxy.proxy.layers.tcpr(   mitmproxy.proxy.layers.tlsr)   r*   r+   r,   r-   mitmproxy.proxy.layers.udpr.   mitmproxy.tlsr/   r0   r1   r3   rH   	StartHookrL   rQ   rC  rS   rW   ri   rN  rl   ry   r~   r   r5  r   rL  r   r   r   r   r   	Exceptionr   r   r  r   Layerr   r%  r  rb  r  r  rD   rE   rF   <module>r     s   "  $ !      / : . 8 2 7 7 1 > < ? 3 0 3 # %  9 8 9      $ # " ! " 9 / 9 ? ? : : / % ) ! ] ] ]2 	' 	 	 (,,   (,,   8f,, 8 8 b_ b b 3o 3 3#22 #^* ^2
%' 
%
%& 
%+(22 +4+622 +2 &	7K #  	6 i  11h,%// ,0YLekk YLxY5;; Yx]/"" ]/@	(3i (3V_i _rE   