o
    ACe@                  
   @  sf  U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZmZmZmZ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m Z  d dl!m"Z"m#Z# zd dl$Z$d dl%m&Z& W n e'y Z( z
ee( W Y dZ([(ndZ([(ww d dlZddl)m*Z*mZ+ ddl,m-Z- ddl*m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9m:Z: ddl;m<Z<m=Z=m>Z>m?Z? ddl@mAZA ddlBmCZCmDZDmEZEmFZFmGZG erd dlHmIZI e$J ZKeKLdZMeNejOjPZQeRedreQ jSejT M  _SeMUeQ ejVdddgd dd%d&ZWd'd(dd.d/ZXe	dd3d4ZYe	dd7d8ZZG d9d: d:e-Z[dd;d<Z\e
dd>d?Z]ddd@ddHdIZ^ee#e"f Z_dJe`dK< ddMdNZaee ef ZbdJe`dO< ddQdRZcddSdTZdddUdVZeddWdXZfddYdZZgdd[d\Zhe3dd_d`ZiddadbZjddcddZkejljmejndekoejodfkdgdhddidjZpddkdlZqejlrdmd'dngddodpZsddqdrZtddsdtZuddudvZvddwdxZwddydzZxdd{d|Zydd}d~ZzdddZ{dddZ|dddZ}dddZ~dddZdddZdddZdddZejldddddZdddZdddZdddZdddZdS )    )annotationsN)asynccontextmanagercontextmanagersuppress)partial)
SSLContext)TYPE_CHECKINGAnyAsyncIteratorIteratorNoReturn)StapledStream)	MockClock)T_Stream)skip_if_optional_else_raise)ReceiveStream
SendStream)MemoryReceiveStreamMemorySendStream)SSL   )_coresocket)Stream)BrokenResourceErrorClosedResourceError)CancelScope)slow)aclose_forcefully)open_tcp_stream)SocketListenerSocketStream)NeedHandshakeErrorSSLListener	SSLStream_is_eof)ConflictDetector)	Sequencerassert_checkpointscheck_two_way_streamlockstep_stream_pairmemory_stream_pair)	TypeAliastrio-test-1.example.orgOP_IGNORE_UNEXPECTED_EOFmoduletls13tls12)scopeparamsrequestpytest.FixtureRequestreturnssl.SSLContextc                 C  sZ   t  }tt dr| jt j M  _t| | jdv r|S | jdkr*t jj	|_
|S t )Nr.   )defaultr0   r1   )sslcreate_default_contexthasattroptionsr.   TRIO_TEST_CAZconfigure_trustparamZ
TLSVersionZTLSv1_2Zmaximum_versionAssertionError)r4   ctx rA   8usr/lib/python3.10/site-packages/trio/_tests/test_ssl.py
client_ctxU   s   




rC   Fexpect_failsockstdlib_socket.socketrE   boolNonec             
   C  s6  zzPt j| ddd}|< |  	 |d}|sBtttj |  W d    n1 s.w   Y  	 W d    W W | 	  d S |
| q1 sKw   Y  W n0 ttfyb   Y W | 	  d S  ty } z|rqtd| ntd|  W Y d }~nd }~ww |rtdW | 	  d S W | 	  d S | 	  w )NTF)server_sideZsuppress_ragged_eofsi   z*ssl_echo_serve_sync got error as expected:z)ssl_echo_serve_sync got unexpected error:zfailed to fail?)
SERVER_CTXwrap_socketdo_handshakerecvr   BrokenPipeErrorr9   ZSSLZeroReturnErrorunwrapclosesendallConnectionResetErrorConnectionAbortedError	ExceptionprintRuntimeError)rF   rE   wrappeddataexcrA   rA   rB   ssl_echo_serve_syncg   sF   

&

r[   kwargsr	   AsyncIterator[SocketStream]c               
   K s   t  \}}t 4 I d H G}|1 | |tjjtt|fi |  t	t
