B
    u9a1ÿ ã               @   s‚  d dl Z d dlZ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	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Zd dlZd dlZd dlZyd dlZW n ek
rÀ   dZY nX e d¡ZeejƒZejZej d¡Ze oöej dkZ!e oej dkZ"e #d¡Z$i Z%xPdD ]H\Z&Z'ye(ee&ƒZ&e(ej)e'ƒZ'W n e*k
rZ   wY nX e'e%e&< qW d	d
„ Z+e+dƒZ,e	 -e,¡Z.e+dƒZ/e+dƒZ0e	 -e/¡Z1e	 -e0¡Z2e+dƒZ3e+dƒZ4dZ5e+dƒZ6e	 -e6¡Z7e+ddƒZ8e+ddƒZ9ddddddddœZ:e+dƒZ;e+dƒZ<dZ=ddd d!d"d#d$dddd%œ
Z>e+d&ƒZ?d'Z@e+d(ƒZAd)ZBe+dd*ƒZCe+d+ƒZDe+d,ƒZEd-ZFe+d.ƒZGe+d/ƒZHe+d0ƒZIe+d1ƒZJe+d2ƒZKe+d3ƒZLe+d4ƒZMe+d5ƒZNe	 -eN¡ZOe(ed6d ƒZPe(ed7d ƒZQe(ed8d ƒZRe(ed9d ƒZSe(ed:d ƒZTd;d<„ ZUd=d>„ ZVd?d@„ ZWdAdB„ ZXdCdD„ ZYeYƒ ZZdEdF„ Z[dGdH„ Z\dIdJ„ Z]e ^ej_dK¡Z`ejafejbdddddLœdMdN„Zce<fdOdP„ZdG dQdR„ dRejeƒZfG dSdT„ dTejeƒZgG dUdV„ dVejeƒZhG dWdX„ dXejeƒZiG dYdZ„ dZejeƒZjG d[d\„ d\ejeƒZkG d]d^„ d^ejeƒZldwd_d`„Zmdadb„ Znd dclompZp G ddde„ deejqƒZrG dfdg„ dgejqƒZsdxdkdl„Ztdydmdn„ZuG dodp„ dpejeƒZve ^ejwdq¡G drds„ dsejeƒƒZxdzdtdu„Zyezdvkr~eyƒ  dS ){é    N)ÚsupportÚsslZLibreSSL)é   r   r   )r   r   r   ÚPY_SSL_DEFAULT_CIPHERS))ÚPROTOCOL_SSLv23ÚSSLv3)ÚPROTOCOL_TLSv1ÚTLSv1)ÚPROTOCOL_TLSv1_1ÚTLSv1_1c              G   s   t jjt j t¡f| žŽ S )N)ÚosÚpathÚjoinÚdirnameÚ__file__)Úname© r   ú/usr/lib/python3.7/test_ssl.pyÚ	data_file2   s    r   zkeycert.pemzssl_cert.pemzssl_key.pemzkeycert.passwd.pemzssl_key.passwd.pemZsomepassÚcapathz
4e1295a3.0z
5ed36f99.0)))ÚcountryNameÚXY))ÚlocalityNamezCastle Anthrax))ÚorganizationNamezPython Software Foundation))Ú
commonNameÚ	localhostzAug 26 14:23:15 2028 GMTzAug 29 14:23:15 2018 GMTZ98A7CF88C74A32ED))ÚDNSr   é   )ÚissuerÚnotAfterÚ	notBeforeÚserialNumberÚsubjectÚsubjectAltNameÚversionzrevocation.crlzkeycert3.pemr   )z)http://testca.pythontest.net/testca/ocsp/)z0http://testca.pythontest.net/testca/pycacert.cer)z2http://testca.pythontest.net/testca/revocation.crl)))r   r   ))r   zPython Software Foundation CA))r   zour-ca-serverzJul  7 14:23:16 2028 GMTzAug 29 14:23:16 2018 GMTZCB2D80995A69525C)
ÚOCSPÚ	caIssuersÚcrlDistributionPointsr   r   r    r!   r"   r#   r$   zkeycert4.pemÚfakehostnamezkeycertecc.pemzlocalhost-eccz
ceff1710.0zallsans.pemzidnsans.pemzself-signed.pythontest.netznullcert.pemzbadcert.pemzXXXnonexisting.pemz
badkey.pemz	nokia.pemznullbytecert.pemztalos-2019-0758.pemzffdh3072.pemÚOP_NO_COMPRESSIONÚOP_SINGLE_DH_USEÚOP_SINGLE_ECDH_USEÚOP_CIPHER_SERVER_PREFERENCEÚOP_ENABLE_MIDDLEBOX_COMPATc             C   s.   d  tjt ¡ Ž ¡}tjr*tj | | ¡ d S )Nú )	r   Ú	tracebackÚformat_exceptionÚsysÚexc_infor   ÚverboseÚstdoutÚwrite)ÚprefixZ
exc_formatr   r   r   Úhandle_error‘   s    r7   c               C   s
   t jdkS )N)r   é	   é   é   é   )r   Ú_OPENSSL_API_VERSIONr   r   r   r   Úcan_clear_options–   s    r=   c               C   s
   t jdkS )N)r   r8   é   r9   r;   )r   ÚOPENSSL_VERSION_INFOr   r   r   r   Úno_sslv2_implies_sslv3_helloš   s    r@   c               C   s
   t jdkS )N)r   r8   r9   r   r;   )r   r?   r   r   r   r   Úhave_verify_flagsž   s    rA   c              C   sB   t js
dS t  t j¡} y|  d¡ W n tk
r8   dS X dS d S )NFÚ	secp384r1T)r   ÚHAS_ECDHÚ
SSLContextÚPROTOCOL_TLS_SERVERÚset_ecdh_curveÚ
ValueError)Úctxr   r   r   Ú_have_secp_curves¢   s    rI   c               C   s$   t jrt  ¡ jdkrt j S t j S )Nr   )ÚtimeZdaylightZ	localtimeZtm_isdstZaltzoneZtimezoner   r   r   r   Ú
utc_offset±   s    rK   c             C   s^   t jdkrZd}tj | |¡}|jdd}| |¡} | d dkrZ| d d… d | dd …  } | S )	N)r   r8   r9   r8   r;   z%b %d %H:%M:%S %Y GMTr   )Úsecondé   Ú0r.   é   )r   r<   ÚdatetimeZstrptimeÚreplaceÚstrftime)Ú	cert_timeZfmtZdtr   r   r   Úasn1time·   s    

rT   c                s,   t tdƒr$t ˆ ¡‡ fdd„ƒ}|S ˆ S d S )NÚPROTOCOL_SSLv2c                 sR   yt  t j¡ W n6 t jk
rF   t jdkrBt ¡ dkrBt d¡‚Y nX ˆ | |ŽS )N)r   r8   r9   r;   r;   )Zdebianzsqueeze/sidÚ z'Patched Ubuntu OpenSSL breaks behaviour)	r   rD   rU   ÚSSLErrorr?   ÚplatformÚlinux_distributionÚunittestZSkipTest)ÚargsÚkwargs)Úfuncr   r   ÚfÈ   s    
z$skip_if_broken_ubuntu_ssl.<locals>.f)Úhasattrr   Ú	functoolsÚwraps)r]   r^   r   )r]   r   Úskip_if_broken_ubuntu_sslÆ   s    
	rb   z SNI support needed for this test)Ú	cert_reqsÚca_certsÚciphersÚcertfileÚkeyfilec      	      K   sv   t  |¡}|d k	r(|t jkr"d|_||_|d k	r:| |¡ |d k	sJ|d k	rV| ||¡ |d k	rh| |¡ |j| f|ŽS )NF)	r   rD   Ú	CERT_NONEÚcheck_hostnameÚverify_modeÚload_verify_locationsÚload_cert_chainÚset_ciphersÚwrap_socket)	ÚsockÚssl_versionrc   rd   re   rf   rg   r\   Úcontextr   r   r   Útest_wrap_socketØ   s    



rr   c             C   sd   | t krt}n| tkrt}nt| ƒ‚t tj¡}| t	¡ t tj
¡}| | ¡ | t	¡ |||fS )zUCreate context

    client_context, server_context, hostname = testing_context()
    )ÚSIGNED_CERTFILEÚSIGNED_CERTFILE_HOSTNAMEÚSIGNED_CERTFILE2ÚSIGNED_CERTFILE2_HOSTNAMErG   r   rD   ÚPROTOCOL_TLS_CLIENTrk   Ú
SIGNING_CArE   rl   )Zserver_certÚhostnameÚclient_contextÚserver_contextr   r   r   Útesting_contextê   s    


r|   c               @   s˜  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Ze e	j
d	kd
¡dd„ ƒZdZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zejdd„ ƒZdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Ze d0e j!kd1¡d2d3„ ƒZ"d4d5„ Z#d6d7„ Z$e e%j&d8kd9¡d:d;„ ƒZ'e e%j&d8kd9¡d<d=„ ƒZ(d>d?„ Z)d@dA„ Z*dBdC„ Z+dDdE„ Z,dFdG„ Z-e e.ƒ dH¡dIdJ„ ƒZ/dKdL„ Z0e 1dMdN¡dOdP„ ƒZ2dQdR„ Z3dS )SÚBasicSocketTestsc             C   s    t j t j t j t j t j t jr*t j t jdkr:t j	 |  
t jddh¡ |  
t jddh¡ t j t j t j t j t jdkrŒt j t j |  t jt j¡ d S )N)r   r   TF)r   r   r   )r   rh   ÚCERT_OPTIONALÚCERT_REQUIREDr,   r*   rC   r+   r?   r)   ÚassertInÚHAS_SNIÚOP_NO_SSLv2ÚOP_NO_SSLv3ÚOP_NO_TLSv1ÚOP_NO_TLSv1_3ÚOP_NO_TLSv1_1ÚOP_NO_TLSv1_2ÚassertEqualÚPROTOCOL_TLSr   )Úselfr   r   r   Útest_constants  s&    

zBasicSocketTests.test_constantsc          
   C   s:   |   td¡$ t ¡ }t |¡ W d Q R X W d Q R X d S )Nzpublic constructor)ÚassertRaisesRegexÚ	TypeErrorÚsocketr   Ú	SSLSocket)rŠ   Úsr   r   r   Útest_private_init  s    
z"BasicSocketTests.test_private_initc             C   s2   t j}|  t|ƒd¡ t  |¡}|  |j|¡ d S )Nz_SSLMethod.PROTOCOL_TLS)r   r‰   rˆ   ÚstrrD   ÚassertIsÚprotocol)rŠ   ÚprotorH   r   r   r   Útest_str_for_enums  s    
z#BasicSocketTests.test_str_for_enumsc             C   s  t  ¡ }tjr*tj d||r dp"df ¡ t  d¡\}}|  t	|ƒd¡ |  ||dk¡ |rxt  
d¡}|  t	|ƒd¡ n|  t jt j
d¡ |  tt j
d¡ |  tt jd¡ tt dƒrÖ|  tt jd¡ |  tt jdd¡ t  d	d
¡ t  dd
¡ t  tdƒd
¡ d S )Nz
 RAND_status is %d (%s)
zsufficient randomnesszinsufficient randomnessé   r   éûÿÿÿÚRAND_egdÚfoozthis is a random stringg     ÀR@s   this is a random bytes objects!   this is a random bytearray object)r   ÚRAND_statusr   r3   r1   r4   r5   ÚRAND_pseudo_bytesrˆ   ÚlenZ
RAND_bytesÚassertRaisesrW   rG   r_   r   r™   ZRAND_addÚ	bytearray)rŠ   ÚvÚdataZis_cryptographicr   r   r   Útest_random$  s(    



zBasicSocketTests.test_randomÚposixzrequires posixc             C   s  t  ¡ }|s|  d¡ t ¡ \}}t ¡ }|dkr yBt |¡ t  d¡d }|  t	|ƒd¡ t 
||¡ t |¡ W n tk
r’   t d¡ Y nX t d¡ nzt |¡ |  tj|¡ t |d¡\}}|  |d¡ t |d¡}|  t	|ƒd¡ t  d¡d }|  t	|ƒd¡ |  ||¡ d S )Nz*OpenSSL's PRNG has insufficient randomnessr   r—   r   )r   r›   Úfailr   ÚpipeÚforkÚcloserœ   rˆ   r   r5   ÚBaseExceptionÚ_exitÚ
addCleanupÚwaitpidÚreadÚassertNotEqual)rŠ   ÚstatusZrfdZwfdÚpidZchild_randomÚ_Zparent_randomr   r   r   Útest_random_fork?  s0    


z!BasicSocketTests.test_random_forkNc             C   s˜   |   tj t¡t¡ |   tj t¡t¡ tj t¡}t	j
rTtj dt |¡ d ¡ |   |d d¡ |   |d d¡ |   |d d¡ |   |d d	¡ d S )
NÚ
r#   ))r   zprojects.developer.nokia.com)r   zprojects.forum.nokia.comr%   )zhttp://ocsp.verisign.comr&   )z0http://SVRIntl-G3-aia.verisign.com/SVRIntlG3.cerr'   )z0http://SVRIntl-G3-crl.verisign.com/SVRIntlG3.crl)rˆ   r   Ú_sslÚ_test_decode_certÚCERTFILEÚCERTFILE_INFOrs   ÚSIGNED_CERTFILE_INFOÚ	NOKIACERTr   r3   r1   r4   r5   ÚpprintÚpformat)rŠ   Úpr   r   r   Útest_parse_certa  s     




