o
    4@HhP                  
   @  s  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 d dl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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l,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z; ddl<m=Z=m>Z>m?Z?m@Z@mAZA erd dlBmCZCmDZDmEZEmFZF d dlGmHZH d dlImJZJ d dlKmLZL ddlMmNZN e O ZPePQdZReSejTjUZVeWedreV jXejY M  _XeRZeV ej[ddd gd!dd&d'Z\d(d)dd/d0Z]e	ddd2d3Z^e		(ddd6d7Z_G d8d9 d9e)Z`dd:d;Zae
	ddd?d@ZbdddAddIdJZceeef ZddKeedL< 		dddOdPZfeeef ZgdKeedQ< 		dddSdTZhddUdVZiddWdXZjddYdZZkdd[d\Zldd]d^Zme-ddadbZnddcddZoddedfZpejqjrejsdgkoejtdhkdidjddkdlZuddmdnZvejqwdod(dpgddqdrZxddsdtZyddudvZzddwdxZ{ddydzZ|dd{d|Z}dd}d~Z~dddZdddZdddZdddZdddZdddZdddZdddZdddZejqdddddZdddZdddZdddZdddZdS )    )annotationsN)asynccontextmanagercontextmanagersuppress)partial)
SSLContext)TYPE_CHECKINGAnyNoReturn)StapledStream)skip_if_optional_else_raise)ReceiveStream
SendStream)MatcherMemoryReceiveStreamMemorySendStreamRaisesGroup)SSL   )_coresocket)Stream)BrokenResourceErrorClosedResourceError)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)AsyncIterator	AwaitableCallableIterator)	TypeAlias)	MockClock)T_Stream)CancelScope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 )Nr2   )defaultr4   r5   )sslcreate_default_contexthasattroptionsr2   TRIO_TEST_CAconfigure_trustparam
TLSVersionTLSv1_2maximum_versionAssertionError)r8   ctx rI   T/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/trio/_tests/test_ssl.py
client_ctxb   s   




rK   Fexpect_failsockstdlib_socket.socketrM   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_side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   BrokenPipeErrorr=   SSLZeroReturnErrorunwrapclosesendallConnectionResetErrorConnectionAbortedError	ExceptionprintRuntimeError)rN   rM   wrappeddataexcrI   rI   rJ   ssl_echo_serve_synct   sJ   

&

re   AsyncIterator[SocketStream]c                 C s   t  \}}t 4 I d H E}|/ | |tjjtt|| d t	t
|V  W d    n1 s5w   Y  W d    n1 sDw   Y  W d   I d H  d S 1 I d H sZw   Y  d S )NrL   )stdlib_socket
socketpairtrioopen_nursery
start_soon	to_threadrun_syncr   re   r   tsocketfrom_stdlib_socket)rM   abnurseryrI   rI   rJ   ssl_echo_server_raw   s    .rs   r    AsyncIterator[SSLStream[Stream]]c              	   C sV   t |d4 I d H }t|| ddV  W d   I d H  d S 1 I d H s$w   Y  d S )NrL   r1   server_hostname)rs   r!   )rK   rM   rN   rI   rI   rJ   ssl_echo_server   s   .rw   c                   @  sX   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sleeper'Callable[[str], Awaitable[None]] | Noner:   rQ   c                 C  s   t t j}ddlm} | }||jj tt drJ t	
| t |d | _| j  t | _t | _td| _td| _|  |d u rQdd
d}|| _d S || _d S )Nr   )BindingOP_NO_TLSv1_4z2simultaneous calls to PyOpenSSLEchoStream.send_allz6simultaneous calls to PyOpenSSLEchoStream.receive_some_objectr:   rQ   c                   s   d S NrI   r}   rI   rI   rJ   no_op_sleeper      z3PyOpenSSLEchoStream.__init__.<locals>.no_op_sleeperr}   r~   r:   rQ   )r   ContextSSLv23_METHOD,cryptography.hazmat.bindings.openssl.bindingr{   set_optionslibSSL_OP_NO_TLSv1_3r?   TRIO_TEST_1_CERTconfigure_cert
Connection_connset_accept_stater   
ParkingLot_lot	bytearray_pending_cleartextr#   _send_all_conflict_detector_receive_some_conflict_detectorry   )selfry   rH   r{   rq   r   rI   rI   rJ   __init__   s*   





zPyOpenSSLEchoStream.__init__c                   s   | j   d S r   )r   bio_shutdownr   rI   rI   rJ   aclose      zPyOpenSSLEchoStream.acloserP   c                 C  s
   | j  S r   )r   renegotiate_pendingr   rI   rI   rJ   r      s   
