B
    18™\òó ã               @   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   úQ/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/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   )ÚtimeÚdaylightÚ	localtimeÚtm_isdstÚaltzoneÚtimezoner   r   r   r   Ú
utc_offset±   s    rP   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<   ÚdatetimeÚstrptimeÚreplaceÚstrftime)Ú	cert_timeÚfmtÚdtr   r   r   Úasn1time·   s    

r\   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;   )Údebianzsqueeze/sidÚ z'Patched Ubuntu OpenSSL breaks behaviour)	r   rD   r]   ÚSSLErrorr?   ÚplatformÚlinux_distributionÚunittestÚSkipTest)ÚargsÚkwargs)Úfuncr   r   ÚfÈ   s    
z$skip_if_broken_ubuntu_ssl.<locals>.f)Úhasattrr   Ú	functoolsÚwraps)rg   rh   r   )rg   r   Úskip_if_broken_ubuntu_sslÆ   s    
	rl   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_versionrm   rn   ro   rp   rq   rf   Úcontextr   r   r   Útest_wrap_socketØ   s    



r|   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_CLIENTru   Ú
SIGNING_CArE   rv   )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   rr   Ú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ÚassertRaisesr`   rG   ri   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_INFOr}   Ú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”   rh   Ú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Ú
assertLessÚassertLessEqualÚIS_LIBRESSLÚ
assertTruerÙ   ÚformatÚhex)	r”   ÚnÚtrš   ÚmajorÚminorZfixÚ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 )Nr_   )	r˜   ÚAF_INETr|   ÚweakrefÚrefr   Ú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ò   r|   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ò   Ú
settimeoutr|   r’   Ú
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)rq   z5certfile must be specified for server-side operationsT)Úserver_sider_   )r  rp   z!can't connect in server-side modei  )rp   )rp   rq   )r˜   r–   rG   r   rx   r¿   ÚconnectÚHOSTr¨   rü   ÚNONEXISTINGCERTr’   Ú	exceptionÚerrnoÚENOENT)r”   ry   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)rp   N)r   r   r   r   r   Úcurdirr˜   r´   r±   r¨   r   r`   r|   )r”   rp   ry   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=ƒ ttd>ƒrÚdd?d9œ}||d@ƒ ||dAƒ ||dBƒ ||d=ƒ d2dCd4œ}||d5ƒ dDdEdFd-œ}||d5ƒ dDdCdFd-œ}||dGƒ ˆ  ttjd d¡ ˆ  ttji d¡ ddHi}ˆ  tj	dI¡ t |dJ¡ W d Q R X ddKi}ˆ  tj	dL¡ t |dM¡ W d Q R X ddNi}ˆ  tj	dO¡ t |dP¡ W d Q R X ddQi}ˆ  tj	dR¡ t |dS¡ W d Q R X ddTi}ˆ  tj	dU¡ t |dV¡ W d Q R X x.dWD ]&}ˆ  t¡ t 
|¡ W d Q R X q*W xdXD ]}ˆ  t 
|¡¡ qZW ttd>ƒr xdYD ]}ˆ  t 
|¡¡ q†W d S )ZNc             S   s   t  | |¡ d S )N)r   Úmatch_hostname)Úcertrƒ   r   r   r   ÚokJ  s    z0BasicSocketTests.test_match_hostname.<locals>.okc                s   ˆ   tjtj| |¡ d S )N)r¨   r   ÚCertificateErrorr  )r  rƒ   )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)r"   r#   z10.11.12.13z14.15.16.17z14.15.16.18zexample.netÚ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::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)Ú1r_   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Údecoderi   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   rx   )r”   rH   ry   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  Úgetsocknamer|   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  rp   )r˜   rò   r|   ÚassertIsNoner0  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   )r|   r˜   rò   ÚreprÚassertWarnsrö   r   Ú
gc_collectrŠ   rœ   Úwarningre   )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_paths/  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ÚROOTr_   )rD  rE  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_certificates;  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 )NrD  r_   é   r   r   rF  rG  )ré   r   Z	enum_crlsr¨   r—   rH  râ   rJ  rä   r’   r§   rK  rŠ   )r”   ZcrlsrP  r   r   r   Útest_enum_crlsT  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)é   rR  zTLS Web Server Authenticationz1.3.6.1.5.5.7.3.1z1.3.6.1.5.5.7.3.1rV  rR  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_asn1objectc  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.1rV  rR  z1.3.6.1.5.5.7.3.2é‚   Z
clientAuth)
r   rX  râ   ÚPurposeÚSERVER_AUTHr’   rY  rZ  r[  ÚCLIENT_AUTH)r”   r_  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)rm   z!only stream sockets are supported)r˜   rò   Ú
SOCK_DGRAMr´   r±   r¨   r  r|   r   rr   r’   rœ   r  rD   r   rx   )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”   Ú
timestringÚ	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   rj  )r”   rk  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)rm  )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)rY   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)rm  r’   r   rj  rn  )r”   rk  ÚtsZ
newyear_tsr   r   r   Útest_cert_time_to_secondsµ  s*    







z*BasicSocketTests.test_cert_time_to_secondsÚLC_ALLr_   c             C   s@   dd„ }|ƒ   ¡ dkr |  d¡ |  dd¡ |  |ƒ d ¡ d S )Nc               S   s   t  dd¡S )Nz%b)	r   rT  r   rR   rT   r:  r   r   r   )rJ   rX   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ÚskipTestrm  rn  )r”   rs  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)rm   )r˜   rò   r´   r±   r   Ú	bind_portr|   r   r‰   Ú
connect_exr  r  ÚECONNREFUSEDÚEHOSTUNREACHÚ	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¬   rc   Ú
skipUnlessr   r   r»   ÚmaxDiffrÆ   rÉ   rÑ   rÔ   rÞ   rñ   r   Úcpython_onlyrù   r  r  r  r  r  r  r  r)  r+  r2  r   ÚCHANNEL_BINDING_TYPESr4  r9  rB  r1   ra   rS  rU  rb  rg  ri  rm  rn  rP   ro  rq  Úrun_with_localerv  r  r   r   r   r   r‡      sP    	
 @'#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 )NrW  é*   )Ú	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)rŒ  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   r   rw   r–   r`   )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SRPÚMD5ZRC4Z3DES)r   rD   r   Úget_ciphersÚassertNotIn)r”   rH   ro   Úsuiter   r   r   r   Útest_python_ciphers  s    