z BasicSocketTests.test_parse_certc             C   sL   t j t¡}tjr,tj dt	 
|¡ d ¡ |  |dddddddd	œ¡ d S )
Nr²   )))r   ÚUK))r   zcody-cazJun 14 18:00:58 2028 GMTzJun 18 18:00:58 2018 GMTZ02)))r   r½   ))r   z#codenomicon-vm-2.test.lal.cisco.com))r   z#codenomicon-vm-2.test.lal.cisco.comr   )r   r   r    r!   r"   r#   r$   )r   r³   r´   ÚTALOS_INVALID_CRLDPr   r3   r1   r4   r5   r¹   rº   rˆ   )rŠ   r»   r   r   r   Útest_parse_cert_CVE_2019_5010~  s    z.BasicSocketTests.test_parse_cert_CVE_2019_5010c             C   sx   t j t¡}tjr,tj dt	 
|¡ d ¡ d}|  |d |¡ |  |d |¡ t jdkr`d}nd}|  |d |¡ d S )	Nr²   )))r   ÚUS))ÚstateOrProvinceNameZOregon))r   Z	Beaverton))r   zPython Software Foundation))ÚorganizationalUnitNamezPython Core Development))r   znull.python.org example.org))ÚemailAddresszpython-dev@python.orgr"   r   )r   r8   r9   ))r   zaltnull.python.org example.com)Úemailz null@python.org user@example.org)ÚURIz)http://null.python.org http://example.org)z
IP Addressz	192.0.2.1)z
IP Addressz2001:DB8:0:0:0:0:0:1
))r   zaltnull.python.org example.com)rÄ   z null@python.org user@example.org)rÅ   z)http://null.python.org http://example.org)z
IP Addressz	192.0.2.1)z
IP Addressz	<invalid>r#   )r   r³   r´   ÚNULLBYTECERTr   r3   r1   r4   r5   r¹   rº   rˆ   r<   )rŠ   r»   r"   Zsanr   r   r   Útest_parse_cert_CVE_2013_4238“  s    
z.BasicSocketTests.test_parse_cert_CVE_2013_4238c             C   s    t j t¡}|  |d d¡ d S )Nr#   )
)r   Zallsans)Ú	othernamez<unsupported>)rÈ   z<unsupported>)rÄ   zuser@example.org)r   zwww.example.org)ZDirName)))r   r   ))r   zCastle Anthrax))r   zPython Software Foundation))r   zdirname example)rÅ   zhttps://www.python.org/)z
IP Addressz	127.0.0.1)z
IP Addressz0:0:0:0:0:0:0:1
)zRegistered IDz	1.2.3.4.5)r   r³   r´   Ú
ALLSANFILErˆ   )rŠ   r»   r   r   r   Útest_parse_all_sans°  s    
z$BasicSocketTests.test_parse_all_sansc          	   C   sŒ   t tdƒ}| ¡ }W d Q R X t |¡}t |¡}t |¡}|  ||¡ | tjd ¡sf|  	d| ¡ | 
dtj d ¡sˆ|  	d| ¡ d S )NÚrr²   z-DER-to-PEM didn't include correct header:
%r
z-DER-to-PEM didn't include correct footer:
%r
)ÚopenÚCAFILE_CACERTr¬   r   ÚPEM_cert_to_DER_certZDER_cert_to_PEM_certrˆ   Ú
startswithZ
PEM_HEADERr¤   ÚendswithZ
PEM_FOOTER)rŠ   r^   ÚpemÚd1Zp2Úd2r   r   r   Útest_DER_to_PEMÅ  s    


z BasicSocketTests.test_DER_to_PEMc       	   	   C   s&  t j}t j}t j}|  |t¡ |  |t¡ |  |t¡ |  |d¡ |  	|d¡ |\}}}}}|  |d¡ |  	|d¡ |  |d¡ |  	|d¡ |  |d¡ |  	|d¡ |  |d¡ |  
|d¡ |  |d¡ |  
|d¡ trü|  | d |¡¡||t|ƒf¡ n&|  | d	 |||¡¡||t|ƒf¡ d S )
Ni   i   0r   r   é   é?   r;   zLibreSSL {:d}zOpenSSL {:d}.{:d}.{:d})r   ZOPENSSL_VERSION_NUMBERr?   ÚOPENSSL_VERSIONÚassertIsInstanceÚintÚtupler’   ÚassertGreaterEqualÚ
assertLessZassertLessEqualÚIS_LIBRESSLÚ
assertTruerÏ   ÚformatÚhex)	rŠ   ÚnÚtr   ÚmajorÚminorZfixZpatchr®   r   r   r   Útest_openssl_versionÑ  s0    z%BasicSocketTests.test_openssl_versionc          	   C   sL   t   t j¡}t|ƒ}t |¡}t dtf¡ ~W d Q R X |  |ƒ d ¡ d S )NrV   )	rŽ   ÚAF_INETrr   ÚweakrefÚrefr   Zcheck_warningsÚResourceWarningrˆ   )rŠ   r   ÚssÚwrr   r   r   Útest_refcycleð  s    
zBasicSocketTests.test_refcyclec          	   C   sÜ   t   t j¡}t|ƒ¾}|  t|jd¡ |  t|jtdƒ¡ |  t|jd¡ |  t|j	tdƒd¡ |  t|j
d¡ |  t|jdd¡ |  t|j¡ |  t|jdgddd¡ |  t|jd¡ |  t|jtdƒg¡ W d Q R X d S )Nr   ó   x)z0.0.0.0r   r   r   éd   )rŽ   ræ   rr   rž   ÚOSErrorÚrecvÚ	recv_intorŸ   ÚrecvfromÚrecvfrom_intoÚsendÚsendtoÚNotImplementedErrorÚdupÚsendmsgÚrecvmsgÚrecvmsg_into)rŠ   r   rê   r   r   r   Útest_wrapped_unconnectedû  s    


z)BasicSocketTests.test_wrapped_unconnectedc          
   C   sL   xFdD ]>}t   t j¡}| |¡ t|ƒ}|  || ¡ ¡ W d Q R X qW d S )N)Ng        g      @)rŽ   ræ   Ú
settimeoutrr   rˆ   Z
gettimeout)rŠ   Útimeoutr   rê   r   r   r   Útest_timeout  s
    


zBasicSocketTests.test_timeoutc          
   C   sd  t   ¡ }| jtdtj|td | jtdtj|dd | jtdtj|ddd tj|dtd}|  td|jtd	f¡ W d Q R X |  t	¡(}t   ¡ }tj|t
d
 W d Q R X W d Q R X |  |jjtj¡ |  t	¡*}t   ¡ }tj|tt
d W d Q R X W d Q R X |  |jjtj¡ |  t	¡*}t   ¡ }tj|t
t
d W d Q R X W d Q R X |  |jjtj¡ d S )Nzcertfile must be specified)rg   z5certfile must be specified for server-side operationsT)Úserver_siderV   )rÿ   rf   z!can't connect in server-side modei  )rf   )rf   rg   )rŽ   rŒ   rG   r   rn   rµ   ÚconnectÚHOSTrž   rï   ÚNONEXISTINGCERTrˆ   Ú	exceptionÚerrnoÚENOENT)rŠ   ro   r   Úcmr   r   r   Útest_errors_sslwrap  s6    
"

z$BasicSocketTests.test_errors_sslwrapc          	   C   sX   t j t j t¡pt j|¡}t ¡ }|  |j¡ |  	t
j¡ t||d W dQ R X dS )z;Check that trying to use the given client certificate fails)rf   N)r   r   r   r   r   ÚcurdirrŽ   rª   r§   rž   r   rW   rr   )rŠ   rf   ro   r   r   r   Úbad_cert_test3  s    zBasicSocketTests.bad_cert_testc             C   s   |   d¡ dS )z Wrapping with an empty cert fileznullcert.pemN)r	  )rŠ   r   r   r   Útest_empty_cert=  s    z BasicSocketTests.test_empty_certc             C   s   |   d¡ dS )z:Wrapping with a badly formatted certificate (syntax error)zbadcert.pemN)r	  )rŠ   r   r   r   Útest_malformed_certA  s    z$BasicSocketTests.test_malformed_certc             C   s   |   d¡ dS )z2Wrapping with a badly formatted key (syntax error)z
badkey.pemN)r	  )rŠ   r   r   r   Útest_malformed_keyE  s    z#BasicSocketTests.test_malformed_keyc          
      sÖ  dd„ }‡ fdd„}ddi}||dƒ ||dƒ ||d	ƒ ||d
ƒ ||dƒ ||dƒ ddi}||dƒ ||dƒ ||dƒ ||dƒ ||dƒ ddi}||dƒ ||dƒ ||dƒ ||dƒ ||dƒ ddi}||dƒ ||dƒ ||dƒ ddi}||dƒ ||dƒ ||dƒ ||dƒ ddi}||dƒ ||dƒ ||dƒ d  d ¡ d!¡}dd"|fffi}|||ƒ dd#i}|||ƒ dd$i}|||ƒ d%  d ¡ d!¡}dd"|fffi}||d&  d ¡ d!¡ƒ ||d'  d ¡ d!¡ƒ ||d(  d ¡ d!¡ƒ ||d)  d ¡ d!¡ƒ d*d+d,d-œ}||d.ƒ ||d/ƒ ||d0ƒ ||d1ƒ d2d3d4œ}||d5ƒ ||d6ƒ ||d7ƒ dd8d9œ}||d:ƒ ||d;ƒ ||d<ƒ ||d=ƒ ||d>ƒ ||d?ƒ ||d@ƒ ttdAƒrddBd9œ}||dCƒ ||dDƒ ||dEƒ ||dFƒ ||dGƒ ||d@ƒ d2dHd4œ}||d5ƒ dIdJdKd-œ}||d5ƒ dIdHdKd-œ}||dLƒ ˆ  ttjd d¡ ˆ  ttji d¡ ddMi}ˆ  tj	dN¡ t |dO¡ W d Q R X ddPi}ˆ  tj	dQ¡ t |dR¡ W d Q R X ddSi}ˆ  tj	dT¡ t |dU¡ W d Q R X ddVi}ˆ  tj	dW¡ t |dX¡ W d Q R X ddYi}ˆ  tj	dZ¡ t |d[¡ W d Q R X x.d\D ]&}ˆ  t¡ t 
|¡ W d Q R X q\W xd]D ]}ˆ  t 
|¡¡ qŒW ttdAƒrÒxd^D ]}ˆ  t 
|¡¡ q¸W d S )_Nc             S   s   t  | |¡ d S )N)r   Úmatch_hostname)Úcertry   r   r   r   ÚokJ  s    z0BasicSocketTests.test_match_hostname.<locals>.okc                s   ˆ   tjtj| |¡ d S )N)rž   r   ÚCertificateErrorr  )r  ry   )rŠ   r   r   r¤   L  s    z2BasicSocketTests.test_match_hostname.<locals>.failr"   )))r   zexample.comzexample.comzExAmple.cOmzwww.example.comz.example.comzexample.orgZexampleXcom)))r   z*.a.comz	foo.a.comzbar.foo.a.comza.comzXa.comz.a.com)))r   zf*.comzfoo.comzf.comzbar.comzbar.foo.com)))r   znull.python.org example.orgznull.python.org example.orgznull.python.org)))r   z	*.*.a.com)))r   za.*.comz	a.foo.comza..comu   pÃ¼thon.python.orgÚidnaÚasciir   )))r   zx*.python.org)))r   zxn--p*.python.orgu   www*.pythÃ¶n.orgu   www.pythÃ¶n.orgu   www1.pythÃ¶n.orgu   ftp.pythÃ¶n.orgu   pythÃ¶n.orgzJun 26 21:41:46 2011 GMT)))r   zlinuxfrz.org))r   zlinuxfr.org)r   zlinuxfr.com)rÈ   z<unsupported>)r   r"   r#   zlinuxfr.orgzlinuxfr.comz<unsupported>zlinuxfrz.orgzDec 18 23:59:59 2011 GMT)))r   rÀ   ))rÁ   Ú
California))r   zMountain View))r   z
Google Inc))r   zmail.google.com)r   r"   zmail.google.comz	gmail.comr  ))r   zexample.com)z
IP Addressz10.11.12.13)z
IP Addressz14.15.16.17)z
IP Addressz	127.0.0.1)r"   r#   z10.11.12.13z14.15.16.17z127.1z14.15.16.17 z14.15.16.17 extra dataz14.15.16.18zexample.netZAF_INET6))r   zexample.com)z
IP Addressz2001:0:0:0:0:0:0:CAFE
)z
IP Addressz2003:0:0:0:0:0:0:BABA
z
2001::cafez
2003::babaz2003::baba z2003::baba extra dataz
2003::bebe)))r   rÀ   ))rÁ   r  ))r   zMountain View))r   z
Google InczDec 18 23:59:59 2099 GMT)))r   rÀ   ))rÁ   r  ))r   zMountain View))r   zmail.google.com))rÈ   Zblablaz
google.com)))r   za*b.example.comz5partial wildcards in leftmost label are not supportedzaxxb.example.com)))r   zwww.*.example.comz2wildcard can only be present in the leftmost labelzwww.sub.example.com)))r   za*b*.example.comztoo many wildcardszaxxbxxc.example.com)))r   Ú*z7sole wildcard without additional labels are not supportÚhost)))r   z*.comz%hostname 'com' doesn't match '\*.com'Zcom)Ú1rV   z1.2.3z	256.0.0.1z127.0.0.1/24)z	127.0.0.1z192.168.0.1)z::1z2001:db8:85a3::8a2e:370:7334)ÚencodeÚdecoder_   rŽ   rž   rG   r   r  rŒ   r  Z_inet_patonrÞ   )rŠ   r  r¤   r  r  ÚinvalidZipaddrr   )rŠ   r   Útest_match_hostnameI  sö    






















































z$BasicSocketTests.test_match_hostnamec          	   C   s:   t  t j¡}t ¡ }| jt|j|ddd W d Q R X d S )NTzsome.hostname)Úserver_hostname)r   rD   rE   rŽ   rž   rG   rn   )rŠ   rH   ro   r   r   r   Útest_server_side  s    
z!BasicSocketTests.test_server_sidec          
   C   s|   t   t j¡}| d¡ | ¡  t   t j¡}| | ¡ ¡ t|dd&}|  t¡ | 	d¡ W d Q R X W d Q R X | 
¡  d S )N)z	127.0.0.1r   F)Údo_handshake_on_connectzunknown-type)rŽ   ræ   ÚbindÚlistenr   Úgetsocknamerr   rž   rG   Úget_channel_bindingr§   )rŠ   r   Úcrê   r   r   r   Útest_unknown_channel_binding  s    
z-BasicSocketTests.test_unknown_channel_bindingz
tls-uniquez*'tls-unique' channel binding not availablec          	   C   sj   t   t j¡}t|ƒ}|  | d¡¡ W d Q R X t   t j¡}t|dtd}|  | d¡¡ W d Q R X d S )Nz
tls-uniqueT)rÿ   rf   )rŽ   ræ   rr   ÚassertIsNoner!  rµ   )rŠ   r   rê   r   r   r   Útest_tls_unique_channel_binding"  s    
z0BasicSocketTests.test_tls_unique_channel_bindingc          	   C   sV   t t tj¡ƒ}t|ƒ}|  t¡}d }t ¡  W d Q R X |  |t	|j
jd ƒ¡ d S )Nr   )rr   rŽ   ræ   ÚreprZassertWarnsré   r   Z
gc_collectr€   r’   Zwarningr[   )rŠ   rê   rË   r  r   r   r   Útest_dealloc_warn.  s    z"BasicSocketTests.test_dealloc_warnc          	   C   sr   t  ¡ }|  t|ƒd¡ |  |t j¡ t ¡ :}t|d< t	|d< t  ¡ }|  |j
t	¡ |  |jt¡ W d Q R X d S )Né   ÚSSL_CERT_DIRÚSSL_CERT_FILE)r   Zget_default_verify_pathsrˆ   r   rØ   ZDefaultVerifyPathsr   ÚEnvironmentVarGuardÚCAPATHrµ   Úcafiler   )rŠ   ÚpathsÚenvr   r   r   Útest_get_default_verify_paths6  s    
z.BasicSocketTests.test_get_default_verify_pathsÚwin32zWindows specificc       	      C   sð   |   t d¡¡ |   t d¡¡ |  ttj¡ |  ttjd¡ tƒ }x–dD ]Ž}t |¡}|  |t¡ xr|D ]j}|  |t	¡ |  
t|ƒd¡ |\}}}|  |t¡ |  |ddh¡ |  |ttf¡ t|tƒrj| |¡ qjW qJW d}|  ||¡ d S )	NÚCAÚROOTrV   )r2  r3  r   Úx509_asnÚ
pkcs_7_asnz1.3.6.1.5.5.7.3.1)rÞ   r   Zenum_certificatesrž   r   ÚWindowsErrorÚsetrØ   ÚlistrÚ   rˆ   r   Úbytesr€   ÚboolÚ
isinstanceÚupdate)	rŠ   Z
trust_oidsZ	storenameÚstoreÚelementr  ÚencZtrustÚ
serverAuthr   r   r   Útest_enum_certificatesB  s&    




z'BasicSocketTests.test_enum_certificatesc             C   s–   |   t d¡¡ |  ttj¡ |  ttjd¡ t d¡}|  |t¡ xL|D ]D}|  |t¡ |  	t
|ƒd¡ |  |d t¡ |  |d ddh¡ qJW d S )Nr2  rV   é   r   r   r4  r5  )rÞ   r   Z	enum_crlsrž   r   r6  rØ   r8  rÚ   rˆ   r   r9  r€   )rŠ   Zcrlsr>  r   r   r   Útest_enum_crls[  s    

zBasicSocketTests.test_enum_crlsc          	   C   sº  d}t  d¡}|  ||¡ |  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ |  |t j¡ |  t	t jd¡ t j 
d¡}|  ||¡ |  |t j¡ |  t	t jj
d¡ |  t	d¡ t j 
d¡ W d Q R X xvtd	ƒD ]j}yt j 
|¡}W n t	k
rþ   Y qÖX |  |jt¡ |  |jt¡ |  |jt¡ |  |jttd ƒf¡ qÖW t j d¡}|  ||¡ |  |t j¡ |  t j d¡|¡ |  t j d¡|¡ |  t	d
¡ t j d¡ W d Q R X d S )N)é   r@  zTLS Web Server Authenticationz1.3.6.1.5.5.7.3.1z1.3.6.1.5.5.7.3.1rD  r@  zTLS Web Server Authenticationéÿÿÿÿzunknown NID 100000i † iè  zunknown object 'serverauth'Z
serverauth)r   Ú_ASN1Objectrˆ   ÚnidÚ	shortnameZlongnameÚoidrØ   rž   rG   ZfromnidrŒ   ÚrangerÙ   r’   ÚtypeZfromname)rŠ   ÚexpectedÚvalÚiÚobjr   r   r   Útest_asn1objectj  s@    
z BasicSocketTests.test_asn1objectc             C   sÈ   t  d¡}|  t jjt j¡ |  t jj|¡ |  t jjjd¡ |  t jjjd¡ |  t jjjd¡ t  d¡}|  t jj	t j¡ |  t jj	|¡ |  t jj	jd¡ |  t jj	jd¡ |  t jj	jd¡ d S )Nz1.3.6.1.5.5.7.3.1rD  r@  z1.3.6.1.5.5.7.3.2é‚   Z
clientAuth)
r   rF  rØ   ÚPurposeÚSERVER_AUTHrˆ   rG  rH  rI  ÚCLIENT_AUTH)rŠ   rM  r   r   r   Útest_purpose_enum‘  s    

z"BasicSocketTests.test_purpose_enumc          	   C   s”   t   t jt j¡}|  |j¡ |  t¡}t|tj	d W d Q R X |  
t|jƒd¡ t tj¡}|  t¡}| |¡ W d Q R X |  
t|jƒd¡ d S )N)rc   z!only stream sockets are supported)rŽ   ræ   Z
SOCK_DGRAMrª   r§   rž   rö   rr   r   rh   rˆ   r’   r  rD   rw   rn   )rŠ   r   ZcxrH   r   r   r   Útest_unsupported_dtls¢  s    z&BasicSocketTests.test_unsupported_dtlsc             C   s   |   t |¡|¡ d S )N)rˆ   r   Úcert_time_to_seconds)rŠ   Ú
timestringZ	timestampr   r   r   Úcert_time_ok­  s    zBasicSocketTests.cert_time_okc          	   C   s$   |   t¡ t |¡ W d Q R X d S )N)rž   rG   r   rW  )rŠ   rX  r   r   r   Úcert_time_fail°  s    zBasicSocketTests.cert_time_failz)local time needs to be different from UTCc             C   s   |   dd¡ |   dd¡ d S )NzMay  9 00:00:00 2007 GMTg   ÀCÑAzJan  5 09:34:43 2018 GMTg  À¬Ñ“ÖA)rY  )rŠ   r   r   r   Ú"test_cert_time_to_seconds_timezone´  s    z3BasicSocketTests.test_cert_time_to_seconds_timezonec             C   sà   d}d}|   ||¡ |  tj|d|¡ |   d|¡ |   d|¡ |  d¡ |  d¡ |  d¡ |  d	¡ |  d
¡ |  d¡ |  d¡ d}|   d|¡ |   d|¡ |   dd¡ |   dd¡ |   dd¡ |  d¡ |   dd¡ d S )NzJan  5 09:34:43 2018 GMTg  À¬Ñ“ÖA)rS   zJan 05 09:34:43 2018 GMTzJaN  5 09:34:43 2018 GmTzJan  5 09:34 2018 GMTzJan  5 09:34:43 2018zJan  5 09:34:43 2018 UTCzJan 35 09:34:43 2018 GMTzJon  5 09:34:43 2018 GMTzJan  5 24:00:00 2018 GMTzJan  5 09:60:43 2018 GMTg   àWÒAzDec 31 23:59:60 2008 GMTzJan  1 00:00:00 2009 GMTzJan  5 09:34:59 2018 GMTiÃFOZzJan  5 09:34:60 2018 GMTiÄFOZzJan  5 09:34:61 2018 GMTiÅFOZzJan  5 09:34:62 2018 GMTzDec 31 23:59:59 9999 GMTg €¿ úMB)rY  rˆ   r   rW  rZ  )rŠ   rX  ÚtsZ
newyear_tsr   r   r   Útest_cert_time_to_seconds¼  s*    







z*BasicSocketTests.test_cert_time_to_secondsÚLC_ALLrV   c             C   s@   dd„ }|ƒ   ¡ dkr |  d¡ |  dd¡ |  |ƒ d ¡ d S )Nc               S   s   t  dd¡S )Nz%b)	r   rB  r   rM   rO   r(  r   r   r   )rJ   rR   r   r   r   r   Úlocal_february_nameã  s    zNBasicSocketTests.test_cert_time_to_seconds_locale.<locals>.local_february_nameZfebz>locale-specific month name needs to be different from C localezFeb  9 00:00:00 2007 GMTg   `îrÑAz  9 00:00:00 2007 GMT)ÚlowerÚskipTestrY  rZ  )rŠ   r_  r   r   r   Ú test_cert_time_to_seconds_localeß  s
    
z1BasicSocketTests.test_cert_time_to_seconds_localec             C   sv   t   t j¡}|  |j¡ t |¡}tt   t j¡tjd}|  |j¡ | 	t
|f¡}tjtjtjtjf}|  ||¡ d S )N)rc   )rŽ   ræ   rª   r§   r   Ú	bind_portrr   r   r   Ú
connect_exr  r  ZECONNREFUSEDZEHOSTUNREACHZ	ETIMEDOUTÚEWOULDBLOCKr€   )rŠ   ÚserverÚportr   ÚrcÚerrorsr   r   r   Útest_connect_ex_errorî  s    

z&BasicSocketTests.test_connect_ex_error)4Ú__name__Ú
__module__Ú__qualname__r‹   r‘   r–   r¢   rZ   Ú
skipUnlessr   r   r±   ZmaxDiffr¼   r¿   rÇ   rÊ   rÔ   rå   r   Zcpython_onlyrì   rû   rþ   r  r	  r
  r  r  r  r  r#  r   ÚCHANNEL_BINDING_TYPESr%  r'  r0  r1   rX   rA  rC  rP  rU  rV  rY  rZ  rK   r[  r]  Zrun_with_localerb  rj  r   r   r   r   r}      sP    	
 G'#r}   c               @   s¨  e Zd Zedd„ ƒZedd„ ƒZdd„ Ze e	dkd¡d	d
„ ƒZ
e ejdk d¡dd„ ƒZedd„ ƒZdd„ Zdd„ Ze eejdƒd¡dd„ ƒZe eƒ d¡dd„ ƒZdd„ Zdd„ Zd d!„ Zd"d#„ Zed$d%„ ƒZd&d'„ Ze ejd(¡d)d*„ ƒZed+d,„ ƒZ ed-d.„ ƒZ!d/d0„ Z"d1d2„ Z#d3d4„ Z$e e%j&d5kd6¡e e'd7¡d8d9„ ƒƒZ(e e%j&d5kd:¡e ee%d;ƒd<¡d=d>„ ƒƒZ)d?d@„ Z*dAdB„ Z+dCdD„ Z,dEdF„ Z-dGdH„ Z.dIdJ„ Z/dKS )LÚContextTestsc             C   sT   xt D ]}t |¡ qW t ¡ }|  |jtj¡ |  ttjd¡ |  ttjd¡ d S )NrE  é*   )Ú	PROTOCOLSr   rD   rˆ   r”   r‰   rž   rG   )rŠ   r”   rH   r   r   r   Útest_constructor  s    
zContextTests.test_constructorc             C   s*   x$t D ]}t |¡}|  |j|¡ qW d S )N)rr  r   rD   rˆ   r”   )rŠ   r•   rH   r   r   r   Útest_protocol
  s    