z'PyOpenSSLEchoStream.renegotiate_pendingc                 C  s   | j  sJ d S r   )r   renegotiater   rI   rI   rJ   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   
checkpointry   r   rI   rI   rJ   r     s   "z1PyOpenSSLEchoStream.wait_send_all_might_not_blockrc   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)r`   r   r   r   ry   r   	bio_writerW   r   ZeroReturnErrorshutdowntotal_renegotiationsWantReadErrorr   r   
unpark_allr   rc   rI   rI   rJ   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))r`   r   r   r   ry   r   bio_readr   r   r   sendr   r   park)r   r   	next_byterI   rI   rJ   r   !  sT   ) ,
z PyOpenSSLEchoStream.receive_somer   )ry   rz   r:   rQ   r:   rQ   )r:   rP   )rc   r   r:   rQ   )r   r   r:   r   )
__name__
__module____qualname__r   r   r   r   r   r   r   rI   rI   rI   rJ   rx      s    
-



rx   c                    s`   dd	d
} | ddddI d H  | ddddI d H  | ddddI d H  | ddddI d H  d S )Nfunc1strargs1tuple[object, ...]func2args2r:   rQ   c              
     s   t  }tttjdG t 4 I d H #}|jt|| g|R   |jt||g|R   W d   I d H  n1 I d H s>w   Y  W d    d S W d    d S 1 sVw   Y  d S )Nsimultaneous)rx   r   r   r   BusyResourceErrorrj   rk   getattr)r   r   r   r   srr   rI   rI   rJ   do_test`  s   *"zDtest_PyOpenSSLEchoStream_gives_resource_busy_errors.<locals>.do_testr   )   xr   rI   r   )r   )
r   r   r   r   r   r   r   r   r:   rQ   rI   )r   rI   rI   rJ   3test_PyOpenSSLEchoStream_gives_resource_busy_errorsY  s   

r   ry   rz   (Iterator[SSLStream[PyOpenSSLEchoStream]]c                 c  s     t |d}t|| ddV  d S )Nry   r1   ru   )rx   r!   )rK   ry   fakesockrI   rI   rJ   virtual_ssl_echo_serverw  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 )Nrv   r1   rR   T)r!   rT   )rK   r   r   r   r   
client_ssl
server_sslrI   rI   rJ   ssl_wrap_pair  s*   r   r-   MemoryStapledStream+dict[str, str | bytes | bool | None] | NoneEtuple[SSLStream[MemoryStapledStream], SSLStream[MemoryStapledStream]]c                 C     t  \}}t| ||||dS Nr   )r(   r   rK   r   r   r   r   rI   rI   rJ   ssl_memory_stream_pair     
r   MyStapledStream=tuple[SSLStream[MyStapledStream], SSLStream[MyStapledStream]]c                 C  r   r   )r'   r   r   rI   rI   rJ   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   TrL   r1   ru   ztrio-test-2.example.org)rw   rR   r   r   r   rs   r=   r>   r!   pytestraisesr   
isinstancevalue	__cause__SSLErrorCertificateError)rK   r   rN   bad_client_ctxexcinforI   rI   rJ   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rR   r:   rQ   c                    sb   j  dd } | d | ddksJ | d |   W d    d S 1 s*w   Y  d S )Nr1   ru   r   r      y   z)rU   r\   rW   rZ   )client_sockrp   rK   rI   rJ   client  s   


"z&test_ssl_server_basics.<locals>.client)targetr   r   r   r       r   )rg   rh   rn   ro   r!   r   rT   rR   	threadingThreadstartr   r   r   join)rK   rq   server_sockr   r   trI   r   rJ   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 )	NTrL   r1   ru   Ftransport_streamcontextasdf)rs   r=   r>   r!   r   r   rR   rv   r   r   AttributeError
asfdasdfsadirr   rV   r   r   r   r   )rK   rN   good_ctxbad_ctxr   r   rI   rI   rJ   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   r:   rQ   c                   sB   t  D ]}t| t|g }|7 | |I d H  qd S r   )ranger`   r   r   )r   ichunk)CHUNKS
CHUNK_SIZEsentrI   rJ   senderP  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receivedrI   rJ   receiverX  s
   z)test_full_duplex_basics.<locals>.receiver)r   r   r:   rQ   )r   rw   r   rj   rk   rV   r   r  )rK   r  r  r   rr   rI   )r   r  r  r  r  rJ   test_full_duplex_basicsH  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   rV   r   r   r   r   r   rK   r   rI   rI   rJ   test_renegotiation_simplem  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   r}   r~   r:   rQ   c                   s   t  ddI d H  d S )Nr   
   )ri   sleepuniformr   )rrI   rJ   ry        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%   r`   rI   )expectr   r   rI   rJ   clear  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   ry   r`   r%   r   )r  r   rI   rJ   r     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   ry   r`   r  r%   r   )r  r  rI   rJ   r    s   
