B
    2*™\t ã               @   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   ú8C:\ALexclude\prg\programme\Python37\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   )ÚtimeZdaylightZ	localtimeZtm_isdstZaltzoneZtimezoner   r   r   r   Ú
utc_offset±   s    rK   c             C   s^   t jdkrZd}tj | |¡}|jdd}| |¡} | d dkrZ| d d… d | dd …  } | S )	N)r   r8   r9   r8   r;   z%b %d %H:%M:%S %Y GMTr   )Úsecondé   Ú0r.   é   )r   r<   ÚdatetimeZstrptimeÚreplaceÚstrftime)Ú	cert_timeZfmtZdtr   r   r   Úasn1time·   s    

rT   c                s,   t tdƒr$t ˆ ¡‡ fdd„ƒ}|S ˆ S d S )NÚPROTOCOL_SSLv2c                 sR   yt  t j¡ W n6 t jk
rF   t jdkrBt ¡ dkrBt d¡‚Y nX ˆ | |ŽS )N)r   r8   r9   r;   r;   )Zdebianzsqueeze/sidÚ z'Patched Ubuntu OpenSSL breaks behaviour)	r   rD   rU   ÚSSLErrorr?   ÚplatformÚlinux_distributionÚunittestZSkipTest)ÚargsÚkwargs)Úfuncr   r   ÚfÈ   s    
z$skip_if_broken_ubuntu_ssl.<locals>.f)Úhasattrr   Ú	functoolsÚwraps)r]   r^   r   )r]   r   Úskip_if_broken_ubuntu_sslÆ   s    
	rb   z SNI support needed for this test)Ú	cert_reqsÚca_certsÚciphersÚcertfileÚkeyfilec      	      K   sv   t  |¡}|d k	r(|t jkr"d|_||_|d k	r:| |¡ |d k	sJ|d k	rV| ||¡ |d k	rh| |¡ |j| f|ŽS )NF)	r   rD   Ú	CERT_NONEÚcheck_hostnameÚverify_modeÚload_verify_locationsÚload_cert_chainÚset_ciphersÚwrap_socket)	ÚsockÚssl_versionrc   rd   re   rf   rg   r\   Úcontextr   r   r   Útest_wrap_socketØ   s    



rr   c             C   sd   | t krt}n| tkrt}nt| ƒ‚t tj¡}| t	¡ t tj
¡}| | ¡ | t	¡ |||fS )N)ÚSIGNED_CERTFILEÚSIGNED_CERTFILE_HOSTNAMEÚSIGNED_CERTFILE2ÚSIGNED_CERTFILE2_HOSTNAMErG   r   rD   ÚPROTOCOL_TLS_CLIENTrk   Ú
SIGNING_CArE   rl   )Zserver_certÚhostnameÚclient_contextÚserver_contextr   r   r   Útesting_contextê   s    


r|   c               @   s˜  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Ze e	j
d	kd
¡dd„ ƒZdZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zejdd„ ƒZdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Ze d0e j!kd1¡d2d3„ ƒZ"d4d5„ Z#d6d7„ Z$e e%j&d8kd9¡d:d;„ ƒZ'e e%j&d8kd9¡d<d=„ ƒZ(d>d?„ Z)d@dA„ Z*dBdC„ Z+dDdE„ Z,dFdG„ Z-e e.ƒ dH¡dIdJ„ ƒZ/dKdL„ Z0e 1dMdN¡dOdP„ ƒZ2dQdR„ Z3dS )SÚBasicSocketTestsc             C   s    t j t j t j t j t j t jr*t j t jdkr:t j	 |  
t jddh¡ |  
t jddh¡ t j t j t j t j t jdkrŒt j t j |  t jt j¡ d S )N)r   r   TF)r   r   r   )r   rh   ÚCERT_OPTIONALÚCERT_REQUIREDr,   r*   rC   r+   r?   r)   ÚassertInÚHAS_SNIÚOP_NO_SSLv2ÚOP_NO_SSLv3ÚOP_NO_TLSv1ÚOP_NO_TLSv1_3ÚOP_NO_TLSv1_1ÚOP_NO_TLSv1_2ÚassertEqualÚPROTOCOL_TLSr   )Úselfr   r   r   Útest_constants  s&    

zBasicSocketTests.test_constantsc          
   C   s:   |   td¡$ t ¡ }t |¡ W d Q R X W d Q R X d S )Nzpublic constructor)ÚassertRaisesRegexÚ	TypeErrorÚsocketr   Ú	SSLSocket)rŠ   Úsr   r   r   Útest_private_init  s    
z"BasicSocketTests.test_private_initc             C   s2   t j}|  t|ƒd¡ t  |¡}|  |j|¡ d S )Nz_SSLMethod.PROTOCOL_TLS)r   r‰   rˆ   ÚstrrD   ÚassertIsÚprotocol)rŠ   ÚprotorH   r   r   r   Útest_str_for_enums  s    
z#BasicSocketTests.test_str_for_enumsc             C   s  t  ¡ }tjr*tj d||r dp"df ¡ t  d¡\}}|  t	|ƒd¡ |  ||dk¡ |rxt  
d¡}|  t	|ƒd¡ n|  t jt j
d¡ |  tt j
d¡ |  tt jd¡ tt dƒrÖ|  tt jd¡ |  tt jdd¡ t  d	d
¡ t  dd
¡ t  tdƒd
¡ d S )Nz
 RAND_status is %d (%s)
zsufficient randomnesszinsufficient randomnessé   r   éûÿÿÿÚRAND_egdÚfoozthis is a random stringg     ÀR@s   this is a random bytes objects!   this is a random bytearray object)r   ÚRAND_statusr   r3   r1   r4   r5   ÚRAND_pseudo_bytesrˆ   ÚlenZ
RAND_bytesÚassertRaisesrW   rG   r_   r   r™   ZRAND_addÚ	bytearray)rŠ   ÚvÚdataZis_cryptographicr   r   r   Útest_random$  s(    



zBasicSocketTests.test_randomÚposixzrequires posixc             C   s  t  ¡ }|s|  d¡ t ¡ \}}t ¡ }|dkr yBt |¡ t  d¡d }|  t	|ƒd¡ t 
||¡ t |¡ W n tk
r’   t d¡ Y nX t d¡ nzt |¡ |  tj|¡ t |d¡\}}|  |d¡ t |d¡}|  t	|ƒd¡ t  d¡d }|  t	|ƒd¡ |  ||¡ d S )Nz*OpenSSL's PRNG has insufficient randomnessr   r—   r   )r   r›   Úfailr   ÚpipeZforkÚcloserœ   rˆ   r   r5   ÚBaseExceptionÚ_exitÚ
addCleanupÚwaitpidÚreadÚassertNotEqual)rŠ   ÚstatusZrfdZwfdZpidZchild_randomÚ_Zparent_randomr   r   r   Útest_random_fork?  s0    


z!BasicSocketTests.test_random_forkNc             C   s˜   |   tj t¡t¡ |   tj t¡t¡ tj t¡}t	j
rTtj dt |¡ d ¡ |   |d d¡ |   |d d¡ |   |d d¡ |   |d d	¡ d S )
NÚ
r#   ))r   zprojects.developer.nokia.com)r   zprojects.forum.nokia.comr%   )zhttp://ocsp.verisign.comr&   )z0http://SVRIntl-G3-aia.verisign.com/SVRIntlG3.cerr'   )z0http://SVRIntl-G3-crl.verisign.com/SVRIntlG3.crl)rˆ   r   Ú_sslÚ_test_decode_certÚCERTFILEÚCERTFILE_INFOrs   ÚSIGNED_CERTFILE_INFOÚ	NOKIACERTr   r3   r1   r4   r5   ÚpprintÚpformat)rŠ   Úpr   r   r   Útest_parse_certa  s     