zContextTests.test_protocolc          	   C   sH   t  t j¡}| d¡ | d¡ |  t jd¡ | d¡ W d Q R X d S )NÚALLÚDEFAULTzNo cipher can be selectedz^$:,;?*'dorothyx)r   rD   rw   rm   rŒ   rW   )rŠ   rH   r   r   r   Útest_ciphers  s
    

zContextTests.test_ciphersr   z+Test applies only to Python default ciphersc             C   sj   t  t j¡}| ¡ }xP|D ]H}|d }|  d|¡ |  d|¡ |  d|¡ |  d|¡ |  d|¡ qW d S )Nr   ZPSKZSRPZMD5ZRC4Z3DES)r   rD   rw   Úget_ciphersZassertNotIn)rŠ   rH   re   Zsuiter   r   r   r   Útest_python_ciphers  s    
z ContextTests.test_python_ciphers)r   r   rB  r   r   zOpenSSL too oldc             C   sH   t  t j¡}| d¡ tdd„ | ¡ D ƒƒ}|  d|¡ |  d|¡ d S )NZAESGCMc             s   s   | ]}|d  V  qdS )r   Nr   )Ú.0Údr   r   r   ú	<genexpr>(  s    z0ContextTests.test_get_ciphers.<locals>.<genexpr>zAES256-GCM-SHA384zAES128-GCM-SHA256)r   rD   rw   rm   r7  rx  r€   )rŠ   rH   Únamesr   r   r   Útest_get_ciphers$  s
    
zContextTests.test_get_ciphersc          	   C   sÊ   t  t j¡}t jt jB t jB }|ttB tB t	B t
B O }|  ||j¡ | jt jO  _|  |t jB |j¡ tƒ rª|jt j @ |_|  ||j¡ d|_|  d|jt j @ ¡ n|  t¡ d|_W d Q R X d S )Nr   )r   rD   rw   ÚOP_ALLr‚   rƒ   r)   r,   r*   r+   r-   rˆ   Úoptionsr„   r=   rž   rG   )rŠ   rH   Údefaultr   r   r   Útest_options,  s    zContextTests.test_optionsc          	   C   sð   t  t j¡}|  |jt j¡ t j|_|  |jt j¡ t j|_|  |jt j¡ t j|_|  |jt j¡ |  t	¡ d |_W d Q R X |  t
¡ d|_W d Q R X t  t j¡}|  |jt j¡ |  |j¡ t  t j¡}|  |jt j¡ |  |j¡ d S )Nrq  )r   rD   r‰   rˆ   rj   rh   r~   r   rž   r   rG   rE   ÚassertFalseri   rw   rÞ   )rŠ   rH   r   r   r   Útest_verify_mode_protocolB  s$    z&ContextTests.test_verify_mode_protocolc          	   C   sv   t  t j¡}|  |j¡ t jrVd|_|  |j¡ d|_|  |j¡ d|_|  |j¡ n|  t¡ d|_W d Q R X d S )NTF)	r   rD   rw   rÞ   Zhostname_checks_common_nameZHAS_NEVER_CHECK_COMMON_NAMErƒ  rž   ÚAttributeError)rŠ   rH   r   r   r   Ú test_hostname_checks_common_nameY  s    z-ContextTests.test_hostname_checks_common_nameÚminimum_versionzrequired OpenSSL 1.1.0gc          	   C   s¢  t  t j¡}|  |jt jjt jjt jjh¡ |  	|j
t jj¡ t jj|_t jj|_
|  	|jt jj¡ |  	|j
t jj¡ t jj|_t jj|_
|  	|jt jj¡ |  	|j
t jj¡ t jj|_
|  	|j
t jj¡ t jj|_
|  |j
t jjt jjh¡ t jj|_|  |jt jjt jjh¡ |  t¡ d|_W d Q R X t  t j¡}|  	|jt jj¡ |  	|j
t jj¡ |  t¡ t jj|_W d Q R X |  t¡ t jj|_
W d Q R X d S )Nrq  )r   rD   rE   r€   r‡  Ú
TLSVersionZMINIMUM_SUPPORTEDr	   ÚTLSv1_2rˆ   Úmaximum_versionZMAXIMUM_SUPPORTEDr   r   ÚTLSv1_3rž   rG   r
   )rŠ   rH   r   r   r   Útest_min_max_versiong  sT    






z!ContextTests.test_min_max_versionz!verify_flags need OpenSSL > 0.9.8c          	   C   s¸   t  t j¡}tt ddƒ}|  |jt j|B ¡ t j|_|  |jt j¡ t j|_|  |jt j¡ t j|_|  |jt j¡ t jt j	B |_|  |jt jt j	B ¡ |  
t¡ d |_W d Q R X d S )NÚVERIFY_X509_TRUSTED_FIRSTr   )r   rD   rE   Úgetattrrˆ   Úverify_flagsÚVERIFY_DEFAULTÚVERIFY_CRL_CHECK_LEAFZVERIFY_CRL_CHECK_CHAINZVERIFY_X509_STRICTrž   r   )rŠ   rH   Útfr   r   r   Útest_verify_flags­  s    zContextTests.test_verify_flagsc          	   C   s¨  t  t j¡}|jtd d |jttd | jt|jtd |  t¡}| t¡ W d Q R X |  	|j
jtj¡ |  t jd¡ | t¡ W d Q R X |  t jd¡ | t¡ W d Q R X t  t j¡}| tt¡ |jttd |jttd |  t jd¡ | t¡ W d Q R X |  t jd¡ | t¡ W d Q R X |  t jd¡ |jttd W d Q R X t  t j¡}|  t jd¡ | tt¡ W d Q R X |jttd |jtt ¡ d |jttt ¡ ƒd | ttt¡ | ttt ¡ ¡ | tttt ¡ ƒ¡ |  td¡ |jtdd W d Q R X |  t j¡ |jtdd W d Q R X |  td	¡ |jtd
d d W d Q R X dd„ }dd„ }dd„ }dd„ }dd„ }dd„ }dd„ }	G dd„ dƒ}
|jt|d |jt|d |jt|d |jt|
ƒ d |jt|
ƒ jd |  t j¡ |jt|d W d Q R X |  td	¡ |jt|d W d Q R X |  td¡ |jt|d W d Q R X |  td¡ |jt|	d W d Q R X |jt|	d d S )N)rg   zPEM lib)rf   rg   zkey values mismatch)Zpasswordzshould be a stringTÚbadpasszcannot be longeró   ai  c               S   s   t S )N)ÚKEY_PASSWORDr   r   r   r   Úgetpass_unicodeð  s    z:ContextTests.test_load_cert_chain.<locals>.getpass_unicodec               S   s   t  ¡ S )N)r–  r  r   r   r   r   Úgetpass_bytesò  s    z8ContextTests.test_load_cert_chain.<locals>.getpass_bytesc               S   s   t t ¡ ƒS )N)rŸ   r–  r  r   r   r   r   Úgetpass_bytearrayô  s    z<ContextTests.test_load_cert_chain.<locals>.getpass_bytearrayc               S   s   dS )Nr”  r   r   r   r   r   Úgetpass_badpassö  s    z:ContextTests.test_load_cert_chain.<locals>.getpass_badpassc               S   s   dd S )Nr•  i   r   r   r   r   r   Úgetpass_hugeø  s    z7ContextTests.test_load_cert_chain.<locals>.getpass_hugec               S   s   dS )Nr8   r   r   r   r   r   Úgetpass_bad_typeú  s    z;ContextTests.test_load_cert_chain.<locals>.getpass_bad_typec               S   s   t dƒ‚d S )Nzgetpass error)Ú	Exceptionr   r   r   r   Úgetpass_exceptionü  s    z<ContextTests.test_load_cert_chain.<locals>.getpass_exceptionc               @   s   e Zd Zdd„ Zdd„ ZdS )z:ContextTests.test_load_cert_chain.<locals>.GetPassCallablec             S   s   t S )N)r–  )rŠ   r   r   r   Ú__call__ÿ  s    zCContextTests.test_load_cert_chain.<locals>.GetPassCallable.__call__c             S   s   t S )N)r–  )rŠ   r   r   r   Úgetpass  s    zBContextTests.test_load_cert_chain.<locals>.GetPassCallable.getpassN)rk  rl  rm  rŸ  r   r   r   r   r   ÚGetPassCallableþ  s   r¡  zmust return a stringzgetpass error)r   rD   rE   rl   rµ   rž   r   rï   r  rˆ   r  r  r  rŒ   rW   ÚBADCERTÚ	EMPTYCERTÚONLYCERTÚONLYKEYÚBYTES_ONLYCERTÚBYTES_ONLYKEYrÍ   ÚCERTFILE_PROTECTEDr–  r  rŸ   ÚONLYKEY_PROTECTEDrG   r   r  )rŠ   rH   r  r—  r˜  r™  rš  r›  rœ  rž  r¡  r   r   r   Útest_load_cert_chainÁ  sz    z!ContextTests.test_load_cert_chainc          	   C   sä   t  t j¡}| t¡ |jtd d | t¡ |jtd d |  t|j¡ |  t|jd d d ¡ |  t¡}| t	¡ W d Q R X |  
|jjtj¡ |  t jd¡ | t¡ W d Q R X | tt¡ |jttd |  t|jd d¡ d S )N)r-  r   zPEM lib)r   T)r   rD   rE   rk   rµ   ÚBYTES_CERTFILErž   r   rï   r  rˆ   r  r  r  rŒ   rW   r¢  r,  ÚBYTES_CAPATH)rŠ   rH   r  r   r   r   Útest_load_verify_locations  s    

z'ContextTests.test_load_verify_locationsc          	   C   sJ  t tƒ}| ¡ }W d Q R X t |¡}t tƒ}| ¡ }W d Q R X t |¡}t tj¡}|  | 	¡ d d¡ |j
|d |  | 	¡ d d¡ |j
|d |  | 	¡ d d¡ |j
|d |  | 	¡ d d¡ t tj¡}d ||f¡}|j
|d |  | 	¡ d d¡ t tj¡}d|d|d	|d
g}|j
d |¡d |  | 	¡ d d¡ t tj¡}|j
|d |j
|d |  | 	¡ d d¡ |j
|d |  | 	¡ d d¡ t tj¡}d ||f¡}|j
|d |  | 	¡ d d¡ t tj¡}| jt|j
td |  tjd¡ |j
dd W d Q R X |  tjd¡ |j
dd W d Q R X d S )NÚx509_car   )Úcadatar   rB  r²   ÚheadÚotherZagainÚtailó    zno start lineZbrokenznot enough datas   broken)rÌ   rÍ   r¬   r   rÎ   ÚCAFILE_NEURONIOrD   rw   rˆ   Úcert_store_statsrk   r   rž   r   ÚobjectrŒ   rW   )rŠ   r^   Z
cacert_pemZ
cacert_derZneuronio_pemZneuronio_derrH   Zcombinedr   r   r   Útest_load_verify_cadata'  sN    




z$ContextTests.test_load_verify_cadatac          	   C   s    t  t j¡}| t¡ tjdkr*| t¡ |  t	|j¡ |  t	|jd ¡ |  t
¡}| t¡ W d Q R X |  |jjtj¡ |  t j¡}| t¡ W d Q R X d S )NÚnt)r   rD   rE   Úload_dh_paramsÚDHFILEr   r   ÚBYTES_DHFILErž   r   ÚFileNotFoundErrorr  rˆ   r  r  r  rW   rµ   )rŠ   rH   r  r   r   r   Útest_load_dh_paramsa  s    


z ContextTests.test_load_dh_paramsc             C   sD   x>t D ]6}t |¡}|  | ¡ ddddddddddddœ¡ qW d S )Nr   )Znumberr   Zconnect_goodZconnect_renegotiateÚacceptZaccept_goodZaccept_renegotiateÚhitsÚmissesZtimeoutsZ
cache_full)rr  r   rD   rˆ   Úsession_stats)rŠ   r•   rH   r   r   r   Útest_session_statsn  s    


zContextTests.test_session_statsc             C   s   t  t j¡}| ¡  d S )N)r   rD   rw   Zset_default_verify_paths)rŠ   rH   r   r   r   Útest_set_default_verify_paths€  s    z*ContextTests.test_set_default_verify_pathsz#ECDH disabled on this OpenSSL buildc             C   sb   t  t j¡}| d¡ | d¡ |  t|j¡ |  t|jd ¡ |  t|jd¡ |  t|jd¡ d S )NÚ
prime256v1s
   prime256v1rš   s   foo)r   rD   rE   rF   rž   r   rG   )rŠ   rH   r   r   r   Útest_set_ecdh_curve†  s    

z ContextTests.test_set_ecdh_curvec             C   sj   t  t j¡}|  t|j¡ |  t|jd¡ |  t|jd¡ |  t|j|¡ dd„ }| d ¡ | |¡ d S )NrM   rV   c             S   s   d S )Nr   )ro   Ú
servernamerH   r   r   r   Údummycallbackš  s    z5ContextTests.test_sni_callback.<locals>.dummycallback)r   rD   rE   rž   r   Úset_servername_callback)rŠ   rH   rÇ  r   r   r   Útest_sni_callback  s    
zContextTests.test_sni_callbackc             C   sJ   t  t j¡}|fdd„}| |¡ t |¡}~~t ¡  |  |ƒ d ¡ d S )Nc             S   s   d S )Nr   )ro   rÆ  rH   Úcycler   r   r   rÇ  ¤  s    z>ContextTests.test_sni_callback_refcycle.<locals>.dummycallback)	r   rD   rE   rÈ  rç   rè   ÚgcÚcollectr“   )rŠ   rH   rÇ  rë   r   r   r   Útest_sni_callback_refcycleŸ  s    

z'ContextTests.test_sni_callback_refcyclec             C   sŽ   t  t j¡}|  | ¡ ddddœ¡ | t¡ |  | ¡ ddddœ¡ | t¡ |  | ¡ ddddœ¡ | t¡ |  | ¡ ddddœ¡ d S )Nr   )r®  ÚcrlÚx509r   rB  )	r   rD   rw   rˆ   rµ  rl   rµ   rk   rÍ   )rŠ   rH   r   r   r   Útest_cert_store_stats¬  s    






z"ContextTests.test_cert_store_statsc             C   s¨   t  t j¡}|  | ¡ g ¡ | t¡ |  | ¡ g ¡ | t¡ |  | ¡ dtdƒtdƒdddddœg¡ t	tƒ}| 
¡ }W d Q R X t  |¡}|  | d¡|g¡ d S )	N)))r   zRoot CA))rÂ   zhttp://www.cacert.org))r   zCA Cert Signing Authority))rÃ   zsupport@cacert.orgzMar 29 12:29:49 2033 GMTzMar 30 12:29:49 2003 GMTZ00)z!https://www.cacert.org/revoke.crlr   )r   r   r    r!   r'   r"   r$   T)r   rD   rw   rˆ   Úget_ca_certsrk   rµ   rÍ   rT   rÌ   r¬   rÎ   )rŠ   rH   r^   rÑ   Úderr   r   r   Útest_get_ca_certsº  s"    




zContextTests.test_get_ca_certsc             C   s€   t  t j¡}| ¡  t  t j¡}| t jj¡ | ¡  t  t j¡}| t jj¡ t  t j¡}|  t|jd ¡ |  t|jd¡ d S )NrS  )	r   rD   rw   Úload_default_certsrR  rS  rT  rž   r   )rŠ   rH   r   r   r   Útest_load_default_certsÖ  s    z$ContextTests.test_load_default_certsr1  znot-Windows specificz!LibreSSL doesn't support env varsc          	   C   sT   t  t j¡}t ¡ 6}t|d< t|d< | ¡  |  | 	¡ ddddœ¡ W d Q R X d S )Nr)  r*  r   r   )rÎ  rÏ  r®  )
r   rD   rw   r   r+  r,  rµ   rÔ  rˆ   rµ  )rŠ   rH   r/  r   r   r   Útest_load_default_certs_envå  s    
z(ContextTests.test_load_default_certs_envzWindows specificZgettotalrefcountz3Debug build does not share environment between CRTsc          	   C   sx   t  t j¡}| ¡  | ¡ }t  t j¡}t ¡ >}t|d< t|d< | ¡  |d  d7  < |  	| ¡ |¡ W d Q R X d S )Nr)  r*  rÏ  r   )
r   rD   rw   rÔ  rµ  r   r+  r,  rµ   rˆ   )rŠ   rH   Ústatsr/  r   r   r   Ú#test_load_default_certs_env_windowsï  s    
z0ContextTests.test_load_default_certs_env_windowsc             C   s‚   |   |jtj@ tj¡ tdkr0|   |jt@ t¡ tdkrJ|   |jt@ t¡ tdkrd|   |jt@ t¡ tdkr~|   |jt@ t¡ d S )Nr   )rˆ   r€  r   r‚   r)   r*   r+   r,   )rŠ   rH   r   r   r   Ú_assert_context_optionsþ  s    z$ContextTests._assert_context_optionsc          	   C   sÐ   t  ¡ }|  |jt j¡ |  |jt j¡ |  |j¡ |  	|¡ t
tƒ}| ¡ }W d Q R X t jtt|d}|  |jt j¡ |  |jt j¡ |  	|¡ t  t jj¡}|  |jt j¡ |  |jt j¡ |  	|¡ d S )N)r-  r   r¯  )r   Úcreate_default_contextrˆ   r”   r‰   rj   r   rÞ   ri   rÙ  rÌ   rx   r¬   r,  rR  rT  rh   )rŠ   rH   r^   r¯  r   r   r   Útest_create_default_context  s     


z(ContextTests.test_create_default_contextc             C   sü   t  ¡ }|  |jt j¡ |  |jt j¡ |  |j¡ |  	|¡ t  t j
¡}|  |jt j
¡ |  |jt j¡ |  	|¡ t jt j
t jdd}|  |jt j
¡ |  |jt j¡ |  |j¡ |  	|¡ t jt jjd}|  |jt j¡ |  |jt j¡ |  	|¡ d S )NT)rc   ri   )Zpurpose)r   Z_create_stdlib_contextrˆ   r”   r‰   rj   rh   rƒ  ri   rÙ  r   r   rÞ   rR  rT  )rŠ   rH   r   r   r   Útest__create_stdlib_context"  s(    


