o
    US`c|                     @   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   ?/usr/local/lib/python3.10/dist-packages/trio/tests/test_dtls.pyendpoint   s   
r   )
autocancelmtur   c              
     s   t |da}|rd}nd}|j|dfI d H  t 4 I d H +} fdd}||jt|I d H  ||j fV  | rB|j	
  W d   I d H  n1 I d H sRw   Y  W d    d S W d    d S 1 sjw   Y  d S )Nr   z::1	127.0.0.1r   c                    s   t d| jj  d| j   d ur|   z/t d |  I d H  t d | 2 z3 d H W }t d| d| j  | |I d H  q+6 W d S  tj	yW   t d Y d S w )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 \}}t| d}||t}ttj |  W d    n1 s.w   Y  |	 I d H  |
dI d H  | I d H dksMJ |
dI d H  | I d H dks`J tt |
dI d H  W d    n1 sxw   Y  |d | }|d | |ksJ |d | |ksJ W d    n1 sw   Y  W d   I d H  d S 1 I d H sw   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 \}}t 4 I d H  fddfdd}| _t|D ]j}t	d t	d t	d t
 Q}||t}t	d | I d H  t	d	 t| }	 td}	||I d H  | I d H |ks~J W d    n1 sw   Y  |	jsnqeW d    n1 sw   Y  q7W d   I d H  n1 I d H sw   Y  W d   I d H  d S 1 I d H sw   Y  d S )Ni  r   c                    s   	 j g dg ddd }t| j d| j d|  |dkr#d S |d	kr- |  n/|d
kr>t d I d H  n|dksDJ t| j d| j d| j	    
|  d S q)NT)deliverdropdupedelay)gffffff?皙?rD   rD   )weightsr   r   z: rA   rB   rC      r@   z: delivered )choicesr   source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 d S  ty   Y d S w N)
start_soonRuntimeErrorr%   )r1   rR   r   r   route_packet_wrapper   s
   zBtest_handshake_over_terrible_network.<locals>.route_packet_wrapperzP################################################################################zclient starting do_handshakezclient finished do_handshakeT
   )rK   Randomr   enabler2   r   r)   rR   ranger   r   r5   r6   r"   strencodemove_on_afterr#   r:   cancelled_caught)
autojump_clockZ
HANDSHAKES_r=   rW   ir>   clientmsgcscoper   )rP   r1   rQ   rR   r   $test_handshake_over_terrible_networkf   sD   
,*.rf   c               	      s   t  4 I d H :\} }t !}||t}|dI d H  | I d H dks(J W d    n1 s2w   Y  W d   I d H  d S 1 I d H sHw   Y  d S )N   xyz)r2   r   r5   r6   r#   r:   ra   r=   r>   rc   r   r   r   test_implicit_handshake   s   .ri   c                     sB  t  } t  w}| jdI d H  t 4 I d H S}dd }|| jt|I d H  || j	 t
}t 4 I d H }||jd ||j W d   I d H  n1 I d H sYw   Y  |j  W d   I d H  n1 I d H ssw   Y  W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nr   r   c              	      s^   t  4 I d H }|| jd || j W d   I d H  d S 1 I d H s(w   Y  d S )Ns   from server)r   r)   rT   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   rT   r#   r:   r-   r.   )r<   r>   Zserver_nurseryrl   rc   r1   r   r   r   test_full_duplex   s"   
((Prm   c               
      s  t  4 I d H x\} }t _}||t}| I d H  |  ttj	 |
dI d H  W d    n1 s9w   Y  ttj	 | I d H  W d    n1 sVw   Y  |  | I d H  W d    n1 spw   Y  W d   I d H  d S 1 I d H sw   Y  d S )N   abc)r2   r   r5   r6   r"   closer7   r8   r   ClosedResourceErrorr#   r:   acloserh   r   r   r   test_channel_closing   s    .rr   c               	      sX   t dd4 I d H \} }|   W d   I d H  n1 I d H s!w   Y  |   d S )NF)r   )r2   ro   )r<   r=   r   r   r   !test_serve_exits_cleanly_on_close   s
   
(rs   c                     sP  t  4 I d H \} }t  4 I d H \} }t }||t}||t}|dI d H  |dI d H  | I d H dksAJ | I d H dksLJ |  tt	j
 |dI d H  W d    n1 siw   Y  tt	j
 | I d H  W d    n1 sw   Y  tt	j
 ||t W d    n1 sw   Y  t	 4 I d H 0}tt	j
 dd }||jt|I d H  W d    n1 sw   Y  W d   I d H  n1 I d H sw   Y  W d    n1 sw   Y  W d   I d H  n1 I d H s
