U
    g2                  
   @  sh  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	 d dl
Z
d dlZd dlmZ zd dlZd dlmZ W n* ek
r Z zee W 5 dZ[X Y nX d dlZd dlZd dlmZmZ d d	lmZmZ d
dlmZmZmZ erd dl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dddZ.edddddddddddZ/e-dd d!d"d#Z0ed$d d%d&d'Z1d d(d)d*Z2d d(d+d,Z3d d(d-d.Z4d d(d/d0Z5d d(d1d2Z6d d(d3d4Z7d d(d5d6Z8d7d d%d8d9Z9d7d d%d:d;Z:d7d d%d<d=Z;d7d d%d>d?Z<d7d d%d@dAZ=d d(dBdCZ>ed d(dDdEZ?d7d d%dFdGZ@d d(dHdIZAe-dd7d dJdKdLZBej*CdMd d(dNdOZDej*CdMd d(dPdQZEej*CdMd d(dRdSZFej*CdMd d(dTdUZGd d(dVdWZHd7d d%dXdYZId7d d%dZd[ZJd d(d\d]ZKd d(d^d_ZLdS )`    )annotationsN)asynccontextmanager)count)TYPE_CHECKINGNoReturn)skip_if_optional_else_raise)SSL)DTLSChannelDTLSEndpoint)FakeNet	UDPPacket   )
binds_ipv6gc_collect_harderslow)AsyncGeneratorzexample.comipv6FT)ZmarksZipv4)idsz
int | boolr
   )kwargsreturnc                  K  s@   |  dd}|rtjjntjj}tjjtjj|d}t|f| S )Nr   F)typefamily)poptriosocketAF_INET6AF_INET
SOCK_DGRAMr
   )r   r   r   sock r   9/tmp/pip-unpacked-wheel-ks04xdmi/trio/_tests/test_dtls.pyendpoint/   s    r!   )
autocancelmtur   boolz
int | Nonez:AsyncGenerator[tuple[DTLSEndpoint, tuple[str, int]], None])r"   r#   r   r   c                  s   t |d}|rdnd}|j|dfI d H  t 4 I d H N}ddd fdd	}||jt|I d H  ||j fV  | r|j	
  W 5 Q I d H R X W 5 Q R X d S )
Nr   z::1	127.0.0.1r   r	   None)dtls_channelr   c                   s   t d| jj d| j  d k	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	k
r   t d Y nX 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)r(   packetr#   r   r    echo_handlerB   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nurseryr2   r   r1   r    dtls_echo_server6   s    r=   r'   )r   r   c                   s@  t | d4 I d H \}}t| d }||t}ttj |  W 5 Q R X |	 I d H  |
dI d H  | I d H dkst|
dI d H  | I d H dksttjtdd |
dI d H  W 5 Q R X |d | }|d | |kst|d | |ks"tW 5 Q R X W 5 Q I d H R X d S )	Nr%      hellos   goodbyez4^openssl doesn't support sending empty DTLS packets$match    i  i  )r=   r!   connect
client_ctxpytestraisesr   ZNeedHandshakeErrorget_cleartext_mtur-   r.   receiveAssertionError
ValueErrorr,   )r   server_endpointaddressclient_endpointZclient_channelZcleartext_mtu_1234r   r   r    
test_smoke\   s*    


rM   ztrio.testing.MockClock)autojump_clockr   c           
        sX  d}t dt     d| _t 4 I d H \}}t 4 I d H ddd fddd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.}	||I d H  | I d H |kstW 5 Q R X |	jsސq(qW 5 Q R X qW 5 Q I d H R X W 5 Q I d H R X d S )Nd   r   gMbP?r   r'   r0   r   c                   s   j ddddgddddgdd }t| j d	| j d
|  |dkrJd S |dkr^ |  q |dkrt d I d H  q |dkstt| j d	| j d| j	
    |  qq d S )NZdeliverZdropZdupedelaygffffff?g?)weightsr   r)   z:    z: delivered )choicesr*   sourceZdestinationZsend_packetr   sleeprandomrH   payloadhexdeliver_packet)r0   op)fnrr   r    route_packet   s&    


