a
    xd|                     @   s$  d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlmZ d dlm	Z	 d dl
Z
d dlmZ d dlmZ ddlmZmZmZ e
 Zed	ZeejZee eejZee e jjd
de jdedgdd
gdZ dd Z!eddddddZ"e dd Z#edd Z$dd Z%dd Z&dd Z'dd  Z(d!d" Z)d#d$ Z*d%d& Z+d'd( Z,d)d* Z-d+d, Z.d-d. Z/d/d0 Z0d1d2 Z1ed3d4 Z2d5d6 Z3d7d8 Z4e d9d: Z5e j6d;d<d= Z7e j6d;d>d? Z8e j6d;d@dA Z9e j6d;dBdC Z:dDdE Z;dFdG Z<dHdI Z=dJdK Z>dLdM Z?dS )N    N)DTLSEndpoint)asynccontextmanager)count)SSL)FakeNet   )slow
binds_ipv6gc_collect_harderzexample.comipv6FT)ZmarksZipv4)idsc                  K   sF   |  dd}|rtjj}ntjj}tjjtjj|d}t|fi | S )Nr   F)typefamily)poptriosocketAF_INET6AF_INET
SOCK_DGRAMr   )kwargsr   r   sock r   L/var/www/html/Ranjet/env/lib/python3.9/site-packages/trio/tests/test_dtls.pyendpoint   s    
r   )
autocancelmtur   c              
     s   t |d}|rd}nd}|j|dfI d H  t 4 I d H V} fdd}||jt|I d H  ||j fV  | r|j	
  W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  d S )Nr   z::1	127.0.0.1r   c                    s   t d| jj  d| j   d ur0|   z\t d |  I d H  t d | 2 z23 d H W }t d| d| j  | |I d H  qT6 W n tj	y   t d Y n0 d S )Nzecho handler started: server z client zserver starting do_handshakezserver finished do_handshakezechoing  -> zecho handler channel broken)
printr   r   getsocknameZpeer_addressset_ciphertext_mtudo_handshakesendr   BrokenResourceError)Zdtls_channelpacketr   r   r   echo_handler3   s$    

z&dtls_echo_server.<locals>.echo_handler)r   r   bindr   open_nurserystartserve
server_ctxr    cancel_scopecancel)r   r   r   server	localhostnurseryr'   r   r&   r   dtls_echo_server)   s    r2   c              
      s  t | d4 I d H h\}}t| d.}||t}ttj |  W d    n1 s^0    Y  |	 I d H  |
dI d H  | I d H dksJ |
dI d H  | I d H dksJ tt  |
dI d H  W d    n1 s0    Y  |d | }|d | |ks*J |d | |ksFJ W d    n1 s\0    Y  W d   I d H  q1 I d H s0    Y  d S )Nr      hellos   goodbye    i  i  )r2   r   connect
client_ctxpytestraisesr   ZNeedHandshakeErrorget_cleartext_mtur"   r#   receive
ValueErrorr!   )r   server_endpointaddressclient_endpointZclient_channelZcleartext_mtu_1234r   r   r   
test_smokeM   s$    &.


r?   c           
         s  d}t dt     t 4 I d H b\}}t 4 I d H  fddfdd}| _t|D ]}t	d t	d t	d t
 }||t}t	d | I d H  t	d	 t| }td
6}	||I d H  | I d H |ksJ W d    n1 s0    Y  |	jsʐq(qW d    qp1 s>0    Y  qpW d   I d H  qx1 I d H sn0    Y  W d   I d H  q1 I d H s0    Y  d S )Ni  r   c                    s   j g dg ddd }t| j d| j d|  |dkrBd S |dkrV |  q |d	krxt d
 I d H  q |dksJ t| j d| j d| j	    
|  qq d S )N)deliverdropdupedelay)gffffff?皙?rD   rD   )weightsr   r   z: rA   rB   rC      r@   z: delivered )choicesr   sourceZdestinationZsend_packetr   sleeprandompayloadhexdeliver_packet)r%   op)fnrr   r   route_packetp   s&    
z:test_handshake_over_terrible_network.<locals>.route_packetc                    s(   z  |  W n ty"   Y n0 d S N)
start_soonRuntimeErrorr%   )r1   rQ   r   r   route_packet_wrapper   s    zBtest_handshake_over_terrible_network.<locals>.route_packet_wrapperzP################################################################################zclient starting do_handshakezclient finished do_handshake
   )rJ   Randomr   enabler2   r   r)   rQ   ranger   r   r5   r6   r"   strencodemove_on_afterr#   r:   cancelled_caught)