z BasicSocketTests.test_parse_certc             C   sL   t j t¡}tjr,tj dt	 
|¡ d ¡ |  |dddddddd	œ¡ d S )
Nr°   )))r   ÚUK))r   zcody-cazJun 14 18:00:58 2028 GMTzJun 18 18:00:58 2018 GMTZ02)))r   r»   ))r   z#codenomicon-vm-2.test.lal.cisco.com))r   z#codenomicon-vm-2.test.lal.cisco.comr   )r   r   r    r!   r"   r#   r$   )r   r±   r²   ÚTALOS_INVALID_CRLDPr   r3   r1   r4   r5   r·   r¸   rˆ   )rŠ   r¹   r   r   r   Útest_parse_cert_CVE_2019_5010~  s    z.BasicSocketTests.test_parse_cert_CVE_2019_5010c             C   sx   t j t¡}tjr,tj dt	 
|¡ d ¡ d}|  |d |¡ |  |d |¡ t jdkr`d}nd}|  |d |¡ d S )	Nr°   )))r   ÚUS))ÚstateOrProvinceNameZOregon))r   Z	Beaverton))r   zPython Software Foundation))ÚorganizationalUnitNamezPython Core Development))r   znull.python.org example.org))ÚemailAddresszpython-dev@python.orgr"   r   )r   r8   r9   ))r   zaltnull.python.org example.com)Úemailz null@python.org user@example.org)ÚURIz)http://null.python.org http://example.org)z
IP Addressz	192.0.2.1)z
IP Addressz2001:DB8:0:0:0:0:0:1
))r   zaltnull.python.org example.com)rÂ   z null@python.org user@example.org)rÃ   z)http://null.python.org http://example.org)z
IP Addressz	192.0.2.1)z
IP Addressz	<invalid>r#   )r   r±   r²   ÚNULLBYTECERTr   r3   r1   r4   r5   r·   r¸   rˆ   r<   )rŠ   r¹   r"   Zsanr   r   r   Útest_parse_cert_CVE_2013_4238“  s    
z.BasicSocketTests.test_parse_cert_CVE_2013_4238c             C   s    t j t¡}|  |d d¡ d S )Nr#   )
)r   Zallsans)Ú	othernamez<unsupported>)rÆ   z<unsupported>)rÂ   zuser@example.org)r   zwww.example.org)ZDirName)))r   r   ))r   zCastle Anthrax))r   zPython Software Foundation))r   zdirname example)rÃ   zhttps://www.python.org/)z
IP Addressz	127.0.0.1)z
IP Addressz0:0:0:0:0:0:0:1
)zRegistered IDz	1.2.3.4.5)r   r±   r²   Ú
ALLSANFILErˆ   )rŠ   r¹   r   r   r   Útest_parse_all_sans°  s    
z$BasicSocketTests.test_parse_all_sansc          	   C   sŒ   t tdƒ}| ¡ }W d Q R X t |¡}t |¡}t |¡}|  ||¡ | tjd ¡sf|  	d| ¡ | 
dtj d ¡sˆ|  	d| ¡ d S )NÚrr°   z-DER-to-PEM didn't include correct header:
%r
z-DER-to-PEM didn't include correct footer:
%r
)ÚopenÚCAFILE_CACERTr«   r   ÚPEM_cert_to_DER_certZDER_cert_to_PEM_certrˆ   Ú
startswithZ
PEM_HEADERr¤   ÚendswithZ
PEM_FOOTER)rŠ   r^   ÚpemÚd1Zp2Úd2r   r   r   Útest_DER_to_PEMÅ  s    


z BasicSocketTests.test_DER_to_PEMc       	   	   C   s&  t j}t j}t j}|  |t¡ |  |t¡ |  |t¡ |  |d¡ |  	|d¡ |\}}}}}|  |d¡ |  	|d¡ |  |d¡ |  	|d¡ |  |d¡ |  	|d¡ |  |d¡ |  
|d¡ |  |d¡ |  
|d¡ trü|  | d |¡¡||t|ƒf¡ n&|  | d	 |||¡¡||t|ƒf¡ d S )
Ni   i   0r   r   é   é?   r;   zLibreSSL {:d}zOpenSSL {:d}.{:d}.{:d})r   ZOPENSSL_VERSION_NUMBERr?   ÚOPENSSL_VERSIONÚassertIsInstanceÚintÚtupler’   ÚassertGreaterEqualÚ
assertLessZassertLessEqualÚIS_LIBRESSLÚ
assertTruerÍ   ÚformatÚhex)	rŠ   ÚnÚtr   ÚmajorÚminorZfixZpatchr­   r   r   r   Útest_openssl_versionÑ  s0    z%BasicSocketTests.test_openssl_versionc          	   C   sL   t   t j¡}t|ƒ}t |¡}t dtf¡ ~W d Q R X |  |ƒ d ¡ d S )NrV   )	rŽ   ÚAF_INETrr   ÚweakrefÚrefr   Zcheck_warningsÚResourceWarningrˆ   )rŠ   r   ÚssÚwrr   r   r   Útest_refcycleð  s    
zBasicSocketTests.test_refcyclec          	   C   sÜ   t   t j¡}t|ƒ¾}|  t|jd¡ |  t|jtdƒ¡ |  t|jd¡ |  t|j	tdƒd¡ |  t|j
d¡ |  t|jdd¡ |  t|j¡ |  t|jdgddd¡ |  t|jd¡ |  t|jtdƒg¡ W d Q R X d S )Nr   ó   x)z0.0.0.0r   r   r   éd   )rŽ   rä   rr   rž   ÚOSErrorÚrecvÚ	recv_intorŸ   ÚrecvfromÚrecvfrom_intoÚsendÚsendtoÚNotImplementedErrorÚdupÚsendmsgÚrecvmsgÚrecvmsg_into)rŠ   r   rè   r   r   r   Útest_wrapped_unconnectedû  s    


z)BasicSocketTests.test_wrapped_unconnectedc          
   C   sL   xFdD ]>}t   t j¡}| |¡ t|ƒ}|  || ¡ ¡ W d Q R X qW d S )N)Ng        g      @)rŽ   rä   Ú
settimeoutrr   rˆ   Z
gettimeout)rŠ   Útimeoutr   rè   r   r   r   Útest_timeout  s
    


zBasicSocketTests.test_timeoutc          
   C   sd  t   ¡ }| jtdtj|td | jtdtj|dd | jtdtj|ddd tj|dtd}|  td|jtd	f¡ W d Q R X |  t	¡(}t   ¡ }tj|t
d
 W d Q R X W d Q R X |  |jjtj¡ |  t	¡*}t   ¡ }tj|tt
d W d Q R X W d Q R X |  |jjtj¡ |  t	¡*}t   ¡ }tj|t
t
d W d Q R X W d Q R X |  |jjtj¡ d S )Nzcertfile must be specified)rg   z5certfile must be specified for server-side operationsT)Úserver_siderV   )rý   rf   z!can't connect in server-side modei  )rf   )rf   rg   )rŽ   rŒ   rG   r   rn   r³   ÚconnectÚHOSTrž   rí   ÚNONEXISTINGCERTrˆ   Ú	exceptionÚerrnoÚENOENT)rŠ   ro   r   Úcmr   r   r   Útest_errors_sslwrap  s6    
"

z$BasicSocketTests.test_errors_sslwrapc          	   C   sX   t j t j t¡pt j|¡}t ¡ }|  |j¡ |  	t
j¡ t||d W d Q R X d S )N)rf   )r   r   r   r   r   ÚcurdirrŽ   r©   r¦   rž   r   rW   rr   )rŠ   rf   ro   r   r   r   Úbad_cert_test3  s    zBasicSocketTests.bad_cert_testc             C   s   |   d¡ d S )Nznullcert.pem)r  )rŠ   r   r   r   Útest_empty_cert=  s    z BasicSocketTests.test_empty_certc             C   s   |   d¡ d S )Nzbadcert.pem)r  )rŠ   r   r   r   Útest_malformed_certA  s    z$BasicSocketTests.test_malformed_certc             C   s   |   d¡ d S )Nz
badkey.pem)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)Úcertry   r   r   r   ÚokJ  s    z0BasicSocketTests.test_match_hostname.<locals>.okc                s   ˆ   tjtj| |¡ d S )N)rž   r   ÚCertificateErrorr  )r  ry   )rŠ   r   r   r¤   L  s    z2BasicSocketTests.test_match_hostname.<locals>.failr"   )))r   zexample.comzexample.comzExAmple.cOmzwww.example.comz.example.comzexample.orgZexampleXcom)))r   z*.a.comz	foo.a.comzbar.foo.a.comza.comzXa.comz.a.com)))r   zf*.comzfoo.comzf.comzbar.comzbar.foo.com)))r   znull.python.org example.orgznull.python.org example.orgznull.python.org)))r   z	*.*.a.com)))r   za.*.comz	a.foo.comza..comu   pÃ¼thon.python.orgÚidnaÚasciir   )))r   zx*.python.org)))r   zxn--p*.python.orgu   www*.pythÃ¶n.orgu   www.pythÃ¶n.orgu   www1.pythÃ¶n.orgu   ftp.pythÃ¶n.orgu   pythÃ¶n.orgzJun 26 21:41:46 2011 GMT)))r   zlinuxfrz.org))r   zlinuxfr.org)r   zlinuxfr.com)rÆ   z<unsupported>)r   r"   r#   zlinuxfr.orgzlinuxfr.comz<unsupported>zlinuxfrz.orgzDec 18 23:59:59 2011 GMT)))r   r¾   ))r¿   Ú
California))r   zMountain View))r   z
Google Inc))r   zmail.google.com)r   r"   zmail.google.comz	gmail.comr  ))r   zexample.com)z
IP Addressz10.11.12.13)z
IP Addressz14.15.16.17)r"   r#   z10.11.12.13z14.15.16.17z14.15.16.18zexample.netZAF_INET6))r   zexample.com)z
IP Addressz2001:0:0:0:0:0:0:CAFE
)z
IP Addressz2003:0:0:0:0:0:0:BABA
z
2001::cafez
2003::babaz
2003::bebe)))r   r¾   ))r¿   r  ))r   zMountain View))r   z
Google InczDec 18 23:59:59 2099 GMT)))r   r¾   ))r¿   r  ))r   zMountain View))r   zmail.google.com))rÆ   Zblablaz
google.com)))r   za*b.example.comz5partial wildcards in leftmost label are not supportedzaxxb.example.com)))r   zwww.*.example.comz2wildcard can only be present in the leftmost labelzwww.sub.example.com)))r   za*b*.example.comztoo many wildcardszaxxbxxc.example.com)))r   Ú*z7sole wildcard without additional labels are not supportÚhost)))r   z*.comz%hostname 'com' doesn't match '\*.com'Zcom)Ú1rV   z1.2.3z	256.0.0.1z127.0.0.1/24)z	127.0.0.1z192.168.0.1)z::1z2001:db8:85a3::8a2e:370:7334)ÚencodeÚdecoder_   rŽ   rž   rG   r   r  rŒ   r  Z_inet_patonrÜ   )rŠ   r  r¤   r  r  ÚinvalidZipaddrr   )rŠ   r   Útest_match_hostnameI  sì    

















































z$BasicSocketTests.test_match_hostnamec          	   C   s:   t  t j¡}t ¡ }| jt|j|ddd W d Q R X d S )NTzsome.hostname)Úserver_hostname)r   rD   rE   rŽ   rž   rG   rn   )rŠ   rH   ro   r   r   r   Útest_server_side  s    
z!BasicSocketTests.test_server_sidec          
   C   s|   t   t j¡}| d¡ | ¡  t   t j¡}| | ¡ ¡ t|dd&}|  t¡ | 	d¡ W d Q R X W d Q R X | 
¡  d S )N)z	127.0.0.1r   F)Údo_handshake_on_connectzunknown-type)rŽ   rä   ÚbindÚlistenrþ   Úgetsocknamerr   rž   rG   Úget_channel_bindingr¦   )rŠ   r   Úcrè   r   r   r   Útest_unknown_channel_binding  s    
z-BasicSocketTests.test_unknown_channel_bindingz
tls-uniquez*'tls-unique' channel binding not availablec          	   C   sj   t   t j¡}t|ƒ}|  | d¡¡ W d Q R X t   t j¡}t|dtd}|  | d¡¡ W d Q R X d S )Nz
tls-uniqueT)rý   rf   )rŽ   rä   rr   ÚassertIsNoner  r³   )rŠ   r   rè   r   r   r   Útest_tls_unique_channel_binding  s    
z0BasicSocketTests.test_tls_unique_channel_bindingc          	   C   sV   t t tj¡ƒ}t|ƒ}|  t¡}d }t ¡  W d Q R X |  |t	|j
jd ƒ¡ d S )Nr   )rr   rŽ   rä   ÚreprZassertWarnsrç   r   Z
gc_collectr€   r’   Zwarningr[   )rŠ   rè   rÉ   r  r   r   r   Útest_dealloc_warn'  s    z"BasicSocketTests.test_dealloc_warnc          	   C   sr   t  ¡ }|  t|ƒd¡ |  |t j¡ t ¡ :}t|d< t	|d< t  ¡ }|  |j
t	¡ |  |jt¡ W d Q R X d S )Né   ÚSSL_CERT_DIRÚSSL_CERT_FILE)r   Zget_default_verify_pathsrˆ   r   rÖ   ZDefaultVerifyPathsr   ÚEnvironmentVarGuardÚCAPATHr³   Úcafiler   )rŠ   ÚpathsÚenvr   r   r   Útest_get_default_verify_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ÚROOTrV   )r0  r1  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 )Nr0  rV   é   r   r   r2  r3  )rÜ   r   Z	enum_crlsrž   r   r4  rÖ   r6  rØ   rˆ   r   r7  r€   )rŠ   Zcrlsr<  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)é   r>  zTLS Web Server Authenticationz1.3.6.1.5.5.7.3.1z1.3.6.1.5.5.7.3.1rB  r>  zTLS Web Server Authenticationéÿÿÿÿzunknown NID 100000i † iè  zunknown object 'serverauth'Z
serverauth)r   Ú_ASN1Objectrˆ   ÚnidÚ	shortnameZlongnameÚoidrÖ   rž   rG   ZfromnidrŒ   Úranger×   r’   ÚtypeZfromname)rŠ   ÚexpectedÚvalÚiÚobjr   r   r   Útest_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.1rB  r>  z1.3.6.1.5.5.7.3.2é‚   Z
clientAuth)
r   rD  rÖ   ÚPurposeÚSERVER_AUTHrˆ   rE  rF  rG  ÚCLIENT_AUTH)rŠ   rK  r   r   r   Útest_purpose_enumŠ  s    

z"BasicSocketTests.test_purpose_enumc          	   C   s”   t   t jt j¡}|  |j¡ |  t¡}t|tj	d W d Q R X |  
t|jƒd¡ t tj¡}|  t¡}| |¡ W d Q R X |  
t|jƒd¡ d S )N)rc   z!only stream sockets are supported)rŽ   rä   Z
SOCK_DGRAMr©   r¦   rž   rô   rr   r   rh   rˆ   r’   r  rD   rw   rn   )rŠ   r   ZcxrH   r   r   r   Útest_unsupported_dtls›  s    z&BasicSocketTests.test_unsupported_dtlsc             C   s   |   t |¡|¡ d S )N)rˆ   r   Úcert_time_to_seconds)rŠ   Ú
timestringZ	timestampr   r   r   Úcert_time_ok¦  s    zBasicSocketTests.cert_time_okc          	   C   s$   |   t¡ t |¡ W d Q R X d S )N)rž   rG   r   rU  )rŠ   rV  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)rW  )rŠ   r   r   r   Ú"test_cert_time_to_seconds_timezone­  s    z3BasicSocketTests.test_cert_time_to_seconds_timezonec             C   sà   d}d}|   ||¡ |  tj|d|¡ |   d|¡ |   d|¡ |  d¡ |  d¡ |  d¡ |  d	¡ |  d
¡ |  d¡ |  d¡ d}|   d|¡ |   d|¡ |   dd¡ |   dd¡ |   dd¡ |  d¡ |   dd¡ d S )NzJan  5 09:34:43 2018 GMTg  À¬Ñ“ÖA)rS   zJan 05 09:34:43 2018 GMTzJaN  5 09:34:43 2018 GmTzJan  5 09:34 2018 GMTzJan  5 09:34:43 2018zJan  5 09:34:43 2018 UTCzJan 35 09:34:43 2018 GMTzJon  5 09:34:43 2018 GMTzJan  5 24:00:00 2018 GMTzJan  5 09:60:43 2018 GMTg   àWÒAzDec 31 23:59:60 2008 GMTzJan  1 00:00:00 2009 GMTzJan  5 09:34:59 2018 GMTiÃFOZzJan  5 09:34:60 2018 GMTiÄFOZzJan  5 09:34:61 2018 GMTiÅFOZzJan  5 09:34:62 2018 GMTzDec 31 23:59:59 9999 GMTg €¿ úMB)rW  rˆ   r   rU  rX  )rŠ   rV  ÚtsZ
newyear_tsr   r   r   Útest_cert_time_to_secondsµ  s*    







z*BasicSocketTests.test_cert_time_to_secondsÚLC_ALLrV   c             C   s@   dd„ }|ƒ   ¡ dkr |  d¡ |  dd¡ |  |ƒ d ¡ d S )Nc               S   s   t  dd¡S )Nz%b)	r   r@  r   rM   rO   r&  r   r   r   )rJ   rR   r   r   r   r   Úlocal_february_nameÜ  s    zNBasicSocketTests.test_cert_time_to_seconds_locale.<locals>.local_february_nameZfebz>locale-specific month name needs to be different from C localezFeb  9 00:00:00 2007 GMTg   `îrÑAz  9 00:00:00 2007 GMT)ÚlowerÚskipTestrW  rX  )rŠ   r]  r   r   r   Ú test_cert_time_to_seconds_localeØ  s
    
z1BasicSocketTests.test_cert_time_to_seconds_localec             C   sv   t   t j¡}|  |j¡ t |¡}tt   t j¡tjd}|  |j¡ | 	t
|f¡}tjtjtjtjf}|  ||¡ d S )N)rc   )rŽ   rä   r©   r¦   r   Ú	bind_portrr   r   r   Ú
connect_exrÿ   r  ZECONNREFUSEDZEHOSTUNREACHZ	ETIMEDOUTÚEWOULDBLOCKr€   )rŠ   ÚserverÚportr   ÚrcÚerrorsr   r   r   Útest_connect_ex_errorç  s    

z&BasicSocketTests.test_connect_ex_error)4Ú__name__Ú
__module__Ú__qualname__r‹   r‘   r–   r¢   rZ   Ú
skipUnlessr   r   r¯   ZmaxDiffrº   r½   rÅ   rÈ   rÒ   rã   r   Zcpython_onlyrê   rù   rü   r  r  r  r	  r
  r  r  r!  r   ÚCHANNEL_BINDING_TYPESr#  r%  r.  r1   rX   r?  rA  rN  rS  rT  rW  rX  rK   rY  r[  Zrun_with_localer`  rh  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 )NrC  é*   )Ú	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)rp  r   rD   rˆ   r”   )rŠ   r•   rH   r   r   r   Útest_protocol  s    