z(ContextTests.test__create_stdlib_contextc          	   C   sd  t  t j¡}|  |j¡ |  |jt j¡ d|_|  |j¡ |  |jt j	¡ d|_t j	|_|  |j¡ |  |jt j	¡ d|_t j|_d|_|  |j¡ |  |jt j¡ d|_|  |j¡ |  |jt j	¡ d|_t j
|_d|_|  |j¡ |  |jt j
¡ d|_|  |j¡ |  |jt j
¡ |  t¡ t j|_W d Q R X d|_|  |j¡ t j|_|  |jt j¡ d S )NTF)r   rD   r‰   rƒ  ri   rˆ   rj   rh   rÞ   r   r~   rž   rG   )rŠ   rH   r   r   r   Útest_check_hostname;  s@    z ContextTests.test_check_hostnamec             C   sT   t  t j¡}|  |j¡ |  |jt j¡ t  t j¡}|  	|j¡ |  |jt j
¡ d S )N)r   rD   rw   rÞ   ri   rˆ   rj   r   rE   rƒ  rh   )rŠ   rH   r   r   r   Útest_context_client_serverf  s    z'ContextTests.test_context_client_serverc          	   C   sŠ   G dd„ dt jƒ}G dd„ dt jƒ}t  t j¡}||_||_|jt ¡ dd}|  	||¡ W d Q R X | 
t  ¡ t  ¡ ¡}|  	||¡ d S )Nc               @   s   e Zd ZdS )z;ContextTests.test_context_custom_class.<locals>.MySSLSocketN)rk  rl  rm  r   r   r   r   ÚMySSLSocketr  s   rß  c               @   s   e Zd ZdS )z;ContextTests.test_context_custom_class.<locals>.MySSLObjectN)rk  rl  rm  r   r   r   r   ÚMySSLObjectu  s   rà  T)rÿ   )r   r   Ú	SSLObjectrD   rE   Zsslsocket_classZsslobject_classrn   rŽ   rØ   Úwrap_bioÚ	MemoryBIO)rŠ   rß  rà  rH   ro   rO  r   r   r   Útest_context_custom_classq  s    z&ContextTests.test_context_custom_classN)0rk  rl  rm  rb   rs  rt  rw  rZ   rn  r   ry  ÚskipIfr   r?   r~  r‚  r„  r†  r_   rD   rŒ  rA   r“  rª  r­  r·  r½  rÂ  rÃ  rC   rÅ  Ú	needs_snirÉ  rÍ  rÐ  rÓ  rÕ  r1   rX   rÝ   rÖ  rØ  rÙ  rÛ  rÜ  rÝ  rÞ  rä  r   r   r   r   rp  ÿ  sF   	
ES:
	+rp  c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚSSLErrorTestsc             C   sX   t  dd¡}|  t|ƒd¡ |  |jd¡ t  dd¡}|  t|ƒd¡ |  |jd¡ d S )Nr   rš   )r   rW   rˆ   r’   r  ZSSLZeroReturnError)rŠ   Úer   r   r   Útest_str„  s    zSSLErrorTests.test_strc          	   C   sn   t  t j¡}|  t j¡}| t¡ W d Q R X |  |jj	d¡ |  |jj
d¡ t|jƒ}|  | d¡|¡ d S )NZPEMZNO_START_LINEz"[PEM: NO_START_LINE] no start line)r   rD   rw   rž   rW   r¹  rµ   rˆ   r  ZlibraryÚreasonr’   rÞ   rÏ   )rŠ   rH   r  r   r   r   r   Útest_lib_reasonŽ  s    
zSSLErrorTests.test_lib_reasonc             C   sÎ   t  t j¡}d|_t j|_t ¡ ¢}| d¡ | ¡  t ¡ }| 	| 
¡ ¡ | d¡ |j|dddT}|  t j¡}| ¡  W d Q R X t|jƒ}|  | d¡|¡ |  |jjt j¡ W d Q R X W d Q R X d S )NF)z	127.0.0.1r   )r  z%The operation did not complete (read))r   rD   rw   ri   rh   rj   rŽ   r  r  r   r   Úsetblockingrn   rž   ÚSSLWantReadErrorÚdo_handshaker’   r  rÞ   rÏ   rˆ   r  ÚSSL_ERROR_WANT_READ)rŠ   rH   r   r"  r  r   r   r   Útest_subclass˜  s    



zSSLErrorTests.test_subclassc          	   C   s–   t  ¡ }|  t¡ |jt  ¡ t  ¡ dd W d Q R X |  t¡ |jt  ¡ t  ¡ dd W d Q R X |  t¡ |jt  ¡ t  ¡ dd W d Q R X d S )NrV   )r  z.example.orgzexample.org evil.com)r   rÚ  rž   rG   râ  rã  r   )rŠ   rH   r   r   r   Útest_bad_server_hostname­  s    z&SSLErrorTests.test_bad_server_hostnameN)rk  rl  rm  ré  rë  rð  rñ  r   r   r   r   rç  ‚  s   

rç  c               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚMemoryBIOTestsc             C   sª   t  ¡ }| d¡ |  | ¡ d¡ |  | ¡ d¡ | d¡ | d¡ |  | ¡ d¡ |  | ¡ d¡ | d¡ |  | d¡d¡ |  | d¡d	¡ |  | d¡d¡ d S )
Ns   foor³  s   bars   foobars   bazrB  s   bar   ó   z)r   rã  r5   rˆ   r¬   )rŠ   Úbior   r   r   Útest_read_write¼  s    



zMemoryBIOTests.test_read_writec             C   s¶   t  ¡ }|  |j¡ |  | ¡ d¡ |  |j¡ | d¡ |  |j¡ | ¡  |  |j¡ |  | d¡d¡ |  |j¡ |  | d¡d¡ |  |j¡ |  | ¡ d¡ |  |j¡ d S )Nr³  s   foorB  s   for   ó   o)	r   rã  rƒ  Úeofrˆ   r¬   r5   Ú	write_eofrÞ   )rŠ   rô  r   r   r   Útest_eofÊ  s    
zMemoryBIOTests.test_eofc             C   s¨   t  ¡ }|  |jd¡ | d¡ |  |jd¡ x0tdƒD ]$}| d¡ |  |jd| d ¡ q8W x,tdƒD ] }| d¡ |  |j|d ¡ qjW | ¡  |  |jd¡ d S )Nr   s   foor   r   rí   )r   rã  rˆ   Úpendingr5   rJ  r¬   )rŠ   rô  rN  r   r   r   Útest_pendingÚ  s    


zMemoryBIOTests.test_pendingc             C   sb   t  ¡ }| d¡ |  | ¡ d¡ | tdƒ¡ |  | ¡ d¡ | tdƒ¡ |  | ¡ d¡ d S )Ns   foos   bars   baz)r   rã  r5   rˆ   r¬   rŸ   Ú
memoryview)rŠ   rô  r   r   r   Útest_buffer_typesè  s    
z MemoryBIOTests.test_buffer_typesc             C   sL   t  ¡ }|  t|jd¡ |  t|jd ¡ |  t|jd¡ |  t|jd¡ d S )Nrš   Tr   )r   rã  rž   r   r5   )rŠ   rô  r   r   r   Útest_error_typesñ  s
    zMemoryBIOTests.test_error_typesN)rk  rl  rm  rõ  rù  rû  rý  rþ  r   r   r   r   rò  º  s
   	rò  c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚSSLObjectTestsc          	   C   s0   t  ¡ }|  td¡ t  ||¡ W d Q R X d S )Nzpublic constructor)r   rã  rŒ   r   rá  )rŠ   rô  r   r   r   r‘   ú  s    z SSLObjectTests.test_private_initc          	   C   s.  t ƒ \}}}t ¡ }t ¡ }t ¡ }t ¡ }|j|||d}|j||dd}	x€tdƒD ]t}
y| ¡  W n tjk
r|   Y nX |jr’| | 	¡ ¡ y|	 ¡  W n tjk
r´   Y nX |jrV| | 	¡ ¡ qVW | ¡  |	 ¡  |  
tj¡ | ¡  W d Q R X | | 	¡ ¡ |	 ¡  | | 	¡ ¡ | ¡  d S )N)r  T)rÿ   rO   )r|   r   rã  râ  rJ  rî  rí  rú  r5   r¬   rž   Úunwrap)rŠ   Z
client_ctxZ
server_ctxry   Zc_inZc_outZs_inZs_outÚclientrf  r°   r   r   r   Útest_unwrapÿ  s8    zSSLObjectTests.test_unwrapN)rk  rl  rm  r‘   r  r   r   r   r   rÿ  ù  s   rÿ  c               @   s¾   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Ze ejdkd¡dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zed"d#„ ƒZd$d%„ Zd&d'„ Zd(d)„ Zd*S )+ÚSimpleBackgroundTestsz?Tests that connect to a simple server running in the backgroundc             C   s2   t tƒ}t|jf| _| ¡  |  |jd d d ¡ d S )N)ÚThreadedEchoServerrs   r  rg  Úserver_addrÚ	__enter__rª   Ú__exit__)rŠ   rf  r   r   r   ÚsetUp,  s    zSimpleBackgroundTests.setUpc          	   C   s˜   t t tj¡tjd.}| | j¡ |  i | ¡ ¡ |  	|j
¡ W d Q R X t t tj¡tjtd,}| | j¡ |  | ¡ ¡ |  	|j
¡ W d Q R X d S )N)rc   )rc   rd   )rr   rŽ   ræ   r   rh   r   r  rˆ   Úgetpeercertrƒ  rÿ   r   rx   rÞ   )rŠ   r   r   r   r   Útest_connect2  s    
z"SimpleBackgroundTests.test_connectc             C   s<   t t tj¡tjd}|  |j¡ |  tjd|j	| j
¡ d S )N)rc   zcertificate verify failed)rr   rŽ   ræ   r   r   rª   r§   rŒ   rW   r   r  )rŠ   r   r   r   r   Útest_connect_failA  s
    

z'SimpleBackgroundTests.test_connect_failc             C   sJ   t t tj¡tjtd}|  |j¡ |  d| 	| j
¡¡ |  | ¡ ¡ d S )N)rc   rd   r   )rr   rŽ   ræ   r   r   rx   rª   r§   rˆ   rd  r  rÞ   r	  )rŠ   r   r   r   r   Útest_connect_exK  s    z%SimpleBackgroundTests.test_connect_exc          	   C   sÚ   t t tj¡tjtdd}|  |j¡ | d¡ | 	| j
¡}|  |dtjtjf¡ t g |gg d¡ xby| ¡  P W qf tjk
rœ   t |gg g d¡ Y qf tjk
rÂ   t g |gg d¡ Y qfX qfW |  | ¡ ¡ d S )NF)rc   rd   r  r   g      @)rr   rŽ   ræ   r   r   rx   rª   r§   rì  rd  r  r€   r  ZEINPROGRESSre  Úselectrî  rí  ÚSSLWantWriteErrorrÞ   r	  )rŠ   r   rh  r   r   r   Útest_non_blocking_connect_exT  s$    
z2SimpleBackgroundTests.test_non_blocking_connect_exc          	   C   sÆ   t  t j¡}| t tj¡¡"}| | j¡ |  i | 	¡ ¡ W d Q R X |jt tj¡dd}| | j¡ W d Q R X t j
|_| t¡ | t tj¡¡$}| | j¡ | 	¡ }|  |¡ W d Q R X d S )NZdummy)r  )r   rD   r‰   rn   rŽ   ræ   r   r  rˆ   r	  r   rj   rk   rx   rÞ   )rŠ   rH   r   r  r   r   r   Útest_connect_with_contextn  s    

z/SimpleBackgroundTests.test_connect_with_contextc             C   sL   t  t j¡}t j|_| t tj¡¡}|  |j	¡ |  
t jd|j| j¡ d S )Nzcertificate verify failed)r   rD   r‰   r   rj   rn   rŽ   ræ   rª   r§   rŒ   rW   r   r  )rŠ   rH   r   r   r   r   Útest_connect_with_context_fail€  s    
z4SimpleBackgroundTests.test_connect_with_context_failc          	   C   s¼   t  t j¡}t j|_|jtd | t tj	¡¡$}| 
| j¡ | ¡ }|  |¡ W d Q R X t  t j¡}t j|_|jtd | t tj	¡¡$}| 
| j¡ | ¡ }|  |¡ W d Q R X d S )N)r   )r   rD   r‰   r   rj   rk   r,  rn   rŽ   ræ   r   r  r	  rÞ   r¬  )rŠ   rH   r   r  r   r   r   Útest_connect_capath‹  s    z)SimpleBackgroundTests.test_connect_capathc          	   C   sâ   t tƒ}| ¡ }W d Q R X t |¡}t tj¡}tj|_|j	|d | 
t tj¡¡$}| | j¡ | ¡ }|  |¡ W d Q R X t tj¡}tj|_|j	|d | 
t tj¡¡$}| | j¡ | ¡ }|  |¡ W d Q R X d S )N)r¯  )rÌ   rx   r¬   r   rÎ   rD   r‰   r   rj   rk   rn   rŽ   ræ   r   r  r	  rÞ   )rŠ   r^   rÑ   rÒ  rH   r   r  r   r   r   Útest_connect_cadata¢  s"    

z)SimpleBackgroundTests.test_connect_cadatar¸  z*Can't use a socket as a file under Windowsc          	   C   sˆ   t t tj¡ƒ}| | j¡ | ¡ }| ¡ }| ¡  t 	|d¡ | ¡  t
 ¡  |  t¡}t 	|d¡ W d Q R X |  |jjtj¡ d S )Nr   )rr   rŽ   ræ   r   r  ÚfilenoZmakefiler§   r   r¬   rË  rÌ  rž   rï   rˆ   r  r  ZEBADF)rŠ   rê   Úfdr^   rè  r   r   r   Útest_makefile_close·  s    z)SimpleBackgroundTests.test_makefile_closec             C   sÄ   t   t j¡}| | j¡ | d¡ t|tjdd}|  |j	¡ d}xfy|d7 }| 
¡  P W qD tjk
r€   t |gg g ¡ Y qD tjk
r¤   t g |gg ¡ Y qDX qDW tjrÀtj d| ¡ d S )NF)rc   r  r   r   z9
Needed %d calls to do_handshake() to establish session.
)rŽ   ræ   r   r  rì  rr   r   rh   rª   r§   rî  rí  r  r  r   r3   r1   r4   r5   )rŠ   r   Úcountr   r   r   Útest_non_blocking_handshakeÊ  s&    
z1SimpleBackgroundTests.test_non_blocking_handshakec             C   s   t | f| jždtiŽ d S )Nr  )Ú_test_get_server_certificater  rx   )rŠ   r   r   r   Útest_get_server_certificateß  s    z1SimpleBackgroundTests.test_get_server_certificatec             C   s   t | f| jžŽ  d S )N)Ú!_test_get_server_certificate_failr  )rŠ   r   r   r   Ú test_get_server_certificate_failâ  s    z6SimpleBackgroundTests.test_get_server_certificate_failc          
   C   s²   t t tj¡tjdd}| | j¡ W d Q R X t t tj¡tjdd}| | j¡ W d Q R X |  tjd¡: t tj¡"}t |tjdd}| | j¡ W d Q R X W d Q R X d S )Nru  )rc   re   rv  zNo cipher can be selectedz^$:,;?*'dorothyx)	rr   rŽ   ræ   r   rh   r   r  rŒ   rW   )rŠ   r   ro   r   r   r   rw  ç  s    z"SimpleBackgroundTests.test_ciphersc          	   C   s€   t  t j¡}|jtd |  | ¡ g ¡ |jt tj	¡dd$}| 
| j¡ | ¡ }|  |¡ W d Q R X |  t| ¡ ƒd¡ d S )N)r   r   )r  r   )r   rD   rw   rk   r,  rˆ   rÑ  rn   rŽ   ræ   r   r  r	  rÞ   r   )rŠ   rH   r   r  r   r   r   Útest_get_ca_certs_capathõ  s    
z.SimpleBackgroundTests.test_get_ca_certs_capathc          	   C   s¨   t  t j¡}|jtd t  t j¡}|jtd t tj¡}|j|ddT}| | j	¡ |  
|j|¡ |  
|jj|¡ ||_|  
|j|¡ |  
|jj|¡ W d Q R X d S )N)r   r   )r  )r   rD   rw   rk   r,  rŽ   ræ   rn   r   r  r“   rq   Ú_sslobj)rŠ   Zctx1Zctx2r   rê   r   r   r   Útest_context_setget  s    z)SimpleBackgroundTests.test_context_setgetc          
   O   sú   |  dd¡}t ¡ | }d}	x¼t ¡ |kr4|  d¡ d }
|	d7 }	y||Ž }W n> tjk
rŠ } z|jtjtjfkrt‚ |j}
W d d }~X Y nX | 	¡ }| 
|¡ |
d krªP q|
tjkr| d¡}|rÎ| |¡ q| ¡  qW tjrötj d|	|jf ¡ |S )Nrý   é
   r   r   i €  z"Needed %d calls to complete %s().
)ÚgetrJ   Z	monotonicr¤   r   rW   r  rï  ZSSL_ERROR_WANT_WRITEr¬   Úsendallrð   r5   rø  r   r3   r1   r4   rk  )rŠ   ro   ÚincomingÚoutgoingr]   r[   r\   rý   Zdeadliner  r  Úretrè  Úbufr   r   r   Ússl_io_loop  s8    




z!SimpleBackgroundTests.ssl_io_loopc             C   s„  t   t j¡}|  |j¡ | | j¡ t ¡ }t ¡ }t tj	¡}|  
|j¡ |  |jtj¡ | t¡ | ||dt¡}|  |jj|¡ |  | ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ |  t|j¡ dtjkrØ|  | d¡¡ |   ||||j!¡ |  
| ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ |  
| ¡ ¡ dtjkr>|  
| d¡¡ y|   ||||j"¡ W n tj#k
rl   Y nX |  tj$|j%d¡ d S )NFz
tls-uniques   foo)&rŽ   ræ   rª   r§   r   r  r   rã  rD   rw   rÞ   ri   rˆ   rj   r   rk   rx   râ  rt   r“   r  Úownerr$  Úcipherr$   ÚassertIsNotNoneÚshared_ciphersrž   rG   r	  ro  r!  r'  rî  r   ZSSLSyscallErrorrW   r5   )rŠ   ro   r#  r$  rH   Ússlobjr   r   r   Útest_bio_handshake6  s<    


z(SimpleBackgroundTests.test_bio_handshakec             C   s¶   t   t j¡}|  |j¡ | | j¡ t ¡ }t ¡ }t tj	¡}tj
|_| ||d¡}|  ||||j¡ d}|  ||||j|¡ |  ||||jd¡}|  |d¡ |  ||||j¡ d S )NFs   FOO
i   s   foo
)rŽ   ræ   rª   r§   r   r  r   rã  rD   r‰   rh   rj   râ  r'  rî  r5   r¬   rˆ   r   )rŠ   ro   r#  r$  rH   r,  Zreqr&  r   r   r   Útest_bio_read_write_dataX  s    z.SimpleBackgroundTests.test_bio_read_write_dataN)rk  rl  rm  Ú__doc__r  r
  r  r  r  r  r  r  r  rZ   rå  r   r   r  r  r  r  rw  r  ræ  r  r'  r-  r.  r   r   r   r   r  )  s(   
	%"r  c               @   s*   e Zd Zdd„ Ze ejd¡dd„ ƒZdS )ÚNetworkedTestsc          	   C   s|   t  t¡h tt tj¡tjdd}|  |j	¡ | 
d¡ | tdf¡}|dkrZ|  d¡ |  |tjtjf¡ W d Q R X d S )NF)rc   r  gH¯¼šò×z>i»  r   z!REMOTE_HOST responded too quickly)r   Útransient_internetÚREMOTE_HOSTrr   rŽ   ræ   r   r   rª   r§   rü   rd  ra  r€   r  ZEAGAINre  )rŠ   r   rh  r   r   r   Útest_timeout_connect_exk  s    

z&NetworkedTests.test_timeout_connect_exz
Needs IPv6c          	   C   s2   t  d¡ t| ddƒ t| ddƒ W d Q R X d S )Nzipv6.google.comi»  )r   r1  r  r  )rŠ   r   r   r   Ú test_get_server_certificate_ipv6y  s    z/NetworkedTests.test_get_server_certificate_ipv6N)	rk  rl  rm  r3  rZ   rn  r   ZIPV6_ENABLEDr4  r   r   r   r   r0  i  s   r0  c             C   sl   t  ||f¡}|s$|  d||f ¡ t j||f|d}|sL|  d||f ¡ tjrhtj d|||f ¡ d S )NzNo server certificate on %s:%s!)rd   z&
Verified certificate for %s:%s is
%s
)r   Úget_server_certificater¤   r   r3   r1   r4   r5   )Útestr  rg  r  rÑ   r   r   r   r  €  s    r  c          
   C   sj   yt j||ftd}W n: t jk