|V  W d    n1 s7w   Y  W d    n1 sFw   Y  W d   I d H  d S 1 I d H s\w   Y  d S N)stdlib_socket
socketpairtrioopen_nursery
start_soonZ	to_threadZrun_syncr   r[   r!   tsocketfrom_stdlib_socket)r\   abnurseryrA   rA   rB   ssl_echo_server_raw   s    .ri   r    AsyncIterator[SSLStream[Stream]]c              	   K sZ   t di |4 I d H }t|| ddV  W d   I d H  d S 1 I d H s&w   Y  d S Nr-   server_hostnamerA   )ri   r$   )rC   r\   rF   rA   rA   rB   ssl_echo_server   s   .rn   c                   @  sV   e Zd ZddddZdddZdd
dZdddZdddZdddZddddZ	dS )PyOpenSSLEchoStreamNsleeperrI   r6   c                 C  s   t t j}ddlm} | }t|jdr||jj tt dr#J t	
| t |d | _| j  t | _t | _td| _td| _|d u rUddd}|| _d S || _d S )Nr   )BindingSSL_OP_NO_TLSv1_3ZOP_NO_TLSv1_4z2simultaneous calls to PyOpenSSLEchoStream.send_allz6simultaneous calls to PyOpenSSLEchoStream.receive_some_objectr6   rI   c                   s   d S r^   rA   rs   rA   rA   rB   no_op_sleeper      z3PyOpenSSLEchoStream.__init__.<locals>.no_op_sleeperrs   rt   r6   rI   )r   ContextZSSLv23_METHODZ,cryptography.hazmat.bindings.openssl.bindingrq   r;   libset_optionsrr   TRIO_TEST_1_CERTconfigure_certZ
Connection_connZset_accept_stater   Z
ParkingLot_lot	bytearray_pending_cleartextr&   _send_all_conflict_detector_receive_some_conflict_detectorrp   )selfrp   r@   rq   rg   rv   rA   rA   rB   __init__   s*   





zPyOpenSSLEchoStream.__init__c                   s   | j   d S r^   )r~   Zbio_shutdownr   rA   rA   rB   aclose      zPyOpenSSLEchoStream.acloserH   c                 C  s
   | j  S r^   )r~   renegotiate_pendingr   rA   rA   rB   r      s   
z'PyOpenSSLEchoStream.renegotiate_pendingc                 C  s   | j  sJ d S r^   )r~   renegotiater   rA   rA   rB   r      s   zPyOpenSSLEchoStream.renegotiatec                   sZ   | j  t I d H  t I d H  | dI d H  W d    d S 1 s&w   Y  d S )Nwait_send_all_might_not_block)r   r   
checkpointrp   r   rA   rA   rB   r      s   "z1PyOpenSSLEchoStream.wait_send_all_might_not_blockrY   bytesc              	     s  t d | jp t I d H  t I d H  | dI d H  | j| 	 | dI d H  z| jd}W n  tj	yM   | j
  t d| j  Y n tjyV   Y n	w |  j|7  _q&| j  | dI d H  t d W d    d S 1 s{w   Y  d S )Nz  --> transport_stream.send_allsend_allT   zrenegotiations:z(  <-- transport_stream.send_all finished)rV   r   r   r   rp   r~   Z	bio_writerN   r   ZZeroReturnErrorshutdownZtotal_renegotiationsWantReadErrorr   r   Z
unpark_allr   rY   rA   rA   rB   r     s0   


"zPyOpenSSLEchoStream.send_allnbytes
int | Nonec                   s  t d |d u rd}| j zt I d H  t I d H  	 | dI d H  z| j|W W | dI d H  t d W  d    S  tjy   | j	rt d| j	 z| j	dd }| j
t| W n@ tjy   z| j|W  Y  Y W | dI d H  t d W  d    S  tjy   t d	 | j I d H  Y nw Y nw | j	dd= nt d
 | j I d H  Y nw q| dI d H  t d w 1 sw   Y  d S )Nz#  --> transport_stream.receive_somei   Treceive_somez,  <-- transport_stream.receive_some finishedz
    tryingr   r   zparking (a)zparking (b))rV   r   r   r   rp   r~   Zbio_readr   r   r   sendr   r   Zpark)r   r   Z	next_byterA   rA   rB   r     sT   ) ,
z PyOpenSSLEchoStream.receive_somer^   )rp   rI   r6   rI   r6   rI   )r6   rH   )rY   r   r6   rI   )r   r   r6   r   )
__name__
__module____qualname__r   r   r   r   r   r   r   rA   rA   rA   rB   ro      s    
9