w   Y  W d   I d H  d S 1 I d H s!w   Y  d S )Nrn   rg   Zxxxc                       d S rS   r   ra   r   r   r   null_handler     z+test_client_multiplex.<locals>.null_handler)r2   r   r5   r6   r#   r:   ro   r7   r8   r   rp   r)   r*   r+   r,   )ra   Zaddress1Zaddress2r>   client1client2r1   rv   r   r   r   test_client_multiplex   s8   *(\rz   c               	      st   t j *} tt t|  W d    n1 sw   Y  W d    d S W d    d S 1 s3w   Y  d S rS   )r   r   r7   r8   r;   r   )sr   r   r   test_dtls_over_dgram_only  s   
"r|   c               
      sR  dd } t  }|jdI d H  t 4 I d H <}||jt| I d H  t	tj
 ||jt| I d H  W d    n1 sBw   Y  |j  W d   I d H  n1 I d H s\w   Y  t 4 I d H }||jt| I d H  |j  W d   I d H  n1 I d H sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nc                    rt   rS   r   ru   r   r   r   rv     rw   z'test_double_serve.<locals>.null_handlerrj   )r   r   r(   r   r)   r*   r+   r,   r7   r8   ZBusyResourceErrorr-   r.   )rv   r<   r1   r   r   r   test_double_serve  s$   (*	"r}   c              
      s   t  }|  t W}t ;}|jdI d H  td}||j t	}|
 I d H  W d    n1 s9w   Y  |jsCJ W d    n1 sMw   Y  W d    d S W d    d S 1 sew   Y  d S )Nrj   d   )r   rZ   r   r   r(   r   r^   r5   r    r6   r"   r_   )r`   rP   rx   ry   re   rk   r   r   r   test_connect_to_non_server+  s   Pr   c           	   
      sB  t  }|  dD ]}t 4 I d H \}}t|df}|j|ks#J ||t}t|d D ]}|t	|
 I d H  tdI d H  q/| }|jdksQJ t|D ]}| I d H t	|
 ksfJ qU|dI d H  | I d H dkszJ W d    n1 sw   Y  W d   I d H  n1 I d H sw   Y  q
d S )N)rX      )incoming_packets_buffer      s   buffer clear now)r   rZ   r2   r   r   r5   r6   r[   r#   r\   r]   r   rJ   
statisticsZ incoming_packets_dropped_in_trior:   )	r`   rP   buffer_sizera   r=   r>   rc   rb   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 G\}}tjjtjjd(}dd|
|||||||f
D ]}|||I d H  tdI d H  qW d    n1 sw   Y  W d   I d H  d S 1 I d H sw   Y  d S )Nr   )Recordencode_recordHandshakeFragmentencode_handshake_fragmentContentTypeHandshakeTypeProtocolVersionrX   )msg_typeZmsg_lenZmsg_seqZfrag_offsetZfrag_lenfrag)content_typeversionZepoch_seqnorL                r   r4   #      r   rg   r   )r   rZ   
trio._dtlsr   r   r   r   r   r   r   	handshakeZDTLS10client_hellobytes	bytearrayr2   r   r   r   sendtorJ   )r`   rP   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_cookiera   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 Qtd fdd}|_t	 4 I d H %\}}	 t
 }||t}| I d H  W d    n1 sLw   Y  q11 I d H sXw   Y  W d    d S 1 shw   Y  d S )Nr   )decode_client_hello_untrusted	BadPacketr   c                    s   z