zContextTests.test_protocolc          	   C   sH   t  t j¡}| d¡ | d¡ |  t jd¡ | d¡ W d Q R X d S )NÚALLÚDEFAULTzNo cipher can be selectedz^$:,;?*'dorothyx)r   rD   rw   rm   rŒ   rW   )rŠ   rH   r   r   r   Útest_ciphers	  s
    

zContextTests.test_ciphersr   z+Test applies only to Python default ciphersc             C   sj   t  t j¡}| ¡ }xP|D ]H}|d }|  d|¡ |  d|¡ |  d|¡ |  d|¡ |  d|¡ qW d S )Nr   ZPSKZSRPZMD5ZRC4Z3DES)r   rD   rw   Úget_ciphersZassertNotIn)rŠ   rH   re   Zsuiter   r   r   r   Útest_python_ciphers  s    
z ContextTests.test_python_ciphers)r   r   r@  r   r   zOpenSSL too oldc             C   sH   t  t j¡}| d¡ tdd„ | ¡ D ƒƒ}|  d|¡ |  d|¡ d S )NZAESGCMc             s   s   | ]}|d  V  qdS )r   Nr   )Ú.0Údr   r   r   ú	<genexpr>!  s    z0ContextTests.test_get_ciphers.<locals>.<genexpr>zAES256-GCM-SHA384zAES128-GCM-SHA256)r   rD   rw   rm   r5  rv  r€   )rŠ   rH   Únamesr   r   r   Útest_get_ciphers  s
    
zContextTests.test_get_ciphersc          	   C   sÊ   t  t j¡}t jt jB t jB }|ttB tB t	B t
B O }|  ||j¡ | jt jO  _|  |t jB |j¡ tƒ rª|jt j @ |_|  ||j¡ d|_|  d|jt j @ ¡ n|  t¡ d|_W d Q R X d S )Nr   )r   rD   rw   ÚOP_ALLr‚   rƒ   r)   r,   r*   r+   r-   rˆ   Úoptionsr„   r=   rž   rG   )rŠ   rH   Údefaultr   r   r   Útest_options%  s    zContextTests.test_optionsc          	   C   sð   t  t j¡}|  |jt j¡ t j|_|  |jt j¡ t j|_|  |jt j¡ t j|_|  |jt j¡ |  t	¡ d |_W d Q R X |  t
¡ d|_W d Q R X t  t j¡}|  |jt j¡ |  |j¡ t  t j¡}|  |jt j¡ |  |j¡ d S )Nro  )r   rD   r‰   rˆ   rj   rh   r~   r   rž   r   rG   rE   ÚassertFalseri   rw   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   rw   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 )Nro  )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)rg   zPEM lib)rf   rg   zkey values mismatch)Zpasswordzshould be a stringTÚbadpasszcannot be longeró   ai  c               S   s   t S )N)ÚKEY_PASSWORDr   r   r   r   Úgetpass_unicodeé  s    z:ContextTests.test_load_cert_chain.<locals>.getpass_unicodec               S   s   t  ¡ S )N)r”  r  r   r   r   r   Úgetpass_bytesë  s    z8ContextTests.test_load_cert_chain.<locals>.getpass_bytesc               S   s   t t ¡ ƒS )N)rŸ   r”  r  r   r   r   r   Úgetpass_bytearrayí  s    z<ContextTests.test_load_cert_chain.<locals>.getpass_bytearrayc               S   s   dS )Nr’  r   r   r   r   r   Úgetpass_badpassï  s    z:ContextTests.test_load_cert_chain.<locals>.getpass_badpassc               S   s   dd S )Nr“  i   r   r   r   r   r   Úgetpass_hugeñ  s    z7ContextTests.test_load_cert_chain.<locals>.getpass_hugec               S   s   dS )Nr8   r   r   r   r   r   Úgetpass_bad_typeó  s    z;ContextTests.test_load_cert_chain.<locals>.getpass_bad_typec               S   s   t dƒ‚d S )Nzgetpass error)Ú	Exceptionr   r   r   r   Úgetpass_exceptionõ  s    z<ContextTests.test_load_cert_chain.<locals>.getpass_exceptionc               @   s   e Zd Zdd„ Zdd„ ZdS )z:ContextTests.test_load_cert_chain.<locals>.GetPassCallablec             S   s   t S )N)r”  )rŠ   r   r   r   Ú__call__ø  s    zCContextTests.test_load_cert_chain.<locals>.GetPassCallable.__call__c             S   s   t S )N)r”  )rŠ   r   r   r   Úgetpassú  s    zBContextTests.test_load_cert_chain.<locals>.GetPassCallable.getpassN)ri  rj  rk  r  rž  r   r   r   r   ÚGetPassCallable÷  s   rŸ  zmust return a stringzgetpass error)r   rD   rE   rl   r³   rž   r   rí   r   rˆ   r  r  r  rŒ   rW   ÚBADCERTÚ	EMPTYCERTÚONLYCERTÚONLYKEYÚBYTES_ONLYCERTÚBYTES_ONLYKEYrË   ÚCERTFILE_PROTECTEDr”  r  rŸ   ÚONLYKEY_PROTECTEDrG   rž  r›  )rŠ   rH   r  r•  r–  r—  r˜  r™  rš  rœ  rŸ  r   r   r   Útest_load_cert_chainº  sz    z!ContextTests.test_load_cert_chainc          	   C   sä   t  t j¡}| t¡ |jtd d | t¡ |jtd d |  t|j¡ |  t|jd d d ¡ |  t¡}| t	¡ W d Q R X |  
|jjtj¡ |  t jd¡ | t¡ W d Q R X | tt¡ |jttd |  t|jd d¡ d S )N)r+  r   zPEM lib)r   T)r   rD   rE   rk   r³   ÚBYTES_CERTFILErž   r   rí   r   rˆ   r  r  r  rŒ   rW   r   r*  ÚBYTES_CAPATH)rŠ   rH   r  r   r   r   Útest_load_verify_locations  s    

z'ContextTests.test_load_verify_locationsc          	   C   sJ  t tƒ}| ¡ }W d Q R X t |¡}t tƒ}| ¡ }W d Q R X t |¡}t tj¡}|  | 	¡ d d¡ |j
|d |  | 	¡ d d¡ |j
|d |  | 	¡ d d¡ |j
|d |  | 	¡ d d¡ t tj¡}d ||f¡}|j
|d |  | 	¡ d d¡ t tj¡}d|d|d	|d
g}|j
d |¡d |  | 	¡ d d¡ t tj¡}|j
|d |j
|d |  | 	¡ d d¡ |j
|d |  | 	¡ d d¡ t tj¡}d ||f¡}|j
|d |  | 	¡ d d¡ t tj¡}| jt|j
td |  tjd¡ |j
dd W d Q R X |  tjd¡ |j
dd W d Q R X d S )NÚx509_car   )Úcadatar   r@  r°   ÚheadÚotherZagainÚtailó    zno start lineZbrokenznot enough datas   broken)rÊ   rË   r«   r   rÌ   ÚCAFILE_NEURONIOrD   rw   rˆ   Úcert_store_statsrk   r   rž   r   ÚobjectrŒ   rW   )rŠ   r^   Z
cacert_pemZ
cacert_derZneuronio_pemZneuronio_derrH   Zcombinedr   r   r   Útest_load_verify_cadata   sN    




z$ContextTests.test_load_verify_cadatac          	   C   s    t  t j¡}| t¡ tjdkr*| t¡ |  t	|j¡ |  t	|jd ¡ |  t
¡}| t¡ W d Q R X |  |jjtj¡ |  t j¡}| t¡ W d Q R X d S )NÚnt)r   rD   rE   Úload_dh_paramsÚDHFILEr   r   ÚBYTES_DHFILErž   r   ÚFileNotFoundErrorr   rˆ   r  r  r  rW   r³   )rŠ   rH   r  r   r   r   Útest_load_dh_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   )Znumberrþ   Zconnect_goodZconnect_renegotiateÚacceptZaccept_goodZaccept_renegotiateÚhitsÚmissesZtimeoutsZ
cache_full)rp  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   rw   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 )NrM   rV   c             S   s   d S )Nr   )ro   Ú
servernamerH   r   r   r   Údummycallback“  s    z5ContextTests.test_sni_callback.<locals>.dummycallback)r   rD   rE   rž   r   Úset_servername_callback)rŠ   rH   rÅ  r   r   r   Útest_sni_callback‰  s    
zContextTests.test_sni_callbackc             C   sJ   t  t j¡}|fdd„}| |¡ t |¡}~~t ¡  |  |ƒ d ¡ d S )Nc             S   s   d S )Nr   )ro   rÄ  rH   Úcycler   r   r   rÅ    s    z>ContextTests.test_sni_callback_refcycle.<locals>.dummycallback)	r   rD   rE   rÆ  rå   ræ   ÚgcÚcollectr“   )rŠ   rH   rÅ  ré   r   r   r   Útest_sni_callback_refcycle˜  s    

z'ContextTests.test_sni_callback_refcyclec             C   sŽ   t  t j¡}|  | ¡ ddddœ¡ | t¡ |  | ¡ ddddœ¡ | t¡ |  | ¡ ddddœ¡ | t¡ |  | ¡ ddddœ¡ d S )Nr   )r¬  ÚcrlÚx509r   r@  )	r   rD   rw   rˆ   r³  rl   r³   rk   rË   )rŠ   rH   r   r   r   Útest_cert_store_stats¥  s    






z"ContextTests.test_cert_store_statsc             C   s¨   t  t j¡}|  | ¡ g ¡ | t¡ |  | ¡ g ¡ | t¡ |  | ¡ dtdƒtdƒdddddœg¡ t	tƒ}| 
¡ }W d Q R X t  |¡}|  | d¡|g¡ d S )	N)))r   zRoot CA))rÀ   zhttp://www.cacert.org))r   zCA Cert Signing Authority))rÁ   zsupport@cacert.orgzMar 29 12:29:49 2033 GMTzMar 30 12:29:49 2003 GMTZ00)z!https://www.cacert.org/revoke.crlr   )r   r   r    r!   r'   r"   r$   T)r   rD   rw   rˆ   Úget_ca_certsrk   r³   rË   rT   rÊ   r«   rÌ   )rŠ   rH   r^   rÏ   Úderr   r   r   Útest_get_ca_certs³  s"    




zContextTests.test_get_ca_certsc             C   s€   t  t j¡}| ¡  t  t j¡}| t jj¡ | ¡  t  t j¡}| t jj¡ t  t j¡}|  t|jd ¡ |  t|jd¡ d S )NrQ  )	r   rD   rw   Úload_default_certsrP  rQ  rR  rž   r   )rŠ   rH   r   r   r   Útest_load_default_certsÏ  s    z$ContextTests.test_load_default_certsr/  znot-Windows specificz!LibreSSL doesn't support env varsc          	   C   sT   t  t j¡}t ¡ 6}t|d< t|d< | ¡  |  | 	¡ ddddœ¡ W d Q R X d S )Nr'  r(  r   r   )rÌ  rÍ  r¬  )
r   rD   rw   r   r)  r*  r³   rÒ  rˆ   r³  )rŠ   rH   r-  r   r   r   Útest_load_default_certs_envÞ  s    
z(ContextTests.test_load_default_certs_envzWindows specificZgettotalrefcountz3Debug build does not share environment between CRTsc          	   C   sx   t  t j¡}| ¡  | ¡ }t  t j¡}t ¡ >}t|d< t|d< | ¡  |d  d7  < |  	| ¡ |¡ W d Q R X d S )Nr'  r(  rÍ  r   )
r   rD   rw   rÒ  r³  r   r)  r*  r³   rˆ   )rŠ   rH   Ústatsr-  r   r   r   Ú#test_load_default_certs_env_windowsè  s    
z0ContextTests.test_load_default_certs_env_windowsc             C   s‚   |   |jtj@ tj¡ tdkr0|   |jt@ t¡ tdkrJ|   |jt@ t¡ tdkrd|   |jt@ t¡ tdkr~|   |jt@ t¡ d S )Nr   )rˆ   r~  r   r‚   r)   r*   r+   r,   )rŠ   rH   r   r   r   Ú_assert_context_options÷  s    z$ContextTests._assert_context_optionsc          	   C   sÐ   t  ¡ }|  |jt j¡ |  |jt j¡ |  |j¡ |  	|¡ t
tƒ}| ¡ }W d Q R X t jtt|d}|  |jt j¡ |  |jt j¡ |  	|¡ t  t jj¡}|  |jt j¡ |  |jt j¡ |  	|¡ d S )N)r+  r   r­  )r   Úcreate_default_contextrˆ   r”   r‰   rj   r   rÜ   ri   r×  rÊ   rx   r«   r*  rP  rR  rh   )rŠ   rH   r^   r­  r   r   r   Útest_create_default_context  s     


