o
    US`c                     @   s  d dl Z d dl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	 d dl
mZ d dlmZ d dlZd dlmZ d dlZddlm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lmZ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, e- Z.e./dZ0e1ej2j3Z4e5edre4 j6ej7 M  _6e08e4 ej9dddgddd Z:ddddZ;edd Z<edd  Z=G d!d" d"Z>d#d$ Z?e	d%d& Z@i i d'd(d)ZAd*d+ ZBd,d- ZCd.d/ ZDd0d1 ZEd2d3 ZFd4d5 ZGd6d7 ZHe&d8d9 ZId:d; ZJd<d= ZKejLjMe jNd>koejOd?kd@dAdBdC ZPdDdE ZQejLRdFddGgdHdI ZSdJdK ZTdLdM ZUdNdO ZVdPdQ ZWdRdS ZXdTdU ZYdVdW ZZdXdY Z[dZd[ Z\d\d] Z]d^d_ Z^d`da Z_dbdc Z`ddde Zadfdg ZbejLcdhdidjdk Zddldm Zedndo Zfdpdq Zgdrds ZhdS )t    N)contextmanager)partial)SSL)asynccontextmanager   )_core)SocketStreamSocketListener)aclose_forcefully)ClosedResourceErrorBrokenResourceError)open_tcp_stream)socket)	SSLStreamSSLListenerNeedHandshakeError_is_eof)ConflictDetector)slow)assert_checkpoints	Sequencermemory_stream_pairlockstep_stream_paircheck_two_way_streamtrio-test-1.example.orgOP_IGNORE_UNEXPECTED_EOFmoduletls13tls12)scopeparamsc                 C   sX   t  }tt dr| jt j M  _t| | jdv r|S | jdkr*t jj	|_
|S J )Nr   )defaultr   r   )sslcreate_default_contexthasattroptionsr   TRIO_TEST_CAZconfigure_trustparam
TLSVersionTLSv1_2maximum_version)requestctx r-   >/usr/local/lib/python3.10/dist-packages/trio/tests/test_ssl.py
client_ctxG   s   




r/   Fexpect_failc             
   C   s^  zzdt j| ddd}|P |  	 |d}|sVttjf}z|  W n" |y-   Y n tjyF   t	j
jdks?t	jdkrDtd Y nw 	 W d    W W |   d S || q1 s_w   Y  W n0 ttfyv   Y W |   d S  ty } z|rt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   cpython)      z\still an issue on recent python versions add a comment to https://bugs.python.org/issue32219z*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recvBrokenPipeErrorr"   SSLZeroReturnErrorunwrapSSLWantWriteErrorsysimplementationnameversion_infopytestfailclosesendallConnectionResetErrorConnectionAbortedError	ExceptionprintRuntimeError)sockr1   wrappeddata
exceptionsexcr-   r-   r.   ssl_echo_serve_syncY   s^   


9
-
rQ   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_soon	to_threadZrun_syncr   rQ   r   tsocketfrom_stdlib_socket)kwargsabnurseryr-   r-   r.   ssl_echo_server_raw   s    .r_   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_hostnamer-   )r_   r   )r/   r[   rL   r-   r-   r.   ssl_echo_server   s   .rc   c                   @   sH   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdddZ	dS )PyOpenSSLEchoStreamNc                 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 rTd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_somec                    s   d S rR   r-   _r-   r-   r.   no_op_sleeper      z3PyOpenSSLEchoStream.__init__.<locals>.no_op_sleeper)r   ContextZSSLv23_METHODZ,cryptography.hazmat.bindings.openssl.bindingre   r$   libZset_optionsrf   TRIO_TEST_1_CERTconfigure_cert
Connection_connZset_accept_stater   Z
ParkingLot_lot	bytearray_pending_cleartextr   _send_all_conflict_detector_receive_some_conflict_detectorsleeper)selfrv   r,   re   r]   ri   r-   r-   r.   __init__   s*   




zPyOpenSSLEchoStream.__init__c                    s   | j   d S rR   )rp   Zbio_shutdownrw   r-   r-   r.   aclose      zPyOpenSSLEchoStream.aclosec                 C   s
   | j  S rR   )rp   renegotiate_pendingry   r-   r-   r.   r|      s   
z'PyOpenSSLEchoStream.renegotiate_pendingc                 C   s   | j  sJ d S rR   )rp   renegotiatery   r-   r-   r.   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)rt   r   
checkpointrv   ry   r-   r-   r.   r~      s   "z1PyOpenSSLEchoStream.wait_send_all_might_not_blockc              	      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)rJ   rt   r   r   rv   rp   Z	bio_writer:   r   ZZeroReturnErrorshutdownZtotal_renegotiationsWantReadErrorrs   rq   Z
unpark_all)rw   rN   r-   r-   r.   r     s0   


"zPyOpenSSLEchoStream.send_allc                    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))rJ   ru   r   r   rv   rp   Zbio_readr   r   rs   sendbytesrq   Zpark)rw   nbytesZ	next_byter-   r-   r.   r     sT   ) ,
z PyOpenSSLEchoStream.receive_somerR   )
__name__
__module____qualname__rx   rz   r|   r}   r~   r   r   r-   r-   r-   r.   rd      s    
9rd   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   )rd   rC   raisesr   BusyResourceErrorrV   rW   r   strvaluer~   r   )sexcinfor^   r-   r-   r.   3test_PyOpenSSLEchoStream_gives_resource_busy_errorsQ  sJ   (((*r   c                 k   s$    t di |}t|| ddV  d S r`   )rd   r   )r/   r[   Zfakesockr-   r-   r.   virtual_ssl_echo_serveru  s   r   client_kwargsserver_kwargsc                C   s4   t || fddi|}t |tfddi|}||fS )Nrb   r   r2   T)r   r7   )r/   client_transportserver_transportr   r   
client_ssl
server_sslr-   r-   r.   ssl_wrap_pair{  s    r   c                 K      t  \}}t| ||fi |S rR   )r   r   r/   r[   r   r   r-   r-   r.   ssl_memory_stream_pair     
r   c                 K   r   rR   )r   r   r   r-   r-   r.   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   Tr0   r   ra   ztrio-test-2.example.org)rc   r2   r   r   rz   r_   r"   r#   r   rC   r   r   
isinstancer   	__cause__SSLErrorCertificateError)r/   r   rL   Zbad_client_ctxr   r-   r-   r.   test_ssl_client_basics  s0   
(
(	
.r   c              	      s"  t  \ } ~ |c t|}tt|tdd}|js J  fdd}tj	|d}|
  |dI d H dks=J |dI d H  |dI d H d	ksQJ |dI d H d
ks]J | I d H  |  W d    n1 srw   Y  W d    d S W d    d S 1 sw   Y  d S )NTr2   c                     sb   j  dd } | d | ddksJ | d |   W d    d S 1 s*w   Y  d S )Nr   ra   r   r      y   z)r8   rF   r:   r=   )Zclient_sockr\   r/   r-   r.   client  s   