z ContextTests.test_python_ciphers)r   r   rT  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   r   rw   rI  r“  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   r   Ú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 )Nr‹  )r   rD   r“   r’   rt   rr   rˆ   r‰   r¨   r—   rG   rE   ÚassertFalsers   r   ré   )r”   rH   r   r   r   Útest_verify_mode_protocol;  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   r   ré   Zhostname_checks_common_nameZHAS_NEVER_CHECK_COMMON_NAMEr   r¨   ÚAttributeError)r”   rH   r   r   r   Ú test_hostname_checks_common_nameR  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 )Nr‹  )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_version`  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)rq   zPEM lib)rp   rq   zkey values mismatch)Ú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)r‚  rƒ  r„  r½  r¾  r   r   r   r   ÚGetPassCallable÷  s   r¿  zmust return a stringzgetpass error)r   rD   rE   rv   r¿   r¨   r—   rü   r  r’   r  r  r  r–   r`   Ú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   ru   r¿   ÚBYTES_CERTFILEr¨   r—   rü   r  r’   r  r  r  r–   r`   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   rT  r¼   ÚheadÚotherZagainÚtailó    zno start lineÚbrokenznot enough datas   broken)rÖ   r×   r¶   r   rØ   ÚCAFILE_NEURONIOrD   r   r’   Úcert_store_statsru   r   r¨   r—   Úobjectr–   r`   )r”   rh   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  r`   r¿   )r”   rH   r  r   r   r   Útest_load_dh_paramsZ  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   )Únumberr  Zconnect_goodZconnect_renegotiateÚacceptZaccept_goodZaccept_renegotiateÚhitsÚmissesZtimeoutsZ
cache_full)rŒ  r   rD   r’   Úsession_stats)r”   rŸ   rH   r   r   r   Útest_session_statsg  s    


zContextTests.test_session_statsc             C   s   t  t j¡}| ¡  d S )N)r   rD   r   Zset_default_verify_paths)r”   rH   r   r   r   Útest_set_default_verify_pathsy  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 )NrR   r_   c             S   s   d S )Nr   )ry   Ú
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   )ry   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   rT  )	r   rD   r   r’   rÔ  rv   r¿   ru   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   r   r’   Úget_ca_certsru   r¿   r×   r\   rÖ   r¶   rØ   )r”   rH   rh   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 )Nre  )	r   rD   r   Úload_default_certsrd  re  rf  r¨   r—   )r”   rH   r   r   r   Útest_load_default_certsÏ  s    z$ContextTests.test_load_default_certsrC  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   r   r   r=  r>  r¿   rô  r’   rÔ  )r”   rH   rA  r   r   r   Útest_load_default_certs_envÞ  s    
z(ContextTests.test_load_default_certs_envzWindows specificÚ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   r   rô  rÔ  r   r=  r>  r¿   r’   )r”   rH   ÚstatsrA  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“   rt   r‰   ré   rs   rú  rÖ   r‚   r¶   r>  rd  rf  rr   )r”   rH   rh   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)rm   rs   )Zpurpose)r   Z_create_stdlib_contextr’   rž   r“   rt   rr   r   rs   rú  r   r‰   ré   rd  rf  )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   rs   r’   rt   rr   ré   r‰   rˆ   r¨   rG   )r”   rH   r   r   r   Útest_check_hostname4  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   r   ré   rs   r’   rt   r‰   rE   r   rr   )r”   rH   r   r   r   Útest_context_client_server_  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)r‚  rƒ  r„  r   r   r   r   ÚMySSLSocketk  s   r   c               @   s   e Zd ZdS )z;ContextTests.test_context_custom_class.<locals>.MySSLObjectN)r‚  rƒ  r„  r   r   r   r   ÚMySSLObjectn  s   r  T)r  )r   r™   Ú	SSLObjectrD   rE   Zsslsocket_classZsslobject_classrx   r˜   râ   Úwrap_bioÚ	MemoryBIO)r”   r   r  rH   ry   ra  r   r   r   Útest_context_custom_classj  s    z&ContextTests.test_context_custom_classN)0r‚  rƒ  r„  rl   r  rŽ  r‘  rc   r…  r   r–  ÚskipIfr   r?   r›  rŸ  r¡  r£  ri   rD   r©  rA   r°  rÈ  rË  rÖ  rÜ  râ  rã  rC   rå  Ú	needs_sniré  rí  rð  ró  rõ  r1   ra   rè   rö  rù  rú  rü  rý  rþ  rÿ  r  r   r   r   r   rŠ  ø  sF   	
ES:
	+rŠ  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   r`   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   r   r¨   r`   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   r   rs   rr   rt   r˜   r-  r.  r  r/  Úsetblockingrx   r¨   ÚSSLWantReadErrorÚdo_handshakerœ   r  ré   rÙ   r’   r  ÚSSL_ERROR_WANT_READ)r”   rH   rš   r1  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 )Nr_   )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)r‚  rƒ  r„  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   bazrT  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   foorT  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   r\  r¶   )r”   r  r`  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)r‚  rƒ  r„  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  rT   )r†   r   r  r  r\  r  r  r  r5   r¶   r¨   Úunwrap)r”   Z