z(ContextTests.test_create_default_contextc             C   sü   t  ¡ }|  |jt j¡ |  |jt j¡ |  |j¡ |  	|¡ t  t j
¡}|  |jt j
¡ |  |jt j¡ |  	|¡ t jt j
t jdd}|  |jt j
¡ |  |jt j¡ |  |j¡ |  	|¡ t jt jjd}|  |jt j¡ |  |jt j¡ |  	|¡ d S )NT)rc   ri   )Zpurpose)r   Z_create_stdlib_contextrˆ   r”   r‰   rj   rh   r  ri   r×  r   r   rÜ   rP  rR  )rŠ   rH   r   r   r   Útest__create_stdlib_context  s(    


z(ContextTests.test__create_stdlib_contextc          	   C   sd  t  t j¡}|  |j¡ |  |jt j¡ d|_|  |j¡ |  |jt j	¡ d|_t j	|_|  |j¡ |  |jt j	¡ d|_t j|_d|_|  |j¡ |  |jt j¡ d|_|  |j¡ |  |jt j	¡ d|_t j
|_d|_|  |j¡ |  |jt j
¡ d|_|  |j¡ |  |jt j
¡ |  t¡ t j|_W d Q R X d|_|  |j¡ t j|_|  |jt j¡ d S )NTF)r   rD   r‰   r  ri   rˆ   rj   rh   rÜ   r   r~   rž   rG   )rŠ   rH   r   r   r   Útest_check_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   rw   rÜ   ri   rˆ   rj   r   rE   r  rh   )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)ri  rj  rk  r   r   r   r   ÚMySSLSocketk  s   rÝ  c               @   s   e Zd ZdS )z;ContextTests.test_context_custom_class.<locals>.MySSLObjectN)ri  rj  rk  r   r   r   r   ÚMySSLObjectn  s   rÞ  T)rý   )r   r   Ú	SSLObjectrD   rE   Zsslsocket_classZsslobject_classrn   rŽ   rÖ   Úwrap_bioÚ	MemoryBIO)rŠ   rÝ  rÞ  rH   ro   rM  r   r   r   Útest_context_custom_classj  s    z&ContextTests.test_context_custom_classN)0ri  rj  rk  rb   rq  rr  ru  rZ   rl  r   rw  ÚskipIfr   r?   r|  r€  r‚  r„  r_   rD   rŠ  rA   r‘  r¨  r«  rµ  r»  rÀ  rÁ  rC   rÃ  Ú	needs_snirÇ  rË  rÎ  rÑ  rÓ  r1   rX   rÛ   rÔ  rÖ  r×  rÙ  rÚ  rÛ  rÜ  râ  r   r   r   r   rn  ø  sF   	
ES:
	+rn  c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚSSLErrorTestsc             C   sX   t  dd¡}|  t|ƒd¡ |  |jd¡ t  dd¡}|  t|ƒd¡ |  |jd¡ d S )Nr   rš   )r   rW   rˆ   r’   r  ZSSLZeroReturnError)rŠ   Úer   r   r   Útest_str}  s    zSSLErrorTests.test_strc          	   C   sn   t  t j¡}|  t j¡}| t¡ W d Q R X |  |jj	d¡ |  |jj
d¡ t|jƒ}|  | d¡|¡ d S )NZPEMZNO_START_LINEz"[PEM: NO_START_LINE] no start line)r   rD   rw   rž   rW   r·  r³   rˆ   r  ZlibraryÚreasonr’   rÜ   rÍ   )rŠ   rH   r  r   r   r   r   Útest_lib_reason‡  s    
zSSLErrorTests.test_lib_reasonc             C   sÎ   t  t j¡}d|_t j|_t ¡ ¢}| d¡ | ¡  t ¡ }| 	| 
¡ ¡ | d¡ |j|dddT}|  t j¡}| ¡  W d Q R X t|jƒ}|  | d¡|¡ |  |jjt j¡ W d Q R X W d Q R X d S )NF)z	127.0.0.1r   )r  z%The operation did not complete (read))r   rD   rw   ri   rh   rj   rŽ   r  r  rþ   r  Úsetblockingrn   rž   ÚSSLWantReadErrorÚdo_handshaker’   r  rÜ   rÍ   rˆ   r  ÚSSL_ERROR_WANT_READ)rŠ   rH   r   r   r  r   r   r   Útest_subclass‘  s    



zSSLErrorTests.test_subclassc          	   C   s–   t  ¡ }|  t¡ |jt  ¡ t  ¡ dd W d Q R X |  t¡ |jt  ¡ t  ¡ dd W d Q R X |  t¡ |jt  ¡ t  ¡ dd W d Q R X d S )NrV   )r  z.example.orgzexample.org evil.com)r   rØ  rž   rG   rà  rá  r   )rŠ   rH   r   r   r   Útest_bad_server_hostname¦  s    z&SSLErrorTests.test_bad_server_hostnameN)ri  rj  rk  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   bazr@  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   foor@  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   rH  r«   )rŠ   rò  rL  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)ri  rj  rk  ró  r÷  rù  rû  rü  r   r   r   r   rð  ³  s
   	rð  c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚSSLObjectTestsc          	   C   s0   t  ¡ }|  td¡ t  ||¡ W d Q R X d S )Nzpublic constructor)r   rá  rŒ   r   rß  )rŠ   rò  r   r   r   r‘   ó  s    z SSLObjectTests.test_private_initc          	   C   s.  t ƒ \}}}t ¡ }t ¡ }t ¡ }t ¡ }|j|||d}|j||dd}	x€tdƒD ]t}
y| ¡  W n tjk
r|   Y nX |jr’| | 	¡ ¡ y|	 ¡  W n tjk
r´   Y nX |jrV| | 	¡ ¡ qVW | ¡  |	 ¡  |  
tj¡ | ¡  W d Q R X | | 	¡ ¡ |	 ¡  | | 	¡ ¡ | ¡  d S )N)r  T)rý   rO   )r|   r   rá  rà  rH  rì  rë  rø  r5   r«   rž   Úunwrap)rŠ   Z
client_ctxZ
server_ctxry   Zc_inZc_outZs_inZs_outÚclientrd  r®   r   r   r   Útest_unwrapø  s8    zSSLObjectTests.test_unwrapN)ri  rj  rk  r‘   r   r   r   r   r   rý  ò  s   rý  c               @   sº   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Z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 )*ÚSimpleBackgroundTestsc             C   s2   t tƒ}t|jf| _| ¡  |  |jd d d ¡ d S )N)ÚThreadedEchoServerrs   rÿ   re  Úserver_addrÚ	__enter__r©   Ú__exit__)rŠ   rd  r   r   r   ÚsetUp%  s    zSimpleBackgroundTests.setUpc          	   C   s˜   t t tj¡tjd.}| | j¡ |  i | ¡ ¡ |  	|j
¡ W d Q R X t t tj¡tjtd,}| | j¡ |  | ¡ ¡ |  	|j
¡ W d Q R X d S )N)rc   )rc   rd   )rr   rŽ   rä   r   rh   rþ   r  rˆ   Úgetpeercertr  rý   r   rx   rÜ   )rŠ   r   r   r   r   Útest_connect+  s    
z"SimpleBackgroundTests.test_connectc             C   s<   t t tj¡tjd}|  |j¡ |  tjd|j	| j
¡ d S )N)rc   zcertificate verify failed)rr   rŽ   rä   r   r   r©   r¦   rŒ   rW   rþ   r  )rŠ   r   r   r   r   Útest_connect_fail:  s
    

z'SimpleBackgroundTests.test_connect_failc             C   sJ   t t tj¡tjtd}|  |j¡ |  d| 	| j
¡¡ |  | ¡ ¡ d S )N)rc   rd   r   )rr   rŽ   rä   r   r   rx   r©   r¦   rˆ   rb  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)rc   rd   r  r   g      @)rr   rŽ   rä   r   r   rx   r©   r¦   rê  rb  r  r€   r  ZEINPROGRESSrc  Úselectrì  rë  ÚSSLWantWriteErrorrÜ   r  )rŠ   r   rf  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 )NZdummy)r  )r   rD   r‰   rn   rŽ   rä   rþ   r  rˆ   r  r   rj   rk   rx   rÜ   )rŠ   rH   r   r  r   r   r   Útest_connect_with_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   rj   rn   rŽ   rä   r©   r¦   rŒ   rW   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   rj   rk   r*  rn   rŽ   rä   rþ   r  r  rÜ   rª  )rŠ   rH   r   r  r   r   r   Útest_connect_capath„  s    z)SimpleBackgroundTests.test_connect_capathc          	   C   sâ   t tƒ}| ¡ }W d Q R X t |¡}t tj¡}tj|_|j	|d | 
t tj¡¡$}| | j¡ | ¡ }|  |¡ W d Q R X t tj¡}tj|_|j	|d | 
t tj¡¡$}| | j¡ | ¡ }|  |¡ W d Q R X d S )N)r­  )rÊ   rx   r«   r   rÌ   rD   r‰   r   rj   rk   rn   rŽ   rä   rþ   r  r  rÜ   )rŠ   r^   rÏ   rÐ  rH   r   r  r   r   r   Útest_connect_cadata›  s"    

z)SimpleBackgroundTests.test_connect_cadatar¶  z*Can't use a socket as a file under Windowsc          	   C   sˆ   t t tj¡ƒ}| | j¡ | ¡ }| ¡ }| ¡  t 	|d¡ | ¡  t
 ¡  |  t¡}t 	|d¡ W d Q R X |  |jjtj¡ d S )Nr   )rr   rŽ   rä   rþ   r  ÚfilenoZmakefiler¦   r   r«   rÉ  rÊ  rž   rí   rˆ   r  r  ZEBADF)rŠ   rè   Úfdr^   ræ  r   r   r   Útest_makefile_close°  s    z)SimpleBackgroundTests.test_makefile_closec             C   sÄ   t   t j¡}| | j¡ | d¡ t|tjdd}|  |j	¡ d}xfy|d7 }| 
¡  P W qD tjk
r€   t |gg g ¡ Y qD tjk
r¤   t g |gg ¡ Y qDX qDW tjrÀtj d| ¡ d S )NF)rc   r  r   r   z9
Needed %d calls to do_handshake() to establish session.
)rŽ   rä   rþ   r  rê  rr   r   rh   r©   r¦   rì  rë  r  r  r   r3   r1   r4   r5   )rŠ   r   Úcountr   r   r   Útest_non_blocking_handshakeÃ  s&    
z1SimpleBackgroundTests.test_non_blocking_handshakec             C   s   t | f| jždtiŽ d S )Nr  )Ú_test_get_server_certificater  rx   )rŠ   r   r   r   Útest_get_server_certificateØ  s    z1SimpleBackgroundTests.test_get_server_certificatec             C   s   t | f| jžŽ  d S )N)Ú!_test_get_server_certificate_failr  )rŠ   r   r   r   Ú test_get_server_certificate_failÛ  s    z6SimpleBackgroundTests.test_get_server_certificate_failc          
   C   s²   t t tj¡tjdd}| | j¡ W d Q R X t t tj¡tjdd}| | j¡ W d Q R X |  tjd¡: t tj¡"}t |tjdd}| | j¡ W d Q R X W d Q R X d S )Nrs  )rc   re   rt  zNo cipher can be selectedz^$:,;?*'dorothyx)	rr   rŽ   rä   r   rh   rþ   r  rŒ   rW   )rŠ   r   ro   r   r   r   ru  à  s    z"SimpleBackgroundTests.test_ciphersc          	   C   s€   t  t j¡}|jtd |  | ¡ g ¡ |jt tj	¡dd$}| 
| j¡ | ¡ }|  |¡ W d Q R X |  t| ¡ ƒd¡ d S )N)r   r   )r  r   )r   rD   rw   rk   r*  rˆ   rÏ  rn   rŽ   rä   rþ   r  r  rÜ   r   )rŠ   rH   r   r  r   r   r   Útest_get_ca_certs_capathî  s    
z.SimpleBackgroundTests.test_get_ca_certs_capathc          	   C   s¨   t  t j¡}|jtd t  t j¡}|jtd t tj¡}|j|ddT}| | j	¡ |  
|j|¡ |  
|jj|¡ ||_|  
|j|¡ |  
|jj|¡ W d Q R X d S )N)r   r   )r  )r   rD   rw   rk   r*  rŽ   rä   rn   rþ   r  r“   rq   Ú_sslobj)rŠ   Zctx1Zctx2r   rè   r   r   r   Útest_context_setgetú  s    z)SimpleBackgroundTests.test_context_setgetc          
   O   sú   |  dd¡}t ¡ | }d}	x¼t ¡ |kr4|  d¡ d }
|	d7 }	y||Ž }W n> tjk
rŠ } z|jtjtjfkrt‚ |j}
W d d }~X Y nX | 	¡ }| 
|¡ |
d krªP q|
tjkr| d¡}|rÎ| |¡ q| ¡  qW tjrötj d|	|jf ¡ |S )Nrû   é
   r   r   i €  z"Needed %d calls to complete %s().
)ÚgetrJ   Z	monotonicr¤   r   rW   r  rí  ZSSL_ERROR_WANT_WRITEr«   Úsendallrî   r5   rö  r   r3   r1   r4   ri  )rŠ   ro   ÚincomingÚoutgoingr]   r[   r\   rû   Zdeadliner  r  Úretræ  Úbufr   r   r   Ússl_io_loop
  s8    




z!SimpleBackgroundTests.ssl_io_loopc             C   s„  t   t j¡}|  |j¡ | | j¡ t ¡ }t ¡ }t tj	¡}|  
|j¡ |  |jtj¡ | t¡ | ||dt¡}|  |jj|¡ |  | ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ |  t|j¡ dtjkrØ|  | d¡¡ |   ||||j!¡ |  
| ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ |  
| ¡ ¡ dtjkr>|  
| d¡¡ y|   ||||j"¡ W n tj#k
rl   Y nX |  tj$|j%d¡ d S )NFz
tls-uniques   foo)&rŽ   rä   r©   r¦   rþ   r  r   rá  rD   rw   rÜ   ri   rˆ   rj   r   rk   rx   rà  rt   r“   r  Úownerr"  Úcipherr$   ÚassertIsNotNoneÚshared_ciphersrž   rG   r  rm  r  r%  rì  rþ  ZSSLSyscallErrorrW   r5   )rŠ   ro   r!  r"  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‰   rh   rj   rà  r%  rì  r5   r«   rˆ   rþ  )rŠ   ro   r!  r"  rH   r*  Zreqr$  r   r   r   Útest_bio_read_write_dataQ  s    z.SimpleBackgroundTests.test_bio_read_write_dataN)ri  rj  rk  r  r  r	  r
  r  r  r  r  r  rZ   rã  r   r   r  r  r  r  ru  r  rä  r  r%  r+  r,  r   r   r   r   r  "  s&   
	%"r  c               @   s*   e Zd Zdd„ Ze ejd¡dd„ ƒZdS )ÚNetworkedTestsc          	   C   s|   t  t¡h tt tj¡tjdd}|  |j	¡ | 