autojump_clockZ
HANDSHAKES_r=   rV   ir>   clientmsgcscoper   )rO   r1   rP   rQ   r   $test_handshake_over_terrible_networkf   s0    
,6re   c               	      s   t  4 I d H r\} }t B}||t}|dI d H  | I d H dksNJ W d    n1 sb0    Y  W d   I d H  q1 I d H s0    Y  d S )N   xyz)r2   r   r5   r6   r#   r:   r`   r=   r>   rb   r   r   r   test_implicit_handshake   s
    rh   c                     s4  t  } t  }| jdI d H  t 4 I d H }dd }|| jt|I d H  || j	 t
}t 4 I d H 0}||jd ||j W d   I d H  q1 I d H s0    Y  |j  W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  W d    n1 s&0    Y  d S )Nr   r   c              	      sZ   t  4 I d H 0}|| jd || j W d   I d H  qV1 I d H sL0    Y  d S )Ns   from server)r   r)   rS   r#   r:   )channelr1   r   r   r   handler   s    z!test_full_duplex.<locals>.handlers   from client)r   r   r(   r   r)   r*   r+   r,   r5   r    r6   rS   r#   r:   r-   r.   )r<   r>   Zserver_nurseryrk   rb   r1   r   r   r   test_full_duplex   s    
6rl   c               
      s  t  4 I d H \} }t }||t}| I d H  |  ttj	  |
dI d H  W d    n1 sp0    Y  ttj	 | I d H  W d    n1 s0    Y  |  | I d H  W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  d S )N   abc)r2   r   r5   r6   r"   closer7   r8   r   ClosedResourceErrorr#   r:   acloserg   r   r   r   test_channel_closing   s    .,rq   c               	      sV   t dd4 I d H "\} }|   W d   I d H  qJ1 I d H s@0    Y  |   d S )NF)r   )r2   rn   )r<   r=   r   r   r   !test_serve_exits_cleanly_on_close   s    2rr   c                     s`  t  4 I d H 4\} }t  4 I d H \} }t }||t}||t}|dI d H  |dI d H  | I d H dksJ | I d H dksJ |  tt	j
  |dI d H  W d    n1 s0    Y  tt	j
 | I d H  W d    n1 s0    Y  tt	j
 ||t W d    n1 sJ0    Y  t	 4 I d H d}tt	j
. dd }||jt|I d H  W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  W d   I d H  q.1 I d H s$0    Y  W d   I d H  q\1 I d H sR0    Y  d S )Nrm   rf   Zxxxc                    s   d S rR   r   r`   r   r   r   null_handler  s    z+test_client_multiplex.<locals>.null_handler)r2   r   r5   r6   r#   r:   rn   r7   r8   r   ro   r)   r*   r+   r,   )r`   Zaddress1Zaddress2r>   client1client2r1   rt   r   r   r   test_client_multiplex   s&    ,
..,rw   c               	      s`   t j B} tt t|  W d    n1 s40    Y  W d    n1 sR0    Y  d S rR   )r   r   r7   r8   r;   r   )sr   r   r   test_dtls_over_dgram_only  s    ry   c               
      sF  dd } t   }|jdI d H  t 4 I d H x}||jt| I d H  t	tj
& ||jt| I d H  W d    n1 s0    Y  |j  W d   I d H  q1 I d H s0    Y  t 4 I d H 8}||jt| I d H  |j  W d   I d H  q"1 I d H s0    Y  W d    n1 s80    Y  d S )Nc                    s   d S rR   r   rs   r   r   r   rt     s    z'test_double_serve.<locals>.null_handlerri   )r   r   r(   r   r)   r*   r+   r,   r7   r8   ZBusyResourceErrorr-   r.   )rt   r<   r1   r   r   r   test_double_serve  s    
44rz   c              
      s   t  }|  t }t v}|jdI d H  td0}||j t	}|
 I d H  W d    n1 sp0    Y  |jsJ W d    n1 s0    Y  W d    n1 s0    Y  d S )Nri   d   )r   rY   r   r   r(   r   r]   r5   r    r6   r"   r^   )r_   rO   ru   rv   rd   rj   r   r   r   test_connect_to_non_server+  s    ,r|   c           	   
      sH  t  }|  dD ].}t 4 I d H \}}t|d}|j|ksHJ ||t}t|d D ],}|t	|
 I d H  tdI d H  q`| }|jdksJ t|D ]"}| I d H t	|
 ksJ q|dI d H  | I d H dksJ W d    n1 s0    Y  W d   I d H  q1 I d H s80    Y  qd S )N)rW      )incoming_packets_buffer      s   buffer clear now)r   rY   r2   r   r~   r5   r6   rZ   r#   r[   r\   r   rI   