z:test_handshake_over_terrible_network.<locals>.route_packetc                   s*   z  |  W n tk
r$   Y nX d S N)
start_soonRuntimeErrorr0   )r<   r^   r   r    route_packet_wrapper   s    zBtest_handshake_over_terrible_network.<locals>.route_packet_wrapperzP################################################################################zclient starting do_handshakezclient finished do_handshake
   )rW   Randomr   enableZautojump_thresholdr=   r   r4   r^   ranger*   r!   rB   rC   r-   strencodemove_on_afterr.   rG   rH   cancelled_caught)
rN   Z
HANDSHAKES_rK   rc   irL   clientmsgcscoper   )r\   r<   r]   r^   r    $test_handshake_over_terrible_networkx   s2    
-"rq   r   c               
     sl   t  4 I d H N\} }t 8}||t}|dI d H  | I d H dksNtW 5 Q R X W 5 Q I d H R X d S )N   xyz)r=   r!   rB   rC   r.   rG   rH   rl   rK   rL   rn   r   r   r    test_implicit_handshake   s
    ru   c                    s   t  } t  }| jdI d H  t 4 I d H }ddddd}|| jt|I d H  || j	 t
}t 4 I d H  }||jd ||j W 5 Q I d H R X |j  W 5 Q I d H R X W 5 Q R X W 5 Q R X d S )Nr&   r   r	   r'   channelr   c              
     s@   t  4 I d H  }|| jd || j W 5 Q I d H R X d S )Ns   from server)r   r4   r`   r.   rG   )rx   r<   r   r   r    handler   s    z!test_full_duplex.<locals>.handlers   from client)r!   r   r3   r   r4   r5   r6   r7   rB   r+   rC   r`   r.   rG   r8   r9   )rJ   rL   Zserver_nurseryry   rn   r<   r   r   r    test_full_duplex   s    rz   c                    s   t  4 I d H \} }t }||t}| I d H  |  ttj	 |
dI d H  W 5 Q R X ttj	 | I d H  W 5 Q R X |  | I d H  W 5 Q R X W 5 Q I d H R X d S )N   abc)r=   r!   rB   rC   r-   closerD   rE   r   ClosedResourceErrorr.   rG   aclosert   r   r   r    test_channel_closing   s    r   c               
     s<   t dd4 I d H \} }|   W 5 Q I d H R X |   d S )NF)r"   )r=   r|   )rJ   rK   r   r   r    !test_serve_exits_cleanly_on_close  s    r   c                    s  t  4 I d H \} }t  4 I d H \\} }t D}||t}||t}|dI d H  |dI d H  | I d H dkst| I d H dkst|  t	t
j |dI d H  W 5 Q R X t	t
j | I d H  W 5 Q R X t	t
j ||t W 5 Q R X ddddd}t
 4 I d H 4}t	t
j ||jt|I d H  W 5 Q R X W 5 Q I d H R X W 5 Q R X W 5 Q I d H R X W 5 Q I d H R X d S )	Nr{   rs      xxxobjectr'   rl   r   c                   s   d S r_   r   rl   r   r   r    null_handler"  s    z+test_client_multiplex.<locals>.null_handler)r=   r!   rB   rC   r.   rG   rH   r|   rD   rE   r   r}   r4   r5   r6   r7   )rl   Zaddress1Zaddress2rL   client1client2r   r<   r   r   r    test_client_multiplex  s&    ,
r   c               
     s<   t j (} tjtdd t|  W 5 Q R X W 5 Q R X d S )Nz#^DTLS requires a SOCK_DGRAM socket$r?   )r   r   rD   rE   rI   r
   )sr   r   r    test_dtls_over_dgram_only*  s    r   c                    s   ddddd} t  }|jdI d H  t 4 I d H T}||jt| I d H  t	tj
 ||jt| I d H  W 5 Q R X |j  W 5 Q I d H R X t 4 I d H &}||jt| I d H  |j  W 5 Q I d H R X W 5 Q R X d S )Nr   r'   r   c                   s   d S r_   r   r   r   r   r    r   1  s    z'test_double_serve.<locals>.null_handlerrv   )r!   r   r3   r   r4   r5   r6   r7   rD   rE   ZBusyResourceErrorr8   r9   )r   rJ   r<   r   r   r    test_double_serve0  s     r   ztrio.abc.Clockc                   s   t  }|  t j}t X}|jdI d H  td&}||j t	}|
 I d H  W 5 Q R X |jsptW 5 Q R X W 5 Q R X d S )Nrv   rO   )r   rf   r!   r   r3   r   rj   rB   r+   rC   r-   rk   rH   )rN   r\   r   r   rp   rx   r   r   r    test_connect_to_non_serverB  s    r   c           	        s  t  }|  dD ]}t 4 I d H \}}t|d}|j|ksDt||t}t|d D ],}|	t