d¡ | tdf¡}|dkrZ|  d¡ |  |tjtjf¡ W d Q R X d S )NF)rc   r  gH¯¼šò×z>i»  r   z!REMOTE_HOST responded too quickly)r   Útransient_internetÚREMOTE_HOSTrr   rŽ   rä   r   r   r©   r¦   rú   rb  r_  r€   r  ZEAGAINrc  )rŠ   r   rf  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   r.  r  r  )rŠ   r   r   r   Ú test_get_server_certificate_ipv6r  s    z/NetworkedTests.test_get_server_certificate_ipv6N)	ri  rj  rk  r0  rZ   rl  r   ZIPV6_ENABLEDr1  r   r   r   r   r-  b  s   r-  c             C   sl   t  ||f¡}|s$|  d||f ¡ t j||f|d}|sL|  d||f ¡ tjrhtj d|||f ¡ d S )NzNo server certificate on %s:%s!)rd   z&
Verified certificate for %s:%s is
%s
)r   Úget_server_certificater¤   r   r3   r1   r4   r5   )Útestr  re  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)rd   z%s
z$Got server certificate %s for %s:%s!)
r   r2  r³   rW   r   r3   r1   r4   r5   r¤   )r3  r  re  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d„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )z$ThreadedEchoServer.ConnectionHandlerc             C   s@   || _ d| _|| _|| _| j d¡ d | _tj | ¡ d| _	d S )NFr   T)
rd  Úrunningro   Úaddrrê  ÚsslconnÚ	threadingÚThreadÚ__init__Údaemon)rŠ   rd  Zconnsockr7  r   r   r   r;  ™  s    z-ThreadedEchoServer.ConnectionHandler.__init__c          
   C   s
  yB| j jj| jdd| _| j j | j ¡ ¡ | j j | j 	¡ ¡ W nÖ t
t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 )%rd  rq   rn   ro   r8  Úselected_npn_protocolsÚappendÚselected_npn_protocolÚselected_alpn_protocolsÚselected_alpn_protocolÚConnectionResetErrorÚBrokenPipeErrorÚconn_errorsr’   Úchattyr7   r$  r7  r6  r¦   r   rW   rí   Ústopr)  rj   r   r  r   r3   r1   r4   r5   r·   r¸   r   r'  )rŠ   ræ  r  Zcert_binaryr'  r   r   r   Ú	wrap_conn£  sD    


z.ThreadedEchoServer.ConnectionHandler.wrap_connc             C   s    | j r| j  ¡ S | j d¡S d S )Ni   )r8  r«   ro   rî   )rŠ   r   r   r   r«   Ù  s    
z)ThreadedEchoServer.ConnectionHandler.readc             C   s"   | j r| j  |¡S | j |¡S d S )N)r8  r5   ro   rò   )rŠ   r7  r   r   r   r5   ß  s    z*ThreadedEchoServer.ConnectionHandler.writec             C   s    | j r| j  ¡  n
| j ¡  d S )N)r8  r¦   ro   )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:
)r6  rd  Ústarttls_serverrG  r«   Ústripr8  rþ  ro   rí   r¦   r   r3   Úconnectionchattyr1   r4   r5   r  r$  r  Úverify_client_post_handshaker   rW   r  r^  rB  rE  rÝ   r7  r7   rF  )rŠ   ÚmsgÚstrippedr¡   ræ  r  Zctyper   r   r   Úrunë  s˜    




*






z(ThreadedEchoServer.ConnectionHandler.runN)	ri  rj  rk  r;  rG  r«   r5   r¦   rO  r   r   r   r   ÚConnectionHandler“  s   
6rP  NTFc             C   sð   |r|| _ n€t |d k	r|ntj¡| _ |d k	r2|ntj| j _|rL| j  |¡ |r\| j  |¡ |rl| j  |¡ |	r|| j  	|	¡ |
rŒ| j  
|
¡ || _|| _|| _t ¡ | _t | j¡| _d | _d| _g | _g | _g | _g | _tj | ¡ d| _d S )NFT)rq   r   rD   rE   rh   rj   rk   rl   Úset_npn_protocolsÚset_alpn_protocolsrm   rE  rK  rI  rŽ   ro   r   ra  re  ÚflagÚactiver=  r@  r)  rD  r9  r:  r;  r<  )rŠ   Zcertificaterp   ÚcertreqsÚcacertsrE  rK  rI  Znpn_protocolsZalpn_protocolsre   rq   r   r   r   r;  G	  s<    


zThreadedEchoServer.__init__c             C   s   |   t ¡ ¡ | j ¡  | S )N)Ústartr9  ÚEventrS  Úwait)rŠ   r   r   r   r  l	  s    
zThreadedEchoServer.__enter__c             G   s   |   ¡  |  ¡  d S )N)rF  r   )rŠ   r[   r   r   r   r  q	  s    zThreadedEchoServer.__exit__c             C   s   || _ tj | ¡ d S )N)rS  r9  r:  rW  )rŠ   rS  r   r   r   rW  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: )ro   rú   r  rT  rS  r5  r¼  r   r3   rE  r1   r4   r5   r$  rP  rW  r   rŽ   rû   ÚKeyboardInterruptrF  r§   r¦   )rŠ   ZnewconnZconnaddrZhandlerræ  r   r   r   rO  y	  s.    


(zThreadedEchoServer.runc             C   s
   d| _ d S )NF)rT  )rŠ   r   r   r   rF  ”	  s    zThreadedEchoServer.stop)NNNNTFFNNNN)N)ri  rj  rk  r9  r:  rP  r;  r  r  rW  rO  rF  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ý   rf   r  )rr   rŽ   ÚasyncoreÚdispatcher_with_sendr;  Ú_ssl_acceptingÚ_do_ssl_handshake)rŠ   Úconnrf   r   r   r   r;  Ÿ	  s    
z8AsyncoreEchoServer.EchoServer.ConnectionHandler.__init__c             C   s.   t | jtjƒr*x| j ¡ dkr(|  ¡  qW dS )Nr   T)r9  rŽ   r   r   rø  Zhandle_read_event)rŠ   r   r   r   Úreadable§	  s    z8AsyncoreEchoServer.EchoServer.ConnectionHandler.readablec          
   C   sœ   y| j  ¡  W n‚ tjtjfk
r*   d S  tjk
rB   |  ¡ S  tjk
rX   ‚ Y n@ tk
r } z|j	d t
jkr€|  ¡ S W d d }~X Y nX d| _d S )Nr   F)rŽ   rì  r   rë  r  ZSSLEOFErrorÚhandle_closerW   rí   r[   r  Z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   r$  r¦   rò   r^  )rŠ   r¡   r   r   r   Úhandle_read¼	  s    


z;AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_readc             C   s$   |   ¡  tjr tj d| j ¡ d S )Nz server:  closed connection %s
)r¦   r   r3   r1   r4   r5   rŽ   )rŠ   r   r   r   rb  È	  s    z<AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_closec              C   s   ‚ d S )Nr   )rŠ   r   r   r   r7   Í	  s    z<AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_errorN)	ri  rj  rk  r;  ra  r_  rd  rb  r7   r   r   r   r   rP  	  s   rP  c             C   s@   || _ t tjtj¡}t |d¡| _tj 	| |¡ |  
d¡ d S )NrV   rO   )rf   rŽ   rä   ZSOCK_STREAMr   ra  re  r\  Ú
dispatcherr;  r  )rŠ   rf   ro   r   r   r   r;  Ð	  s
    z&AsyncoreEchoServer.EchoServer.__init__c             C   s(   t jrtj d| ¡ |  || j¡ d S )Nz$ server:  new connection from %s:%s
)r   r3   r1   r4   r5   rP  rf   )rŠ   Zsock_objr7  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)	ri  rj  rk  r\  r]  rP  r;  rf  r7   r   r   r   r   Ú
EchoServer›	  s   3rg  c             C   s8   d | _ d| _|  |¡| _| jj| _tj | ¡ d| _d S )NFT)	rS  rT  rg  rd  re  r9  r:  r;  r<  )rŠ   rf   r   r   r   r;  ß	  s    
zAsyncoreEchoServer.__init__c             C   s   d| j j| jf S )Nz<%s %s>)Ú	__class__ri  rd  )rŠ   r   r   r   Ú__str__ç	  s    zAsyncoreEchoServer.__str__c             C   s   |   t ¡ ¡ | j ¡  | S )N)rW  r9  rX  rS  rY  )rŠ   r   r   r   r  ê	  s    
zAsyncoreEchoServer.__enter__c             G   sV   t jrtj d¡ |  ¡  t jr,tj d¡ |  ¡  t jrFtj d¡ tjdd d S )Nz cleanup: stopping server.
z! cleanup: joining server thread.
z cleanup: successfully joined.
T)Z
ignore_all)	r   r3   r1   r4   r5   rF  r   r\  Z	close_all)rŠ   r[   r   r   r   r  ï	  s    zAsyncoreEchoServer.__exit__Nc             C   s   || _ tj | ¡ d S )N)rS  r9  r:  rW  )rŠ   rS  r   r   r   rW  û	  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   )rT  rS  r5  r\  Zloop)rŠ   r   r   r   rO  ÿ	  s    
zAsyncoreEchoServer.runc             C   s   d| _ | j ¡  d S )NF)rT  rd  r¦   )rŠ   r   r   r   rF  	
  s    zAsyncoreEchoServer.stop)N)ri  rj  rk  r\  re  rg  r;  ri  r  r  rW  rO  rF  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 )NF)rq   rE  rK  )r  Úsessionz client:  sending %r...
z client:  read %r
z4bad data <<%r>> (%d) received; expected <<%r>> (%d)
é   s   over
z client:  closing connection.
)Úcompressionr'  ÚpeercertÚclient_alpn_protocolÚclient_npn_protocolr$   Úsession_reusedrk  Úserver_alpn_protocolsÚserver_npn_protocolsÚserver_shared_ciphers)r  rn   rŽ   rþ   rÿ   re  rŸ   rú  r   r3   r1   r4   r5   r«   r^  ÚAssertionErrorr   r:  rm  r'  r  rA  r?  r$   rq  rk  r¦   r@  r=  r)  )rz   r{   ÚindatarE  rK  Úsni_namerk  rÕ  rd  r   ÚargÚoutdatar   r   r   Úserver_params_test
  sR    


 


rz  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 )Nrh   r~   r   z %s->%s %s
z {%s->%s} %s
r…  rs  F)rE  rK  z5Client protocol %s succeeded with server protocol %s!Tr$   z%version mismatch: expected %r, got %r)r   rh   r~   r   r   r3   r1   r4   r5   Zget_protocol_namerD   r~  ÚPROTOCOL_TO_TLS_VERSIONr  r_   r‰   r…  r”   rm   rj   rl   rs   rk   rx   rz  rW   rí   r  Ú
ECONNRESETru  )Zserver_protocolZclient_protocolÚexpect_successZ	certsreqsÚserver_optionsÚclient_optionsZcerttypeZ	formatstrrz   r{   Zmin_versionrH   rÕ  ræ  r   r   r   Útry_protocol_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 )
Nr°   )r”   T)rE  rK  )rÿ  rd  )rz   r{   rE  rK  rw  Fz%called a function you should not call)rz   r{   rE  rK  )r   r3   r1   r4   r5   rp  r   rw   rE   ZsubTestÚ_PROTOCOL_NAMESrD   rl   r³   rz  r|   ri   rž   rW   r€   r’   r  )rŠ   r”   rq   rz   r{   ry   ræ  r   r   r   Ú	test_echoˆ
  sN    


zThreadedTests.test_echoc       
      C   s\  t jrtj d¡ tƒ \}}}t|dd}|" |jt ¡ d|d }| 	t