client_ctxZ
server_ctxrƒ   Zc_inZc_outZs_inZs_outÚclientr}  rº   r   r   r   Útest_unwrapø  s8    zSSLObjectTests.test_unwrapN)r‚  rƒ  r„  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)ÚThreadedEchoServerr}   r  r~  Úserver_addrÚ	__enter__r´   Ú__exit__)r”   r}  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)rm   )rm   rn   )r|   r˜   rò   r   rr   r  r&  r’   Úgetpeercertr   r  r‰   r‚   ré   )r”   rš   r   r   r   Útest_connect+  s    
z"SimpleBackgroundTests.test_connectc             C   s<   t t tj¡tjd}|  |j¡ |  tjd|j	| j
¡ d S )N)rm   zcertificate verify failed)r|   r˜   rò   r   r‰   r´   r±   r–   r`   r  r&  )r”   rš   r   r   r   Útest_connect_fail:  s
    

z'SimpleBackgroundTests.test_connect_failc             C   sJ   t t tj¡tjtd}|  |j¡ |  d| 	| j
¡¡ |  | ¡ ¡ d S )N)rm   rn   r   )r|   r˜   rò   r   r‰   r‚   r´   r±   r’   rx  r&  ré   r*  )r”   rš   r   r   r   Útest_connect_exD  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)rm   rn   r,  r   g      @)r|   r˜   rò   r   r‰   r‚   r´   r±   r  rx  r&  rŠ   r  ZEINPROGRESSr|  Úselectr  r  ÚSSLWantWriteErrorré   r*  )r”   rš   r  r   r   r   Útest_non_blocking_connect_exM  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 )NÚdummy)r*  )r   rD   r“   rx   r˜   rò   r  r&  r’   r*  r‰   rt   ru   r‚   ré   )r”   rH   rš   r  r   r   r   Útest_connect_with_contextg  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‰   rt   rx   r˜   rò   r´   r±   r–   r`   r  r&  )r”   rH   rš   r   r   r   Útest_connect_with_context_faily  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‰   rt   ru   r>  rx   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Ö   r‚   r¶   r   rØ   rD   r“   r‰   rt   ru   rx   r˜   rò   r  r&  r*  ré   )r”   rh   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   )r|   r˜   rò   r  r&  ÚfilenoÚmakefiler±   r   r¶   rë  rì  r¨   rü   r’   r  r  ÚEBADF)r”   r÷   Úfdrh   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)rm   r,  r   r   z9
Needed %d calls to do_handshake() to establish session.
)r˜   rò   r  r&  r  r|   r   rr   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&  r‚   )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 )Nr  )rm   ro   r  zNo cipher can be selectedz^$:,;?*'dorothyx)	r|   r˜   rò   r   rr   r  r&  r–   r`   )r”   rš   ry   r   r   r   r‘  à  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   r   ru   r>  r’   rñ  rx   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   r   ru   r>  r˜   rò   rx   r  r&  r   r{   Ú_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   Ú	monotonicr®   r   r`   r  r  ZSSL_ERROR_WANT_WRITEr¶   Úsendallrý   r5   r  r   r3   r1   r4   r‚  )r”   ry   ÚincomingÚoutgoingrg   re   rf   r  Ú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   r   ré   rs   r’   rt   r‰   ru   r‚   r  r~   r   rB  Úownerr3  Úcipherr$   ÚassertIsNotNoneÚshared_ciphersr¨   rG   r*  rˆ  r0  rM  r  r!  ZSSLSyscallErrorr`   r5   )r”   ry   rH  rI  rH   Ússlobjr   r   r   Útest_bio_handshake/  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“   rr   rt   r  rM  r  r5   r¶   r’   r!  )r”   ry   rH  rI  rH   rR  ÚreqrL  r   r   r   Útest_bio_read_write_dataQ  s    z.SimpleBackgroundTests.test_bio_read_write_dataN)r‚  rƒ  r„  Ú__doc__r)  r+  r,  r-  r0  r2  r3  r4  r5  rc   r  r   r   r:  r<  r>  r@  r‘  rA  r  rC  rM  rS  rU  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)rm   r,  gH¯¼šò×z>i»  r   z!REMOTE_HOST responded too quickly)r   Útransient_internetÚREMOTE_HOSTr|   r˜   rò   r   r‰   r´   r±   r	  rx  ru  rŠ   r  ÚEAGAINr|  )r”   rš   r  r   r   r   Útest_timeout_connect_exd  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   rX  r=  r?  )r”   r   r   r   Ú test_get_server_certificate_ipv6r  s    z/NetworkedTests.test_get_server_certificate_ipv6N)	r‚  rƒ  r„  r[  rc   r…  r   ÚIPV6_ENABLEDr\  r   r   r   r   rW  b  s   rW  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!)rn   z&
Verified certificate for %s:%s is
%s
)r   Úget_server_certificater®   r   r3   r1   r4   r5   )Útestr$  r~  r  rÛ   r   r   r   r=  y  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)rn   z%s
z$Got server certificate %s for %s:%s!)
r   r^  r¿   r`   r   r3   r1   r4   r5   r®   )r_  r$  r~  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)
r}  Úrunningry   Úaddrr  ÚsslconnÚ	threadingÚThreadÚ__init__Údaemon)r”   r}  Zconnsockrc  r   r   r   rg  ™  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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rv| j jrvt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 )%r}  r{   rx   ry   rd  Úselected_npn_protocolsÚappendÚselected_npn_protocolÚselected_alpn_protocolsÚselected_alpn_protocolÚConnectionResetErrorÚBrokenPipeErrorÚconn_errorsrœ   Úchattyr7   r5  rc  rb  r±   r   r`   rü   ÚstoprQ  rt   r‰   r*  r   r3   r1   r4   r5   rÃ   rÄ   r§   rO  )r”   r	  r  Zcert_binaryrO  r   r   r   Ú	wrap_conn£  sD    