| I d H  tdI d H  q\| }|jdkstt|D ]"}| I d H t
| kstq|	dI d H  | I d H dkstW 5 Q R X W 5 Q I d H R X qd S )N)rd      )incoming_packets_buffer      s   buffer clear now)r   rf   r=   r!   r   rH   rB   rC   rg   r.   rh   ri   r   rV   Z
statisticsZ incoming_packets_dropped_in_triorG   )	rN   r\   buffer_sizerl   rK   rL   rn   rm   statsr   r   r    test_incoming_buffer_overflowN  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 j\}}tjjtjjdH}dd|
|||||||f
D ](}|||I d H  tdI d H  qtW 5 Q R X W 5 Q I d H R X d S )Nr   )ContentTypeHandshakeFragmentHandshakeTypeProtocolVersionRecordencode_handshake_fragmentencode_recordrd   )msg_typeZmsg_lenZmsg_seqZfrag_offsetZfrag_lenfrag)content_typeversionZepoch_seqnorX                r   rA   #      r   rs   r   )r   rf   
trio._dtlsr   r   r   r   r   r   r   Z	handshakeZDTLS10client_hellobytes	bytearrayr=   r   r   r   sendtorV   )rN   r\   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_cookierl   rK   r   Z
bad_packetr   r   r    *test_server_socket_doesnt_crash_on_garbagea  s    $

	
	r   c                   s   t    ddlm m t tdddd fdd}|_t	 4 I d H 8\}}t
  }||t}| I d H  W 5 Q R X qfW 5 Q I d H R X W 5 Q R X jstd S )	Nr   )	BadPacketdecode_client_hello_untrustedr   r   r'   rP   c                   s   z| j \}}}W n  k
r(   Y n^X t|dkrt| j }t}|t|krht|d }  ||  dN  < tj| |d} |  d S )Nr   r   )rX   )rX   lenr   nextr9   attrsZevolverZ   )r0   rl   cookierX   offsetr   rp   r   r\   Zoffset_to_corruptr   r    r^     s    
z2test_invalid_cookie_rejected.<locals>.route_packet)r   rf   r   r   r   r   CancelScoper   r^   r=   r!   rB   rC   r-   rk   rH   )rN   r^   rl   rK   rn   rx   r   r   r    test_invalid_cookie_rejected  s    
4r   c                   s,  t  }|  t }t }|jdI d H  t 4 I d H }dddd fdd}||jt	|I d H  t
d t & ||j t}| I d H  W 5 Q R X  jstt
d	 ||j t}| I d H d
ksttdI d H  |j  W 5 Q I d H R X W 5 Q R X W 5 Q R X d S )Nrv   Tr	   r'   rw   c              	     st   rXdt d    tdI d H  t d ttj |  I d H  W 5 Q R X 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 hellor>   )	r*   r9   r   rV   rD   rE   r/   r-   r.   rx   Zconnect_cscopeZ
first_timer   r    ry     s    zAtest_client_cancels_handshake_and_starts_new_one.<locals>.handlerzclient: starting first connectzclient: starting second connectr>   rd   )r   rf   r!   r   r3   r   r4   r5   r6   r7   r*   r   rB   r+   rC   r-   rk   rH   rG   rV   r8   r9   )rN   r\   r:   rn   r<   ry   rx   r   r   r    0test_client_cancels_handshake_and_starts_new_one  s$    