|jf¡ |  t¡ | ¡  W d Q R X | ¡  | ¡ }|  |d¡ | ¡ }t jrÐtj t |¡d ¡ tj dt|ƒ d ¡ d|krì|  d	t |¡ ¡ d
|d kr|  d¡ |  d|¡ |  d|¡ t |d ¡}t |d ¡}	|  ||	¡ W d Q R X W d Q R X d S )Nr°   F)rq   rE  )r  r  zCan't get peer certificate.zConnection cipher is z.
r"   z$No subject field in certificate: %s.))r   zPython Software FoundationzkMissing or invalid 'organizationName' field in certificate subject; should be 'Python Software Foundation'.r    r   )r   r3   r1   r4   r5   r|   r  rn   rŽ   rþ   rÿ   re  rž   rG   r  rì  rÜ   r'  r·   r¸   r’   r¤   r€   r   rU  rÚ   )
rŠ   rz   r{   ry   rd  r   r  r'  ZbeforeZafterr   r   r   Útest_getpeercert¸
  s<    
zThreadedTests.test_getpeercertz!verify_flags need OpenSSL > 0.9.8c             C   s|  t jrtj d¡ tƒ \}}}ttddƒ}|  |j	tj
|B ¡ t|dd}|H |jt ¡ |d*}| t|jf¡ | ¡ }|  |d¡ W d Q R X W d Q R X | j	tjO  _	t|dd}|N |jt ¡ |d0}|  tjd¡ | t|jf¡ W d Q R X W d Q R X W d Q R X | t¡ t|dd}|H |jt ¡ |d*}| t|jf¡ | ¡ }|  |d¡ W d Q R X W d Q R X d S )	Nr°   r‹  r   T)rq   rE  )r  zCan't get peer certificate.zcertificate verify failed)r   r3   r1   r4   r5   r|   rŒ  r   rˆ   r  rŽ  r  rn   rŽ   rþ   rÿ   re  r  rÜ   r  rŒ   rW   rk   ÚCRLFILE)rŠ   rz   r{   ry   r  rd  r   r  r   r   r   Útest_crl_checkÜ
  s8    

 

.


zThreadedTests.test_crl_checkc             C   s6  t jrtj d¡ tƒ \}}}t|dd}|H |jt ¡ |d*}| 	t
|jf¡ | ¡ }|  |d¡ W d Q R X W d Q R X t|dd}|N |jt ¡ dd0}|  tjd¡ | 	t
|jf¡ W d Q R X W d Q R X W d Q R X t|dd}|< t ¡ (}|  td¡ | |¡ W d Q R X W d Q R X W d Q R X d S )	Nr°   T)rq   rE  )r  zCan't get peer certificate.r  z:Hostname mismatch, certificate is not valid for 'invalid'.z'check_hostname requires server_hostname)r   r3   r1   r4   r5   r|   r  rn   rŽ   rþ   rÿ   re  r  rÜ   rŒ   r   r  rG   )rŠ   rz   r{   ry   rd  r   r  r   r   r   rÛ    s0    

 

.
z!ThreadedTests.test_check_hostnamec          
   C   sÂ   t  t j¡}| t¡ | d¡ t}t  t j¡}| t	¡ t
|dd}|n |jt ¡ |dP}| t|jf¡ | ¡ }|  |d¡ | ¡ d  d¡}|  |d d… d	¡ W d Q R X W d Q R X d S )
NzECDHE:ECDSA:!NULL:!aRSAT)rq   rE  )r  zCan't get peer certificate.r   ú-r@  )ÚECDHEÚECDSA)r   rD   rw   rk   rx   rm   ÚSIGNED_CERTFILE_ECC_HOSTNAMErE   rl   ÚSIGNED_CERTFILE_ECCr  rn   rŽ   rþ   rÿ   re  r  rÜ   r'  Úsplit)rŠ   rz   ry   r{   rd  r   r  r'  r   r   r   Útest_ecc_cert'  s    




zThreadedTests.test_ecc_certc          
   C   sÜ   t  t j¡}| t¡ | jt jO  _| d¡ t}t  t j	¡}| 
t¡ | 
t¡ t|dd}|n |jt ¡ |dP}| t|jf¡ | ¡ }|  |d¡ | ¡ d  d¡}|  |d d… d	¡ W d Q R X W d Q R X d S )
NzECDHE:ECDSA:!NULL:!aRSAT)rq   rE  )r  zCan't get peer certificate.r   r‡  r@  )rˆ  r‰  )r   rD   rw   rk   rx   r~  r…   rm   rŠ  rE   rl   r‹  rs   r  rn   rŽ   rþ   rÿ   re  r  rÜ   r'  rŒ  )rŠ   rz   ry   r{   rd  r   r  r'  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)rq   rE  )r  zCan't get peer certificate.zpython.example.org)r   r3   r1   r4   r5   r   rD   rE   rl   ÚIDNSANSFILErw   r   rj   ri   rk   rx   r  rn   rŽ   rˆ   r  rþ   rÿ   re  r  rÜ   rž   r  )	rŠ   r{   rq   Zidn_hostnamesr  Zexpected_hostnamerd  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 )NT)rq   rE  rK  )r  z
SSLError is %r
z
socket.error is %r
z'Use of invalid cert should have failed!)r|   rl   r³   r   r   rj   r†  r‡  rˆ  r  rn   rŽ   rþ   rÿ   re  rW   r   r3   r1   r4   r5   rí   r  r|  r¤   )rŠ   rz   r{   ry   rd  r   ræ  r   r   r   Útest_wrong_cert_tls12Ž  s(    



 "z#ThreadedTests.test_wrong_cert_tls12zTest needs TLS 1.3c             C   s&  t ƒ \}}}| t¡ tj|_tjj|_tjj|_t	|ddd}|Ø |j
t ¡ |dº}| t|jf¡ y| d¡ | d¡ W n€ tjk
r¼ } ztjr¬tj d| ¡ W d d }~X Y nR tk
r } z(|jtjkrÜ‚ tjròtj d| ¡ W d d }~X Y nX |  d¡ W d Q R X W d Q R X d S )	NT)rq   rE  rK  )r  s   datarM   z
SSLError is %r
z
socket.error is %r
z'Use of invalid cert should have failed!)r|   rl   r³   r   r   rj   r†  r‰  r…  r  rn   rŽ   rþ   rÿ   re  r5   r«   rW   r   r3   r1   r4   rí   r  r|  r¤   )rŠ   rz   r{   ry   rd  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 )Nc                 s8   ˆ  ¡  ˆ ¡  ˆ ¡ \} }|  ¡  ˆ ¡  ˆ  ¡  d S )N)r  r5  r¼  r¦   )Znewsockr7  )Ú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)rY  rŽ   rþ   rÿ   rr   rí   r¤   )r   Ússl_sock)r“  r”  re  rŠ   r   r   Ú	connectorè  s    
z3ThreadedTests.test_rude_shutdown.<locals>.connector)Útarget)	r9  rX  rŽ   r   ra  rÿ   r:  rW  r   )rŠ   r•  r—  rà   r   )r“  r”  re  r   rŠ   r   Útest_rude_shutdownÒ  s    
z ThreadedTests.test_rude_shutdownc             C   sú   t jrtj d¡ t tj¡}| t	¡ t tj
¡}t|dd}|¬ |jt ¡ tdŽ}y| t|jf¡ W nr tjk
rà } zRd}|  |tj¡ |  |jd¡ |  |j|¡ |  |t|ƒ¡ |  dt|ƒ¡ W d d }~X Y nX W d Q R X W d Q R X d S )Nr°   T)rq   rE  )r  z&unable to get local issuer certificaterl  zcertificate verify failed)r   r3   r1   r4   r5   r   rD   rE   rl   rs   rw   r  rn   rŽ   rt   rþ   rÿ   re  rW   rÖ   ZSSLCertVerificationErrorrˆ   Zverify_codeZverify_messager€   r$  )rŠ   r{   rq   rd  r   ræ  rM  r   r   r   Útest_ssl_cert_verify_errorû  s$    


z(ThreadedTests.test_ssl_cert_verify_errorrU   z)OpenSSL is compiled without SSLv2 supportc             C   sÐ   t jrtj d¡ ttjtjdƒ ttjtjdtjƒ ttjtjdtj	ƒ ttjtj
dƒ ttdƒrtttjtjdƒ ttjtjdƒ tƒ r ttjtj
dtjd ttjtj
dtjd ttjtj
dtjd d S )Nr°   TFÚPROTOCOL_SSLv3)r  )r   r3   r1   r4   r5   r€  r   rU   r~   r   r‰   r_   r›  r   r@   r‚   rƒ   r„   )rŠ   r   r   r   Útest_protocol_sslv2  s     


z!ThreadedTests.test_protocol_sslv2c          
   C   sŽ  t jrtj d¡ ttdƒrnyttjtj	dƒ W n< t
k
rl } zt jr\tj dt|ƒ ¡ W d d }~X Y nX ttdƒrˆttjtjdƒ ttjtjdƒ ttjtjdƒ ttdƒrÆttjtjdtjƒ ttjtjdtjƒ ttjtjdtjƒ ttdƒrttjtjdtjƒ ttjtjdtjƒ ttjtjdtjƒ ttdƒrXttjtjdtjd ttjtjdtjtjB d ttjtjdtjd d S )	Nr°   rU   Tz; SSL2 client to SSL23 server test unexpectedly failed:
 %s
r›  Fr	   )r~  )r   r3   r1   r4   r5   r_   r   r€  r‰   rU   rí   r’   r›  r   r~   r   rƒ   r‚   r„   )rŠ   r4  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 )Nr°   r   rU   F)r  )r   r3   r1   r4   r5   r€  r   r›  r~   r   r_   rU   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 )Nr°   r	   rU   Fr›  )r  )r   r3   r1   r4   r5   r€  r   r   r~   r   r_   rU   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 )Nr°   zTLSv1.1rU   Fr›  )r  )r   r3   r1   r4   r5   r€  r   r
   r_   rU   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 )Nr°   zTLSv1.2)r~  r  rU   Fr›  )r  )r   r3   r1   r4   r5   r€  r   r¡  rƒ   r‚   r_   rU   r›  r‰   r‡   r   r
   )rŠ   r   r   r   Útest_protocol_tlsv1_2‰  s     



z#ThreadedTests.test_protocol_tlsv1_2c       	   	   C   sŽ  d}t tdddd}d}|f t ¡ }| d¡ | t|jf¡ tjrTt	j
 d¡ xâ|D ]Ú}tjrtt	j
 d| ¡ |rŒ| |¡ | ¡ }n| |¡ | d¡}| ¡  ¡ }|d	krâ| d
¡râtjrÔt	j
 d| ¡ t|ƒ}d}qZ|dkr| d
¡rtjrt	j
 d| ¡ | ¡ }d}qZtjrZt	j
 d| ¡ qZW tjrLt	j
 d¡ |r^| d¡ n