| j \}}}W n	  y   Y n/w t|dkrBt| j }t}|t|kr3t|d }  ||  dN  < tj| |d} |  d S )Nr   r   )rL   )rL   lenr   nextr.   attrevolverN   )r%   ra   cookierL   offsetr   re   r   rP   Zoffset_to_corruptr   r   rR     s   
z2test_invalid_cookie_rejected.<locals>.route_packet)r   rZ   r   r   r   r   CancelScoper   rR   r2   r   r5   r6   r"   r_   )r`   rR   ra   r=   rc   rk   r   r   r   test_invalid_cookie_rejected  s"   
"r   c                    s  t  }|  t }t }|jdI d H  t 4 I d H q}d fdd}||jt	|I d H  t
d t  ||j t}| I d H  W d    n1 sYw   Y   jscJ t
d ||j t}| I d H dks{J tdI d H  |j  W d   I d H  n1 I d H sw   Y  W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )	Nrj   Tc                    s   r9dt d    tdI d H  t d ttj |  I d H  W d    d S 1 s2w   Y  d S 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   rJ   r7   r8   r$   r"   r#   rk   Zconnect_cscopeZ
first_timer   r   rl     s   "zAtest_client_cancels_handshake_and_starts_new_one.<locals>.handlerzclient: starting first connectzclient: starting second connectr3   rX   )r   rZ   r   r   r(   r   r)   r*   r+   r,   r   r   r5   r    r6   r"   r_   r:   rJ   r-   r.   )r`   rP   r/   rc   r1   rl   rk   r   r   r   0test_client_cancels_handshake_and_starts_new_one  s.   

(Pr   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s`J | |j	 t
}| I d H  ttj |dI d H  W d    n1 sw   Y  |dI d H  | I d H dksJ |j  W d   I d H  n1 I d H sw   Y  W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )	Nrj   c                    s*   | 2 z3 d H W }|  |I d H  q6 d S rS   )r#   )rk   r%   r   r   r   r'     s   z-test_swap_client_server.<locals>.echo_handlerc                    sB   t tj  | I d H  W d    d S 1 sw   Y  d S rS   )r7   r8   r   r$   r   r'   r   r   crashing_echo_handler     "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.   (Pr   c                     s  t    dfdd} | _t 4 I d H b\} t I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  n1 I d H s^w   Y  W d    n1 smw   Y  W d   I d H  d S 1 I d H sw   Y  d S )	NTc                    s*    r	t d|  d S t d|  |  d S )Nzdropped packetzdelivered packet)r   rN   rV   
blackholedrP   r   r   rR   9  s
   

z@test_openssl_retransmit_doesnt_break_stuff.<locals>.route_packetc                     sJ     t} | jddI d H  | dI d H  |  I d H dks#J d S )Ng      ?Zinitial_retransmit_timeout   hi)r5   r6   r"   r#   r:   )rc   )r=   r>   r   r   	connecterM  s
   z=test_openssl_retransmit_doesnt_break_stuff.<locals>.connecterg?F   xxx)r   rZ   rR   r2   r   r   r)   rT   rJ   r   r   r    )rR   r<   r1   r   r   )r=   r   r>   rP   r   *test_openssl_retransmit_doesnt_break_stuff/  s(   

(.r   c           	   
      s   t    d  fdd}|_t 4 I d H G\}}dD ]6}t )}t }d ||t}|j	|dI d H  t }|| |ksGJ W d    n1 sQw   Y  q W d   I d H  d S 1 I d H shw   Y  d S )NTc                    s    rd d S  |  d S )NF)rN   rV   r   r   r   rR   i  s   zCtest_initial_retransmit_timeout_configuration.<locals>.route_packet)r   r      r   )
r   rZ   rR   r2   r   r   current_timer5   r6   r"   )	r`   rR   ra   r=   trc   beforerk   afterr   r   r   -test_initial_retransmit_timeout_configurationc  s&   .r   c               	      s   d t     fdd} | _t d4 I d H F\}}t -}||t}|  | I d H  |	dI d H  |
 I d H dksIJ W d    n1 sSw   Y  W d   I d H  d S 1 I d H siw   Y  d S )Ni,  c                    sB   t d|   t dt| j  t| j ksJ |  d S )Ndelivering zpayload size: )r   r   rL   rN   rV   ZMTUrP   r   r   rR     s   z9test_explicit_tiny_mtu_is_respected.<locals>.route_packetr&   r   )r   rZ   rR   r2   r   r5   r6   r!   r"   r#   r:   )rR   r/   r=   rc   rk   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 I\}}t| d.}||t}|d |dI d H  |	 I d H dksIJ |
 dksQJ W d    n1 s[w   Y  W d   I d H  d S 1 I d H sqw   Y  d S )	Ni  i$  c                    s<   t | jkrtd|   d S td|    |  d S )Nz	dropping r   )r   rL   r   rN   rV   rP   r   r   r   rR     s   z@test_handshake_handles_minimum_network_mtu.<locals>.route_packetr   i'  rg   i(#  )r   rZ   rR   r2   r   r5   r6   r!   r#   r:   r9   )r   r`   rR   ra   r=   r>   rc   r   r   r   *test_handshake_handles_minimum_network_mtu  s"   