z.ThreadedEchoServer.ConnectionHandler.wrap_connc             C   s    | j r| j  ¡ S | j d¡S d S )Ni   )rd  r¶   ry   rý   )r”   r   r   r   r¶   Ù  s    
z)ThreadedEchoServer.ConnectionHandler.readc             C   s"   | j r| j  |¡S | j |¡S d S )N)rd  r5   ry   r  )r”   rK  r   r   r   r5   ß  s    z*ThreadedEchoServer.ConnectionHandler.writec             C   s    | j r| j  ¡  n
| j ¡  d S )N)rd  r±   ry   )r”   r   r   r   r±   å  s    z*ThreadedEchoServer.ConnectionHandler.closec          
   C   sz  d| _ | jjs|  ¡ sd S xX| j rt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k
r2   | jjr tjr tj d | j¡¡ |  
¡  d| _ Y q t	k
rp   | jjrTt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Test server failure:
)rb  r}  Ústarttls_serverrs  r¶   Ústriprd  r!  ry   rü   r±   r   r3   Úconnectionchattyr1   r4   r5   r0  r5  r&  Úverify_client_post_handshaker   r`   r*  rt  rn  rq  rê   rc  r7   rr  )r”   ÚmsgÚstrippedr«   r	  r  Zctyper   r   r   Úrunë  s˜    




*






z(ThreadedEchoServer.ConnectionHandler.runN)
r‚  rƒ  r„  rV  rg  rs  r¶   r5   r±   r{  r   r   r   r   ÚConnectionHandler“  s   
6r|  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)r{   r   rD   rE   rr   rt   ru   rv   Úset_npn_protocolsÚset_alpn_protocolsrw   rq  rw  ru  r˜   ry   r   rw  r~  ÚflagÚactiveri  rl  rQ  rp  re  rf  rg  rh  )r”   Zcertificaterz   ÚcertreqsÚcacertsrq  rw  ru  Znpn_protocolsZalpn_protocolsro   r{   r   r   r   rg  G	  s<    


zThreadedEchoServer.__init__c             C   s   |   t ¡ ¡ | j ¡  | S )N)Ústartre  ÚEventr  Úwait)r”   r   r   r   r'  l	  s    
zThreadedEchoServer.__enter__c             G   s   |   ¡  |  ¡  d S )N)rr  r   )r”   re   r   r   r   r(  q	  s    zThreadedEchoServer.__exit__c             C   s   || _ tj | ¡ d S )N)r  re  rf  rƒ  )r”   r  r   r   r   rƒ  u	  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: )ry   r	  r.  r€  r  rI  rÞ  r   r3   rq  r1   r4   r5   r5  r|  rƒ  r   r˜   r  ÚKeyboardInterruptrr  r²   r±   )r”   ZnewconnZconnaddrÚhandlerr	  r   r   r   r{  y	  s.    


(zThreadedEchoServer.runc             C   s
   d| _ d S )NF)r€  )r”   r   r   r   rr  ”	  s    zThreadedEchoServer.stop)NNNNTFFNNNN)N)r‚  rƒ  r„  re  rf  r|  rg  r'  r(  rƒ  r{  rr  r   r   r   r   r%  ‘  s    5    
!
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  rp   r,  )r|   r˜   ÚasyncoreÚdispatcher_with_sendrg  Ú_ssl_acceptingÚ_do_ssl_handshake)r”   Úconnrp   r   r   r   rg  Ÿ	  s    
z8AsyncoreEchoServer.EchoServer.ConnectionHandler.__init__c             C   s.   t | jtjƒr*x| j ¡ dkr(|  ¡  qW dS )Nr   T)rM  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_closer`   rü   re   r  ZECONNABORTEDr‹  )r”   Úerrr   r   r   rŒ  ­	  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
)r‹  rŒ  rý   r   r3   r1   r4   r5   r5  r±   r  rt  )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   r  È	  s    z<AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_closec              C   s   ‚ d S )Nr   )r”   r   r   r   r7   Í	  s    z<AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_errorN)	r‚  rƒ  r„  rg  rŽ  rŒ  r‘  r  r7   r   r   r   r   r|  	  s   r|  c             C   s@   || _ t tjtj¡}t |d¡| _tj 	| |¡ |  
d¡ d S )Nr_   rT   )rp   r˜   rò   ÚSOCK_STREAMr   rw  r~  r‰  Ú
dispatcherrg  r.  )r”   rp   ry   r   r   r   rg  Ð	  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   r|  rp   )r”   Zsock_objrc  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)	r‚  rƒ  r„  r‰  rŠ  r|  rg  r”  r7   r   r   r   r   Ú
EchoServer›	  s   3r•  c             C   s8   d | _ d| _|  |¡| _| jj| _tj | ¡ d| _d S )NFT)	r  r€  r•  r}  r~  re  rf  rg  rh  )r”   rp   r   r   r   rg  ß	  s    
zAsyncoreEchoServer.__init__c             C   s   d| j j| jf S )Nz<%s %s>)Ú	__class__r‚  r}  )r”   r   r   r   Ú__str__ç	  s    zAsyncoreEchoServer.__str__c             C   s   |   t ¡ ¡ | j ¡  | S )N)rƒ  re  r„  r  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)Ú
ignore_all)	r   r3   r1   r4   r5   rr  r   r‰  Ú	close_all)r”   re   r   r   r   r(  ï	  s    zAsyncoreEchoServer.__exit__Nc             C   s   || _ tj | ¡ d S )N)r  re  rf  rƒ  )r”   r  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   )r€  r  rI  r‰  Zloop)r”   r   r   r   r{  ÿ	  s    
zAsyncoreEchoServer.runc             C   s   d| _ | j ¡  d S )NF)r€  r}  r±   )r”   r   r   r   rr  	
  s    zAsyncoreEchoServer.stop)N)r‚  rƒ  r„  r‰  r“  r•  rg  r—  r'  r(  rƒ  r{  rr  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)r{   rq  rw  )r*  Úsessionz client:  sending %r...