| d¡ |rx| ¡  n| ¡  W d Q R X d S )N)s   msg 1s   MSG 2s   STARTTLSs   MSG 3s   msg 4s   ENDTLSs   msg 5s   msg 6T)rI  rE  rK  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
)r  r³   rŽ   rê  rþ   rÿ   re  r   r3   r1   r4   r5   r«   rò   rî   rJ  r^  rÍ   rr   rþ  r¦   )	rŠ   Zmsgsrd  Úwrappedr   rv  r`  ry  rM  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 )N)rf   r°   ÚrbrV   zhttps://localhost:%d/%sr   )r+  )rq   zcontent-lengthr   z/ client: read %d bytes from remote server '%s'
)r5  rs   r   r3   r1   r4   r5   rÊ   r³   r«   re  r   r   rŒ  r   rØ  rx   ÚurllibZrequestZurlopenÚinfor  r×   r   r¦   rˆ   )rŠ   rd  r^   rÐ   rÑ   Zurlrq   Zdlenr   r   r   Útest_socketserverÚ  s(    
zThreadedTests.test_socketserverc          	   C   s   t jrtj d¡ d}ttƒ}|Ô tt ¡ ƒ}| 	d|j
f¡ t jrVtj d| ¡ | |¡ | ¡ }t jr~tj d| ¡ || ¡ kr¼|  d|d d… t|ƒ|d d…  ¡ t|ƒf ¡ | d¡ t jrØtj d	¡ | ¡  t jròtj d
¡ W d Q R X d S )Nr°   s   FOO
z	127.0.0.1z client:  sending %r...
z client:  read %r
z4bad data <<%r>> (%d) received; expected <<%r>> (%d)
rl  s   over
z client:  closing connection.
z client:  connection closed.
)r   r3   r1   r4   r5   r[  r³   rr   rŽ   rþ   re  r«   r^  r¤   r   r¦   )rŠ   rv  rd  r   ry  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 )%Nr°   TF)rU  rp   rV  rE  rK  )rý   rf   rd   rc   rp   c                 s   t dƒ} ˆ  | ¡}| d |… S )Nsd                                                                                                       )rŸ   rï   )Úbr  )r   r   r   Ú
_recv_into%  s    
z0ThreadedTests.test_recv_send.<locals>._recv_intoc                 s"   t dƒ} ˆ  | ¡\}}| d |… S )Nsd                                                                                                       )rŸ   rñ   )rª  r  r7  )r   r   r   Ú_recvfrom_into*  s    z4ThreadedTests.test_recv_send.<locals>._recvfrom_intorò   ró   zsome.addressr   c             S   s   d S )Nr   )r4  r   r   r   Ú<lambda>3  r±  z.ThreadedTests.test_recv_send.<locals>.<lambda>rî   rð   rï   rñ   ZPREFIX_r  zsending with {})rM  zpWhile sending with <<{name:s}>> bad data <<{outdata:r}>> ({nout:d}) received; expected <<{indata:r}>> ({nin:d})
rl  )r   ry  Znoutrv  Zninz>Failed to send with method <<{name:s}>>; expected to succeed.
)r   zFMethod <<{name:s}>> failed with unexpected exception message: {exp:s}
)r   ZexpzrWhile receiving with <<{name:s}>> bad data <<{outdata:r}>> ({nout:d}) received; expected <<{indata:r}>> ({nin:d})
zAFailed to receive with method <<{name:s}>>; expected to succeed.
s   datarC  rì   s   over
)*r   r3   r1   r4   r5   r  r³   r   rh   rE   rr   rŽ   rw   rþ   rÿ   re  rò   r   ró   r   rî   rð   r  rÝ   rˆ   r«   r^  r¤   rG   r’   rÍ   rŸ   ÚctypesZc_ubyteZfrom_buffer_copyrž   rô   rõ   rö   r÷   rø   r¦   )rŠ   rd  r«  r¬  Zsend_methodsZrecv_methodsZdata_prefixZ	meth_nameZ	send_methr}  r[   Zret_val_methrv  r#  rM  ry  ræ  Z	recv_methr¡   ÚbufferZubyteZ	bytesliker   )r   r   Útest_recv_send  s²    



"

 




zThreadedTests.test_recv_sendc             C   sÆ   t tƒ}| ¡  |  |jd d ¡ t t|jf¡}|  |j	¡ t
|dd}|  |j	¡ | d¡ |  | d¡d¡ |  | d¡d¡ |  | ¡ d¡ | d¡ |  | d¡d¡ |  | tƒ ¡d¡ d S )NF)Zsuppress_ragged_eofss   datar   r±  )r  r³   r  r©   r  rŽ   Zcreate_connectionrÿ   re  r¦   rr   rò   rˆ   rî   r«   rê  rï   rŸ   )rŠ   rd  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)rU  rp   rV  rE  rK  )rý   rf   rd   rc   rp   i    c                  s   xˆ  ˆ ¡ qW d S )N)rò   r   )r$  r   r   r   Úfill_bufferÂ  s    z8ThreadedTests.test_nonblocking_send.<locals>.fill_buffer)r  r³   r   rh   rE   rr   rŽ   rw   rþ   rÿ   re  rê  rŸ   rž   r  rë  r¦   )rŠ   rd  r²  r   )r$  r   r   Útest_nonblocking_send®  s*    


z#ThreadedTests.test_nonblocking_sendc                sþ   t   t j¡‰d}t ˆ¡}t ¡ ‰d‰ ‡ ‡‡fdd„}tj|d}| ¡  ˆ ¡  zz:t   t j¡}| 	d¡ | 
||f¡ |  t jdt|¡ W d | ¡  X z:t   t j¡}t|ƒ}| 	d¡ |  t jd|j
||f¡ W d | ¡  X W d d‰ | ¡  ˆ ¡  X d S )	Nz	127.0.0.1Fc                 sj   ˆ  ¡  ˆ ¡  g } x:ˆ sNt ˆgg g d¡\}}}ˆ|kr|  ˆ ¡ d ¡ qW x| D ]}| ¡  qVW d S )Ngš™™™™™¹?r   )r  r5  r  r>  r¼  r¦   )ZconnsrÉ   Úwræ  ro   )Úfinishrd  Ústartedr   r   ÚserveÔ  s    
z3ThreadedTests.test_handshake_timeout.<locals>.serve)r˜  gš™™™™™É?z	timed outT)rŽ   rä   r   ra  r9  rX  r:  rW  rY  rú   rþ   rŒ   rû   rr   r¦   r   )rŠ   r  re  r·  rà   r   r   )rµ  rd  r¶  r   Útest_handshake_timeoutÌ  s6    





z$ThreadedTests.test_handshake_timeoutc                s  t  t j¡}t j|_| t¡ | t¡ t	 	t	j
¡‰d}t ˆ¡}|jˆdd‰|  ˆj¡ t ¡ ‰ d ‰d ‰‡ ‡‡‡fdd„}tj|d}| ¡  ˆ  ¡  | t	 	¡ ¡}| ||f¡ | d¡ | ¡  | ¡ }| ¡  | ¡  ˆ ¡  ˆ ¡  |  ˆt j¡ |  ˆ|¡ d S )Nz	127.0.0.1T)rý   c                  s0   ˆ  ¡  ˆ  ¡  ˆ ¡ \‰‰ˆ ˆ d¡¡ d S )NrM   )r  r5  r¼  rò   rî   r   )ÚevtÚpeerÚremoterd  r   r   r·    s    z/ThreadedTests.test_server_accept.<locals>.serve)r˜  s   data)r   rD   r‰   r   rj   rk   rx   rl   rs   rŽ   rä   r   ra  rn   rÜ   rý   r9  rX  r:  rW  rY  rþ   rò   rî   r  r¦   r   rÖ   r   rˆ   )rŠ   rq   r  re  r·  rà   rÿ  Zclient_addrr   )r¹  rº  r»  rd  r   Útest_server_acceptý  s6    



z ThreadedTests.test_server_acceptc          
   C   sZ   t  t j¡}| t ¡ ¡6}|  t¡}| ¡  W d Q R X |  |j	j
t
j¡ W d Q R X d S )N)r   rD   r‰   rn   rŽ   rž   rí   r  rˆ   r  r  ÚENOTCONN)rŠ   rq   ro   r  r   r   r   Útest_getpeercert_enotconn&  s
    z'ThreadedTests.test_getpeercert_enotconnc          
   C   sZ   t  t j¡}| t ¡ ¡6}|  t¡}| ¡  W d Q R X |  |j	j
t
j¡ W d Q R X d S )N)r   rD   r‰   rn   rŽ   rž   rí   rì  rˆ   r  r  r½  )rŠ   rq   ro   r  r   r   r   Útest_do_handshake_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)rq   )r  zno shared cipherr   )r|   r~  r   r…   rm   r  rn   rŽ   rž   rí   rþ   rÿ   re  r€   rD  )rŠ   rz   r{   ry   rd  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 )NF)rp   rE  zTLSv1.3)r   r   r@  zTLSv1.2)r	   zTLSv1.2)r   rD   rw   ri   rh   rj   r  r³   rE   rn   rŽ   r“   r$   r  rþ   rÿ   re  ÚIS_OPENSSL_1_1_1ÚHAS_TLSv1_3rˆ   r?   r€   )rŠ   rq   rd  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)rq   r   ZTLS_AES_256_GCM_SHA384ZTLS_CHACHA20_POLY1305_SHA256ZTLS_AES_128_GCM_SHA256zTLSv1.3)r   rD   r‰   rl   r³   r~  r„   r†   r‡   r  rn   rŽ   rþ   rÿ   re  r€   r'  rˆ   r$   )rŠ   rq   rd  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)rq   )r  zTLSv1.2zTLSv1.1Zalert)r|   r   r†  r	   r…  r‡  rˆ  r  rn   rŽ   rþ   rÿ   re  rˆ   r$   r   rž   rW   r€   r’   r  )rŠ   rz   r{   ry   rd  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)rq   )r  r   )r|   r   r†  r   r…  rˆ  r  rn   rŽ   rþ   rÿ   re  rˆ   r$   )rŠ   rz   r{   ry   rd  r   r   r   r   Útest_min_max_version_sslv3”  s    




z(ThreadedTests.test_min_max_version_sslv3z"test requires ECDH-enabled OpenSSLc          
   C   s’   t  t j¡}| t¡ | jt jO  _t jdk r:| d¡ t	|dD}| 
t ¡ ¡*}| t|jf¡ |  d| ¡ d ¡ W d Q R X W d Q R X d S )N)r   r   r   zECCdraft:ECDH)rq   ZECDHr   )r   rD   r‰   rl   r³   r~  r…   r?   rm   r  rn   rŽ   rþ   rÿ   re  r€   r'  )rŠ   rq   rd  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 )Nr°   TF)rq   rE  rK  )r  z
tls-uniquez! got channel binding data: {0!r}
zTLSv1.3é0   é   s   CB tls-unique
zus-asciiz(got another channel binding data: {0!r}
)r   r3   r1   r4   r5   r|   r  rn   rŽ   rþ   rÿ   re  r  rÝ   r(  r$   rˆ   r   r«   rJ  r$  r  r¬   )	rŠ   rz   r{   ry   rd  r   Zcb_dataZpeer_data_reprZnew_cb_datar   r   r   r#  ¶  sR    







z-ThreadedTests.test_tls_unique_channel_bindingc             C   sT   t ƒ \}}}t||dd|d}tjr:tj d |d ¡¡ |  |d d ddh¡ d S )NT)rE  rK  rw  z got compression: {!r}
rm  ZZLIBZRLE)	r|   rz  r   r3   r1   r4   r5   rÝ   r€   )rŠ   rz   r{   ry   rÕ  r   r   r   Útest_compressionò  s    zThreadedTests.test_compressionr)   z*ssl.OP_NO_COMPRESSION needed for this testc             C   sR   t ƒ \}}}| jtjO  _| jtjO  _t||dd|d}|  |d d ¡ d S )NT)rE  rK  rw  rm  )r|   r~  r   r)   rz  r“   )rŠ   rz   r{   ry   rÕ  r   r   r   Útest_compression_disabledû  s    z'ThreadedTests.test_compression_disabledc             C   s–   t ƒ \}}}| jtjO  _| t¡ | d¡ | jtjO  _t||dd|d}|d d }| d¡}d|kr’d|kr’d	|kr’|  	d
|d  ¡ d S )NZkEDHT)rE  rK  rw  r'  r   r‡  ZADHZEDHZDHEzNon-DH cipher: )
r|   r~  r   r…   r·  r¸  rm   rz  rŒ  r¤   )rŠ   rz   r{   ry   rÕ  r'  Úpartsr   r   r   Útest_dh_params  s    


zThreadedTests.test_dh_paramszneeds secp384r1 curve supportz TODO: Test doesn't work on 1.1.1c             C   s  t ƒ \}}}| d¡ | d¡ | jtjtjB O  _t||dd|d}t ƒ \}}}| d¡ | d¡ | jtjtjB O  _t||dd|d}t ƒ \}}}| d¡ | d¡ | d¡ | jtjtjB O  _yt||dd|d}W n tjk
rü   Y nX t	r|  
d¡ d S )NrB   zECDHE:!eNULL:!aNULLT)rE  rK  rw  rÂ  zmismatch curve did not fail)r|   rF   rm   r~  r   r„   r†   rz  rW   ÚIS_OPENSSL_1_1_0r¤   )rŠ   rz   r{   ry   rÕ  r   r   r   Útest_ecdh_curve  s6    






zThreadedTests.test_ecdh_curvec             C   s2   t ƒ \}}}t||dd|d}|  |d d ¡ d S )NT)rE  rK  rw  ro  )r|   rz  r“   )rŠ   rz   r{   ry   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)rE  rK  rw  ro  )r|   rR  rz  r“   )rŠ   rz   r{   ry   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)rE  rK  rw  )r   r   r   r&  zKfailed trying %s (s) and %s (c).
was expecting %s, but got %%s from the %%sro  rÿ  rr  rC  Únothingrd  )r|   rR  rz  r   rW   rÎ  r?   rÖ   r’   rˆ   r   )rŠ   Úserver_protocolsÚprotocol_testsÚclient_protocolsrJ  rz   r{   ry   rÕ  ræ  rM  Ú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)rE  rK  rw  rp  )r|   rz  r“   )rŠ   rz   r{   ry   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/2r3  ÚabcÚdefT)rE  rK  rw  zKfailed trying %s (s) and %s (c).
was expecting %s, but got %%s from the %%srp  rÿ  rs  rC  rÓ  rd  )r|   rQ  rz  r’   rˆ   r   )rŠ   rÔ  rÕ  rÖ  rJ  rz   r{   ry   rÕ  rM  r×  rØ  r   r   r   Útest_npn_protocols  s&    




z ThreadedTests.test_npn_protocolsc             C   sL   t  t j¡}| t¡ t  t j¡}| t¡ t  t j¡}| t¡ |||fS )N)	r   rD   rE   rl   rs   ru   rw   rk   rx   )rŠ   r{   Úother_contextrz   r   r   r   Úsni_contexts™  s    


zThreadedTests.sni_contextsc             C   s"   |d }|   d|ff|d ¡ d S )Nrn  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)r>  rq   )r–  Úserver_nameÚinitial_context)ÚcallsrÞ  r   r   Úservername_cb­  s    z6ThreadedTests.test_sni_callback.<locals>.servername_cbTÚsupermessage)rE  rw  r(   Znotfunny)rß  ri   rÆ  rz  rˆ   rà  rt   )rŠ   r{   rz   rä  rÕ  r   )rã  rÞ  r   rÇ  ¦  s.    

zThreadedTests.test_sni_callbackc          	   C   s\   |   ¡ \}}}dd„ }| |¡ |  tj¡}t||ddd}W d Q R X |  |jjd¡ d S )Nc             S   s   t jS )N)r   ZALERT_DESCRIPTION_ACCESS_DENIED)r–  rá  râ  r   r   r   Úcb_returning_alertÔ  s    zAThreadedTests.test_sni_callback_alert.<locals>.cb_returning_alertFrå  )rE  rw  ZTLSV1_ALERT_ACCESS_DENIED)	rß  rÆ  rž   r   rW   rz  rˆ   r  rè  )rŠ   r{   rÞ  rz   ræ  r  rÕ  r   r   r   Útest_sni_callback_alertÏ  s    
z%ThreadedTests.test_sni_callback_alertc          
   C   s€   |   ¡ \}}}dd„ }| |¡ |  tj¡*}t ¡ }t||ddd}W d Q R X W d Q R X |  |j	j
d¡ |  d| ¡ ¡ d S )Nc             S   s   dd  d S )Nr   r   r   )r–  rá  râ  r   r   r   Ú
cb_raisingâ  s    z;ThreadedTests.test_sni_callback_raising.<locals>.cb_raisingFrå  )rE  rw  ZSSLV3_ALERT_HANDSHAKE_FAILUREÚZeroDivisionError)rß  rÆ  rž   r   rW   r   Úcaptured_stderrrz  rˆ   r  rè  r€   Úgetvalue)rŠ   r{   rÞ  rz   rè  r  ÚstderrrÕ  r   r   r   Útest_sni_callback_raisingÝ  s    

z'ThreadedTests.test_sni_callback_raisingc          
   C   s€   |   ¡ \}}}dd„ }| |¡ |  tj¡*}t ¡ }t||ddd}W d Q R X W d Q R X |  |j	j
d¡ |  d| ¡ ¡ d S )Nc             S   s   dS )Nrš   r   )r–  rá  râ  r   r   r   Úcb_wrong_return_typeô  s    zOThreadedTests.test_sni_callback_wrong_return_type.<locals>.cb_wrong_return_typeFrå  )rE  rw  ZTLSV1_ALERT_INTERNAL_ERRORr   )rß  rÆ  rž   r   rW   r   rê  rz  rˆ   r  rè  r€   rë  )rŠ   r{   rÞ  rz   rî  r  rì  rÕ  r   r   r   Ú#test_sni_callback_wrong_return_typeî  s    

z1ThreadedTests.test_sni_callback_wrong_return_typec       	         sŽ   t ƒ \}}}| d¡ | d¡ ddddg}t|||d}|d d }|  t|ƒd¡ x2|D ]*\‰ }}t‡ fd	d
„|D ƒƒs\|  ˆ ¡ q\W d S )NzAES128:AES256rÀ  zAES-256ZTLS_CHACHA20ZTLS_AES)rw  rt  r   c             3   s   | ]}|ˆ kV  qd S )Nr   )rx  Zalg)r   r   r   rz    s    z4ThreadedTests.test_shared_ciphers.<locals>.<genexpr>)r|   rm   rz  ÚassertGreaterr   Úanyr¤   )	rŠ   rz   r{   ry   Zexpected_algsrÕ  re   Ztls_versionÚbitsr   )r   r   Útest_shared_ciphers   s    

z!ThreadedTests.test_shared_ciphersc          	   C   sv   t ƒ \}}}t|dd}|P |jt ¡ |d}| t|jf¡ | ¡  |  t	|j
d¡ |  t	|jd¡ W d Q R X d S )NF)rq   rE  )r  i   s   hello)r|   r  rn   rŽ   rþ   rÿ   re  r¦   rž   rG   r«   r5   )rŠ   rz   r{   ry   rd  r   r   r   r   Ú,test_read_write_after_close_raises_valuerror  s    
z:ThreadedTests.test_read_write_after_close_raises_valuerrorc             C   sÜ   d}t tjdƒ}| |¡ W d Q R X |  tjtj¡ t tj¡}tj	|_
| t¡ | t¡ t|dd}|d | t ¡ ¡J}| t|jf¡ t tjdƒ"}| |¡ |  | d¡|¡ W d Q R X W d Q R X W d Q R X d S )Ns   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxÚwbF)rq   rE  r¥  i   )rÊ   r   ZTESTFNr5   r©   Úunlinkr   rD   r‰   r   rj   rk   rx   rl   rs   r  rn   rŽ   rþ   rÿ   re  Zsendfilerˆ   rî   )rŠ   Z	TEST_DATAr^   rq   rd  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)rw  rk  r   )r   r   r   rq  r¼  r   r½  )rk  rw  r@  r   rM   )r|   r~  r   r…   rz  rÜ   Úidrð  rJ   rû   Z
has_ticketr?   Zticket_lifetime_hintr  r¿  rˆ   ZassertIsNotrÙ   r¬   )
rŠ   rz   r{   ry   rÕ  rk  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)rq   rE  )r  zValue is not a SSLSession.z#Cannot set session after handshake.Tz)Session refers to a different SSLContext.)r|   r~  r   r…   r  rn   rŽ   rˆ   rk  rq  rþ   rÿ   re  rÜ   rž   r   r´  r’   r  rG   rù  )
rŠ   rz   r{   ry   Zclient_context2r®   rd  r   rk  ræ  r   r   r   Útest_session_handlingj  sJ    








z#ThreadedTests.test_session_handlingN)Jri  rj  rk  rb   rƒ  r„  rZ   rl  rA   r†  rÛ  r  rŽ  r  r‘  r   rÃ  r’  r™  rš  r_   rœ  r  rž  rŸ  r   r¢  r¤  r¨  r©  r°  r±  r³  r¸  r¼  r¾  r¿  rÁ  rÄ  rÅ  rD   rŠ  Z	HAS_SSLv3rÆ  rC   rÇ  rm  r#  rÊ  rË  rÍ  ÚHAVE_SECP_CURVESrã  rÂ  rÏ  rÐ  ZHAS_ALPNrÒ  rÙ  rÚ  ZHAS_NPNrÝ  rß  rà  rä  rÇ  rç  rí  rï  ró  rô  rø  rú  rû  r   r   r   r   r  †
  sŽ   0$)!8%)(9 
1)';	

&
(	):r  zTest needs TLS 1.3c               @   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   rw   rD   rˆ   Úpost_handshake_authr   rj   r~   )rŠ   Z	protocolsr”   rH   r   r   r   Útest_pha_setterŸ  s     

z%TestPostHandshakeAuth.test_pha_setterc          
   C   s  t ƒ \}}}d|_tj|_d|_| t¡ t|dd}|Ê |jt	 	¡ |d¬}| 
t|jf¡ | d¡ |  | d¡d¡ | d¡ |  | d¡d	¡ | d¡ |  | d¡d
¡ | d¡ |  | d¡d	¡ | d¡ | d¡ d¡}|  d|¡ W d Q R X W d Q R X d S )NTF)rq   rE  )r  s   HASCERTi   s   FALSE
s   PHAs   OK
s   TRUE
s   GETCERTi   zus-asciizPython Software Foundation CA)r|   rþ  r   r   rj   rl   rs   r  rn   rŽ   rþ   rÿ   re  r5   rˆ   rî   r  r€   )rŠ   rz   r{   ry   rd  r   Z	cert_textr   r   r   Útest_pha_required·  s*    







z'TestPostHandshakeAuth.test_pha_requiredc             C   s¸   t ƒ \}}}d|_tj|_d|_t|dd}|~ |jt ¡ |d`}| t	|j
f¡ | d¡ |  | d¡d¡ | d¡ |  tjd	¡ | d¡ W d Q R X W d Q R X W d Q R X d S )
NTF)rq   rE  )r  s   PHAi   s   OK
s   HASCERTz!tlsv13 alert certificate required)r|   rþ  r   r   rj   r  rn   rŽ   rþ   rÿ   re  r5   rˆ   rî   rŒ   rW   )rŠ   rz   r{   ry   rd  r   r   r   r   Útest_pha_required_nocertÐ  s     



z.TestPostHandshakeAuth.test_pha_required_nocertc          
   C   sæ   t jrtj d¡ tƒ \}}}d|_tj|_	d|_| 