rP } ztjr@tj d| ¡ W d d }~X Y nX |  	d|||f ¡ d S )N)rd   z%s
z$Got server certificate %s for %s:%s!)
r   r5  rµ   rW   r   r3   r1   r4   r5   r¤   )r6  r  rg  rÑ   Úxr   r   r   r  ‹  s    "r  )Úmake_https_serverc               @   sR   e Zd ZG dd„ dejƒZddd„Zdd	„ Zd
d„ Zddd„Z	dd„ Z
dd„ ZdS )r  c               @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )z$ThreadedEchoServer.ConnectionHandlerzºA mildly complicated class, because we want it to work both
        with and without the SSL wrapper around the socket connection, so
        that we can test the STARTTLS functionality.c             C   s@   || _ d| _|| _|| _| j d¡ d | _tj | ¡ d| _	d S )NFr   T)
rf  Úrunningro   Úaddrrì  ÚsslconnÚ	threadingÚThreadÚ__init__Údaemon)rŠ   rf  Zconnsockr:  r   r   r   r>     s    z-ThreadedEchoServer.ConnectionHandler.__init__c          
   C   s  yB| j jj| jdd| _| j j | j ¡ ¡ | j j | j 	¡ ¡ W nØ t
ttfk
rª } zB| j j t|ƒ¡ | j jrŠtdt| jƒ d ƒ d| _|  ¡  dS d }~X Y n^ tjtfk
r } zL| j j t|ƒ¡ | j jròtdt| jƒ d ƒ d| _| j  ¡  |  ¡  dS d }~X Y nîX | j j | j ¡ ¡ | j jjtjkr²| j ¡ }tjrx| j jrxtj  !dt" #|¡ d ¡ | j d¡}tjr²| j jr²tj  !dtt$|ƒƒ d	 ¡ | j %¡ }tjr| j jrtj  !d
t|ƒ d ¡ tj  !dt| j ¡ ƒ d ¡ dS d S )NT)rÿ   z'
 server:  bad connection attempt from z:
Fz client cert is r²   z cert binary is z bytes
z" server: connection cipher is now z" server: selected protocol is now )&rf  rq   rn   ro   r;  Úselected_npn_protocolsÚappendÚselected_npn_protocolÚselected_alpn_protocolsÚselected_alpn_protocolÚConnectionResetErrorÚBrokenPipeErrorÚConnectionAbortedErrorÚconn_errorsr’   Úchattyr7   r&  r:  r9  r§   r   rW   rï   Ústopr+  rj   r   r	  r   r3   r1   r4   r5   r¹   rº   r   r)  )rŠ   rè  r  Zcert_binaryr)  r   r   r   Ú	wrap_connª  sD    


z.ThreadedEchoServer.ConnectionHandler.wrap_connc             C   s    | j r| j  ¡ S | j d¡S d S )Ni   )r;  r¬   ro   rð   )rŠ   r   r   r   r¬   ã  s    
z)ThreadedEchoServer.ConnectionHandler.readc             C   s"   | j r| j  |¡S | j |¡S d S )N)r;  r5   ro   rô   )rŠ   r9  r   r   r   r5   é  s    z*ThreadedEchoServer.ConnectionHandler.writec             C   s    | j r| j  ¡  n
| j ¡  d S )N)r;  r§   ro   )rŠ   r   r   r   r§   ï  s    z*ThreadedEchoServer.ConnectionHandler.closec          
   C   sÜ  d| _ | jjs|  ¡ sd S xº| j rÖyÀ|  ¡ }| ¡ }|s|d| _ y| j ¡ | _W n t	k
rh   Y nX d | _|  
¡  nj|dkrªtjrž| jjržtj d¡ |  
¡  d S | jjrî|dkrîtjrÔ| jjrÔtj d¡ |  d¡ |  ¡ sêd S nø| jjrf| jrf|dkrftjr(| jjr(tj d	¡ |  d¡ | j ¡ | _d | _tjræ| jjrætj d
¡ n€|dkr¶tjrŽ| jjrŽtj d¡ | j d¡}|  t|ƒ d¡d ¡ n0|dkr8tjrÞ| jjrÞtj d¡ y| j ¡  W n> tjk
r* } z|  t|ƒ d¡d ¡ W d d }~X Y nX |  d¡ n®|dkrj| j ¡ d k	r^|  d¡ n
|  d¡ n||dkr˜| j ¡ }|  t|ƒ d¡d ¡ nNtjrØ| jjrØ| jr¸dpºd}tj d||| ¡ |f ¡ |  | ¡ ¡ W q ttfk
r6   | jjr$tjr$tj d | j¡¡ |  
¡  d| _ Y q tjk
r” } z>d|jkr„| jjrztjrztj |jd ¡ t d¡‚W d d }~X Y q t	k
rÒ   | jjr¶t dƒ |  
¡  d| _ | j !¡  Y qX qW d S )NTFs   overz" server: client closed connection
s   STARTTLSz2 server: read STARTTLS from client, sending OK...
s   OK
s   ENDTLSz0 server: read ENDTLS from client, sending OK...
z* server: connection is now unencrypted...
s   CB tls-uniquez@ server: read CB tls-unique from client, sending our CB data...
z
tls-uniquezus-asciió   
s   PHAz( server: initiating post handshake auth
s   HASCERTs   TRUE
s   FALSE
s   GETCERTZ	encryptedZunencryptedz/ server: read %r (%s), sending back %r (%s)...
z Connection reset by peer: {}
Z!PEER_DID_NOT_RETURN_A_CERTIFICATEr   z!tlsv13 alert certificate requiredzTest server failure:
)"r9  rf  Ústarttls_serverrK  r¬   Ústripr;  r   ro   rï   r§   r   r3   Úconnectionchattyr1   r4   r5   r!  r&  r  Úverify_client_post_handshaker   rW   r	  r`  rE  rG  rI  rß   r:  rê  r[   r7   rJ  )rŠ   ÚmsgÚstrippedr¡   rè  r  ZctypeÚerrr   r   r   Úrunõ  s¢    




*






z(ThreadedEchoServer.ConnectionHandler.runN)
rk  rl  rm  r/  r>  rK  r¬   r5   r§   rT  r   r   r   r   ÚConnectionHandlerš  s   
9rU  NTFc             C   sð   |r|| _ n€t |d k	r|ntj¡| _ |d k	r2|ntj| j _|rL| j  |¡ |r\| j  |¡ |rl| j  |¡ |	r|| j  	|	¡ |
rŒ| j  
|
¡ || _|| _|| _t ¡ | _t | j¡| _d | _d| _g | _g | _g | _g | _tj | ¡ d| _d S )NFT)rq   r   rD   rE   rh   rj   rk   rl   Úset_npn_protocolsÚset_alpn_protocolsrm   rI  rO  rM  rŽ   ro   r   rc  rg  ÚflagÚactiver@  rC  r+  rH  r<  r=  r>  r?  )rŠ   Zcertificaterp   ÚcertreqsÚcacertsrI  rO  rM  Znpn_protocolsZalpn_protocolsre   rq   r   r   r   r>  ]	  s<    


zThreadedEchoServer.__init__c             C   s   |   t ¡ ¡ | j ¡  | S )N)Ústartr<  ÚEventrX  Úwait)rŠ   r   r   r   r  ‚	  s    
zThreadedEchoServer.__enter__c             G   s   |   ¡  |  ¡  d S )N)rJ  r   )rŠ   r[   r   r   r   r  ‡	  s    zThreadedEchoServer.__exit__c             C   s   || _ tj | ¡ d S )N)rX  r<  r=  r\  )rŠ   rX  r   r   r   r\  ‹	  s    zThreadedEchoServer.startc          
   C   s  | j  d¡ | j  ¡  d| _| jr,| j ¡  xÖ| jryT| j  ¡ \}}tjrj| j	rjt
j dt|ƒ d ¡ |  | ||¡}| ¡  | ¡  W q. tjk
r    Y q. tk
rº   |  ¡  Y q. tk
rþ } z(tjrî| j	rît
j dt|ƒ d ¡ W d d }~X Y q.X q.W | j  ¡  d S )Ngš™™™™™©?Tz server:  new connection from r²   z connection handling failed: )ro   rü   r  rY  rX  r7  r¾  r   r3   rI  r1   r4   r5   r&  rU  r\  r   rŽ   rý   ÚKeyboardInterruptrJ  r¨   r§   )rŠ   ZnewconnZconnaddrZhandlerrè  r   r   r   rT  	  s.    


(zThreadedEchoServer.runc             C   s
   d| _ d S )NF)rY  )rŠ   r   r   r   rJ  ª	  s    zThreadedEchoServer.stop)NNNNTFFNNNN)N)rk  rl  rm  r<  r=  rU  r>  r  r  r\  rT  rJ  r   r   r   r   r  ˜  s    D    
!
r  c               @   sX   e Zd ZG dd„ dejƒZdd„ Zdd„ Zdd„ Zd	d
„ Z	ddd„Z
dd„ Zdd„ ZdS )ÚAsyncoreEchoServerc               @   s6   e Zd ZG dd„ dejƒZdd„ Zdd„ Zdd„ Zd	S )
zAsyncoreEchoServer.EchoServerc               @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )z/AsyncoreEchoServer.EchoServer.ConnectionHandlerc             C   s4   t |d|dd| _tj | | j¡ d| _|  ¡  d S )NTF)rÿ   rf   r  )rr   rŽ   ÚasyncoreÚdispatcher_with_sendr>  Ú_ssl_acceptingÚ_do_ssl_handshake)rŠ   Úconnrf   r   r   r   r>  µ	  s    
z8AsyncoreEchoServer.EchoServer.ConnectionHandler.__init__c             C   s.   t | jtjƒr*x| j ¡ dkr(|  ¡  qW dS )Nr   T)r;  rŽ   r   r   rú  Zhandle_read_event)rŠ   r   r   r   Úreadable½	  s    z8AsyncoreEchoServer.EchoServer.ConnectionHandler.readablec          
   C   sœ   y| j  ¡  W n‚ tjtjfk
r*   d S  tjk
rB   |  ¡ S  tjk
rX   ‚ Y n@ tk
r } z|j	d t
jkr€|  ¡ S W d d }~X Y nX d| _d S )Nr   F)rŽ   rî  r   rí  r  ZSSLEOFErrorÚhandle_closerW   rï   r[   r  ZECONNABORTEDrc  )rŠ   rS  r   r   r   rd  Ã	  s    zAAsyncoreEchoServer.EchoServer.ConnectionHandler._do_ssl_handshakec             C   sT   | j r|  ¡  n@|  d¡}tjr4tj dt|ƒ ¡ |sB|  	¡  n|  
| ¡ ¡ d S )Ni   z server:  read %s from client
)rc  rd  rð   r   r3   r1   r4   r5   r&  r§   rô   r`  )rŠ   r¡   r   r   r   Úhandle_readÒ	  s    


z;AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_readc             C   s$   |   ¡  tjr tj d| j ¡ d S )Nz server:  closed connection %s
)r§   r   r3   r1   r4   r5   rŽ   )rŠ   r   r   r   rg  Þ	  s    z<AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_closec              C   s   ‚ d S )Nr   )rŠ   r   r   r   r7   ã	  s    z<AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_errorN)	rk  rl  rm  r>  rf  rd  rh  rg  r7   r   r   r   r   rU  ³	  s   rU  c             C   s@   || _ t tjtj¡}t |d¡| _tj 	| |¡ |  
d¡ d S )NrV   rO   )rf   rŽ   ræ   ZSOCK_STREAMr   rc  rg  ra  Ú
dispatcherr>  r  )rŠ   rf   ro   r   r   r   r>  æ	  s
    z&AsyncoreEchoServer.EchoServer.__init__c             C   s(   t jrtj d| ¡ |  || j¡ d S )Nz$ server:  new connection from %s:%s
)r   r3   r1   r4   r5   rU  rf   )rŠ   Zsock_objr:  r   r   r   Úhandle_acceptedí	  s    z-AsyncoreEchoServer.EchoServer.handle_acceptedc              C   s   ‚ d S )Nr   )rŠ   r   r   r   r7   ò	  s    z*AsyncoreEchoServer.EchoServer.handle_errorN)	rk  rl  rm  ra  rb  rU  r>  rj  r7   r   r   r   r   Ú
EchoServer±	  s   3rk  c             C   s8   d | _ d| _|  |¡| _| jj| _tj | ¡ d| _d S )NFT)	rX  rY  rk  rf  rg  r<  r=  r>  r?  )rŠ   rf   r   r   r   r>  õ	  s    
zAsyncoreEchoServer.__init__c             C   s   d| j j| jf S )Nz<%s %s>)Ú	__class__rk  rf  )rŠ   r   r   r   Ú__str__ý	  s    zAsyncoreEchoServer.__str__c             C   s   |   t ¡ ¡ | j ¡  | S )N)r\  r<  r]  rX  r^  )rŠ   r   r   r   r   
  s    
zAsyncoreEchoServer.__enter__c             G   sV   t jrtj d¡ |  ¡  t jr,tj d¡ |  ¡  t jrFtj d¡ tjdd d S )Nz cleanup: stopping server.
z! cleanup: joining server thread.
z cleanup: successfully joined.
T)Z
ignore_all)	r   r3   r1   r4   r5   rJ  r   ra  Z	close_all)rŠ   r[   r   r   r   r  
  s    zAsyncoreEchoServer.__exit__Nc             C   s   || _ tj | ¡ d S )N)rX  r<  r=  r\  )rŠ   rX  r   r   r   r\  
  s    zAsyncoreEchoServer.startc             C   sB   d| _ | jr| j ¡  x&| j r<yt d¡ W q   Y qX qW d S )NTr   )rY  rX  r7  ra  Zloop)rŠ   r   r   r   rT  
  s    
zAsyncoreEchoServer.runc             C   s   d| _ | j ¡  d S )NF)rY  rf  r§   )rŠ   r   r   r   rJ  
  s    zAsyncoreEchoServer.stop)N)rk  rl  rm  ra  ri  rk  r>  rm  r  r  r\  rT  rJ  r   r   r   r   r`  ­	  s   D

r`  ó   FOO
TFc             C   sz  i }t ||dd}|X | jt ¡ ||d}	|	 t|jf¡ xœ|t|ƒt|ƒgD ]†}
|rttj	rtt
j d| ¡ |	 |
¡ |	 ¡ }|r tj	r t
j d| ¡ || ¡ krVtd|dd… t|ƒ|dd…  ¡ t|ƒf ƒ‚qVW |	 d	¡ |rtj	rt
j d
¡ | |	 ¡ |	 ¡ |	 ¡ |	 ¡ |	 ¡ |	 ¡ |	j|	jdœ¡ |	 ¡  W dQ R X |j|d< |j|d< |j|d< W dQ R X |S )zW
    Launch a server, connect a client to it and try various reads
    and writes.
    F)rq   rI  rO  )r  Úsessionz client:  sending %r...
z client:  read %r
z4bad data <<%r>> (%d) received; expected <<%r>> (%d)
Né   s   over
z client:  closing connection.
)Úcompressionr)  ÚpeercertÚclient_alpn_protocolÚclient_npn_protocolr$   Úsession_reusedro  Úserver_alpn_protocolsÚserver_npn_protocolsÚserver_shared_ciphers)r  rn   rŽ   r   r  rg  rŸ   rü  r   r3   r1   r4   r5   r¬   r`  ÚAssertionErrorr   r<  rq  r)  r	  rD  rB  r$   ru  ro  r§   rC  r@  r+  )rz   r{   ÚindatarI  rO  Úsni_namero  r×  rf  r   ÚargÚoutdatar   r   r   Úserver_params_test#
  sR    


 


r~  c          
   C   sÈ  |dkrt j}t jdt jdt jdi| }tjr\|r6dp8d}tj |t  	|¡t  	| ¡|f ¡ t  