z client:  read %r
z4bad data <<%r>> (%d) received; expected <<%r>> (%d)
Né   s   over
z client:  closing connection.
)ÚcompressionrO  ÚpeercertÚclient_alpn_protocolÚclient_npn_protocolr$   Úsession_reusedr›  Úserver_alpn_protocolsÚserver_npn_protocolsÚserver_shared_ciphers)r%  rx   r˜   r  r  r~  r©   r  r   r3   r1   r4   r5   r¶   rt  ÚAssertionErrorr§   rN  r  rO  r*  rm  rk  r$   r¡  r›  r±   rl  ri  rQ  )r„   r…   Úindatarq  rw  Úsni_namer›  rø  r}  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.
    Nrr   rˆ   r‰   z %s->%s %s
z {%s->%s} %s
r¤  r  F)rq  rw  z5Client protocol %s succeeded with server protocol %s!Tr$   z%version mismatch: expected %r, got %r)r   rr   rˆ   r‰   r   r3   r1   r4   r5   Zget_protocol_namerD   r  ÚPROTOCOL_TO_TLS_VERSIONrE  ri   r“   r¤  rž   rw   rt   rv   r}   ru   r‚   rª  r`   rü   r  Ú
ECONNRESETr¥  )Zserver_protocolZclient_protocolÚexpect_successZ	certsreqsÚserver_optionsÚclient_optionsZcerttypeZ	formatstrr„   r…   Úmin_versionrH   rø  r	  r   r   r   Útry_protocol_combo?
  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)rq  rw  N)r"  r}  )r„   r…   rq  rw  r§  Fz%called a function you should not call)r„   r…   rq  rw  )r   r3   r1   r4   r5   rŒ  r   r   rE   ÚsubTestÚ_PROTOCOL_NAMESrD   rv   r¿   rª  r†   rs   r¨   r`   rŠ   rœ   r  )r”   rž   r{   r„   r…   rƒ   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)r{   rq  )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%  rx   r˜   r  r  r~  r¨   rG   r*  r  ré   rO  rÃ   rÄ   rœ   r®   rŠ   r   rj  ræ   )