"z-test_renegotiation_randomized.<locals>.expectr   r	  d      r   methodr   c                   s"   | dkrt dI d H  d S d S )Nr   順 ri   r  r  rI   rI   rJ   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  )ri   r  r   rI   r  rI   rJ   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  rI   rI   rJ   *sleeper_with_slow_wait_writable_and_expect  s   zQtest_renegotiation_randomized.<locals>.sleeper_with_slow_wait_writable_and_expectr   r   )r  r   r:   rQ   )r  r   r:   rQ   )r  r   r:   rQ   )autojump_thresholdrandomRandomr   rV   r   r   r   r   r   rj   rk   r   r   )r  rK   r$  ry   r  r   b1b2rr   r  r!  r"  rI   )r  r  r   r   rJ   test_renegotiation_randomized~  s   


((
*
'
*

*$r(  c                   s   t jt jt jjt jjf  }ddd}ddd}dd	d
}d fdd}|||I d H  |||I d H  |||I d H  |||I d H  d S )Nr   Sr:   rQ   c                   >   t   | dI d H  W d    d S 1 sw   Y  d S )Nr   )r%   r   r  rI   rI   rJ   do_send_all     "z.test_resource_busy_errors.<locals>.do_send_allc                   r*  Nr   )r%   r   r  rI   rI   rJ   do_receive_some  r,  z2test_resource_busy_errors.<locals>.do_receive_somec                   s<   t   |  I d H  W d    d S 1 sw   Y  d S r   )r%   r   r  rI   rI   rJ    do_wait_send_all_might_not_block     "zCtest_resource_busy_errors.<locals>.do_wait_send_all_might_not_blockr   Callable[[S], Awaitable[None]]r   c              
     s   t  \}}tttjd; t 4 I d H }|| | ||| W d   I d H  n1 I d H s5w   Y  W d    d S W d    d S 1 sMw   Y  d S )Nzanother task)r   r   r   r   r   rj   rk   )r   r   r   r}   rr   rK   rI   rJ   r   
  s   *"z*test_resource_busy_errors.<locals>.do_test)r   r)  r:   rQ   )r   r1  r   r1  r:   rQ   )ri   r!   r   abcr   r   )rK   r)  r+  r.  r/  r   rI   r2  rJ   test_resource_busy_errors  s   



r4  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>.NotAStreamr:   rQ   c                   s     d d S )Nok)appendr   recordrI   rJ   r     r   zctest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStream.wait_send_all_might_not_blockc                   
   t dNzShould not get calledrG   r   rI   rI   rJ   r   "     zLtest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStream.acloseN	max_bytesr   bytes | bytearrayc                   r9  r:  r;  )r   r=  rI   rI   rJ   r   %  r<  zRtest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStream.receive_somerc   bytes | bytearray | memoryviewc                   r9  r:  r;  r   rI   rI   rJ   r   (  r<  zNtest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStream.send_allr   r   )r=  r   r:   r>  )rc   r?  r:   rQ   )r   r   r   r   r   r   r   rI   r7  rI   rJ   
NotAStream  s
    