r   c                    st  t  b} t  N}| jdI d H  |jdI d H  ddddd d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st| |j	 t
}| I d H  ttj |d
I d H  W 5 Q R X |dI d H  | I d H dksBt|j  W 5 Q I d H R X W 5 Q R X W 5 Q R X d S )Nrv   r	   r'   rw   c                   s(   | 2 z3 d H W }|  |I d H  q6 d S r_   )r.   )rx   r0   r   r   r    r2   /  s    z-test_swap_client_server.<locals>.echo_handlerc              	     s*   t tj  | I d H  W 5 Q R X d S r_   )rD   rE   r   r/   r   r2   r   r    crashing_echo_handler3  s    z6test_swap_client_server.<locals>.crashing_echo_handlers   b as clients   association brokens   a as client)r!   r   r3   r   r4   r5   r6   r7   rB   r+   rC   r.   rG   rH   r-   rD   rE   r/   r8   r9   )abr   r<   Zb_to_aZa_to_br   r   r    test_swap_client_server*  s$    r   c                    s   t    ddddfdd} | _t 4 I d H \} t tt 4 I d H R}dd fdd	}|| td
I d H  d|j	
dj	 I d H  W 5 Q I d H R X W 5 Q R X W 5 Q I d H R X d S )NTr   r'   rP   c                   s*    rt d|  d S t d|  |  d S )Nzdropped packetzdelivered packet)r*   rZ   rb   
blackholedr\   r   r    r^   S  s
    

z@test_openssl_retransmit_doesnt_break_stuff.<locals>.route_packetrr   c                    sH     t} | jddI d H  | dI d H  |  I d H dksDtd S )Ng      ?Zinitial_retransmit_timeout   hi)rB   rC   r-   r.   rG   rH   )rn   )rK   rL   r   r    	connecterg  s    z=test_openssl_retransmit_doesnt_break_stuff.<locals>.connecterg?Fr   )r   rf   r^   r=   r!   r   r4   r`   rV   r   r   r+   )r^   rJ   r<   r   r   )rK   r   rL   r\   r    *test_openssl_retransmit_doesnt_break_stuffI  s     
r   c           	        s   t    d ddd fdd}|_t 4 I d H h\}}dD ]X}t H}t }d ||t}|j	|dI d H  t }|| |kst
W 5 Q R X qFW 5 Q I d H R X d S )	NTr   r'   rP   c                   s    r
d n
 |  d S )NF)rZ   rb   r   r   r    r^     s    zCtest_initial_retransmit_timeout_configuration.<locals>.route_packet)r   r      r   )r   rf   r^   r=   r!   r   current_timerB   rC   r-   rH   )	rN   r^   rl   rK   trn   beforerx   afterr   r   r    -test_initial_retransmit_timeout_configuration~  s    r   c               
     s   d t    ddd fdd} | _t d4 I d H f\}}t P}||t}|  | I d H  |	dI d H  |
 I d H dkstW 5 Q R X W 5 Q I d H R X d S )	Ni,  r   r'   rP   c                   sB   t d|   t dt| j  t| j ks4t|  d S )Ndelivering zpayload size: )r*   r   rX   rH   rZ   rb   ZMTUr\   r   r    r^     s    z9test_explicit_tiny_mtu_is_respected.<locals>.route_packetr1   r   )r   rf   r^   r=   r!   rB   rC   r,   r-   r.   rG   rH   )r^   r:   rK   rn   rx   r   r   r    #test_explicit_tiny_mtu_is_respected  s    
r   )r   rN   r   c              
     s   t      | rdndddd fdd}| _t| d4 I d H l\}}t| dR}||t}|d	 |d
I d H  |	 I d H d
kst
| dkst
W 5 Q R X W 5 Q I d H R X d S )Ni  i$  r   r'   rP   c                   s:   t | jkrtd|   ntd|    |  d S )Nz	dropping r   )r   rX   r*   rZ   rb   r\   r#   r   r    r^     s    z@test_handshake_handles_minimum_network_mtu.<locals>.route_packetr%   i'  rs   i(#  )r   rf   r^   r=   r!   rB   rC   r,   r.   rG   rH   rF   )r   rN   r^   rl   rK   rL   rn   r   r   r    *test_handshake_handles_minimum_network_mtu  s    
r   z$always:unclosed DTLS:ResourceWarningc               	     s   t j j} dddd}tt( | I d H }t j I d H  t	  W 5 Q R X t j I d H  t j j}| |k szt
| |kst
d S )Nintrr   c                    s   t  } tjjtjjdn}|dI d H  | | t}t 4 I d H ,}|	|j
 tj I d H  |j  W 5 Q I d H R X W 5 Q R X tj j}|S )Nr   rv   )r!   r   r   r   r3   rB   r+   rC   r4   r`   r-   testingwait_all_tasks_blockedr8   r9   lowlevelcurrent_statisticstasks_living)er   cr<   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   rD   warnsResourceWarningr   r   r   rH   )Zbefore_tasksr   r   Zafter_tasksr   r   r    !test_system_task_cleaned_up_on_gc  s    r   c               	     s8   t  } tt ~ t  W 5 Q R X tj I d H  d S r_   )r!   rD   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 5 Q R X tt ~t  W 5 Q R X d S )Nrv   r   r   )r   rf   r!   r   r3   Z_ensure_receive_loopr   r   r   r   r   r+   rD   r   r   r   )r\   r   r   r   r   r    test_gc_as_packet_received  s    "r   c               	   C  s:   dddd} t | }tt ~t  W 5 Q R X d S )Nr
   rr   c                    s   t  } |   t S r_   )r   rf   r!   )r\   r   r   r    main  s    z&test_gc_after_trio_exits.<locals>.main)r   runrD   r   r   r   )r   r   r   r   r    test_gc_after_trio_exits  s
    	