r”   r„   r…   rƒ   r}  rš   r  rO  ÚbeforeÚ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)r{   rq  )r*  zCan't get peer certificate.zcertificate verify failed)r   r3   r1   r4   r5   r†   r«  r   r’   r¬  r­  r%  rx   r˜   r  r  r~  r*  ré   r®  r–   r`   ru   ÚCRLFILE)r”   r„   r…   rƒ   r¯  r}  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)r{   rq  )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%  rx   r˜   r  r  r~  r*  ré   r–   r   r  rG   )r”   r„   r…   rƒ   r}  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)r{   rq  )r*  zCan't get peer certificate.r   ú-rT  )ÚECDHEÚECDSA)r   rD   r   ru   r‚   rw   ÚSIGNED_CERTFILE_ECC_HOSTNAMErE   rv   ÚSIGNED_CERTFILE_ECCr%  rx   r˜   r  r  r~  r*  ré   rO  Úsplit)r”   r„   rƒ   r…   r}  rš   r  rO  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)r{   rq  )r*  zCan't get peer certificate.r   r»  rT  )r¼  r½  )r   rD   r   ru   r‚   r  r   rw   r¾  rE   rv   r¿  r}   r%  rx   r˜   r  r  r~  r*  ré   rO  rÀ  )r”   r„   rƒ   r…   r}  rš   r  rO  r   r   r   Útest_dual_rsa_ecc<  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)r{   rq  )r*  zCan't get peer certificate.zpython.example.org)r   r3   r1   r4   r5   r   rD   rE   rv   ÚIDNSANSFILEr   r‰   rt   rs   ru   r‚   r%  rx   r˜   r’   r*  r  r  r~  r*  ré   r¨   r  )	r”   r…   r{   Zidn_hostnamesr*  Zexpected_hostnamer}  rš   r  r   r   r   Útest_check_hostname_idnV  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)r{   rq  rw  )r*  z
SSLError is %r
Nz
socket.error is %r
z'Use of invalid cert should have failed!)r†   rv   r¿   r   r‰   rt   r¥  r¦  r§  r%  rx   r˜   r  r  r~  r`   r   r3   r1   r4   r5   rü   r  r¬  r®   )r”   r„   r…   rƒ   r}  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)r{   rq  rw  )r*  s   datarR   z
SSLError is %r
z
socket.error is %r
z'Use of invalid cert should have failed!)r†   rv   r¿   r   r‰   rt   r¥  r¨  r¤  r%  rx   r˜   r  r  r~  r5   r¶   r`   r   r3   r1   r4   rü   r  r¬  r®   )r”   r„   r…   rƒ   r}  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.  rI  rÞ  r±   )Znewsockrc  )Ú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  r|   rü   r®   )r1  Ússl_sock)rÇ  rÈ  r~  r”   r   r   Ú	connectorè  s    
z3ThreadedTests.test_rude_shutdown.<locals>.connector)ÚtargetN)	re  r„  r˜   r   rw  r  rf  rƒ  r   )r”   rÉ  rË  rí   r   )rÇ  rÈ  r~  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)r{   rq  )r*  z&unable to get local issuer certificaterœ  zcertificate verify failed)r   r3   r1   r4   r5   r   rD   rE   rv   r}   r   r%  rx   r˜   r~   r  r  r~  r`   râ   ZSSLCertVerificationErrorr’   Zverify_codeZverify_messagerŠ   r5  )r”   r…   r{   r}  rš   r	  ry  r   r   r   Útest_ssl_cert_verify_errorû  s$    


z(ThreadedTests.test_ssl_cert_verify_errorr]   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   r]   rˆ   r‰   r“   ri   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¼   r]   Tz; SSL2 client to SSL23 server test unexpectedly failed:
 %s
NrÏ  Fr	   )r®  )r   r3   r1   r4   r5   ri   r   r±  r“   r]   rü   rœ   rÏ  r   rˆ   r‰   r   rŒ   rŽ   )r”   r`  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   r]   F)r¯  N)r   r3   r1   r4   r5   r±  r   rÏ  rˆ   r‰   ri   r]   r“   r   r   r@   rŒ   )r”   r   r   r   Útest_protocol_sslv3R  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	   r]   FrÏ  )r¯  N)r   r3   r1   r4   r5   r±  r   r   rˆ   r‰   ri   r]   rÏ  r“   rŽ   )r”   r   r   r   Útest_protocol_tlsv1f  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.1r]   FrÏ  )r¯  N)r   r3   r1   r4   r5   r±  r   r
   ri   r]   rÏ  r“   r   r   )r”   r   r   r   Útest_protocol_tlsv1_1u  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¯  r]   FrÏ  )r¯  N)r   r3   r1   r4   r5   r±  r   rÕ  r   rŒ   ri   r]   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)ru  rq  rw  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  r~  r   r3   r1   r4   r5   r¶   r  rý   rv  rt  rÙ   r|   r!  r±   )	r”   Zmsgsr}  Úwrappedrš   r¦  r  r©  ry  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.)rp   r¼   ÚrbNr_   zhttps://localhost:%d/%sr   )r?  )r{   zcontent-lengthr   z/ client: read %d bytes from remote server '%s'
)ra  r}   r   r3   r1   r4   r5   rÖ   r¿   r¶   r~  r   r   rÀ  r   rû  r‚   ÚurllibÚrequestÚurlopenÚinforE  rã   r§   r±   r’   )r”   r}  rh   rÜ   rÝ   Úurlr{   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)
Nrœ  s   over
z client:  closing connection.
z client:  connection closed.
)r   r3   r1   r4   r5   rˆ  r¿   r|   r˜   r  r~  r¶   rt  r®   r§   r±   )r”   r¦  r}  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)r  rz   r‚  rq  rw  )r  rp   rn   rm   rz   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;  rc  )rš   r   r   Ú_recvfrom_into*  s    z4ThreadedTests.test_recv_send.<locals>._recvfrom_intor  r  zsome.addressrG  c             S   s   d S )Nr   )r`  r   r   r   Ú<lambda>3  rÑ  z.ThreadedTests.test_recv_send.<locals>.<lambda>rý   rÿ   rþ   r   ZPREFIX_r   zsending with {})ry  zpWhile sending with <<{name:s}>> bad data <<{outdata:r}>> ({nout:d}) received; expected <<{indata:r}>> ({nin:d})
Nrœ  )r   r©  Znoutr¦  Zninz>Failed to send with method <<{name:s}>>; expected to succeed.
)r   zFMethod <<{name:s}>> failed with unexpected exception message: {exp:s}
)r   Ú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   datarW  rû   s   over
)*r   r3   r1   r4   r5   r%  r¿   r   rr   rE   r|   r˜   r   r  r  r~  r  r§   r  rG  rý   rÿ   r&  rê   r’   r¶   rt  r®   rG   rœ   rÙ   r©   ÚctypesZc_ubyteZfrom_buffer_copyr¨   r  r  r  r  r  r±   )r”   r}  râ  rã  Zsend_methodsZrecv_methodsZdata_prefixZ	meth_nameZ	send_methr­  re   Zret_val_methr¦  rK  ry  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˜   Úcreate_connectionr  r~  r±   r|   r  r’   rý   r¶   r  rþ   r©   )r”   r}  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)r  rz   r‚  rq  rw  )r  rp   rn   rm   rz   i    c                  s   xˆ  ˆ ¡ qW d S )N)r  r   )rL  rš   r   r   Úfill_bufferÂ  s    z8ThreadedTests.test_nonblocking_send.<locals>.fill_buffer)r%  r¿   r   rr   rE   r|   r˜   r   r  r  r~  r  r©   r¨   r/  r  r±   )r”   r}  rë  r   )rL  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.  rI  r.  rj  rÞ  r±   )ZconnsrÕ   Úwr	  ry   )Úfinishr}  Ústartedr   r   ÚserveÔ  s    
z3ThreadedTests.test_handshake_timeout.<locals>.serve)rÌ  gš™™™™™É?z	timed outT)r˜   rò   r   rw  re  r„  rf  rƒ  r…  r	  r  r–   r  r|   r±   r   )r”   r$  r~  rð  rí   r1  r   )rî  r}  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 )NrR   )r.  rI  rÞ  r  rý   r   )ÚevtÚpeerÚremoter}  r   r   rð    s    z/ThreadedTests.test_server_accept.<locals>.serve)rÌ  s   data)r   rD   r“   r‰   rt   ru   r‚   rv   r}   r˜   rò   r   rw  rx   ré   r  re  r„  rf  rƒ  r…  r  r  rý   r/  r±   r   râ   r™   r’   )r”   r{   r$  r~  rð  rí   r"  Zclient_addrr   )rò  ró  rô  r}  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“   rx   r˜   r¨   rü   r*  r’   r  r  ÚENOTCONN)r”   r{   ry   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“   rx   r˜   r¨   rü   r  r’   r  r  rö  )r”   r{   ry   r  r   r   r   Útest_do_handshake_enotconn-  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)r{   )r*  zno shared cipherr   )r†   r  r   r   rw   r%  rx   r˜   r¨   rü   r  r  r~  rŠ   rp  )r”   r„   r…   rƒ   r}  rš   r   r   r   Útest_no_shared_ciphers4  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)rz   rq  NzTLSv1.3)r   r   rT  zTLSv1.2)r	   zTLSv1.2)r   rD   r   rs   rr   rt   r%  r¿   rE   rx   r˜   r   r$   rB  r  r  r~  ÚIS_OPENSSL_1_1_1ÚHAS_TLSv1_3r’   r?   rŠ   )r”   r{   r}  rš   r   r   r   Útest_version_basicB  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)r{   r   ZTLS_AES_256_GCM_SHA384ZTLS_CHACHA20_POLY1305_SHA256ZTLS_AES_128_GCM_SHA256zTLSv1.3)r   rD   r“   rv   r¿   r  rŽ   r   r‘   r%  rx   r˜   r  r  r~  rŠ   rO  r’   r$   )r”   r{   r}  rš   r   r   r   Útest_tls1_3Z  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)r{   )r*  zTLSv1.2zTLSv1.1Úalert)r†   r   r¥  r	   r¤  r¦  r§  r%  rx   r˜   r  r  r~  r’   r$   r   r¨   r`   rŠ   rœ   r  )r”   r„   r…   rƒ   r}  rš   r	  r   r   r   r©  l  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)r{   )r*  r   )r†   r   r¥  r   r¤  r§  r%  rx   r˜   r  r  r~  r’   r$   )r”   r„   r…   rƒ   r}  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)r{   ZECDHr   )r   rD   r“   rv   r¿   r  r   r?   rw   r%  rx   r˜   r  r  r~  rŠ   rO  )r”   r{   r}  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)r{   rq  rw  )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%  rx   r˜   r  r  r~  r0  rê   rP  r$   r’   r§   r¶   rv  r5  r&  r·   )	r”   r„   r…   rƒ   r}  rš   Zcb_dataZpeer_data_reprZnew_cb_datar   r   r   r4  ¶  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)rq  rw  r§  z got compression: {!r}
r  ZZLIBZRLE)	r†   rª  r   r3   r1   r4   r5   rê   rŠ   )r”   r„   r…   rƒ   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)rq  rw  r§  r  )r†   r  r   r)   rª  r   )r”   r„   r…   rƒ   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)rq  rw  r§  rO  r   r»  ZADHZEDHZDHEzNon-DH cipher: )
r†   r  r   r   rØ  rÙ  rw   rª  rÀ  r®   )r”   r„   r…   rƒ   rø  rO  Ú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)rq  rw  r§  rä  zmismatch curve did not fail)r†   rF   rw   r  r   rŽ   r   rª  r`   ÚIS_OPENSSL_1_1_0r®   )r”   r„   r…   rƒ   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)rq  rw  r§  rŸ  )r†   rª  r   )r”   r„   r…   rƒ   rø  r   r   r   Útest_selected_alpn_protocol=  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)rq  rw  r§  rŸ  )r†   r~  rª  r   )r”   r„   r…   rƒ   rø  r   r   r   Ú/test_selected_alpn_protocol_if_server_uses_alpnE  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)rq  rw  r§  )r   r   r   r:  zKfailed trying %s (s) and %s (c).
was expecting %s, but got %%s from the %%srŸ  r"  r¢  rW  Únothingr}  )r†   r~  rª  r   r`   r  r?   râ   rœ   r’   r§   )r”   Úserver_protocolsÚprotocol_testsÚclient_protocolsr^  r„   r…   rƒ   rø  r	  ry  Úclient_resultÚserver_resultr   r   r   Útest_alpn_protocolsO  s:    