ro   c               
     sv  t  } ttj4}t 4 I d H }|| jd || jd W d   I d H  n1 I d H s2w   Y  W d    n1 sAw   Y  dt|j	v sOJ t  } ttj3}t 4 I d H }|| jd || j
 W d   I d H  n1 I d H sw   Y  W d    n1 sw   Y  dt|j	v sJ t  } ttj2}t 4 I d H }|| j
 || j
 W d   I d H  n1 I d H sw   Y  W d    n1 sw   Y  dt|j	v sJ t  } ttj5}t 4 I d H }|| jd || jd W d   I d H  n1 I d H sw   Y  W d    n	1 s*w   Y  dt|j	v s9J d S )N   xZsimultaneousr   )ro   pytestraisesr   BusyResourceErrorrb   rc   r   strvaluer   r   )sexcinforh   rA   rA   rB   3test_PyOpenSSLEchoStream_gives_resource_busy_errorsR  sJ   (((*r   (Iterator[SSLStream[PyOpenSSLEchoStream]]c                 k  s$    t di |}t|| ddV  d S rk   )ro   r$   )rC   r\   ZfakesockrA   rA   rB   virtual_ssl_echo_serverv  s   r   client_kwargsserver_kwargsclient_transportr   server_transportr   dict[str, Any] | Noner   /tuple[SSLStream[T_Stream], SSLStream[T_Stream]]c                C  sL   |d u ri }|d u ri }t || fddi|}t |tfddi|}||fS )Nrm   r-   rJ   T)r$   rK   )rC   r   r   r   r   
client_ssl
server_sslrA   rA   rB   ssl_wrap_pair~  s(   r   r,   MemoryStapledStreamEtuple[SSLStream[MemoryStapledStream], SSLStream[MemoryStapledStream]]c                 K     t  \}}t| ||fi |S r^   )r+   r   rC   r\   r   r   rA   rA   rB   ssl_memory_stream_pair     
r   MyStapledStream=tuple[SSLStream[MyStapledStream], SSLStream[MyStapledStream]]c                 K  r   r^   )r*   r   r   rA   rA   rB   ssl_lockstep_stream_pair  r   r   c              	     s  t | 4 I d H +}|jrJ |dI d H  |dI d H dks#J | I d H  W d   I d H  n1 I d H s:w   Y  tdd4 I d H B}t }t||dd}|jrYJ t	
t}|dI d H  W d    n1 sqw   Y  t|jjtjsJ W d   I d H  n1 I d H sw   Y  tdd4 I d H ?}t|| dd}|jrJ t	
t}|dI d H  W d    n1 sw   Y  t|jjtjsJ W d   I d H  d S 1 I d H sw   Y  d S )Nr   r   TrD   r-   rl   ztrio-test-2.example.org)rn   rJ   r   r   r   ri   r9   r:   r$   r   r   r   
isinstancer   	__cause__SSLErrorZCertificateError)rC   r   rF   Zbad_client_ctxr   rA   rA   rB   test_ssl_client_basics  s0   
(
(	
.r   c              	     s$  t  \ }  |d t|}tt|tdd}|js J d fdd}tj	|d}|
  |dI d H d	ks>J |d
I d H  |dI d H dksRJ |dI d H dks^J | I d H  |  W d    n1 ssw   Y  W d    d S W d    d S 1 sw   Y  d S )NTrJ   r6   rI   c                    sb   j  dd } | d | ddksJ | d |   W d    d S 1 s*w   Y  d S )Nr-   rl   r   r      y   z)rL   rR   rN   rP   )Zclient_sockrf   rC   rA   rB   client  s   


"z&test_ssl_server_basics.<locals>.client)targetr   r   r   r       r   )r_   r`   rd   re   r$   r!   rK   rJ   	threadingThreadstartr   r   r   join)rC   rg   Zserver_sockr   r   trA   r   rB   test_ssl_server_basics  s$   


	
Pr   c              	     s  t dd4 I d H }| }t }t||dd}|j|u sJ |j|u s&J |jdks-J |jdks4J t	t
 |j W d    n1 sGw   Y  dt|v sTJ dt|v s\J t	t
 d|_W d    n1 sow   Y  t	t
 d|_W d    n1 sw   Y  ||_|j|u sJ t	t}| I d H  W d    n1 sw   Y  t|jjtjsJ W d   I d H  d S 1 I d H sw   Y  d S )	NTrD   r-   rl   Ftransport_streamcontextZasdf)ri   r9   r:   r$   r   r   rJ   rm   r   r   AttributeErrorZ