statisticsZ incoming_packets_dropped_in_trior:   )	r_   rO   buffer_sizer`   r=   r>   rb   ra   statsr   r   r   test_incoming_buffer_overflow7  s     
 r   c                    s  t  }|  ddlm}m}m}m}m}m}m	} |||j
|jd|||jddddtddd}	|	d }
|	d d }|	d d }t|	}d	|d
< |||j
|jd|||jddddtddd}|||j
|jd|||jddddtddd d}|||j
|jddd}|||j
|jdtdd d}t 4 I d H \}}tjjtjjdR}dd|
|||||||f
D ](}|||I d H  tdI d H  qtW d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  d S )Nr   )Recordencode_recordHandshakeFragmentencode_handshake_fragmentContentTypeHandshakeTypeProtocolVersionrW   )msg_typeZmsg_lenZmsg_seqZfrag_offsetZfrag_lenfrag)content_typeversionZepoch_seqnorK                r}   r4   #      r   rf   r   )r   rY   
trio._dtlsr   r   r   r   r   r   r   Z	handshakeZDTLS10client_hellobytes	bytearrayr2   r   r   r   sendtorI   )r_   rO   r   r   r   r   r   r   r   r   Zclient_hello_extendedZclient_hello_shortZclient_hello_really_shortZclient_hello_corrupt_record_lenZclient_hello_fragmentedZ$client_hello_trailing_data_in_recordZhandshake_emptyZ client_hello_truncated_in_cookier`   r=   r   Z
bad_packetr   r   r   *test_server_socket_doesnt_crash_on_garbageJ  s    $

	
	r   c              
      s   t    ddlmm  t td fdd}|_t	 4 I d H f\}}t
 *}||t}| I d H  W d    q^1 s0    Y  q^jsJ W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  d S )Nr   )decode_client_hello_untrusted	BadPacketr   c                    s   z| j \}}}W n  y&   Y n^0 t|dkrt| j }t}|t|krft|d }  ||  dN  < tj| |d} |  d S )Nr   r   )rK   )rK   lenr   nextr.   attrZevolverM   )r%   r`   cookierK   offsetr   rd   r   rO   Zoffset_to_corruptr   r   rQ     s    
z2test_invalid_cookie_rejected.<locals>.route_packet)r   rY   r   r   r   r   CancelScoper   rQ   r2   r   r5   r6   r"   r^   )r_   rQ   r`   r=   rb   rj   r   r   r   test_invalid_cookie_rejected  s    
.r   c                    s  t  }|  t X}t .}|jdI d H  t 4 I d H }d fdd}||jt	|I d H  t
d t 0 ||j t}| I d H  W d    n1 s0    Y   jsJ t
d ||j t}| I d H dksJ tdI d H  |j  W d   I d H  q@1 I d H s60    Y  W d    n1 sV0    Y  W d    n1 sv0    Y  d S )	Nri   Tc                    s   rldt d    tdI d H  t d ttj |  I d H  W d    q1 s`0    Y  nt d | dI d H  d S )NFz'handler: first time, cancelling connectg      ?z"handler: handshake should fail nowz&handler: not first time, sending hellor3   )	r   r.   r   rI   r7   r8   r$   r"   r#   rj   Zconnect_cscopeZ
first_timer   r   rk     s    .zAtest_client_cancels_handshake_and_starts_new_one.<locals>.handlerzclient: starting first connectzclient: starting second connectr3   rW   )r   rY   r   r   r(   r   r)   r*   r+   r,   r   r   r5   r    r6   r"   r^   r:   rI   r-   r.   )r_   rO   r/   rb   r1   rk   rj   r   r   r   0test_client_cancels_handshake_and_starts_new_one  s$    
,
r   c                     s  t  } t  ~}| jdI d H  |jdI d H  dd   fdd}t 4 I d H }|| jt|I d H  ||jt I d H  || j	 t
}|dI d H  | I d H dksJ | |j	 t
}| I d H  ttj  |dI d H  W d    n1 s0    Y  |dI d H  | I d H dksJJ |j  W d   I d H  q1 I d H sx0    Y  W d    n1 s0    Y  W d    n1 s0    Y  d S )	Nri   c                    s(   | 2 z3 d H W }|  |I d H  q6 d S rR   )r#   )rj   r%   r   r   r   r'     s    z-test_swap_client_server.<locals>.echo_handlerc                    s>   t tj  | I d H  W d    n1 s00    Y  d S rR   )r7   r8   r   r$   r   r'   r   r   crashing_echo_handler  s    z6test_swap_client_server.<locals>.crashing_echo_handlers   b as clients   association brokens   a as client)r   r   r(   r   r)   r*   r+   r,   r5   r    r6   r#   r:   r"   r7   r8   r$   r-   r.   )abr   r1   Zb_to_aZa_to_br   r   r   test_swap_client_server  s$    0r   c                     s  t    dfdd} | _t 4 I d H \} t t 4 I d H \} fdd}|| tdI d H  d|j	
dj	 I d H  W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  d S )	NTc                    s*    rt d|  d S t d|  |  d S )Nzdropped packetzdelivered packet)r   rM   rU   
blackholedrO   r   r   rQ   9  s
    

z@test_openssl_retransmit_doesnt_break_stuff.<locals>.route_packetc                     sH     t} | jddI d H  | dI d H  |  I d H dksDJ d S )Ng      ?Zinitial_retransmit_timeout   hi)r5   r6   r"   r#   r:   )rb   )r=   r>   r   r   	connecterM  s    z=test_openssl_retransmit_doesnt_break_stuff.<locals>.connecterg?F   xxx)r   rY   rQ   r2   r   r   r)   rS   rI   r   r   r    )rQ   r<   r1   r   r   )r=   r   r>   rO   r   *test_openssl_retransmit_doesnt_break_stuff/  s    

r   c           	   
      s   t    d  fdd}|_t 4 I d H \}}dD ]l}t R}t }d ||t}|j	|dI d H  t }|| |ksJ W d    q>1 s0    Y  q>W d   I d H  q1 I d H s0    Y  d S )NTc                    s    r
d n
 |  d S NF)rM   rU   r   r   r   rQ   i  s    zCtest_initial_retransmit_timeout_configuration.<locals>.route_packet)r   r      r   )
r   rY   rQ   r2   r   r   current_timer5   r6   r"   )	r_   rQ   r`   r=   trb   beforerj   afterr   r   r   -test_initial_retransmit_timeout_configurationc  s    r   c               	      s   d t     fdd} | _t d4 I d H \}}t Z}||t}|  | I d H  |	dI d H  |
 I d H dksJ W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  d S )Ni,  c                    sB   t d|   t dt| j  t| j ks4J |  d S )Ndelivering zpayload size: )r   r   rK   rM   rU   ZMTUrO   r   r   rQ     s    z9test_explicit_tiny_mtu_is_respected.<locals>.route_packetr&   r   )r   rY   rQ   r2   r   r5   r6   r!   r"   r#   r:   )rQ   r/   r=   rb   rj   r   r   r   #test_explicit_tiny_mtu_is_respected}  s    