z!ThreadedTests.test_alpn_protocolsc             C   s2   t ƒ \}}}t||dd|d}|  |d d ¡ d S )NT)rq  rw  r§  r   )r†   rª  r   )r”   r„   r…   rƒ   rø  r   r   r   Útest_selected_npn_protocolw  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/2r_  ÚabcÚdefT)rq  rw  r§  zKfailed trying %s (s) and %s (c).
was expecting %s, but got %%s from the %%sr   r"  r£  rW  r  r}  )r†   r}  rª  rœ   r’   r§   )r”   r  r  r  r^  r„   r…   rƒ   rø  ry  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   rv   r}   r   r   ru   r‚   )r”   r…   Úother_contextr„   r   r   r   Úsni_contexts™  s    


zThreadedTests.sni_contextsc             C   s"   |d }|   d|ff|d ¡ d S )Nrž  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)rj  r{   )rÊ  Úserver_nameÚinitial_context)Úcallsr  r   r   Úservername_cb­  s    z6ThreadedTests.test_sni_callback.<locals>.servername_cbTÚsupermessage)rq  r§  r(   Znotfunny)r  rs   rè  rª  r’   r  r~   )r”   r…   r„   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  )rq  r§  ZTLSV1_ALERT_ACCESS_DENIED)	r  rè  r¨   r   r`   rª  r’   r  r  )r”   r…   r  r„   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  )rq  r§  ZSSLV3_ALERT_HANDSHAKE_FAILUREÚZeroDivisionError)r  rè  r¨   r   r`   r   Úcaptured_stderrrª  r’   r  r  rŠ   Úgetvalue)r”   r…   r  r„   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  )rq  r§  ZTLSV1_ALERT_INTERNAL_ERRORr—   )r  rè  r¨   r   r`   r   r$  rª  r’   r  r  rŠ   r%  )r”   r…   r  r„   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§  r¤  r   c             3   s   | ]}|ˆ kV  qd S )Nr   )r—  Zalg)r   r   r   r™    s    z4ThreadedTests.test_shared_ciphers.<locals>.<genexpr>)r†   rw   rª  ÚassertGreaterr§   Úanyr®   )	r”   r„   r…   rƒ   Zexpected_algsrø  ro   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)r{   rq  )r*  i   s   hello)r†   r%  rx   r˜   r  r  r~  r±   r¨   rG   r¶   r5   )r”   r„   r…   rƒ   r}  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)r{   rq  rÙ  i   )rÖ   r   ÚTESTFNr5   r´   Úunlinkr   rD   r“   r‰   rt   ru   r‚   rv   r}   r%  rx   r˜   r  r  r~  Úsendfiler’   rý   )r”   Z	TEST_DATArh   r{   r}  rš   Úfiler   r   r   Útest_sendfile  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§  r›  r   )r   r   r   r¡  rÞ  r   rß  )r›  r§  rT  r   rR   )r†   r  r   r   rª  ré   Úidr*  rJ   r  Z
has_ticketr?   Zticket_lifetime_hintr   rá  r’   ÚassertIsNotrå   r·   )
r”   r„   r…   rƒ   rø  r›  Z	sess_statZsession2Zsession3Zsession4r   r   r   Útest_session0  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)r{   rq  )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%  rx   r˜   r’   r›  r¡  r  r  r~  ré   r¨   r—   rÕ  rœ   r  rG   r5  )
r”   r„   r…   rƒ   Zclient_context2rº   r}  rš   r›  r	  r   r   r   Útest_session_handlingj  sJ    