r   c               	     s0   t   } | j  tj I d H  W 5 Q R X d S r_   )r!   r   r|   r   r   r   r   r   r   r    'test_already_closed_socket_doesnt_crash+  s    
r   c                   s   t      t 4 I d H h\}ddd fdd}| _t 6}td  ||t}|	 I d H  W 5 Q R X W 5 Q R X W 5 Q I d H R X d S )Nr   r'   rP   c                   s     |  j  d S r_   )rZ   r   r|   rb   r\   r:   r   r    r^   >  s    
zEtest_socket_closed_while_processing_clienthello.<locals>.route_packetrd   )
r   rf   r=   r^   r!   r   rj   rB   rC   r-   )rN   rK   r^   rL   rn   r   r   r    /test_socket_closed_while_processing_clienthello4  s    r   c                   s   t  }|  ddddd}||_t 4 I d H \}}t l}||t t 4 I d H >}dd fdd}|	| t
d	I d H  ||t W 5 Q I d H R X W 5 Q R X W 5 Q I d H R X d S )
Nr   r'   rP   c                 S  s   d S r_   r   rb   r   r   r    r^   P  s    zGtest_association_replaced_while_handshake_running.<locals>.route_packetrr   c                	     s*   t tj   I d H  W 5 Q R X d S r_   )rD   rE   r   r/   r-   r   c1r   r    doomed_handshakeZ  s    zKtest_association_replaced_while_handshake_running.<locals>.doomed_handshakerd   )r   rf   r^   r=   r!   rB   rC   r   r4   r`   rV   )rN   r\   r^   rl   rK   rL   r<   r   r   r   r    1test_association_replaced_while_handshake_runningJ  s    
r   c                    s   t  } |   ddddd}|| _t 4 I d H Z\}}t D}||t}||t tt	j
 | I d H  W 5 Q R X W 5 Q R X W 5 Q I d H R X d S )Nr   r   rP   c                 S  s
   t  d S r_   )rH   rb   r   r   r    r^   j  s    zGtest_association_replaced_before_handshake_starts.<locals>.route_packet)r   rf   r^   r=   r!   rB   rC   rD   rE   r   r/   r-   )r\   r^   rl   rK   rL   r   r   r   r    1test_association_replaced_before_handshake_startse  s    r   c                    s   t  4 I d H \} }t }t 4 I d H n}tddD ] }|d|ft}||j q8||t}|	dI d H  |
 I d H dkst|j  W 5 Q I d H R X W 5 Q R X W 5 Q I d H R X d S )Nr   rd   r&   r   )r=   r!   r   r4   rg   rB   rC   r`   r-   r.   rG   rH   r8   r9   )rl   rK   rL   r<   rm   rx   r   r   r    test_send_to_closed_local_portw  s    r   )M
__future__r   rW   
contextlibr   	itertoolsr   typingr   r   r   rD   Ztrio._tests.pytest_pluginr   ZtrustmeZOpenSSLr   ImportErrorerrorr   Ztrio.testingr	   r
   Ztrio.testing._fake_netr   r   Z_core._tests.tutilr   r   r   collections.abcr   CAcaZ
issue_certZserver_certContextZDTLS_METHODr7   Zconfigure_certrC   Zconfigure_trustmarkZparametrizeparamZparametrize_ipv6r!   r=   rM   rq   ru   rz   r   r   r   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>   s   


%X
r*-4"
#



	