"z&test_ssl_server_basics.<locals>.client)targetr   r   r   r       )rS   rT   rY   rZ   r   r   r7   r2   	threadingThreadstartr   r   rz   join)r/   r]   Zserver_sockr   r   tr-   r   r.   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 )	NTr0   r   ra   Ftransport_streamcontextZasdf)r_   r"   r#   r   r   r   r2   rb   rC   r   AttributeErrorZ
asfdasdfsadirr   r9   r   r   r   r   )r/   rL   Zgood_ctxZbad_ctxr   r   r-   r-   r.   test_attributes  s6   .r   c              
      s(  d d  t  t   f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 sYw   Y  | I d H  W d   I d H  n1 I d H suw   Y  tt  krksJ  J ksJ d S )N   i   c                    sB   t  D ]}t| t|g }|7 | |I d H  qd S rR   )rangerJ   r   r   )r   ichunk)CHUNKS
CHUNK_SIZEsentr-   r.   sender!  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receivedr-   r.   receiver)  s
   z)test_full_duplex_basics.<locals>.receiver)rr   rc   r   rV   rW   r9   rz   r   )r/   r   r   r   r^   r-   )r   r   r   r   r   r.   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   r9   r   r}   r   r   rz   r/   r   r-   r-   r.   test_renegotiation_simple>  s   