z#ThreadedTests.test_session_handlingN)Jr‚  rƒ  r„  rl   rµ  r¸  rc   r…  rA   rº  rþ  rÁ  rÂ  rÄ  rÅ  r   rü  rÆ  rÍ  rÎ  ri   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  rˆ  r4  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.  r4  r7  r8  r   r   r   r   r²  †
  sŽ   0$)!8%)(9 
1)';	

&
(	):r²  zTest needs TLS 1.3c               @   sL   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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   r   rD   r’   Úpost_handshake_authr‰   rt   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)r{   rq  )r*  s   HASCERTi   s   FALSE
s   PHAs   OK
s   TRUE
s   GETCERTi   zus-asciizPython Software Foundation CA)r†   r;  r   r‰   rt   rv   r}   r%  rx   r˜   r  r  r~  r5   r’   rý   r'  rŠ   )r”   r„   r…   rƒ   r}  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)r{   rq  )r*  s   PHAi   s   OK
s   HASCERTz!tlsv13 alert certificate required)r†   r;  r   r‰   rt   r%  rx   r˜   r  r  r~  r5   r’   rý   r–   r`   )r”   r„   r…   rƒ   r}  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)r{   rq  )r*  s   HASCERTi   s   FALSE
s   PHAs   OK
s   TRUE
)r   r3   r1   r4   r5   r†   r;  r   r‰   rt   rv   r}   rˆ   r%  rx   r˜   r  r  r~  r’   rý   )r”   r„   r…   rƒ   r}  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)r{   rq  )r*  s   HASCERTi   s   FALSE
s   PHAs   OK
)r   r3   r1   r4   r5   r†   r;  r   rˆ   rt   r%  rx   r˜   r  r  r~  r’   rý   )r”   r„   r…   rƒ   r}  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)r{   rq  )r*  z
not servers   PHAs   extension not receivedi   )r†   r;  r   r‰   rt   rv   r}   r%  rx   r˜   r  r  r~  r–   r`   rx  r5   rŠ   rý   )r”   r„   r…   rƒ   r}  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)r{   rq  )r*  s   HASCERTi   s   TRUE
s   PHAs   OK
)r†   r   r‰   rt   r;  rv   r}   r%  rx   r˜   r  r  r~  r5   r’   rý   )r”   r„   r…   rƒ   r}  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)r{   rq  )r*  s   PHAs   WRONG_SSL_VERSIONi   )r†   r   r‰   rt   r¥  r¦  r§  r;  rv   r}   r%  rx   r˜   r  r  r~  r5   rŠ   rý   )r”   r„   r…   rƒ   r}  rš   r   r   r   Útest_pha_not_tls138  s    




z(TestPostHandshakeAuth.test_pha_not_tls13N)r‚  rƒ  r„  r<  r=  r>  r?  r@  rA  rB  rC  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   )ÚLinuxZMacÚ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 %rÚnetwork)2r   r3   Úwarningsra   rb   Úmac_verÚ	win32_verÚcatch_warningsÚfilterwarningsÚDeprecationWarningÚitemsr5  Úprintr   rá   r?   r‹   rœ  r   r¢  r¿   rÉ  rÂ  rÃ  rÄ  rÅ  r}   r   r‚   rÀ  ÚBADKEYrÁ  r   r   ÚexistsÚ
TestFailedrŠ  r‡   r  r  r   r$  r²  r:  Úis_resource_enabledrj  rW  Úthreading_setupÚrun_unittestÚthreading_cleanup)	r3   rH  Zplatsr   rg   ZplatÚfilenameÚtestsÚthread_infor   r   r   Ú	test_mainJ  sR    


rZ  Ú__main__)N)rš  TFNN)Nr   r   )F){r1   rc   r_  r   r˜   r.  rJ   rU   rë  r   r  rÃ   Úurllib.requestrÚ  re  r/   r‰  ró   ra   rj   Ú	sysconfigræ  ÚImportErrorÚimport_moduler   Úsortedr´  rŒ  r  rá   rÙ   rè   r?   r  rû  Úget_config_varr   r«  rŸ   Úverr«  r¥  r¢  r   r¿   ÚfsencoderÉ  rÂ  rÃ  rÄ  rÅ  rÆ  rÇ  r´  r>  rÊ  rÓ  r×   rÀ   r¹  r}   r~   rÁ   r   r€   r¿  r¾  r‚   rÓ   rÃ  rY  rÁ  rÀ  r  rP  rÂ   rÐ   rÈ   rÙ  rÚ  r)   r*   r+   r,   r-   r7   r=   r@   rA   rI   r9  rP   r\   rl   r…  r‹   r  r“   rr   r|   r†   ÚTestCaser‡   rŠ  r  r  r   r$  rW  r=  r?  Ztest.ssl_serversra  rf  r%  rˆ  rª  r±  r²  rü  r:  rZ  r‚  r   r   r   r   Ú<module>   s:  













     }     8?0  B
  v  
1
F            #
 -
7