|¡}| j|O  _t  
| ¡}	|	 j|O  _t |d¡}
|
dk	rÄt|	dƒrÄ| t jkrÄ|	j|
krÄ|
|	_|jt jkrÚ| d¡ x*||	fD ]}||_| t¡ | t¡ qäW yt||	d	d	d
}W nX t jk
r:   |r6‚ Y nŠ tk
rr } z|s`|jtjkrb‚ W dd}~X Y nRX |s˜tdt  	|¡t  	| ¡f ƒ‚n,|dk	rÄ||d krÄtd||d f ƒ‚dS )a<  
    Try to SSL-connect using *client_protocol* to *server_protocol*.
    If *expect_success* is true, assert that the connection succeeds,
    if it's false, assert that the connection fails.
    Also, if *expect_success* is a string, assert that it is the protocol
    version actually used by the connection.
    Nrh   r~   r   z %s->%s %s
z {%s->%s} %s
r‡  ru  F)rI  rO  z5Client protocol %s succeeded with server protocol %s!Tr$   z%version mismatch: expected %r, got %r)r   rh   r~   r   r   r3   r1   r4   r5   Zget_protocol_namerD   r€  ÚPROTOCOL_TO_TLS_VERSIONr!  r_   r‰   r‡  r”   rm   rj   rl   rs   rk   rx   r~  rW   rï   r  Ú
ECONNRESETry  )Zserver_protocolZclient_protocolÚexpect_successZ	certsreqsÚserver_optionsÚclient_optionsZcerttypeZ	formatstrrz   r{   Zmin_versionrH   r×  rè  r   r   r   Útry_protocol_comboU
  s\    	








r„  c               @   s  e Zd Zedd„ ƒZdd„ Ze eƒ d¡dd„ ƒZ	dd	„ Z
d
d„ Zdd„ Zdd„ Zdd„ Ze ejd¡dd„ ƒZdd„ Zdd„ Zee eedƒd¡dd„ ƒƒZedd„ ƒZee eedƒd ¡d!d"„ ƒƒZed#d$„ ƒZee eed%ƒd&¡d'd(„ ƒƒZee eed)ƒd*¡d+d,„ ƒƒZd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Z d9d:„ Z!d;d<„ Z"d=d>„ Z#d?d@„ Z$dAdB„ Z%dCdD„ Z&e ejdE¡dFdG„ ƒZ'e eej(dHƒdI¡dJdK„ ƒZ)e eej(dHƒdI¡e ej*dL¡dMdN„ ƒƒZ+e ej,dO¡dPdQ„ ƒZ-e dRej.kdS¡dTdU„ ƒZ/dVdW„ Z0e eedXƒdY¡dZd[„ ƒZ1d\d]„ Z2e e3d^¡e 4e5d_¡d`da„ ƒƒZ6dbdc„ Z7e ej8dd¡dedf„ ƒZ9e ej8dg¡dhdi„ ƒZ:djdk„ Z;e ej<dl¡dmdn„ ƒZ=dodp„ Z>dqdr„ Z?e@dsdt„ ƒZAe@dudv„ ƒZBe@dwdx„ ƒZCe@dydz„ ƒZDd{d|„ ZEd}d~„ ZFdd€„ ZGdd‚„ ZHdƒd„„ ZId…S )†ÚThreadedTestsc          
   C   sÄ  t jrtj d¡ x`tD ]X}|tjtjhkr.q| j	tj
| d* t |¡}| t¡ t||ddd W dQ R X qW tƒ \}}}| j	tjtjd t||dd|d W dQ R X d|_| j	tjtjdB |  tj¡}t||dd|d W dQ R X |  d	t|jƒ¡ W dQ R X | j	tjtjd@ |  tj¡}t||ddd
 W dQ R X |  d	t|jƒ¡ W dQ R X | j	tjtjd@ |  tj¡}t||ddd
 W dQ R X |  d	t|jƒ¡ W dQ R X dS )z2Basic test of an SSL client connecting to a serverr²   )r”   T)rI  rO  N)r  rf  )rz   r{   rI  rO  r{  Fz%called a function you should not call)rz   r{   rI  rO  )r   r3   r1   r4   r5   rr  r   rw   rE   ZsubTestÚ_PROTOCOL_NAMESrD   rl   rµ   r~  r|   ri   rž   rW   r€   r’   r  )rŠ   r”   rq   rz   r{   ry   rè  r   r   r   Ú	test_echož
  sN    


zThreadedTests.test_echoc       
      C   s\  t jrtj d¡ tƒ \}}}t|dd}|" |jt ¡ d|d }| 	t
|jf¡ |  t¡ | ¡  W d Q R X | ¡  | ¡ }|  |d¡ | ¡ }t jrÐtj t |¡d ¡ tj dt|ƒ d ¡ d|krì|  d	t |¡ ¡ d
|d kr|  d¡ |  d|¡ |  d|¡ t |d ¡}t |d ¡}	|  ||	¡ W d Q R X W d Q R X d S )Nr²   F)rq   rI  )r  r  zCan't get peer certificate.zConnection cipher is z.
r"   z$No subject field in certificate: %s.))r   zPython Software FoundationzkMissing or invalid 'organizationName' field in certificate subject; should be 'Python Software Foundation'.r    r   )r   r3   r1   r4   r5   r|   r  rn   rŽ   r   r  rg  rž   rG   r	  rî  rÞ   r)  r¹   rº   r’   r¤   r€   r   rW  rÜ   )
rŠ   rz   r{   ry   rf  r   r  r)  ZbeforeZafterr   r   r   Útest_getpeercertÎ
  s<    
zThreadedTests.test_getpeercertz!verify_flags need OpenSSL > 0.9.8c             C   s|  t jrtj d¡ tƒ \}}}ttddƒ}|  |j	tj
|B ¡ t|dd}|H |jt ¡ |d*}| t|jf¡ | ¡ }|  |d¡ W d Q R X W d Q R X | j	tjO  _	t|dd}|N |jt ¡ |d0}|  tjd¡ | t|jf¡ W d Q R X W d Q R X W d Q R X | t¡ t|dd}|H |jt ¡ |d*}| t|jf¡ | ¡ }|  |d¡ W d Q R X W d Q R X d S )	Nr²   r  r   T)rq   rI  )r  zCan't get peer certificate.zcertificate verify failed)r   r3   r1   r4   r5   r|   rŽ  r   rˆ   r  r  r  rn   rŽ   r   r  rg  r	  rÞ   r‘  rŒ   rW   rk   ÚCRLFILE)rŠ   rz   r{   ry   r’  rf  r   r  r   r   r   Útest_crl_checkò
  s8    

 

.


zThreadedTests.test_crl_checkc             C   s6  t jrtj d¡ tƒ \}}}t|dd}|H |jt ¡ |d*}| 	t
|jf¡ | ¡ }|  |d¡ W d Q R X W d Q R X t|dd}|N |jt ¡ dd0}|  tjd¡ | 	t
|jf¡ W d Q R X W d Q R X W d Q R X t|dd}|< t ¡ (}|  td¡ | |¡ W d Q R X W d Q R X W d Q R X d S )	Nr²   T)rq   rI  )r  zCan't get peer certificate.r  z:Hostname mismatch, certificate is not valid for 'invalid'.z'check_hostname requires server_hostname)r   r3   r1   r4   r5   r|   r  rn   rŽ   r   r  rg  r	  rÞ   rŒ   r   r  rG   )rŠ   rz   r{   ry   rf  r   r  r   r   r   rÝ    s0    

 

.
z!ThreadedTests.test_check_hostnamec          
   C   sÂ   t  t j¡}| t¡ | d¡ t}t  t j¡}| t	¡ t
|dd}|n |jt ¡ |dP}| t|jf¡ | ¡ }|  |d¡ | ¡ d  d¡}|  |d d… d	¡ W d Q R X W d Q R X d S )
NzECDHE:ECDSA:!NULL:!aRSAT)rq   rI  )r  zCan't get peer certificate.r   ú-rB  )ÚECDHEÚECDSA)r   rD   rw   rk   rx   rm   ÚSIGNED_CERTFILE_ECC_HOSTNAMErE   rl   ÚSIGNED_CERTFILE_ECCr  rn   rŽ   r   r  rg  r	  rÞ   r)  Úsplit)rŠ   rz   ry   r{   rf  r   r  r)  r   r   r   Útest_ecc_cert=  s    




zThreadedTests.test_ecc_certc          
   C   sÜ   t  t j¡}| t¡ | jt jO  _| d¡ t}t  t j	¡}| 
t¡ | 
t¡ t|dd}|n |jt ¡ |dP}| t|jf¡ | ¡ }|  |d¡ | ¡ d  d¡}|  |d d… d	¡ W d Q R X W d Q R X d S )
NzECDHE:ECDSA:!NULL:!aRSAT)rq   rI  )r  zCan't get peer certificate.r   r‹  rB  )rŒ  r  )r   rD   rw   rk   rx   r€  r…   rm   rŽ  rE   rl   r  rs   r  rn   rŽ   r   r  rg  r	  rÞ   r)  r  )rŠ   rz   ry   r{   rf  r   r  r)  r   r   r   Útest_dual_rsa_eccR  s"    





zThreadedTests.test_dual_rsa_eccc       	      C   sR  t jrtj d¡ t tj¡}| t	¡ t tj
¡}tj|_d|_| t¡ ddddddd	d
g}xŠ|D ]‚\}}t|dd}|d |jt ¡ |dF}|  |j|¡ | t|jf¡ | ¡ }|  |j|¡ |  |d¡ W d Q R X W d Q R X qfW t|dd}|L |jt ¡ dd.}|  tj¡ | t|jf¡ W d Q R X W d Q R X W d Q R X d S )Nr²   T)u   kÃ¶nig.idn.pythontest.netzxn--knig-5qa.idn.pythontest.net)zxn--knig-5qa.idn.pythontest.netzxn--knig-5qa.idn.pythontest.net)s   xn--knig-5qa.idn.pythontest.netzxn--knig-5qa.idn.pythontest.net)u(   kÃ¶nigsgÃ¤ÃŸchen.idna2003.pythontest.netz.xn--knigsgsschen-lcb0w.idna2003.pythontest.net)z.xn--knigsgsschen-lcb0w.idna2003.pythontest.netz.xn--knigsgsschen-lcb0w.idna2003.pythontest.net)s.   xn--knigsgsschen-lcb0w.idna2003.pythontest.netz.xn--knigsgsschen-lcb0w.idna2003.pythontest.net)z.xn--knigsgchen-b4a3dun.idna2008.pythontest.netz.xn--knigsgchen-b4a3dun.idna2008.pythontest.net)s.   xn--knigsgchen-b4a3dun.idna2008.pythontest.netz.xn--knigsgchen-b4a3dun.idna2008.pythontest.net)rq   rI  )r  zCan't get peer certificate.zpython.example.org)r   r3   r1   r4   r5   r   rD   rE   rl   ÚIDNSANSFILErw   r   rj   ri   rk   rx   r  rn   rŽ   rˆ   r  r   r  rg  r	  rÞ   rž   r  )	rŠ   r{   rq   Zidn_hostnamesr  Zexpected_hostnamerf  r   r  r   r   r   Útest_check_hostname_idnl  s@    



$

z%ThreadedTests.test_check_hostname_idnc             C   s  t ƒ \}}}| t¡ tj|_tjj|_t	|ddd}|Â |j
t ¡ |d¤}y| t|jf¡ W n~ tjk
rž } ztjrŽtj d| ¡ W dd}~X Y nP tk
râ } z(|jtjkr¼‚ tjrÒtj d| ¡ W dd}~X Y nX |  d¡ W dQ R X W dQ R X dS )zÇConnecting when the server rejects the client's certificate

        Launch a server with CERT_REQUIRED, and check that trying to
        connect to it with a wrong client certificate fails.
        T)rq   rI  rO  )r  z
SSLError is %r
Nz
socket.error is %r
z'Use of invalid cert should have failed!)r|   rl   rµ   r   r   rj   rˆ  r‰  rŠ  r  rn   rŽ   r   r  rg  rW   r   r3   r1   r4   r5   rï   r  r€  r¤   )rŠ   rz   r{   ry   rf  r   rè  r   r   r   Útest_wrong_cert_tls12¤  s(    



 "z#ThreadedTests.test_wrong_cert_tls12zTest needs TLS 1.3c             C   s&  t ƒ \}}}| t¡ tj|_tjj|_tjj|_t	|ddd}|Ø |j
t ¡ |dº}| t|jf¡ y| d¡ | d¡ W n€ tjk
r¼ } ztjr¬tj d| ¡ W d d }~X Y nR tk
r } z(|jtjkrÜ‚ tjròtj d| ¡ W d d }~X Y nX |  d¡ W d Q R X W d Q R X d S )	NT)rq   rI  rO  )r  s   datarM   z
SSLError is %r
z
socket.error is %r
z'Use of invalid cert should have failed!)r|   rl   rµ   r   r   rj   rˆ  r‹  r‡  r  rn   rŽ   r   r  rg  r5   r¬   rW   r   r3   r1   r4   rï   r  r€  r¤   )rŠ   rz   r{   ry   rf  r   rè  r   r   r   Útest_wrong_cert_tls13É  s.    





 "z#ThreadedTests.test_wrong_cert_tls13c                st   t  ¡ ‰t  ¡ ‰ t ¡ ‰t ˆt¡‰‡ ‡‡fdd„}‡ ‡‡‡fdd„}t j|d}| ¡  z
|ƒ  W d| ¡  X dS )ztA brutal shutdown of an SSL server should raise an OSError
        in the client when attempting handshake.
        c                 s8   ˆ  ¡  ˆ ¡  ˆ ¡ \} }|  ¡  ˆ ¡  ˆ  ¡  d S )N)r  r7  r¾  r§   )Znewsockr:  )Úlistener_goneÚlistener_readyr   r   r   Úlistenerö  s    z2ThreadedTests.test_rude_shutdown.<locals>.listenerc           	      sb   ˆ  ¡  t ¡ H} |  tˆf¡ ˆ   ¡  yt| ƒ}W n tk
rH   Y nX ˆ d¡ W d Q R X d S )Nz2connecting to closed SSL socket should have failed)r^  rŽ   r   r  rr   rï   r¤   )r"  Ússl_sock)r—  r˜  rg  rŠ   r   r   Ú	connectorþ  s    
z3ThreadedTests.test_rude_shutdown.<locals>.connector)ÚtargetN)	r<  r]  rŽ   r   rc  r  r=  r\  r   )rŠ   r™  r›  râ   r   )r—  r˜  rg  r   rŠ   r   Útest_rude_shutdownè  s    
z ThreadedTests.test_rude_shutdownc             C   sú   t jrtj d¡ t tj¡}| t	¡ t tj
¡}t|dd}|¬ |jt ¡ tdŽ}y| t|jf¡ W nr tjk
rà } zRd}|  |tj¡ |  |jd¡ |  |j|¡ |  |t|ƒ¡ |  dt|ƒ¡ W d d }~X Y nX W d Q R X W d Q R X d S )Nr²   T)rq   rI  )r  z&unable to get local issuer certificaterp  zcertificate verify failed)r   r3   r1   r4   r5   r   rD   rE   rl   rs   rw   r  rn   rŽ   rt   r   r  rg  rW   rØ   ZSSLCertVerificationErrorrˆ   Zverify_codeZverify_messager€   r&  )rŠ   r{   rq   rf  r   rè  rQ  r   r   r   Útest_ssl_cert_verify_error  s$    


z(ThreadedTests.test_ssl_cert_verify_errorrU   z)OpenSSL is compiled without SSLv2 supportc             C   sÐ   t jrtj d¡ ttjtjdƒ ttjtjdtjƒ ttjtjdtj	ƒ ttjtj
dƒ ttdƒrtttjtjdƒ ttjtjdƒ tƒ r ttjtj
dtjd ttjtj
dtjd ttjtj
dtjd dS )z9Connecting to an SSLv2 server with various client optionsr²   TFÚPROTOCOL_SSLv3)rƒ  N)r   r3   r1   r4   r5   r„  r   rU   r~   r   r‰   r_   rŸ  r   r@   r‚   rƒ   r„   )rŠ   r   r   r   Útest_protocol_sslv2(  s     


z!ThreadedTests.test_protocol_sslv2c          
   C   sŽ  t jrtj d¡ ttdƒrnyttjtj	dƒ W n< t
k
rl } zt jr\tj dt|ƒ ¡ W dd}~X Y nX ttdƒrˆttjtjdƒ ttjtjdƒ ttjtjdƒ ttdƒrÆttjtjdtjƒ ttjtjdtjƒ ttjtjdtjƒ ttdƒrttjtjdtjƒ ttjtjdtjƒ ttjtjdtjƒ ttdƒrXttjtjdtjd	 ttjtjdtjtjB d	 ttjtjdtjd	 dS )
z:Connecting to an SSLv23 server with various client optionsr²   rU   Tz; SSL2 client to SSL23 server test unexpectedly failed:
 %s
NrŸ  Fr	   )r‚  )r   r3   r1   r4   r5   r_   r   r„  r‰   rU   rï   r’   rŸ  r   r~   r   rƒ   r‚   r„   )rŠ   r7  r   r   r   Útest_PROTOCOL_TLS@  s:    



zThreadedTests.test_PROTOCOL_TLSrŸ  z)OpenSSL is compiled without SSLv3 supportc             C   sª   t jrtj d¡ ttjtjdƒ ttjtjdtjƒ ttjtjdtj	ƒ t
tdƒrdttjtjdƒ ttjtjdtjd ttjtjdƒ tƒ r¦ttjtjdtjd dS )z9Connecting to an SSLv3 server with various client optionsr²   r   rU   F)rƒ  N)r   r3   r1   r4   r5   r„  r   rŸ  r~   r   r_   rU   r‰   rƒ   r   r@   r‚   )rŠ   r   r   r   Útest_protocol_sslv3h  s    


z!ThreadedTests.test_protocol_sslv3c             C   s˜   t jrtj d¡ ttjtjdƒ ttjtjdtjƒ ttjtjdtj	ƒ t
tdƒrdttjtjdƒ t
tdƒr~ttjtjdƒ ttjtjdtjd dS )z8Connecting to a TLSv1 server with various client optionsr²   r	   rU   FrŸ  )rƒ  N)r   r3   r1   r4   r5   r„  r   r   r~   r   r_   rU   rŸ  r‰   r„   )rŠ   r   r   r   Útest_protocol_tlsv1|  s    

z!ThreadedTests.test_protocol_tlsv1r
   zTLS version 1.1 not supported.c             C   s    t jrtj d¡ ttjtjdƒ ttdƒr<ttjtj	dƒ ttdƒrVttjtj
dƒ ttjtjdtjd ttjtjdƒ ttjtjdƒ ttjtjdƒ dS )zjConnecting to a TLSv1.1 server with various client options.
           Testing against older TLS versions.r²   zTLSv1.1rU   FrŸ  )rƒ  N)r   r3   r1   r4   r5   r„  r   r
   r_   rU   rŸ  r‰   r†   r   )rŠ   r   r   r   Útest_protocol_tlsv1_1‹  s    


z#ThreadedTests.test_protocol_tlsv1_1ÚPROTOCOL_TLSv1_2zTLS version 1.2 not supported.c             C   sÖ   t jrtj d¡ ttjtjdtjtj	B tjtj	B d t
tdƒrRttjtjdƒ t
tdƒrlttjtjdƒ ttjtjdtjd ttjtjdƒ ttjtjdƒ ttjtjdƒ ttjtjdƒ ttjtjdƒ dS )	zjConnecting to a TLSv1.2 server with various client options.
           Testing against older TLS versions.r²   zTLSv1.2)r‚  rƒ  rU   FrŸ  )rƒ  N)r   r3   r1   r4   r5   r„  r   r¥  rƒ   r‚   r_   rU   rŸ  r‰   r‡   r   r
   )rŠ   r   r   r   Útest_protocol_tlsv1_2Ÿ  s     



z#ThreadedTests.test_protocol_tlsv1_2c       	   	   C   sŽ  d}t tdddd}d}|f t ¡ }| d¡ | t|jf¡ tjrTt	j
 d¡ xâ|D ]Ú}tjrtt	j
 d| ¡ |rŒ| |¡ | ¡ }n| |¡ | d¡}| ¡  ¡ }|d	krâ| d
¡râtjrÔt	j
 d| ¡ t|ƒ}d}qZ|dkr| d
¡rtjrt	j
 d| ¡ | ¡ }d}qZtjrZt	j
 d| ¡ qZW tjrLt	j
 d¡ |r^| d¡ n
| d¡ |rx| ¡  n| ¡  W dQ R X dS )z6Switching from clear text to encrypted and back again.)s   msg 1s   MSG 2s   STARTTLSs   MSG 3s   msg 4s   ENDTLSs   msg 5s   msg 6T)rM  rI  rO  Fr   r²   z client:  sending %r...
i   s   STARTTLSs   okz/ client:  read %r from server, starting TLS...
s   ENDTLSz- client:  read %r from server, ending TLS...
z client:  read %r from server
z client:  closing connection.
s   over
N)r  rµ   rŽ   rì  r   r  rg  r   r3   r1   r4   r5   r¬   rô   rð   rN  r`  rÏ   rr   r   r§   )	rŠ   Zmsgsrf  Úwrappedr   rz  re  r}  rQ  r   r   r   Útest_starttls·  s^    








zThreadedTests.test_starttlsc          	   C   sà   t | td}tjrtj d¡ ttdƒ}| 	¡ }W dQ R X d}d|j
tj t¡d f }tjtd}tjj||d	}zN| ¡  d
¡}|rÂt|ƒdkrÂ| 	t|ƒ¡}tjrÂtj dt|ƒ|f ¡ W d| ¡  X |  ||¡ dS )z8Using socketserver to create and manage SSL connections.)rf   r²   ÚrbNrV   zhttps://localhost:%d/%sr   )r-  )rq   zcontent-lengthr   z/ client: read %d bytes from remote server '%s'
)r8  rs   r   r3   r1   r4   r5   rÌ   rµ   r¬   rg  r   r   r  r   rÚ  rx   ÚurllibZrequestZurlopenÚinfor!  rÙ   r   r§   rˆ   )rŠ   rf  r^   rÒ   rÓ   Zurlrq   Zdlenr   r   r   Útest_socketserverð  s(    
zThreadedTests.test_socketserverc          	   C   s   t jrtj d¡ d}ttƒ}|Ô tt ¡ ƒ}| 	d|j
f¡ t jrVtj d| ¡ | |¡ | ¡ }t jr~tj d| ¡ || ¡ kr¼|  d|dd… t|ƒ|dd…  ¡ t|ƒf ¡ | d	¡ t jrØtj d
¡ | ¡  t jròtj d¡ W dQ R X dS )z'Check the example asyncore integration.r²   s   FOO
z	127.0.0.1z client:  sending %r...
z client:  read %r
z4bad data <<%r>> (%d) received; expected <<%r>> (%d)
Nrp  s   over
z client:  closing connection.
z client:  connection closed.
)r   r3   r1   r4   r5   r`  rµ   rr   rŽ   r   rg  r¬   r`  r¤   r   r§   )rŠ   rz  rf  r   r}  r   r   r   Útest_asyncore_server
  s2    