r@  xru   r5  )r   r=   r>   r!   r   )r@  rH   r   rI   r7  rJ   1test_wait_writable_calls_underlying_wait_writable  s   rB  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   )rw   r%   rV   r   r   r   rZ   r   r  rI   rI   rJ   test_checkpoints1  sB   ( 0rF  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   )rw   rV   r%   r   r   r   r  rI   rI   rJ   test_send_all_empty_stringR  s   .rG  https_compatibleTc                   s4   d fdd}d	 fdd}t ||I d H  d S )
Nr:   r   c                     s   t  dididS )NrH  r   )r   rI   rK   rH  rI   rJ   stream_makerg  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   rj   rk   rV   )r   serverrr   r2  rI   rJ   clogged_stream_makerq  s   z4test_SSLStream_generic.<locals>.clogged_stream_maker)r:   r   )r:   r   )r&   )rK   rH  rJ  rL  rI   rI  rJ   test_SSLStream_genericb  s   
rM  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 )Nr:   rQ   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)rV   r   r   send_streamsend_all_hookr   rZ   )rP  rawtrailing)r   r   seqrI   rJ   r     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   rN  )rV   r   r   rZ   r   )rQ  rR  )rS  r   r   rI   rJ   rK    s   (ztest_unwrap.<locals>.serverr   )r   r   r$   r   rj   rk   rK   r   rK  rr   rI   )r   r   rS  r   r   rJ   test_unwrap  s   
.rU  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 )Nr:   rQ   c                     s<   t     I d H  W d    d S 1 sw   Y  d S r   )r%   r   rI   )r   rI   rJ   client_closer  r0  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   rI   r   rI   rJ   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 rW  )r%   r   r   rI   rX  rI   rJ   expect_eof_server  s   "z1test_closing_nice_case.<locals>.expect_eof_serverr   )r   r   r   rj   rk   r   r   r   r   r%   r   r   rZ   rV   )rK   r   rV  rY  rr   rZ  rI   )r   r   rJ   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 )Nr:   r
   c                        t r   KeyErrorrI   rI   rI   rJ   bad_hook  r   z3test_send_all_fails_in_the_middle.<locals>.bad_hookr   r   rQ   c                     s    d7  d S r-  rI   rI   closedrI   rJ   
close_hook  s   z5test_send_all_fails_in_the_middle.<locals>.close_hookr   r:   r
   r   )r   r   rj   rk   rV   r   rO  rP  r   r   r^  r   r   r   rb  receive_streamr   )rK   r   rK  rr   r_  rb  rI   r`  rJ   !test_send_all_fails_in_the_middle  s(   (



re  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 )Nr1   ru   Tr   r:   rQ   c                     s.     dI d H   dI d H dksJ d S )N   hir     bye)r   r   rI   )client_2rI   rJ   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  rf  rg  )r   r   rI   )server_2rI   rJ   rK  ,  s   z!test_ssl_over_ssl.<locals>.serverr   )r(   r!   rT   r   rj   rk   )rK   client_0server_0client_1server_1r   rK  rr   rI   )rh  ri  rJ   test_ssl_over_ssl  s(   

.rn  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   rj   rk   rV   ri   r   r   r   r   r   r   r   rT  rI   rI   rJ   test_ssl_bad_shutdown5  s   (rp  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 )NrH  Tr   r   r  r   ro  )r   r   rj   rk   rV   ri   r   r   r   r   r   r   r   rT  rI   rI   rJ    test_ssl_bad_shutdown_but_its_okF  s    
(rr  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 )NTrL   r1   ru   )rs   r=   r>   r!   r   r   r   r   )rN   rK   r   rI   rI   rJ   (test_ssl_handshake_failure_during_acloseZ  s   .rs  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   r:   r
   c                     s    d usJ    d7 t r-  r]  rI   client_orig_close_hooktransport_close_countrI   rJ   rb  y  s   z4test_ssl_only_closes_stream_once.<locals>.close_hookr   rc  )r   r   rj   rk   rV   r   rO  rb  r   r   r^  r   )rK   r   rK  rr   rb  rI   rt  rJ    test_ssl_only_closes_stream_oncem  s   (

rw  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 )
NrH  FTrq  r:   rQ   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   rK  rI   rJ   receive_and_expect_error  s
   zKtest_ssl_https_compatibility_disagreement.<locals>.receive_and_expect_errorr   )r   r   rj   rk   rV   r   )rK   r   rr   ry  rI   rx  rJ   )test_ssl_https_compatibility_disagreement  s   
(.rz  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 )	NrH  Trq  r:   rQ   c                     s     dI d H dksJ d S rW  )r   rI   rx  rI   rJ   server_expect_clean_eof  r  zEtest_https_mode_eof_before_handshake.<locals>.server_expect_clean_eofr   )r   r   rj   rk   r   )rK   r   r{  rr   rI   rx  rJ   $test_https_mode_eof_before_handshake  s   
.r|  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 )Nr:   r
   c                     r\  r   r]  rI   rI   rI   rJ   r_    r   z2test_send_error_during_handshake.<locals>.bad_hookrc  )
r   r   rO  rP  r   r   r^  r%   rV   r   )rK   r   _serverr_  rI   rI   rJ    test_send_error_during_handshake  s"   

"r~  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 )Nr:   r
   c                     r\  r   r]  rI   rI   rI   rJ   r_    r   z5test_receive_error_during_handshake.<locals>.bad_hookcancel_scoper0   rQ   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%   rV   cancel)r  r   rI   rJ   client_side  s   z8test_receive_error_during_handshake.<locals>.client_siderc  )r  r0   r:   rQ   )r   r   rd  receive_some_hookr   rj   rk   r  rV   r   r   r   r%   )rK   rK  r_  r  rr   rI   r  rJ   #test_receive_error_during_handshake  s    

("r  c                 C  v   t | \}}tt |  W d    n1 sw   Y  tt |  W d    d S 1 s4w   Y  d S r   )r   r   r   r   selected_alpn_protocolrK   r   rK  rI   rI   rJ   ,test_selected_alpn_protocol_before_handshake     

"r  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   rj   rk   rV   r  rT  rI   rI   rJ   (test_selected_alpn_protocol_when_not_set  s   (r  c                 C  r  r   )r   r   r   r   selected_npn_protocolr  rI   rI   rJ   +test_selected_npn_protocol_before_handshake  r  r  zCignore: ssl module. NPN is deprecated, use ALPN instead:UserWarningzAignore:ssl NPN is deprecated, use ALPN instead:DeprecationWarningc              	     r  r   )r   r   rj   rk   rV   r  rT  rI   rI   rJ   'test_selected_npn_protocol_when_not_set  s   (r  c                 C  r  r   )r   r   r   r   get_channel_bindingr  rI   rI   rJ   )test_get_channel_binding_before_handshake  r  r  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   rj   rk   rV   r  rT  rI   rI   rJ   (test_get_channel_binding_after_handshake  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  | d u s9J t|  d| d v sIJ d S )N)DNSr1   subjectAltName)r   r   rj   rk   rV   getpeercertr`   rT  rI   rI   rJ   test_getpeercert#  s   (r  c                   s|  	d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 sRw   Y  W d   I d H  n1 I d H sgw   Y  | I d H  | dks{J 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 )NFrH  rP   r:   Mtuple[tsocket.SocketType, SSLListener[SocketStream], SSLStream[SocketStream]]c                   sd   t  }|dI d H  |d t|}t|t| d}t|  I d H }t	| dd}|||fS )N)z	127.0.0.1r   r   rH  r1   ru   )
rn   r   bindlistenr   r    rT   r   getsocknamer!   )rH  listen_socksocket_listenerssl_listenertransport_client
ssl_clientr2  rI   rJ   setup1  s"   