asfdasdfsadirr   rM   r   r   r   r   )rC   rF   Zgood_ctxZbad_ctxr   r   rA   rA   rB   test_attributes  s6   .r   c              
     s,  d d  t  t  d fdd}dfd	d
}t| 4 I d H H}t 4 I d H #}||| ||| ||j ||j W d   I d H  n1 I d H s[w   Y  | I d H  W d   I d H  n1 I d H sww   Y  tt  krksJ  J ksJ d S )N   i   r   r   r6   rI   c                   sB   t  D ]}t| t|g }|7 | |I d H  qd S r^   )rangerV   r   r   )r   ichunk)CHUNKS
CHUNK_SIZEsentrA   rB   sender2  s   z'test_full_duplex_basics.<locals>.senderc                   s>   t k r|  d I d H }|7 t k sd S d S )Nr   )lenr   )r   r   )r   EXPECTEDreceivedrA   rB   receiver:  s
   z)test_full_duplex_basics.<locals>.receiver)r   r   r6   rI   )r   rn   r   rb   rc   rM   r   r   )rC   r   r   r   rh   rA   )r   r   r   r   r   rB   test_full_duplex_basics*  s&   (($r   c                   s   t | D}| I d H  |j  |dI d H  |dI d H dks&J |dI d H  |dI d H dks:J | I d H  W d    d S 1 sLw   Y  d S )N   ar      b)r   rM   r   r   r   r   r   rC   r   rA   rA   rB   test_renegotiation_simpleO  s   

"r   
mock_clockr   c                   s  d| _ dd l}|ddfdd}d  fdd	}d!fddd"fdd t||d I d H  dI d H  j   dI d H  | I d H  tdD ]q}t|d g}td| d g}j  t	
 4 I d H }|| | | W d   I d H  n1 I d H sw   Y  t	
 4 I d H }| | || W d   I d H  n1 I d H sw   Y  | I d H  qVtdD ]V}t|d g}td| d g}|I d H  j   |I d H  t	
 4 I d H }| | || W d   I d H  n1 I d H sw   Y  | I d H  qW d    n	1 s.w   Y  d#dd}	d fdd}
t||	dKdI d H  j  t	
 4 I d H }| d ||
 W d   I d H  n1 I d H sww   Y  | I d H   I d H  W d    n	1 sw   Y  d#dd}t||dMdI d H  j  t	
 4 I d H }| d |j W d   I d H  n1 I d H sw   Y  | I d H   I d H  W d    d S 1 sw   Y  d S )$Nr   rs   rt   r6   rI   c                   s   t  ddI d H  d S )Nr   
   )ra   sleepuniformru   )rrA   rB   rp   l     z.test_renegotiation_randomized.<locals>.sleeperc                     s   j  r?t  dI d H  W d    n1 sw   Y  t   dI d H  W d    n1 s5w   Y  j  std d S )N   -z-- clear --)r   r   r(   rV   rA   )expectr   r   rA   rB   clearo  s   