z"ThreadedTests.test_asyncore_serverc                sÆ  t jrtj d¡ tttjtj	tddd}|Œ t
t ¡ dtttjtjd‰ ˆ  t|jf¡ ‡ fdd„}‡ fdd	„}d
ˆ jdg tfdˆ jddgtfdˆ jdg dd„ fg}dˆ jdg fdˆ jddgfd|dg fd|dg fg}d}xþ|D ]ö\}}}	}
}||  d¡}yx||f|
žŽ }d |¡}| j|||ƒ|d ˆ  ¡ }|| ¡ krx|  dj||dd… t|ƒ|dd… t|ƒd¡ W qæ tk
rÚ } z@|	r¦|  dj|d¡ t|ƒ |¡sÊ|  dj||d¡ W dd}~X Y qæX qæW xä|D ]Ü\}}}	}
||  d¡}yVˆ  |¡ ||
Ž }|| ¡ krT|  d j||dd… t|ƒ|dd… t|ƒd¡ W nh tk
r¾ } zH|	r‚|  d!j|d¡ t|ƒ |¡s¦|  dj||d¡ ˆ  ¡  W dd}~X Y nX qæW d"}ˆ  |¡ tt|ƒƒ}|  ˆ  d#|¡t|ƒ¡ |  ||¡ t dk	r@t j!t|ƒ }| "|¡}ˆ  |¡ |  ˆ  ¡ |¡ |  #t$ˆ j%¡ |  #t$ˆ j&d"g¡ |  #t$ˆ j'd$¡ |  #t$ˆ j(td$ƒg¡ ˆ  d%¡ |  #tˆ jd#¡ |  #tˆ jd#¡ ˆ  )¡  W dQ R X dS )&z Test recv(), send() and friends.r²   TF)rZ  rp   r[  rI  rO  )rÿ   rf   rd   rc   rp   c                 s   t dƒ} ˆ  | ¡}| d |… S )Nsd                                                                                                       )rŸ   rñ   )Úbr  )r   r   r   Ú
_recv_into;  s    
z0ThreadedTests.test_recv_send.<locals>._recv_intoc                 s"   t dƒ} ˆ  | ¡\}}| d |… S )Nsd                                                                                                       )rŸ   ró   )r®  r  r:  )r   r   r   Ú_recvfrom_into@  s    z4ThreadedTests.test_recv_send.<locals>._recvfrom_intorô   rõ   zsome.addressr"  c             S   s   d S )Nr   )r7  r   r   r   Ú<lambda>I  r³  z.ThreadedTests.test_recv_send.<locals>.<lambda>rð   rò   rñ   ró   ZPREFIX_r  zsending with {})rQ  zpWhile sending with <<{name:s}>> bad data <<{outdata:r}>> ({nout:d}) received; expected <<{indata:r}>> ({nin:d})
Nrp  )r   r}  Znoutrz  Zninz>Failed to send with method <<{name:s}>>; expected to succeed.
)r   zFMethod <<{name:s}>> failed with unexpected exception message: {exp:s}
)r   ZexpzrWhile receiving with <<{name:s}>> bad data <<{outdata:r}>> ({nout:d}) received; expected <<{indata:r}>> ({nin:d})
zAFailed to receive with method <<{name:s}>>; expected to succeed.
s   datarE  rî   s   over
)*r   r3   r1   r4   r5   r  rµ   r   rh   rE   rr   rŽ   rw   r   r  rg  rô   r   rõ   r"  rð   rò   r  rß   rˆ   r¬   r`  r¤   rG   r’   rÏ   rŸ   ÚctypesZc_ubyteZfrom_buffer_copyrž   rö   r÷   rø   rù   rú   r§   )rŠ   rf  r¯  r°  Zsend_methodsZrecv_methodsZdata_prefixZ	meth_nameZ	send_methr  r[   Zret_val_methrz  r%  rQ  r}  rè  Z	recv_methr¡   ÚbufferZubyteZ	bytesliker   )r   r   Útest_recv_send'  s²    



"

 




zThreadedTests.test_recv_sendc             C   sÆ   t tƒ}| ¡  |  |jd d ¡ t t|jf¡}|  |j	¡ t
|dd}|  |j	¡ | d¡ |  | d¡d¡ |  | d¡d¡ |  | ¡ d¡ | d¡ |  | d¡d¡ |  | tƒ ¡d¡ d S )NF)Zsuppress_ragged_eofss   datar   r³  )r  rµ   r  rª   r  rŽ   Zcreate_connectionr  rg  r§   rr   rô   rˆ   rð   r¬   rì  rñ   rŸ   )rŠ   rf  r   r   r   r   Útest_recv_zero°  s    

zThreadedTests.test_recv_zeroc          	      sž   t ttjtjtddd}|x tt ¡ dtttjtjd‰ˆ t	|j
f¡ ˆ d¡ tdƒ‰ ‡ ‡fdd„}|  tjtjf|¡ ˆ d¡ ˆ ¡  W d Q R X d S )NTF)rZ  rp   r[  rI  rO  )rÿ   rf   rd   rc   rp   i    c                  s   xˆ  ˆ ¡ qW d S )N)rô   r   )r&  r   r   r   Úfill_bufferØ  s    z8ThreadedTests.test_nonblocking_send.<locals>.fill_buffer)r  rµ   r   rh   rE   rr   rŽ   rw   r   r  rg  rì  rŸ   rž   r  rí  r§   )rŠ   rf  r¶  r   )r&  r   r   Útest_nonblocking_sendÄ  s*    


z#ThreadedTests.test_nonblocking_sendc                sþ   t   t j¡‰d}t ˆ¡}t ¡ ‰d‰ ‡ ‡‡fdd„}tj|d}| ¡  ˆ ¡  zz:t   t j¡}| 	d¡ | 
||f¡ |  t jdt|¡ W d | ¡  X z:t   t j¡}t|ƒ}| 	d¡ |  t jd|j
||f¡ W d | ¡  X W d d‰ | ¡  ˆ ¡  X d S )	Nz	127.0.0.1Fc                 sj   ˆ  ¡  ˆ ¡  g } x:ˆ sNt ˆgg g d¡\}}}ˆ|kr|  ˆ ¡ d ¡ qW x| D ]}| ¡  qVW d S )Ngš™™™™™¹?r   )r  r7  r  rA  r¾  r§   )ZconnsrË   Úwrè  ro   )Úfinishrf  Ústartedr   r   Úserveê  s    
z3ThreadedTests.test_handshake_timeout.<locals>.serve)rœ  gš™™™™™É?z	timed outT)rŽ   ræ   r   rc  r<  r]  r=  r\  r^  rü   r   rŒ   rý   rr   r§   r   )rŠ   r  rg  r»  râ   r"  r   )r¹  rf  rº  r   Útest_handshake_timeoutâ  s6    





z$ThreadedTests.test_handshake_timeoutc                s  t  t j¡}t j|_| t¡ | t¡ t	 	t	j
¡‰d}t ˆ¡}|jˆdd‰|  ˆj¡ t ¡ ‰ d ‰d ‰‡ ‡‡‡fdd„}tj|d}| ¡  ˆ  ¡  | t	 	¡ ¡}| ||f¡ | d¡ | ¡  | ¡ }| ¡  | ¡  ˆ ¡  ˆ ¡  |  ˆt j¡ |  ˆ|¡ d S )Nz	127.0.0.1T)rÿ   c                  s0   ˆ  ¡  ˆ  ¡  ˆ ¡ \‰‰ˆ ˆ d¡¡ d S )NrM   )r  r7  r¾  rô   rð   r   )ÚevtÚpeerÚremoterf  r   r   r»  #  s    z/ThreadedTests.test_server_accept.<locals>.serve)rœ  s   data)r   rD   r‰   r   rj   rk   rx   rl   rs   rŽ   ræ   r   rc  rn   rÞ   rÿ   r<  r]  r=  r\  r^  r   rô   rð   r   r§   r   rØ   r   rˆ   )rŠ   rq   r  rg  r»  râ   r  Zclient_addrr   )r½  r¾  r¿  rf  r   Útest_server_accept  s6    



z ThreadedTests.test_server_acceptc          
   C   sZ   t  t j¡}| t ¡ ¡6}|  t¡}| ¡  W d Q R X |  |j	j
t
j¡ W d Q R X d S )N)r   rD   r‰   rn   rŽ   rž   rï   r	  rˆ   r  r  ÚENOTCONN)rŠ   rq   ro   r  r   r   r   Útest_getpeercert_enotconn<  s
    z'ThreadedTests.test_getpeercert_enotconnc          
   C   sZ   t  t j¡}| t ¡ ¡6}|  t¡}| ¡  W d Q R X |  |j	j
t
j¡ W d Q R X d S )N)r   rD   r‰   rn   rŽ   rž   rï   rî  rˆ   r  r  rÁ  )rŠ   rq   ro   r  r   r   r   Útest_do_handshake_enotconnC  s
    z(ThreadedTests.test_do_handshake_enotconnc             C   s    t ƒ \}}}| jtjO  _| d¡ | d¡ t|dJ}|jt ¡ |d,}|  t	¡ | 
t|jf¡ W d Q R X W d Q R X W d Q R X |  d|jd ¡ d S )NZAES128ÚAES256)rq   )r  zno shared cipherr   )r|   r€  r   r…   rm   r  rn   rŽ   rž   rï   r   r  rg  r€   rH  )rŠ   rz   r{   ry   rf  r   r   r   r   Útest_no_shared_ciphersJ  s    



.z$ThreadedTests.test_no_shared_ciphersc          
   C   sè   t  t j¡}d|_t j|_ttt jdd´}| 	t
 
¡ ¡|}|  | ¡ d¡ |  |jd¡ | t|jf¡ tr†t jr†|  | ¡ d¡ n,t jdkr¢|  | ¡ d¡ n|  | ¡ d¡ W dQ R X |  |jd¡ |  | ¡ d¡ W dQ R X dS )zt
        Basic tests for SSLSocket.version().
        More tests are done in the test_protocol_*() methods.
        F)rp   rI  NzTLSv1.3)r   r   rB  zTLSv1.2)r	   zTLSv1.2)r   rD   rw   ri   rh   rj   r  rµ   rE   rn   rŽ   r“   r$   r  r   r  rg  ÚIS_OPENSSL_1_1_1ÚHAS_TLSv1_3rˆ   r?   r€   )rŠ   rq   rf  r   r   r   r   Útest_version_basicX  s"    


z ThreadedTests.test_version_basicz%test requires TLSv1.3 enabled OpenSSLc          
   C   s    t  t j¡}| t¡ | jt jt jB t jB O  _t	|dZ}| 
t ¡ ¡@}| t|jf¡ |  | ¡ d dddh¡ |  | ¡ d¡ W d Q R X W d Q R X d S )N)rq   r   ZTLS_AES_256_GCM_SHA384ZTLS_CHACHA20_POLY1305_SHA256ZTLS_AES_128_GCM_SHA256zTLSv1.3)r   rD   r‰   rl   rµ   r€  r„   r†   r‡   r  rn   rŽ   r   r  rg  r€   r)  rˆ   r$   )rŠ   rq   rf  r   r   r   r   Útest_tls1_3p  s    
zThreadedTests.test_tls1_3r‡  zrequired OpenSSL 1.1.0gc             C   sŠ  t ƒ \}}}tjj|_tjj|_tjj|_tjj|_t|dD}|jt	 	¡ |d&}| 
t|jf¡ |  | ¡ d¡ W d Q R X W d Q R X tjj|_tjj|_t|dD}|jt	 	¡ |d&}| 
t|jf¡ |  | ¡ d¡ W d Q R X W d Q R X tjj|_tjj|_tjj|_tjj|_t|d^}|jt	 	¡ |d@}|  tj¡}| 
t|jf¡ W d Q R X |  dt|jƒ¡ W d Q R X W d Q R X d S )N)rq   )r  zTLSv1.2zTLSv1.1Zalert)r|   r   rˆ  r	   r‡  r‰  rŠ  r  rn   rŽ   r   r  rg  rˆ   r$   r   rž   rW   r€   r’   r  )rŠ   rz   r{   ry   rf  r   rè  r   r   r   rŒ  ‚  s6    





$



$





z"ThreadedTests.test_min_max_versionzrequires SSLv3 supportc          
   C   s‚   t ƒ \}}}tjj|_tjj|_tjj|_t|dD}|jt ¡ |d&}| 	t
|jf¡ |  | ¡ d¡ W d Q R X W d Q R X d S )N)rq   )r  r   )r|   r   rˆ  r   r‡  rŠ  r  rn   rŽ   r   r  rg  rˆ   r$   )rŠ   rz   r{   ry   rf  r   r   r   r   Útest_min_max_version_sslv3ª  s    




z(ThreadedTests.test_min_max_version_sslv3z"test requires ECDH-enabled OpenSSLc          
   C   s’   t  t j¡}| t¡ | jt jO  _t jdk r:| d¡ t	|dD}| 
t ¡ ¡*}| t|jf¡ |  d| ¡ d ¡ W d Q R X W d Q R X d S )N)r   r   r   zECCdraft:ECDH)rq   ZECDHr   )r   rD   r‰   rl   rµ   r€  r…   r?   rm   r  rn   rŽ   r   r  rg  r€   r)  )rŠ   rq   rf  r   r   r   r   Útest_default_ecdh_curve¸  s    


z%ThreadedTests.test_default_ecdh_curvez
tls-uniquez*'tls-unique' channel binding not availablec       	   
   C   sº  t jrtj d¡ tƒ \}}}t|ddd}|~ |jt ¡ |dœ}| 	t
|jf¡ | d¡}t jrztj d |¡¡ |  |¡ | ¡ dkr¢|  t|ƒd	¡ n|  t|ƒd
¡ | d¡ | ¡  ¡ }|  |t|ƒ d¡¡ W dQ R X |jt ¡ |d¬}| 	t
|jf¡ | d¡}t jr0tj d |¡¡ |  ||¡ |  |¡ | ¡ dkrf|  t|ƒd	¡ n|  t|ƒd
¡ | d¡ | ¡  ¡ }|  |t|ƒ d¡¡ W dQ R X W dQ R X dS )z Test tls-unique channel binding.r²   TF)rq   rI  rO  )r  z
tls-uniquez! got channel binding data: {0!r}
zTLSv1.3é0   é   s   CB tls-unique
zus-asciiNz(got another channel binding data: {0!r}
)r   r3   r1   r4   r5   r|   r  rn   rŽ   r   r  rg  r!  rß   r*  r$   rˆ   r   r¬   rN  r&  r  r­   )	rŠ   rz   r{   ry   rf  r   Zcb_dataZpeer_data_reprZnew_cb_datar   r   r   r%  Ì  sR    







z-ThreadedTests.test_tls_unique_channel_bindingc             C   sT   t ƒ \}}}t||dd|d}tjr:tj d |d ¡¡ |  |d d ddh¡ d S )NT)rI  rO  r{  z got compression: {!r}
rq  ZZLIBZRLE)	r|   r~  r   r3   r1   r4   r5   rß   r€   )rŠ   rz   r{   ry   r×  r   r   r   Útest_compression  s    zThreadedTests.test_compressionr)   z*ssl.OP_NO_COMPRESSION needed for this testc             C   sR   t ƒ \}}}| jtjO  _| jtjO  _t||dd|d}|  |d d ¡ d S )NT)rI  rO  r{  rq  )r|   r€  r   r)   r~  r“   )rŠ   rz   r{   ry   r×  r   r   r   Útest_compression_disabled  s    z'ThreadedTests.test_compression_disabledc             C   s–   t ƒ \}}}| jtjO  _| t¡ | d¡ | jtjO  _t||dd|d}|d d }| d¡}d|kr’d|kr’d	|kr’|  	d
|d  ¡ d S )NZkEDHT)rI  rO  r{  r)  r   r‹  ZADHZEDHZDHEzNon-DH cipher: )
r|   r€  r   r…   r¹  rº  rm   r~  r  r¤   )rŠ   rz   r{   ry   r×  r)  Úpartsr   r   r   Útest_dh_params  s    


zThreadedTests.test_dh_paramszneeds secp384r1 curve supportz TODO: Test doesn't work on 1.1.1c             C   s  t ƒ \}}}| d¡ | d¡ | jtjtjB O  _t||dd|d}t ƒ \}}}| d¡ | d¡ | jtjtjB O  _t||dd|d}t ƒ \}}}| d¡ | d¡ | d¡ | jtjtjB O  _yt||dd|d}W n tjk
rü   Y nX t	r|  
d¡ d S )NrB   zECDHE:!eNULL:!aNULLT)rI  rO  r{  rÄ  zmismatch curve did not fail)r|   rF   rm   r€  r   r„   r†   r~  rW   ÚIS_OPENSSL_1_1_0r¤   )rŠ   rz   r{   ry   r×  r   r   r   Útest_ecdh_curve,  s6    






zThreadedTests.test_ecdh_curvec             C   s2   t ƒ \}}}t||dd|d}|  |d d ¡ d S )NT)rI  rO  r{  rs  )r|   r~  r“   )rŠ   rz   r{   ry   r×  r   r   r   Útest_selected_alpn_protocolS  s
    z)ThreadedTests.test_selected_alpn_protocolzALPN support requiredc             C   s@   t ƒ \}}}| ddg¡ t||dd|d}|  |d d ¡ d S )Nrš   ÚbarT)rI  rO  r{  rs  )r|   rW  r~  r“   )rŠ   rz   r{   ry   r×  r   r   r   Ú/test_selected_alpn_protocol_if_server_uses_alpn[  s    z=ThreadedTests.test_selected_alpn_protocol_if_server_uses_alpnz!ALPN support needed for this testc             C   s>  dddg}ddgdfddgdfdgdfddgd fg}x|D ]ú\}}t ƒ \}}}| |¡ | |¡ yt||dd|d}W n( tjk
r¢ }	 z|	}W d d }	~	X Y nX |d krÊtrÊtjdk rÊ|  |tj¡ q<d	t|ƒt|ƒt|ƒf }
|d
 }|  	|||
|df ¡ t
|d ƒr|d d nd}|  	|||
|df ¡ q<W d S )Nrš   rÕ  Z	milkshakezhttp/3.0zhttp/4.0T)rI  rO  r{  )r   r   r   r(  zKfailed trying %s (s) and %s (c).
was expecting %s, but got %%s from the %%srs  r  rv  rE  Únothingrf  )r|   rW  r~  r   rW   rÒ  r?   rØ   r’   rˆ   r   )rŠ   Úserver_protocolsÚprotocol_testsÚclient_protocolsrL  rz   r{   ry   r×  rè  rQ  Úclient_resultÚserver_resultr   r   r   Útest_alpn_protocolse  s:    





z!ThreadedTests.test_alpn_protocolsc             C   s2   t ƒ \}}}t||dd|d}|  |d d ¡ d S )NT)rI  rO  r{  rt  )r|   r~  r“   )rŠ   rz   r{   ry   r×  r   r   r   Útest_selected_npn_protocol  s
    z(ThreadedTests.test_selected_npn_protocolz NPN support needed for this testc             C   sæ   ddg}ddgdfddgdfddgdfddgdfg}x¬|D ]¤\}}t ƒ \}}}| |¡ | |¡ t||dd|d}dt|ƒt|ƒt|ƒf }	|d	 }