.r   z$always:unclosed DTLS:ResourceWarningc                     s   t j j} dd }tt | I d H }t j I d H  t	  W d    n1 s,w   Y  t j I d H  t j j}| |k sEJ | |ksKJ d S )Nc               
      s   t  } tjjtjjdI}|dI d H  | | t}t 4 I d H }|	|j
 tj I d H  |j  W d   I d H  n1 I d H sJw   Y  W d    n1 sYw   Y  tj j}|S )Nr   rj   )r   r   r   r   r(   r5   r    r6   r)   rT   r"   testingwait_all_tasks_blockedr-   r.   lowlevelcurrent_statisticstasks_living)er{   cr1   during_tasksr   r   r   start_and_forget_endpoint  s   (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                     sN   t  } tt ~ t  W d    n1 sw   Y  tj I d H  d S rS   )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@w   Y  tt ~t  W d    d S 1 sZw   Y  d S )Nrj   r   r   )r   rZ   r   r   r(   Z_ensure_receive_loopr   r   r   r   r   r    r7   r   r   r
   )rP   r   r{   r   r   r   test_gc_as_packet_received  s   "r   c                  C   sJ   dd } t | }tt ~t  W d    d S 1 sw   Y  d S )Nc                     s   t  } |   t S rS   )r   rZ   r   )rP   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                     sH   t  } | j  tj I d H  W d    d S 1 sw   Y  d S rS   )r   r   ro   r   r   r   r   r   r   r   'test_already_closed_socket_doesnt_crash  s
   
"r   c              
      s   t      t 4 I d H M\} fdd}| _t *}td ||t}|	 I d H  W d    n1 s=w   Y  W d    n1 sLw   Y  W d   I d H  d S 1 I d H sbw   Y  d S )Nc                    s     |  j  d S rS   )rN   r   ro   rV   rP   r/   r   r   rR     s   
zEtest_socket_closed_while_processing_clienthello.<locals>.route_packetrX   )
r   rZ   r2   rR   r   r   r^   r5   r6   r"   )r`   r=   rR   r>   rc   r   r   r   /test_socket_closed_while_processing_clienthello  s   .r   c                    s  t  }|  dd }||_t 4 I d H ^\}}t E}||t t 4 I d H $} fdd}|	| t
dI d H  ||t W d   I d H  n1 I d H sUw   Y  W d    n1 sdw   Y  W d   I d H  d S 1 I d H szw   Y  d S )Nc                 S   s   d S rS   r   rV   r   r   r   rR   /     zGtest_association_replaced_while_handshake_running.<locals>.route_packetc                      sB   t tj   I d H  W d    d S 1 sw   Y  d S rS   )r7   r8   r   r$   r"   r   c1r   r   doomed_handshake9  r   zKtest_association_replaced_while_handshake_running.<locals>.doomed_handshakerX   )r   rZ   rR   r2   r   r5   r6   r   r)   rT   rJ   )r`   rP   rR   ra   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 J\}}t 1}||t}||t tt	j
 | I d H  W d    n1 sAw   Y  W d    n1 sPw   Y  W d   I d H  d S 1 I d H sfw   Y  d S )Nc                 S   s   J rS   r   rV   r   r   r   rR   I  r   zGtest_association_replaced_before_handshake_starts.<locals>.route_packet)r   rZ   rR   r2   r   r5   r6   r7   r8   r   r$   r"   )rP   rR   ra   r=   r>   r   r   r   r   1test_association_replaced_before_handshake_startsD  s   .r   c                     s  t  4 I d H s\} }t Z}t 4 I d H ?}tddD ]}|d|ft}||j q||t}|	dI d H  |
 I d H dksGJ |j  W d   I d H  n1 I d H s\w   Y  W d    n1 skw   Y  W d   I d H  d S 1 I d H sw   Y  d S )Nr   rX   r   r   )r2   r   r   r)   r[   r5   r6   rT   r"   r#   r:   r-   r.   )ra   r=   r>   r1   rb   rk   r   r   r   test_send_to_closed_local_portV  s   (.r   )@r7   r   Ztrio.testingr   rK   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?   rf   ri   rm   rr   rs   rz   r|   r}   r   r   r   r   r   r   r   r   r   r   filterwarningsr   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sx    



#

S
p++
3

"

#





	