z,test_renegotiation_randomized.<locals>.clearbyter   c                   sZ    j dI d H  td|  t   | I d H  W d    d S 1 s&w   Y  d S )Nz
outer sendzcalling SSLStream.send_all)r   rp   rV   r(   r   )r   r   rA   rB   r   w  s   
"z+test_renegotiation_randomized.<locals>.sendexpectedc                   sr    j dI d H  td|  t| dksJ t   dI d H | ks'J W d    d S 1 s2w   Y  d S )Nr   z)calling SSLStream.receive_some, expectingr   )r   rp   rV   r   r(   r   )r   r   rA   rB   r   }  s   
"z-test_renegotiation_randomized.<locals>.expect)rp   r   d      r   methodr   c                   s"   | dkrt dI d H  d S d S )Nr   順 ra   r   r   rA   rA   rB   sleeper_with_slow_send_all  s   zAtest_renegotiation_randomized.<locals>.sleeper_with_slow_send_allc                     s$   t dI d H    I d H  d S )N  )ra   r   r   rA   r   rA   rB   sleep_then_wait_writable  s   z?test_renegotiation_randomized.<locals>.sleep_then_wait_writabler   c                   s>   | dkrt dI d H  d S | dkrt dI d H  d S d S )Nr   r   r   r   r   r   rA   rA   rB   *sleeper_with_slow_wait_writable_and_expect  s   zQtest_renegotiation_randomized.<locals>.sleeper_with_slow_wait_writable_and_expectrx   r   )r   r   r6   rI   )r   r   r6   rI   )r   r   r6   rI   )Zautojump_thresholdrandomRandomr   rM   r   r   r   r   r   rb   rc   r   r   )r   rC   r   rp   r   r   Zb1Zb2rh   r   r   r   rA   )r   r   r   r   rB   test_renegotiation_randomized`  s   


((
*
'
*

*$r   c              
     s  d
 fdd}d
 fdd}d
 fdd}t | \ }ttj0}t 4 I d H }|| || W d   I d H  n1 I d H sFw   Y  W d    n1 sUw   Y  d	t|jv scJ t | \ }ttj0}t 4 I d H }|| || W d   I d H  n1 I d H sw   Y  W d    n1 sw   Y  d	t|jv sJ t | \ }ttj0}t 4 I d H }|| || W d   I d H  n1 I d H sw   Y  W d    n1 sw   Y  d	t|jv sJ t | \ }ttj1}t 4 I d H }|| || W d   I d H  n1 I d H s.w   Y  W d    n	1 s>w   Y  d	t|jv sMJ d S )Nr6   rI   c                     >   t    dI d H  W d    d S 1 sw   Y  d S )Nr   )r(   r   rA   r   rA   rB   do_send_all     "z.test_resource_busy_errors.<locals>.do_send_allc                     r   Nr   )r(   r   rA   r   rA   rB   do_receive_some  r   z2test_resource_busy_errors.<locals>.do_receive_somec                     <   t     I d H  W d    d S 1 sw   Y  d S r^   )r(   r   rA   r   rA   rB    do_wait_send_all_might_not_block     "zCtest_resource_busy_errors.<locals>.do_wait_send_all_might_not_blockzanother taskr   )	r   r   r   r   r   rb   rc   r   r   )rC   r   r   r   rs   r   rh   rA   r   rB   test_resource_busy_errors  sP   
(
(
(
*r  c                    sR   g  G  fdddt } t }t|  |dd}| I d H   dgks'J d S )Nc                      s:   e Zd Zd fddZdddZddddZdddZdS )zEtest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStreamr6   rI   c                   s     d d S )Nok)appendr   recordrA   rB   r     r   zctest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStream.wait_send_all_might_not_blockc                   
   t dNzShould not get calledr?   r   rA   rA   rB   r   	     zLtest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStream.acloseN	max_bytesr   bytes | bytearrayc                   r  r  r  )r   r
  rA   rA   rB   r     r	  zRtest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStream.receive_somerY   bytes | bytearray | memoryviewc                   r  r  r  r   rA   rA   rB   r     r	  zNtest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStream.send_allr   r^   )r
  r   r6   r  )rY   r  r6   rI   )r   r   r   r   r   r   r   rA   r  rA   rB   
NotAStream  s
    
r  xrl   r  )r   r9   r:   r$   r   )r  r@   r   rA   r  rB   1test_wait_writable_calls_underlying_wait_writable  s   r  nt)   r   z)frequently fails on Windows + Python 3.10)reasonc              	     sn  t | 4 I d H }t  | I d H  W d    n1 sw   Y  t  | I d H  W d    n1 s9w   Y  t  | I d H  W d    n1 sSw   Y  t  |dI d H  W d    n1 snw   Y  t  |dI d H  W d    n1 sw   Y  t  |dI d H  W d    n1 sw   Y  t  |dI d H  W d    n1 sw   Y  t  | I d H  W d    n1 sw   Y  W d   I d H  n1 I d H sw   Y  t | 4 I d H .}| I d H  t  | I d H  W d    n	1 sw   Y  W d   I d H  d S 1 I d H s0w   Y  d S )Ns   xxxr   )rn   r(   rM   r   r   r   rP   r   r   rA   rA   rB   test_checkpoints  sB   ( 0r  c              	     s   t | 4 I d H d}| I d H  t  |dI d H  W d    n1 s'w   Y  t  |dI d H  W d    n1 sBw   Y  |dI d H  |dI d H dks[J | I d H  W d   I d H  d S 1 I d H ssw   Y  d S )Nr   r   r   )rn   rM   r(   r   r   r   r   rA   rA   rB   test_send_all_empty_string9  s   .r  https_compatibleTc                   s4   d fdd}d	 fdd}t ||I d H  d S )
Nr6   r   c                     s   t  dididS )Nr  r   )r   rA   rC   r  rA   rB   stream_makerM  s   z,test_SSLStream_generic.<locals>.stream_makerr   c               	     sp   t  \} }t 4 I d H }|| j ||j W d   I d H  | |fS 1 I d H s/w   Y  | |fS r^   )r   r   rb   rc   rM   )r   serverrh   rC   rA   rB   clogged_stream_makerW  s   z4test_SSLStream_generic.<locals>.clogged_stream_maker)r6   r   )r6   r   )r)   )rC   r  r  r  rA   r  rB   test_SSLStream_genericI  s   
r  c              	     s   t | \  jjt d fdd}dfdd}t 4 I d H }|| || W d   I d H  d S 1 I d H sFw   Y  d S )Nr6   rI   c               	     s     I d H   dI d H   dI d H dksJ  dI d H  d4 I d H  jj} d j_W d   I d H  n1 I d H sEw   Y   dI d H dksVJ  ju s]J   I d H \}}|u slJ |dksrJ  jd u syJ |dI d H  | j_j I d H  d S )Nr   r   r   r   r   r      trailing)rM   r   r   send_streamsend_all_hookr   rP   )r  rawtrailing)r   r   seqrA   rB   r   q  s$   
(ztest_unwrap.<locals>.clientc               	     s     I d H  dI d H dksJ dI d H  dI d H dks(J  d4 I d H   I d H \} }W d   I d H  n1 I d H sJw   Y  | u sUJ |dks[J jd u sbJ d S )Nr   r   r   r   r  )rM   r   r   rP   r   )r  r   )r!  r   r   rA   rB   r    s   (ztest_unwrap.<locals>.serverr   )r   r   r'   r   rb   rc   rC   r   r  rh   rA   )r   r   r!  r   r   rB   test_unwrapj  s   
.r#  c              	     s  t | \  j}d fdd}dfdd}t 4 I d H }|| || W d   I d H  n1 I d H s;w   Y  tt |dI d H  W d    n1 sXw   Y  t	   
 I d H  W d    n1 srw   Y  t	   
 I d H  W d    n1 sw   Y  tt dI d H  W d    n1 sw   Y  tt  dI d H d	ksJ W d    n1 sw   Y  tt   I d H  W d    n1 sw   Y  tt   I d H  W d    n	1 sw   Y  t | \ dfd
d}t 4 I d H }| j
 || W d   I d H  d S 1 I d H s;w   Y  d S )Nr6   rI   c                     r   r^   )r(   r   rA   )r   rA   rB   client_closer  r   z-test_closing_nice_case.<locals>.client_closerc                     sl     dI d H dksJ   dI d H dksJ t    I d H  W d    d S 1 s/w   Y  d S Nr   r   )r   r(   r   rA   r   rA   rB   server_closer  s   "z-test_closing_nice_case.<locals>.server_closers   123r   r   c                     sz   t    dI d H dksJ W d    n1 sw   Y  t     I d H  W d    d S 1 s6w   Y  d S r%  )r(   r   r   rA   r&  rA   rB   expect_eof_server  s   "z1test_closing_nice_case.<locals>.expect_eof_serverr   )r   r   r   rb   rc   r   r   r   r   r(   r   r   rP   rM   )rC   r   r$  r'  rh   r(  rA   )r   r   rB   test_closing_nice_case  sH   
(0r)  c              	     s,  t | \}}t 4 I d H }||j ||j W d   I d H  n1 I d H s,w   Y  ddd}||jj_t	t
 |dI d H  W d    n1 sSw   Y  t	t | I d H  W d    n1 sow   Y  d d fdd	}||jj_||jj_| I d H   d
ksJ d S )Nr6   r   c                        t r^   KeyErrorrA   rA   rA   rB   bad_hook  rw   z3test_send_all_fails_in_the_middle.<locals>.bad_hookr   r   rI   c                     s    d7  d S r   rA   rA   closedrA   rB   
close_hook  s   z5test_send_all_fails_in_the_middle.<locals>.close_hookr   r6   r   r   )r   r   rb   rc   rM   r   r  r  r   r   r,  r   r   r   r0  receive_streamr   )rC   r   r  rh   r-  r0  rA   r.  rB   !test_send_all_fails_in_the_middle  s(   (



r3  c              	     s   t  \}}t|| dd}t|tdd}t|| dd t|tddd fdd}dfd	d
}t 4 I d H }|| || W d   I d H  d S 1 I d H sTw   Y  d S )Nr-   rl   Tr   r6   rI   c                     s.     dI d H   dI d H dksJ d S )N   hir      bye)r   r   rA   )client_2rA   rB   r   
  s   z!test_ssl_over_ssl.<locals>.clientc                     s.     dI d H dksJ  dI d H  d S )Nr   r4  r5  )r   r   rA   )server_2rA   rB   r    s   z!test_ssl_over_ssl.<locals>.serverr   )r+   r$   rK   r   rb   rc   )rC   Zclient_0Zserver_0Zclient_1Zserver_1r   r  rh   rA   )r6  r7  rB   test_ssl_over_ssl  s    

.r8  c              	     s   t | \}}t 4 I d H }||j ||j W d   I d H  n1 I d H s,w   Y  t|I d H  tt	 |
dI d H  W d    n1 sQw   Y  tt	 |dI d H  W d    n1 snw   Y  | I d H  d S )Nr   
   xxxxxxxxxx)r   r   rb   rc   rM   ra   r   r   r   r   r   r   r   r"  rA   rA   rB   test_ssl_bad_shutdown  s   (r:  c              	     s   t | ddiddid\}}t 4 I d H }||j ||j W d   I d H  n1 I d H s3w   Y  t|I d H  |dI d H dksLJ t	t
 |dI d H  W d    n1 sdw   Y  | I d H  d S )Nr  Tr   r   r   r   r9  )r   r   rb   rc   rM   ra   r   r   r   r   r   r   r   r"  rA   rA   rB    test_ssl_bad_shutdown_but_its_ok(  s    
(r<  c               	     s   t dd4 I d H 3} t }t| |dd}tt | I d H  W d    n1 s-w   Y  W d   I d H  d S 1 I d H sCw   Y  d S )NTrD   r-   rl   )ri   r9   r:   r$   r   r   r   r   )rF   rC   r   rA   rA   rB   (test_ssl_handshake_failure_during_aclose<  s   .r=  c              	     s   t | \}}t 4 I d H }||j ||j W d   I d H  n1 I d H s,w   Y  |jjj dd fdd}||jj_t	t
 | I d H  W d    n1 s\w   Y  dksgJ d S )Nr   r6   r   c                     s    d usJ    d7 t r   r+  rA   Zclient_orig_close_hookZtransport_close_countrA   rB   r0  [  s   z4test_ssl_only_closes_stream_once.<locals>.close_hookr   r1  )r   r   rb   rc   rM   r   r  r0  r   r   r,  r   )rC   r   r  rh   r0  rA   r>  rB    test_ssl_only_closes_stream_onceO  s   (

r?  c              	     s   t | ddiddid\} t 4 I d H }||j | j W d   I d H  n1 I d H s3w   Y  d	 fdd}t 4 I d H }||j || W d   I d H  d S 1 I d H sdw   Y  d S )
Nr  FTr;  r6   rI   c                    sP   t t}  dI d H  W d    n1 sw   Y  t| jjs&J d S )Nr   )r   r   r   r   r%   r   r   )r   r  rA   rB   receive_and_expect_errorv  s
   zKtest_ssl_https_compatibility_disagreement.<locals>.receive_and_expect_errorr   )r   r   rb   rc   rM   r   )rC   r   rh   rA  rA   r@  rB   )test_ssl_https_compatibility_disagreementi  s   
(.rB  c              	     s   t | ddiddid\} d fdd}t 4 I d H }||j || W d   I d H  d S 1 I d H s:w   Y  d S )	Nr  Tr;  r6   rI   c                     s     dI d H dksJ d S r%  )r   rA   r@  rA   rB   server_expect_clean_eof  r   zEtest_https_mode_eof_before_handshake.<locals>.server_expect_clean_eofr   )r   r   rb   rc   r   )rC   r   rC  rh   rA   r@  rB   $test_https_mode_eof_before_handshake  s   
.rD  c              	     s   t | \}}ddd}||jj_tt" t  | I d H  W d    n1 s,w   Y  W d    n1 s;w   Y  tt	+ t  | I d H  W d    n1 s[w   Y  W d    d S W d    d S 1 ssw   Y  d S )Nr6   r   c                     r*  r^   r+  rA   rA   rA   rB   r-    rw   z2test_send_error_during_handshake.<locals>.bad_hookr1  )
r   r   r  r  r   r   r,  r(   rM   r   )rC   r   r  r-  rA   rA   rB    test_send_error_during_handshake  s"   

"rE  c              	     s   t | \ }d
dd}| jj_d fdd	}t 4 I d H }|||j ||j W d   I d H  n1 I d H s>w   Y  t	
t+ t    I d H  W d    n1 s^w   Y  W d    d S W d    d S 1 svw   Y  d S )Nr6   r   c                     r*  r^   r+  rA   rA   rA   rB   r-    rw   z5test_receive_error_during_handshake.<locals>.bad_hookcancel_scoper   rI   c              	     sl   t t" t    I d H  W d    n1 sw   Y  W d    n1 s+w   Y  |   d S r^   )r   r   r,  r(   rM   cancel)rF  r   rA   rB   client_side  s   z8test_receive_error_during_handshake.<locals>.client_sider1  )rF  r   r6   rI   )r   r   r2  Zreceive_some_hookr   rb   rc   rF  rM   r   r   r   r(   )rC   r  r-  rI  rh   rA   rH  rB   #test_receive_error_during_handshake  s    

("rJ  c                   x   t | \}}tt |  W d    n1 sw   Y  tt |  W d    d S 1 s5w   Y  d S r^   )r   r   r   r"   selected_alpn_protocolrC   r   r  rA   rA   rB   ,test_selected_alpn_protocol_before_handshake     

"rN  c              	        t | \}}t 4 I d H }||j ||j W d   I d H  n1 I d H s,w   Y  | d u s9J | d u sAJ | | ksKJ d S r^   )r   r   rb   rc   rM   rL  r"  rA   rA   rB   (test_selected_alpn_protocol_when_not_set  s   (rQ  c                   rK  r^   )r   r   r   r"   selected_npn_protocolrM  rA   rA   rB   +test_selected_npn_protocol_before_handshake  rO  rS  zCignore: ssl module. NPN is deprecated, use ALPN instead:UserWarningzAignore:ssl NPN is deprecated, use ALPN instead:DeprecationWarningc              	     rP  r^   )r   r   rb   rc   rM   rR  r"  rA   rA   rB   'test_selected_npn_protocol_when_not_set  s   (rT  c                   rK  r^   )r   r   r   r"   get_channel_bindingrM  rA   rA   rB   )test_get_channel_binding_before_handshake  rO  rV  c              	     s   t | \}}t 4 I d H }||j ||j W d   I d H  n1 I d H s,w   Y  | d us9J | d usAJ | | ksKJ d S r^   )r   r   rb   rc   rM   rU  r"  rA   rA   rB   (test_get_channel_binding_after_handshake  s   (rW  c              	     s   t | \}}t 4 I d H }||j ||j W d   I d H  n1 I d H s,w   Y  | d u s9J t|  d| d v sIJ d S )N)ZDNSr-   ZsubjectAltName)r   r   rb   rc   rM   ZgetpeercertrV   r"  rA   rA   rB   test_getpeercert  s   (rX  c                   sx  d
 fdd}| I d H \}}}|4 I d H l |  I d H }|4 I d H : |jr+J t 4 I d H }||j ||j W d   I d H  n1 I d H sPw   Y  W d   I d H  n1 I d H sew   Y  | I d H  | dksyJ W d   I d H  n1 I d H sw   Y  |dd	I d H \}}}|  I d H }|jsJ t|I d H  t|I d H  t|I d H  d S )Nr\   r	   r6   Mtuple[tsocket.SocketType, SSLListener[SocketStream], SSLStream[SocketStream]]c                    sh   t  }|dI d H  |d t|}t|tfi | }t|  I d H }t	| dd}|||fS )N)z	127.0.0.1r   r   r-   rl   )
rd   r   bindlistenr    r#   rK   r   getsocknamer$   )r\   listen_sockZsocket_listenerssl_listenerZtransport_client
ssl_clientr  rA   rB   setup  s   

ztest_SSLListener.<locals>.setupT)r  )r\   r	   r6   rY  )	acceptZ_https_compatibler   rb   rc   rM   r   filenor   )rC   r`  r]  r^  r_  Z
ssl_serverrh   rs   rA   r  rB   test_SSLListener  s*   
*(	(
rd  )r4   r5   r6   r7   )rF   rG   rE   rH   r6   rI   )r\   r	   r6   r]   )rC   r   r\   r	   r6   rj   r   )rC   r   r\   r	   r6   r   )rC   r   r   r   r   r   r   r   r   r   r6   r   )rC   r   r\   r	   r6   r   )rC   r   r\   r	   r6   r   )rC   r   r6   rI   )r   r   rC   r   r6   rI   )rC   r   r  rH   r6   rI   )
__future__r   osr   r_   r9   sysr   
contextlibr   r   r   	functoolsr   r   typingr   r	   r
   r   r   r   ra   r   Z
trio._corer   Z	trio._sslr   Ztrio._tests.pytest_pluginr   Ztrio.abcr   r   Ztrio.testingr   r   ZtrustmeZOpenSSLr   ImportErrorerror r   rd   _abcr   r   r   Z
_core._runr   Z_core._tests.tutilr   Z_highlevel_genericr   Z_highlevel_open_tcp_streamr   Z_highlevel_socketr    r!   Z_sslr"   r#   r$   r%   Z_utilr&   testingr'   r(   r)   r*   r+   typing_extensionsr,   ZCAr=   Zissue_server_certr|   r:   ZPurposeZCLIENT_AUTHrK   r;   r<   r.   r}   ZfixturerC   r[   ri   rn   ro   r   r   r   r   __annotations__r   r   r   r   r   r   r   r   r   r  r  ZmarkZskipifnameversion_infor  r  Zparametrizer  r#  r)  r3  r8  r:  r<  r=  r?  rB  rD  rE  rJ  rN  rQ  rS  filterwarningsrT  rV  rW  rX  rd  rA   rA   rA   rB   <module>   s    

	3 
$






E
%
v
*

 
6
>

