ztest_SSLListener.<locals>.setupTr  F)rH  rP   r:   r  )	accept_https_compatibler   rj   rk   rV   r   filenor   )rK   r  r  r  r  
ssl_serverrr   r}   rI   r2  rJ   test_SSLListener0  s,   
*(	(
r  )r8   r9   r:   r;   )rN   rO   rM   rP   r:   rQ   r  )rM   rP   r:   rf   )rK   r   rM   rP   r:   rt   r   r   )rK   r   ry   rz   r:   r   )rK   r   r   r/   r   r/   r   r   r   r   r:   r   )NN)rK   r   r   r   r   r   r:   r   )rK   r   r   r   r   r   r:   r   )rK   r   r:   rQ   )r  r.   rK   r   r:   rQ   )rK   r   rH  rP   r:   rQ   )
__future__r   osr   rg   r=   sysr   
contextlibr   r   r   	functoolsr   r   typingr   r	   r
   r   ri   r   trio._tests.pytest_pluginr   trio.abcr   r   trio.testingr   r   r   r   trustmeOpenSSLr   ImportErrorerror r   rn   _abcr   r   r   _core._tests.tutilr   _highlevel_genericr   _highlevel_open_tcp_streamr   _highlevel_socketr   r   _sslr   r    r!   r"   _utilr#   testingr$   r%   r&   r'   r(   collections.abcr)   r*   r+   r,   typing_extensionsr-   
trio._corer.   	trio._sslr/   
_core._runr0   CArA   issue_server_certr   r>   PurposeCLIENT_AUTHrT   r?   r@   r2   r   fixturerK   re   rs   rw   rx   r   r   r   r   __annotations__r   r   r   r   r   r   r  r  r(  r4  rB  markskipifnameversion_inforF  rG  parametrizerM  rU  r[  re  rn  rp  rr  rs  rw  rz  r|  r~  r  r  r  r  filterwarningsr  r  r  r  r  rI   rI   rI   rJ   <module>   s    

	7 



!
E
%
z
!

!
6
>

