r   c              	      s   t      | rdnd fdd}| _t| d4 I d H \}}t| d\}||t}|d |dI d H  |	 I d H dksJ |
 dksJ W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  d S )	Ni  i$  c                    s:   t | jkrtd|   ntd|    |  d S )Nz	dropping r   )r   rK   r   rM   rU   rO   r   r   r   rQ     s    z@test_handshake_handles_minimum_network_mtu.<locals>.route_packetr   i'  rf   i(#  )r   rY   rQ   r2   r   r5   r6   r!   r#   r:   r9   )r   r_   rQ   r`   r=   r>   rb   r   r   r   *test_handshake_handles_minimum_network_mtu  s    
r   z$always:unclosed DTLS:ResourceWarningc                     s   t j j} dd }tt2 | I d H }t j I d H  t	  W d    n1 sV0    Y  t j I d H  t j j}| |k sJ | |ksJ d S )Nc               
      s   t  } tjjtjjd}|dI d H  | | t}t 4 I d H <}|	|j
 tj I d H  |j  W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  tj j}|S )Nr   ri   )r   r   r   r   r(   r5   r    r6   r)   rS   r"   testingwait_all_tasks_blockedr-   r.   lowlevelcurrent_statisticstasks_living)erx   cr1   during_tasksr   r   r   start_and_forget_endpoint  s    RzDtest_system_task_cleaned_up_on_gc.<locals>.start_and_forget_endpoint)