|  |
||	|
d
f ¡ t|d ƒrÄ|d d nd}|  |||	|df ¡ q:W d S )Nzhttp/1.1zspdy/2r6  ÚabcÚdefT)rI  rO  r{  zKfailed trying %s (s) and %s (c).
was expecting %s, but got %%s from the %%srt  r  rw  rE  r×  rf  )r|   rV  r~  r’   rˆ   r   )rŠ   rØ  rÙ  rÚ  rL  rz   r{   ry   r×  rQ  rÛ  rÜ  r   r   r   Útest_npn_protocols•  s&    




z ThreadedTests.test_npn_protocolsc             C   sL   t  t j¡}| t¡ t  t j¡}| t¡ t  t j¡}| t¡ |||fS )N)	r   rD   rE   rl   rs   ru   rw   rk   rx   )rŠ   r{   Úother_contextrz   r   r   r   Úsni_contexts¯  s    


zThreadedTests.sni_contextsc             C   s"   |d }|   d|ff|d ¡ d S )Nrr  r   r"   )r€   )rŠ   r×  r   r  r   r   r   Úcheck_common_name¸  s    zThreadedTests.check_common_namec                sÊ   g ‰ |   ¡ \}‰}d|_‡ ‡fdd„}| |¡ t||ddd}|  ˆ d|fg¡ |  |d¡ g ‰ t||dd d}|  ˆ d |fg¡ |  |t¡ g ‰ | d ¡ t||ddd}|  |t¡ |  ˆ g ¡ d S )	NFc                s    ˆ   ||f¡ |d k	rˆ| _d S )N)rA  rq   )rš  Úserver_nameÚinitial_context)Úcallsrâ  r   r   Úservername_cbÃ  s    z6ThreadedTests.test_sni_callback.<locals>.servername_cbTÚsupermessage)rI  r{  r(   Znotfunny)rã  ri   rÈ  r~  rˆ   rä  rt   )rŠ   r{   rz   rè  r×  r   )rç  râ  r   rÉ  ¼  s.    

zThreadedTests.test_sni_callbackc          	   C   s\   |   ¡ \}}}dd„ }| |¡ |  tj¡}t||ddd}W d Q R X |  |jjd¡ d S )Nc             S   s   t jS )N)r   ZALERT_DESCRIPTION_ACCESS_DENIED)rš  rå  ræ  r   r   r   Úcb_returning_alertê  s    zAThreadedTests.test_sni_callback_alert.<locals>.cb_returning_alertFré  )rI  r{  ZTLSV1_ALERT_ACCESS_DENIED)	rã  rÈ  rž   r   rW   r~  rˆ   r  rê  )rŠ   r{   râ  rz   rê  r  r×  r   r   r   Útest_sni_callback_alertå  s    
z%ThreadedTests.test_sni_callback_alertc          
   C   s€   |   ¡ \}}}dd„ }| |¡ |  tj¡*}t ¡ }t||ddd}W d Q R X W d Q R X |  |j	j
d¡ |  d| ¡ ¡ d S )Nc             S   s   dd  d S )Nr   r   r   )rš  rå  ræ  r   r   r   Ú
cb_raisingø  s    z;ThreadedTests.test_sni_callback_raising.<locals>.cb_raisingFré  )rI  r{  ZSSLV3_ALERT_HANDSHAKE_FAILUREÚZeroDivisionError)rã  rÈ  rž   r   rW   r   Úcaptured_stderrr~  rˆ   r  rê  r€   Úgetvalue)rŠ   r{   râ  rz   rì  r  Ústderrr×  r   r   r   Útest_sni_callback_raisingó  s    

z'ThreadedTests.test_sni_callback_raisingc          
   C   s€   |   ¡ \}}}dd„ }| |¡ |  tj¡*}t ¡ }t||ddd}W d Q R X W d Q R X |  |j	j
d¡ |  d| ¡ ¡ d S )Nc             S   s   dS )Nrš   r   )rš  rå  ræ  r   r   r   Úcb_wrong_return_type
  s    zOThreadedTests.test_sni_callback_wrong_return_type.<locals>.cb_wrong_return_typeFré  )rI  r{  ZTLSV1_ALERT_INTERNAL_ERRORr   )rã  rÈ  rž   r   rW   r   rî  r~  rˆ   r  rê  r€   rï  )rŠ   r{   râ  rz   rò  r  rð  r×  r   r   r   Ú#test_sni_callback_wrong_return_type  s    

z1ThreadedTests.test_sni_callback_wrong_return_typec       	         sŽ   t ƒ \}}}| d¡ | d¡ ddddg}t|||d}|d d }|  t|ƒd¡ x2|D ]*\‰ }}t‡ fd	d
„|D ƒƒs\|  ˆ ¡ q\W d S )NzAES128:AES256rÄ  zAES-256ZTLS_CHACHA20ZTLS_AES)r{  rx  r   c             3   s   | ]}|ˆ kV  qd S )Nr   )rz  Zalg)r   r   r   r|  %  s    z4ThreadedTests.test_shared_ciphers.<locals>.<genexpr>)r|   rm   r~  ÚassertGreaterr   Úanyr¤   )	rŠ   rz   r{   ry   Zexpected_algsr×  re   Ztls_versionÚbitsr   )r   r   Útest_shared_ciphers  s    

z!ThreadedTests.test_shared_ciphersc          	   C   sv   t ƒ \}}}t|dd}|P |jt ¡ |d}| t|jf¡ | ¡  |  t	|j
d¡ |  t	|jd¡ W d Q R X d S )NF)rq   rI  )r  i   s   hello)r|   r  rn   rŽ   r   r  rg  r§   rž   rG   r¬   r5   )rŠ   rz   r{   ry   rf  r   r   r   r   Ú,test_read_write_after_close_raises_valuerror(  s    
z:ThreadedTests.test_read_write_after_close_raises_valuerrorc             C   sÜ   d}t tjdƒ}| |¡ W d Q R X |  tjtj¡ t tj¡}tj	|_
| t¡ | t¡ t|dd}|d | t ¡ ¡J}| t|jf¡ t tjdƒ"}| |¡ |  | d¡|¡ W d Q R X W d Q R X W d Q R X d S )Ns   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxÚwbF)rq   rI  r©  i   )rÌ   r   ZTESTFNr5   rª   Úunlinkr   rD   r‰   r   rj   rk   rx   rl   rs   r  rn   rŽ   r   r  rg  Úsendfilerˆ   rð   )rŠ   Z	TEST_DATAr^   rq   rf  r   Úfiler   r   r   Útest_sendfile5  s    


zThreadedTests.test_sendfilec       
      C   s@  t ƒ \}}}| jtjO  _t|||d}|d }|  |j¡ |  |jd¡ |  |j	d¡ |  |j
¡ tjdkr~|  |jd¡ |  |d ¡ | ¡ }|  |d d¡ |  |d d¡ t||||d	}| ¡ }|  |d d
¡ |  |d d¡ |  |d ¡ |d }|  |j|j¡ |  ||¡ |  ||¡ |  |j|j¡ |  |j	|j	¡ t|||d}|  |d ¡ |d }|  |j|j¡ |  ||¡ | ¡ }|  |d d¡ |  |d d¡ t||||d	}|  |d ¡ |d }	|  |	j|j¡ |  |	|¡ |  |	j|j¡ |  |	j	|j	¡ | ¡ }|  |d d¡ |  |d d
¡ d S )N)r{  ro  r   )r   r   r   ru  r¾  r   r¿  )ro  r{  rB  r   rM   )r|   r€  r   r…   r~  rÞ   Úidrô  rJ   rý   Z
has_ticketr?   Zticket_lifetime_hintrƒ  rÁ  rˆ   ZassertIsNotrÛ   r­   )
rŠ   rz   r{   ry   r×  ro  Z	sess_statZsession2Zsession3Zsession4r   r   r   Útest_sessionF  s^    


zThreadedTests.test_sessionc       
      C   sü  t ƒ \}}}t ƒ \}}}| jtjO  _| jtjO  _t|dd}|¨ |jt ¡ |dp}|  |jd ¡ |  |j	d ¡ | 
t|jf¡ |j}|  |¡ |  t¡}	t|_W d Q R X |  t|	jƒd¡ W d Q R X |jt ¡ |dD}| 
t|jf¡ |  t¡}	||_W d Q R X |  t|	jƒd¡ W d Q R X |jt ¡ |dJ}||_| 
t|jf¡ |  |jj|j¡ |  |j|¡ |  |j	d¡ W d Q R X |jt ¡ |dD}|  t¡}	||_| 
t|jf¡ W d Q R X |  t|	jƒd¡ W d Q R X W d Q R X d S )NF)rq   rI  )r  zValue is not a SSLSession.z#Cannot set session after handshake.Tz)Session refers to a different SSLContext.)r|   r€  r   r…   r  rn   rŽ   rˆ   ro  ru  r   r  rg  rÞ   rž   r   r¶  r’   r  rG   rþ  )
rŠ   rz   r{   ry   Zclient_context2r°   rf  r   ro  rè  r   r   r   Útest_session_handling€  sJ    








z#ThreadedTests.test_session_handlingN)Jrk  rl  rm  rb   r‡  rˆ  rZ   rn  rA   rŠ  rÝ  r‘  r’  r”  r•  r   rÇ  r–  r  rž  r_   r   r¡  r¢  r£  r¤  r¦  r¨  r¬  r­  r´  rµ  r·  r¼  rÀ  rÂ  rÃ  rÅ  rÈ  rÉ  rD   rŒ  Z	HAS_SSLv3rÊ  rC   rË  ro  r%  rÎ  rÏ  rÑ  ÚHAVE_SECP_CURVESrå  rÆ  rÓ  rÔ  ZHAS_ALPNrÖ  rÝ  rÞ  ZHAS_NPNrá  rã  rä  ræ  rÉ  rë  rñ  ró  r÷  rø  rý  rÿ  r   r   r   r   r   r…  œ
  sŽ   0$)!8%)(9 
1)';	

&
(	):r…  zTest needs TLS 1.3c               @   sT   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚTestPostHandshakeAuthc             C   sÄ   t jt jt jg}x®|D ]¦}t  |¡}|  |jd¡ d|_|  |jd¡ t j|_|  |jt j¡ |  |jd¡ d|_|  |jt j¡ |  |jd¡ t j	|_d|_|  |jt j	¡ |  |jd¡ qW d S )NFT)
r   r‰   rE   rw   rD   rˆ   Úpost_handshake_authr   rj   r~   )rŠ   Z	protocolsr”   rH   r   r   r   Útest_pha_setterµ  s     

z%TestPostHandshakeAuth.test_pha_setterc          
   C   s  t ƒ \}}}d|_tj|_d|_| t¡ t|dd}|Ê |jt	 	¡ |d¬}| 
t|jf¡ | d¡ |  | d¡d¡ | d¡ |  | d¡d	¡ | d¡ |  | d¡d
¡ | d¡ |  | d¡d	¡ | d¡ | d¡ d¡}|  d|¡ W d Q R X W d Q R X d S )NTF)rq   rI  )r  s   HASCERTi   s   FALSE
s   PHAs   OK
s   TRUE
s   GETCERTi   zus-asciizPython Software Foundation CA)r|   r  r   r   rj   rl   rs   r  rn   rŽ   r   r  rg  r5   rˆ   rð   r  r€   )rŠ   rz   r{   ry   rf  r   Z	cert_textr   r   r   Útest_pha_requiredÍ  s*    







z'TestPostHandshakeAuth.test_pha_requiredc             C   s¸   t ƒ \}}}d|_tj|_d|_t|dd}|~ |jt ¡ |d`}| t	|j
f¡ | d¡ |  | d¡d¡ | d¡ |  tjd	¡ | d¡ W d Q R X W d Q R X W d Q R X d S )
NTF)rq   rI  )r  s   PHAi   s   OK
s   HASCERTz!tlsv13 alert certificate required)r|   r  r   r   rj   r  rn   rŽ   r   r  rg  r5   rˆ   rð   rŒ   rW   )rŠ   rz   r{   ry   rf  r   r   r   r   Útest_pha_required_nocertæ  s     



z.TestPostHandshakeAuth.test_pha_required_nocertc          
   C   sæ   t jrtj d¡ tƒ \}}}d|_tj|_	d|_| 
t¡ tj|_	t|dd}|ˆ |jt ¡ |dj}| t|jf¡ | d¡ |  | d¡d¡ | d	¡ |  | d¡d
¡ | d¡ |  | d¡d¡ W d Q R X W d Q R X d S )Nr²   TF)rq   rI  )r  s   HASCERTi   s   FALSE
s   PHAs   OK
s   TRUE
)r   r3   r1   r4   r5   r|   r  r   r   rj   rl   rs   r~   r  rn   rŽ   r   r  rg  rˆ   rð   )rŠ   rz   r{   ry   rf  r   r   r   r   Útest_pha_optionalü  s&    





z'TestPostHandshakeAuth.test_pha_optionalc          
   C   sÔ   t jrtj d¡ tƒ \}}}d|_tj|_	d|_t
|dd}|ˆ |jt ¡ |dj}| t|jf¡ | d¡ |  | d¡d¡ | d	¡ |  | d¡d
¡ | d¡ |  | d¡d¡ W d Q R X W d Q R X d S )Nr²   TF)rq   rI  )r  s   HASCERTi   s   FALSE
s   PHAs   OK
)r   r3   r1   r4   r5   r|   r  r   r~   rj   r  rn   rŽ   r   r  rg  rˆ   rð   )rŠ   rz   r{   ry   rf  r   r   r   r   Útest_pha_optional_nocert  s"    




z.TestPostHandshakeAuth.test_pha_optional_nocertc             C   s°   t ƒ \}}}d|_tj|_| t¡ t|dd}|r |jt	 	¡ |dT}| 
t|jf¡ |  tjd¡ | ¡  W d Q R X | d¡ |  d| d¡¡ W d Q R X W d Q R X d S )	NTF)rq   rI  )r  z
not servers   PHAs   extension not receivedi   )r|   r  r   r   rj   rl   rs   r  rn   rŽ   r   r  rg  rŒ   rW   rP  r5   r€   rð   )rŠ   rz   r{   ry   rf  r   r   r   r   Útest_pha_no_pha_client*  s    



z,TestPostHandshakeAuth.test_pha_no_pha_clientc          
   C   sÆ   t ƒ \}}}tj|_d|_| t¡ t|dd}|ˆ |jt	 	¡ |dj}| 
t|jf¡ | d¡ |  | d¡d¡ | d¡ |  | d¡d	¡ | d¡ |  | d¡d¡ W d Q R X W d Q R X d S )
NTF)rq   rI  )r  s   HASCERTi   s   TRUE
s   PHAs   OK
)r|   r   r   rj   r  rl   rs   r  rn   rŽ   r   r  rg  r5   rˆ   rð   )rŠ   rz   r{   ry   rf  r   r   r   r   Útest_pha_no_pha_server:  s    





z,TestPostHandshakeAuth.test_pha_no_pha_serverc          
   C   s˜   t ƒ \}}}tj|_tjj|_d|_| t	¡ t
|dd}|P |jt ¡ |d2}| t|jf¡ | d¡ |  d| d¡¡ W d Q R X W d Q R X d S )NTF)rq   rI  )r  s   PHAs   WRONG_SSL_VERSIONi   )r|   r   r   rj   rˆ  r‰  rŠ  r  rl   rs   r  rn   rŽ   r   r  rg  r5   r€   rð   )rŠ   rz   r{   ry   rf  r   r   r   r   Útest_pha_not_tls13N  s    




z(TestPostHandshakeAuth.test_pha_not_tls13c          
   C   s  t }t tj¡}d|_| t¡ d|_tj|_	t tj
¡}| t¡ | t¡ d|_tj|_	t|dd}|˜ |jt ¡ |dz}| t|jf¡ | d¡ |  | d¡d¡ | d¡ |  | d¡d	¡ | d¡ |  | d¡d
¡ |  | ¡ i ¡ W d Q R X W d Q R X d S )NTF)rq   rI  )r  s   HASCERTi   s   FALSE
s   PHAs   OK
s   TRUE
)rt   r   rD   rw   r  rl   rs   ri   rh   rj   rE   rk   rx   r   r  rn   rŽ   r   r  rg  r5   rˆ   rð   r	  )rŠ   ry   rz   r{   rf  r   r   r   r   Útest_bpo37428_pha_cert_none_  s.    







z1TestPostHandshakeAuth.test_bpo37428_pha_cert_noneN)rk  rl  rm  r  r  r  r  r  r	  r
  r  r  r   r   r   r   r  ³  s   r  c       	      C   s~  t jrèdd l}tjtjtjdœ}| ¡ V | ddt	¡ x@| 
¡ D ](\}}|ƒ }|rB|d rBd||f }P qBW tt ¡ ƒ}W d Q R X tdtjtjf ƒ td| ƒ tdtj ƒ td	tj ƒ ytd
tj ƒ W n tk
ræ   Y nX xBttttttttttttgD ]"}t j! "|¡st  #d| ¡‚qW t$t%t&t't(t)t*t+g}t  ,d¡rV| -t.¡ t  /¡ }zt j0|Ž  W d t j1|Ž  X d S )Nr   )ZLinuxZMacZWindowsÚignorez?dist\(\) and linux_distribution\(\) functions are deprecated .*z%s %rztest_ssl: testing with %r %rz          under %sz          HAS_SNI = %rz          OP_ALL = 0x%8xz          OP_NO_TLSv1_1 = 0x%8xzCan't read certificate file %rZnetwork)2r   r3   ÚwarningsrX   rY   Zmac_verZ	win32_verÚcatch_warningsÚfilterwarningsÚDeprecationWarningÚitemsr&  Úprintr   r×   r?   r   r  r†   r…  rµ   r«  r¤  r¥  r¦  r§  rs   ru   rx   r¢  ÚBADKEYr£  r   r   ÚexistsZ
TestFailedrp  r}   rç  rò  rÿ  r  r…  r  Zis_resource_enabledrA  r0  Zthreading_setupZrun_unittestZthreading_cleanup)	r3   r  Zplatsr   r]   ZplatÚfilenameZtestsÚthread_infor   r   r   Ú	test_main  sR    


r  Ú__main__)N)rn  TFNN)Nr   r   )F){r1   rZ   r6  r   rŽ   r  rJ   rP   rË  r   r  r¹   Zurllib.requestrª  r<  r/   ra  rç   rX   r`   Z	sysconfigr²  ÚImportErrorÚimport_moduler   Úsortedr†  rr  r  r×   rÏ   rÝ   r?   rÒ  rÆ  Zget_config_varr   r  r•   ZverrŽ  rˆ  r…  r   rµ   Úfsencoder«  r¤  r¥  r¦  r§  r¨  r©  r–  r,  r¬  r´  rÍ   r¶   r‰  rs   rt   r·   ru   rv   r  rŽ  rx   rÉ   r“  r2  r£  r¢  r  r  r¸   rÆ   r¾   rº  r»  r)   r*   r+   r,   r-   r7   r=   r@   rA   rI   r  rK   rT   rb   rn  r   ræ  r‰   rh   rr   r|   ZTestCaser}   rp  rç  rò  rÿ  r  r0  r  r  Ztest.ssl_serversr8  r=  r  r`  r~  r„  r…  rÇ  r  r  rk  r   r   r   r   Ú<module>   s<  













           8?0  B
  v  
1
F            #
 L
7