"r   c                    s  d| _ dd l}|dfdd} fdd}f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  qRt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 }	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 sqw   Y  | I d H   I d H  W d    n	1 sw   Y  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   c                    s   t  ddI d H  d S )Nr   
   )rU   sleepuniformrg   )rr-   r.   rv   Z     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   rJ   r-   )expectr   r   r-   r.   clear]  s   

z,test_renegotiation_randomized.<locals>.clearc                    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   rv   rJ   r   r   )byter   r-   r.   r   e  s   
"z+test_renegotiation_randomized.<locals>.sendc                    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   rv   rJ   r   r   r   )expectedr   r-   r.   r   k  s   
"z-test_renegotiation_randomized.<locals>.expect)rv   r   d      r   c                    s"   | dkrt dI d H  d S d S )Nr   順 rU   r   methodr-   r-   r.   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  )rU   r   r~   r-   r   r-   r.   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   r-   r-   r.   *sleeper_with_slow_wait_writable_and_expect  s   zQtest_renegotiation_randomized.<locals>.sleeper_with_slow_wait_writable_and_expect)Zautojump_thresholdrandomRandomr   r9   r   r}   r   r   r   rV   rW   rz   r~   )Z
mock_clockr/   r   rv   r   r   b1b2r^   r   r   r   r-   )r   r   r   r   r.   test_renegotiation_randomizedP  s   