t¡ tj|_	t|dd}|ˆ |jt ¡ |dj}| t|jf¡ | d¡ |  | d¡d¡ | d	¡ |  | d¡d
¡ | d¡ |  | d¡d¡ W d Q R X W d Q R X d S )Nr°   TF)rq   rE  )r  s   HASCERTi   s   FALSE
s   PHAs   OK
s   TRUE
)r   r3   r1   r4   r5   r|   rþ  r   r   rj   rl   rs   r~   r  rn   rŽ   rþ   rÿ   re  rˆ   rî   )rŠ   rz   r{   ry   rd  r   r   r   r   Útest_pha_optionalæ  s&    





z'TestPostHandshakeAuth.test_pha_optionalc          
   C   sÔ   t jrtj d¡ tƒ \}}}d|_tj|_	d|_t
|dd}|ˆ |jt ¡ |dj}| t|jf¡ | d¡ |  | d¡d¡ | d	¡ |  | d¡d
¡ | d¡ |  | d¡d¡ W d Q R X W d Q R X d S )Nr°   TF)rq   rE  )r  s   HASCERTi   s   FALSE
s   PHAs   OK
)r   r3   r1   r4   r5   r|   rþ  r   r~   rj   r  rn   rŽ   rþ   rÿ   re  rˆ   rî   )rŠ   rz   r{   ry   rd  r   r   r   r   Útest_pha_optional_nocertþ  s"    




z.TestPostHandshakeAuth.test_pha_optional_nocertc             C   s°   t ƒ \}}}d|_tj|_| t¡ t|dd}|r |jt	 	¡ |dT}| 
t|jf¡ |  tjd¡ | ¡  W d Q R X | d¡ |  d| d¡¡ W d Q R X W d Q R X d S )	NTF)rq   rE  )r  z
not servers   PHAs   extension not receivedi   )r|   rþ  r   r   rj   rl   rs   r  rn   rŽ   rþ   rÿ   re  rŒ   rW   rL  r5   r€   rî   )rŠ   rz   r{   ry   rd  r   r   r   r   Útest_pha_no_pha_client  s    



z,TestPostHandshakeAuth.test_pha_no_pha_clientc          
   C   sÆ   t ƒ \}}}tj|_d|_| t¡ t|dd}|ˆ |jt	 	¡ |dj}| 
t|jf¡ | d¡ |  | d¡d¡ | d¡ |  | d¡d	¡ | d¡ |  | d¡d¡ W d Q R X W d Q R X d S )
NTF)rq   rE  )r  s   HASCERTi   s   TRUE
s   PHAs   OK
)r|   r   r   rj   rþ  rl   rs   r  rn   rŽ   rþ   rÿ   re  r5   rˆ   rî   )rŠ   rz   r{   ry   rd  r   r   r   r   Útest_pha_no_pha_server$  s    





z,TestPostHandshakeAuth.test_pha_no_pha_serverc          
   C   s˜   t ƒ \}}}tj|_tjj|_d|_| t	¡ t
|dd}|P |jt ¡ |d2}| t|jf¡ | d¡ |  d| d¡¡ W d Q R X W d Q R X d S )NTF)rq   rE  )r  s   PHAs   WRONG_SSL_VERSIONi   )r|   r   r   rj   r†  r‡  rˆ  rþ  rl   rs   r  rn   rŽ   rþ   rÿ   re  r5   r€   rî   )rŠ   rz   r{   ry   rd  r   r   r   r   Útest_pha_not_tls138  s    




z(TestPostHandshakeAuth.test_pha_not_tls13N)ri  rj  rk  rÿ  r   r  r  r  r  r  r  r   r   r   r   rý    s   rý  c       	      C   s~  t jrèdd l}tjtjtjdœ}| ¡ V | ddt	¡ x@| 
¡ D ](\}}|ƒ }|rB|d rBd||f }P qBW tt ¡ ƒ}W d Q R X tdtjtjf ƒ td| ƒ tdtj ƒ td	tj ƒ ytd
tj ƒ W n tk
ræ   Y nX xBttttttttttttgD ]"}t j! "|¡st  #d| ¡‚qW t$t%t&t't(t)t*t+g}t  ,d¡rV| -t.¡ t  /¡ }zt j0|Ž  W d t j1|Ž  X d S )Nr   )ZLinuxZMacZWindowsÚignorez?dist\(\) and linux_distribution\(\) functions are deprecated .*z%s %rztest_ssl: testing with %r %rz          under %sz          HAS_SNI = %rz          OP_ALL = 0x%8xz          OP_NO_TLSv1_1 = 0x%8xzCan't read certificate file %rZnetwork)2r   r3   ÚwarningsrX   rY   Zmac_verZ	win32_verÚcatch_warningsÚfilterwarningsÚDeprecationWarningÚitemsr$  Úprintr   rÕ   r?   r   r}  r†   rƒ  r³   r©  r¢  r£  r¤  r¥  rs   ru   rx   r   ÚBADKEYr¡  r   r   ÚexistsZ
TestFailedrn  r}   rå  rð  rý  r  r  rý  Zis_resource_enabledr>  r-  Zthreading_setupZrun_unittestZthreading_cleanup)	r3   r  Zplatsr   r]   ZplatÚfilenameZtestsÚthread_infor   r   r   Ú	test_mainJ  sR    


r  Ú__main__)N)rj  TFNN)Nr   r   )F){r1   rZ   r3  r   rŽ   r  rJ   rP   rÉ  r   r  r·   Zurllib.requestr¦  r9  r/   r\  rå   rX   r`   Z	sysconfigr®  ÚImportErrorÚimport_moduler   Úsortedr‚  rp  rÿ   rÕ   rÍ   rÛ   r?   rÎ  rÂ  Zget_config_varr   r{  r•   ZverrŒ  r†  rƒ  r   r³   Úfsencoder©  r¢  r£  r¤  r¥  r¦  r§  r”  r*  rª  r²  rË   r´   r…  rs   rt   rµ   ru   rv   r‹  rŠ  rx   rÇ   r  r/  r¡  r   r   r  r¶   rÄ   r¼   r¸  r¹  r)   r*   r+   r,   r-   r7   r=   r@   rA   rI   rü  rK   rT   rb   rl  r   rä  r‰   rh   rr   r|   ZTestCaser}   rn  rå  rð  rý  r  r-  r  r  Ztest.ssl_serversr5  r:  r  r[  rz  r€  r  rÃ  rý  r  ri  r   r   r   r   Ú<module>   s:  













     }     8?0  B
  v  
1
F            #
 -
7