r   r   r   r   r7   warnsResourceWarningr   r   r
   )Zbefore_tasksr   r   Zafter_tasksr   r   r   !test_system_task_cleaned_up_on_gc  s    $r   c                     sL   t  } tt ~ t  W d    n1 s.0    Y  tj I d H  d S rR   )r   r7   r   r   r
   r   r   r   r   r   r   r   !test_gc_before_system_task_starts  s
    $r   c                     s   t  } |   t }|jdI d H  |  tj I d H  tjjtjj	d(}|
d|j I d H  W d    n1 s~0    Y  tt ~t  W d    n1 s0    Y  d S )Nri   r   r   )r   rY   r   r   r(   Z_ensure_receive_loopr   r   r   r   r   r    r7   r   r   r
   )rO   r   rx   r   r   r   test_gc_as_packet_received  s    6r   c                  C   sH   dd } t | }tt ~t  W d    n1 s:0    Y  d S )Nc                     s   t  } |   t S rR   )r   rY   r   )rO   r   r   r   main  s    z&test_gc_after_trio_exits.<locals>.main)r   runr7   r   r   r
   )r   r   r   r   r   test_gc_after_trio_exits  s
    	
r   c                     sD   t  *} | j  tj I d H  W d    n1 s60    Y  d S rR   )r   r   rn   r   r   r   r   r   r   r   'test_already_closed_socket_doesnt_crash  s    
r   c              
      s   t      t 4 I d H \} fdd}| _t T}td* ||t}|	 I d H  W d    n1 sx0    Y  W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  d S )Nc                    s     |  j  d S rR   )rM   r   rn   rU   rO   r/   r   r   rQ     s    
zEtest_socket_closed_while_processing_clienthello.<locals>.route_packetrW   )
r   rY   r2   rQ   r   r   r]   r5   r6   r"   )r_   r=   rQ   r>   rb   r   r   r   /test_socket_closed_while_processing_clienthello  s    r   c                    s   t  }|  dd }||_t 4 I d H \}}t }||t t 4 I d H H} fdd}|	| t
dI d H  ||t W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  d S )Nc                 S   s   d S rR   r   rU   r   r   r   rQ   /  s    zGtest_association_replaced_while_handshake_running.<locals>.route_packetc                      s>   t tj   I d H  W d    n1 s00    Y  d S rR   )r7   r8   r   r$   r"   r   c1r   r   doomed_handshake9  s    zKtest_association_replaced_while_handshake_running.<locals>.doomed_handshakerW   )r   rY   rQ   r2   r   r5   r6   r   r)   rS   rI   )r_   rO   rQ   r`   r=   r>   r1   r   r   r   r   1test_association_replaced_while_handshake_running+  s    
r   c               
      s   t  } |   dd }|| _t 4 I d H \}}t b}||t}||t tt	j
 | I d H  W d    n1 s0    Y  W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  d S )Nc                 S   s   dsJ d S r   r   rU   r   r   r   rQ   I  s    zGtest_association_replaced_before_handshake_starts.<locals>.route_packet)r   rY   rQ   r2   r   r5   r6   r7   r8   r   r$   r"   )rO   rQ   r`   r=   r>   r   r   r   r   1test_association_replaced_before_handshake_startsD  s    r   c                     s  t  4 I d H \} }t }t 4 I d H ~}tddD ] }|d|ft}||j q8||t}|	dI d H  |
 I d H dksJ |j  W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y  d S )Nr   rW   r   r   )r2   r   r   r)   rZ   r5   r6   rS   r"   r#   r:   r-   r.   )r`   r=   r>   r1   ra   rj   r   r   r   test_send_to_closed_local_portV  s    r   )@r7   r   Ztrio.testingr   rJ   r   async_generatorr   	itertoolsr   ZtrustmeZOpenSSLr   Ztrio.testing._fake_netr   Z_core.tests.tutilr   r	   r
   CAcaZ
issue_certZserver_certContextZDTLS_METHODr,   Zconfigure_certr6   Zconfigure_trustmarkZparametrizeparamZparametrize_ipv6r   r2   r?   re   rh   rl   rq   rr   rw   ry   rz   r|   r   r   r   r   r   r   r   r   r   filterwarningsr   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sv   



#

S
p++
3
"

#






	