((
*'
*
*$r   c              
      s   fdd} f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 sCw   Y  W d    n1 sRw   Y  dt|jv s`J 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 sJJ d S )Nc                      >   t    dI d H  W d    d S 1 sw   Y  d S )Nr   )r   r   r-   r   r-   r.   do_send_all     "z.test_resource_busy_errors.<locals>.do_send_allc                      r   Nr   )r   r   r-   r   r-   r.   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 rR   )r   r~   r-   r   r-   r.    do_wait_send_all_might_not_block     "zCtest_resource_busy_errors.<locals>.do_wait_send_all_might_not_blockzanother task)	r   rC   r   r   r   rV   rW   r   r   )r/   r   r   r   rh   r   r^   r-   r   r.   test_resource_busy_errors  sP   
(
(
(
*r   c                     sP   g  G  fddd} t  }t|  |dd}| I d H   dgks&J d S )Nc                       s   e Zd Z fddZdS )zEtest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStreamc                    s     d d S )Nok)appendry   recordr-   r.   r~     r{   zctest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStream.wait_send_all_might_not_blockN)r   r   r   r~   r-   r   r-   r.   
NotAStream  s    r   xra   r   )r"   r#   r   r~   )r   r,   r   r-   r   r.   1test_wait_writable_calls_underlying_wait_writable  s   r   nt)r5   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   )rc   r   r9   r~   r   r   r=   rz   r   r-   r-   r.   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   )rc   r9   r   r   r   rz   r   r-   r-   r.   test_send_all_empty_string  s   .r   https_compatibleTc                    s0    fdd} fdd}t ||I d H  d S )Nc                      s   t  dididS )Nr   r   )r   r-   r/   r   r-   r.   stream_maker/  s   z,test_SSLStream_generic.<locals>.stream_makerc               	      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 rR   )r   r   rV   rW   r9   )r   serverr^   r/   r-   r.   clogged_stream_maker6  s   z4test_SSLStream_generic.<locals>.clogged_stream_maker)r   )r/   r   r   r   r-   r   r.   test_SSLStream_generic-  s   r   c              	      s   t | \  jjt  fdd}fdd}t 4 I d H }|| || W d   I d H  d S 1 I d H sDw   Y  d S )Nc               	      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)r9   r   r   send_streamsend_all_hookr   r=   )r   rawtrailing)r   r   seqr-   r.   r   M  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   )r9   r   r   r=   r   )r  r  )r  r   r   r-   r.   r   h  s   (ztest_unwrap.<locals>.server)r   r   r   r   rV   rW   r/   r   r   r^   r-   )r   r   r  r   r   r.   test_unwrapF  s   
.r  c              	      sx  t | \  j} fdd}fdd}t 4 I d H }|| || W d   I d H  n1 I d H s9w   Y  tt |dI d H  W d    n1 sVw   Y  t	   
 I d H  W d    n1 spw   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 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 sw   Y  t | \ fdd	}t 4 I d H }| j
 || W d   I d H  d S 1 I d H s5w   Y  d S )
Nc                      r   rR   )r   rz   r-   )r   r-   r.   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   rz   r-   r   r-   r.   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   rz   r-   r  r-   r.   expect_eof_server  s   "z1test_closing_nice_case.<locals>.expect_eof_server)r   r   r   rV   rW   rC   r   r   r   r   rz   r   r=   r9   )r/   r   r  r	  r^   r
  r-   )r   r   r.   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 }||jj_t	t
 |dI d H  W d    n1 sRw   Y  t	t | I d H  W d    n1 snw   Y  d  fdd}||jj_||jj_| I d H   dksJ d S )Nc                         t rR   KeyErrorr-   r-   r-   r.   bad_hook  rj   z3test_send_all_fails_in_the_middle.<locals>.bad_hookr   r   c                      s    d7  d S r   r-   r-   closedr-   r.   
close_hook  s   z5test_send_all_fails_in_the_middle.<locals>.close_hookr   )r   r   rV   rW   r9   r   r   r   rC   r   r  r   r   r~   r  receive_streamrz   )r/   r   r   r^   r  r  r-   r  r.   !test_send_all_fails_in_the_middle  s(   (


r  c              	      s   t  \}}t|| dd}t|tdd}t|| dd t|tdd fdd}fdd}t 4 I d H }|| || W d   I d H  d S 1 I d H sRw   Y  d S )	Nr   ra   Tr   c                      s.     dI d H   dI d H dksJ d S )N   hir      bye)r   r   r-   )client_2r-   r.   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   r  r  )r   r   r-   )server_2r-   r.   r     s   z!test_ssl_over_ssl.<locals>.server)r   r   r7   r   rV   rW   )r/   Zclient_0Zserver_0Zclient_1Zserver_1r   r   r^   r-   )r  r  r.   test_ssl_over_ssl  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  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   rV   rW   r9   rU   r
   rC   r   r   r   r   rz   r  r-   r-   r.   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   r  )r   r   rV   rW   r9   rU   r
   r   rC   r   r   r   rz   r  r-   r-   r.    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 )NTr0   r   ra   )r_   r"   r#   r   rC   r   r   rz   )rL   r/   r   r-   r-   r.   (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 fdd}||jj_t	t
 | I d H  W d    n1 s[w   Y  dksfJ d S )Nr   c                      s      d7 t r   r  r-   Zclient_orig_close_hookZtransport_close_countr-   r.   r  7  s   z4test_ssl_only_closes_stream_once.<locals>.close_hookr   )r   r   rV   rW   r9   r   r   r  rC   r   r  rz   )r/   r   r   r^   r  r-   r  r.    test_ssl_only_closes_stream_once+  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   fdd}t 4 I d H }||j || W d   I d H  d S 1 I d H scw   Y  d S )Nr   FTr  c                     sP   t t}  dI d H  W d    n1 sw   Y  t| jjs&J d S )Nr   )rC   r   r   r   r   r   r   )r   r   r-   r.   receive_and_expect_errorQ  s
   zKtest_ssl_https_compatibility_disagreement.<locals>.receive_and_expect_error)r   r   rV   rW   r9   rz   )r/   r   r^   r"  r-   r!  r.   )test_ssl_https_compatibility_disagreementD  s   
(.r#  c              	      s   t | ddiddid\}  fdd}t 4 I d H }||j || W d   I d H  d S 1 I d H s9w   Y  d S )Nr   Tr  c                      s     dI d H dksJ d S r  )r   r-   r!  r-   r.   server_expect_clean_eofc  r   zEtest_https_mode_eof_before_handshake.<locals>.server_expect_clean_eof)r   r   rV   rW   rz   )r/   r   r$  r^   r-   r!  r.   $test_https_mode_eof_before_handshake\  s   
.r%  c              	      s   t | \}}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 sZw   Y  W d    d S W d    d S 1 srw   Y  d S )Nc                      r  rR   r  r-   r-   r-   r.   r  n  rj   z2test_send_error_during_handshake.<locals>.bad_hook)
r   r   r   r   rC   r   r  r   r9   r   )r/   r   r   r  r-   r-   r.    test_send_error_during_handshakek  s"   
"r&  c              	      s   t | \ }dd }| jj_ 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 stw   Y  d S )Nc                      r  rR   r  r-   r-   r-   r.   r    rj   z5test_receive_error_during_handshake.<locals>.bad_hookc              	      sl   t t" t    I d H  W d    n1 sw   Y  W d    n1 s+w   Y  |   d S rR   )rC   r   r  r   r9   cancel)cancel_scoper   r-   r.   client_side  s   z8test_receive_error_during_handshake.<locals>.client_side)r   r   r  Zreceive_some_hookr   rV   rW   r(  r9   rC   r   r   r   )r/   r   r  r*  r^   r-   r)  r.   #test_receive_error_during_handshake|  s    
("r+  c                    x   t | \}}tt |  W d    n1 sw   Y  tt |  W d    d S 1 s5w   Y  d S rR   )r   rC   r   r   selected_alpn_protocolr/   r   r   r-   r-   r.   ,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 rR   )r   r   rV   rW   r9   r-  r  r-   r-   r.   (test_selected_alpn_protocol_when_not_set  s   (r2  c                    r,  rR   )r   rC   r   r   selected_npn_protocolr.  r-   r-   r.   +test_selected_npn_protocol_before_handshake  r0  r4  zCignore: ssl module. NPN is deprecated, use ALPN instead:UserWarningzAignore:ssl NPN is deprecated, use ALPN instead:DeprecationWarningc              	      r1  rR   )r   r   rV   rW   r9   r3  r  r-   r-   r.   'test_selected_npn_protocol_when_not_set  s   (r5  c                    r,  rR   )r   rC   r   r   get_channel_bindingr.  r-   r-   r.   )test_get_channel_binding_before_handshake  r0  r7  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 rR   )r   r   rV   rW   r9   r6  r  r-   r-   r.   (test_get_channel_binding_after_handshake  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  | d u s9J t|  d| d v sIJ d S )N)DNSr   subjectAltName)r   r   rV   rW   r9   getpeercertrJ   r  r-   r-   r.   test_getpeercert  s   (r<  c                    sv   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 sOw   Y  W d   I d H  n1 I d H sdw   Y  | I d H  | dksxJ 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 )Nc                     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   ra   )
rY   r   bindlistenr	   r   r7   r   getsocknamer   )r[   listen_sockZsocket_listenerssl_listenerZtransport_client
ssl_clientr   r-   r.   setup  s   

ztest_SSLListener.<locals>.setupT)r   )	acceptZ_https_compatibler   rV   rW   r9   rz   filenor
   )r/   rC  r@  rA  rB  Z
ssl_serverr^   rh   r-   r   r.   test_SSLListener  s*   
*(	(
rG  )iosrer?   rC   r   r   rS   r"   
contextlibr   	functoolsr   ZOpenSSLr   Ztrustmeasync_generatorr   rU    r   Z_highlevel_socketr   r	   Z_highlevel_genericr
   r   r   Z_highlevel_open_tcp_streamr   rY   _sslr   r   r   r   Z_utilr   Z_core.tests.tutilr   testingr   r   r   r   r   CAr&   Zissue_server_certrm   r#   PurposeCLIENT_AUTHr7   r$   r%   r   rn   Zfixturer/   rQ   r_   rc   rd   r   r   r   r   r   r   r   r   r   r   r   r   r   markZskipifrA   rB   r   r   Zparametrizer   r  r  r  r  r  r  r  r   r#  r%  r&  r+  r/  r2  r4  filterwarningsr5  r7  r8  r<  rG  r-   r-   r-   r.   <module>   s    


	
D

 $

E%
t*

6>



