a
    äzeÅ_ ã                   @   s¢  d dl Z d dlZd dlZd dlmZ d dlmZ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d dlZd dlZd dlZzd dlZW n eyî   dZY n0 e d¡Z d dl m!Z!m"Z"m#Z# e$e dƒZ%e%o&e jdkZ&e'e j(ƒZ)ej*Z*e j+ ,d¡Z-e- oTe j.d	kZ/e- ofe j.d
kZ0e- oxe j.dkZ1e 2d¡Z3i Z4dD ]H\Z5Z6ze7e e5ƒZ5e7e j!e6ƒZ6W n e8yÈ   Y qŒY n0 e6e4e5< qŒdd„ Z9e9dƒZ:e ;e:¡Z<e9dƒZ=e9dƒZ>e ;e=¡Z?e ;e>¡Z@e9dƒZAe9dƒZBdZCe9dƒZDe ;eD¡ZEe9ddƒZFe9ddƒZGddddddddœZHe9d ƒZIe9d!ƒZJd"ZKd#d$d%d&d'd(d)dddd*œ
ZLe9d+ƒZMd,ZNe9d-ƒZOd.ZPe9dd/ƒZQe9d0ƒZRe9d1ƒZSe9d2ƒZTd"ZUd3ZVe9d4ƒZWe9d5ƒZXe9d6ƒZYe9d7ƒZZe9d8ƒZ[e9d9ƒZ\e9d:ƒZ]e9d;ƒZ^e ;e^¡Z_e7e d<d ƒZ`e7e d=d ƒZae7e d>d ƒZbe7e d?d ƒZce7e d@d ƒZde7e dAd ƒZedBdC„ Zfefƒ r~dDdE„ ZgndFdE„ ZgdGdH„ ZhejidIdJ„ ƒZjdKdL„ Zke le$e jmdMƒdN¡ZndOdP„ ZodQdR„ ZpdSdT„ ZqdUdV„ ZrdWdX„ Zsesƒ ZtdYdZ„ Zud[d\„ Zve le jwd]¡Zxe jyfe jzddddd^œd_d`„Z{eJfdadb„Z|G dcdd„ ddej}ƒZ~G dedf„ dfej}ƒZG dgdh„ dhej}ƒZ€G didj„ djej}ƒZG dkdl„ dlej}ƒZ‚G dmdn„ dnej}ƒZƒe „do¡G dpdq„ dqej}ƒƒZ…d“drds„Z†dtdu„ Z‡d dvlˆm‰Z‰ G dwdx„ dxejŠƒZ‹G dydz„ dzejŠƒZŒd”d~d„Zd•d€d„ZŽG d‚dƒ„ dƒej}ƒZe lejd„ƒd…¡G d†d‡„ d‡ej}ƒƒZe$e jmdˆƒZ‘e le‘d‰¡Z’G dŠd‹„ d‹ej}ƒZ“dŒd„ Z”G dŽd„ dej}ƒZ•dd‘„ Z–e—d’krže ˜¡  dS )–é    N)Úsupport)Úsocket_helperÚwarnings_helperÚssl)Ú
TLSVersionÚ_TLSContentTypeÚ_TLSMessageTypeÚgettotalrefcountÚwin32ZLibreSSL)é   r   r   )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¡g| ¢R Ž S ©N)ÚosÚpathÚjoinÚdirnameÚ__file__©Úname© r   ú#/usr/lib/python3.9/test/test_ssl.pyÚ	data_file<   s    r   zkeycert.pemzssl_cert.pemzssl_key.pemzkeycert.passwd.pemzssl_key.passwd.pemZsomepassÚcapathz
4e1295a3.0z
5ed36f99.0)©)ÚcountryNameZ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'   r   ©Ú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%   úPython Software Foundation CA))r&   zour-ca-serverzOct 28 14:23:16 2037 GMTzAug 29 14:23:16 2018 GMTZCB2D80995A69525C)
ÚOCSPÚ	caIssuersÚcrlDistributionPointsr*   r+   r,   r-   r.   r/   r0   zkeycert4.pemÚfakehostnamezkeycertecc.pemzlocalhost-eccz
ceff1710.0zallsans.pemzidnsans.pemz	nosan.pemzself-signed.pythontest.netúnullcert.pemúbadcert.pemzXXXnonexisting.pemú
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_COMPATÚOP_IGNORE_UNEXPECTED_EOFc                  C   sX   z>t ddd} d|  ¡ v W  d   ƒ W S 1 s20    Y  W n tyR   Y dS 0 d S )Nz/etc/os-releasezutf-8)ÚencodingZubuntuF)ÚopenÚreadÚFileNotFoundError)Úfr   r   r   Ú	is_ubuntuŸ   s
    0rD   c                  G   s0   | D ]&}t |dƒr|jtjjkr| d¡ qd S )NÚminimum_versionz@SECLEVEL=1:ALL)ÚhasattrrE   r   r   r   Úset_ciphers)ÚctxsÚctxr   r   r   Úseclevel_workaround©   s    ÿþrJ   c                  G   s   d S r   r   )rH   r   r   r   rJ   ²   s    c                 C   sT   t | tƒr"tt| d ƒ} | d u r"dS | tjtjtjhv r:dS | j}t|t	dƒd … ƒS )NFTZ	PROTOCOL_)
Ú
isinstanceÚstrÚgetattrr   ÚPROTOCOL_TLSÚPROTOCOL_TLS_SERVERÚPROTOCOL_TLS_CLIENTr   Úhas_tls_versionÚlen)Úprotocolr   r   r   r   Úhas_tls_protocol¶   s    
þrT   c                 C   s¤   | dkrdS t | tƒr"tjj|  } ttd| j› ƒs8dS trL| tjjk rLdS t 	¡ }t
|dƒrz|jtjjkrz| |jk rzdS t
|dƒr |jtjjkr | |jkr dS dS )NÚSSLv2FZHAS_rE   Úmaximum_versionT)rK   rL   r   r   Ú__members__rM   r   ÚIS_OPENSSL_3_0_0ÚTLSv1_2Ú
SSLContextrF   rE   ÚMINIMUM_SUPPORTEDrV   ÚMAXIMUM_SUPPORTED)r0   rI   r   r   r   rQ   Ë   s0    
ÿþýÿþýrQ   c                    s   ‡ fdd„}|S )Nc                    s   t  ˆ ¡‡ ‡fdd„ƒ}|S )Nc                     s,   t ˆƒst ˆ› d¡‚nˆ | i |¤ŽS d S )Nz is not available.)rQ   ÚunittestZSkipTest)ÚargsÚkw)Úfuncr0   r   r   Úwrapperû   s    z8requires_tls_version.<locals>.decorator.<locals>.wrapper)Ú	functoolsÚwraps)r`   ra   ©r0   )r`   r   Ú	decoratorú   s    z'requires_tls_version.<locals>.decoratorr   )r0   re   r   rd   r   Úrequires_tls_versionô   s    rf   rE   zrequired OpenSSL >= 1.1.0gc                 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    rp   c                   C   s
   t jdkS )N)r   é	   é   é   é   )r   Ú_OPENSSL_API_VERSIONr   r   r   r   Úcan_clear_options  s    rv   c                   C   s
   t jdkS )N)r   rq   é   rr   rt   ©r   ÚOPENSSL_VERSION_INFOr   r   r   r   Úno_sslv2_implies_sslv3_hello  s    rz   c                   C   s
   t jdkS )N)r   rq   rr   r   rt   rx   r   r   r   r   Úhave_verify_flags  s    r{   c                  C   sB   t js
dS t  t j¡} z|  d¡ W n ty8   Y dS 0 dS d S )NFÚ	secp384r1T)r   ÚHAS_ECDHrZ   rO   Úset_ecdh_curveÚ
ValueError)rI   r   r   r   Ú_have_secp_curves  s    r€   c                   C   s$   t jrt  ¡ jdkrt j S t j S ©Nr   )ÚtimeÚdaylightÚ	localtimeÚtm_isdstÚaltzoneÚtimezoner   r   r   r   Ú
utc_offset+  s    rˆ   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   rq   rr   rq   rt   z%b %d %H:%M:%S %Y GMTr   )Úsecondé   Ú0rg   é   )r   ru   ÚdatetimeÚstrptimeÚreplaceÚstrftime)Ú	cert_timeÚfmtZdtr   r   r   Úasn1time1  s    

r“   z SNI support needed for this test)Ú	cert_reqsÚca_certsÚciphersÚcertfileÚkeyfilec          	      K   sz   t  |¡}|d ur(|t jkr"d|_||_|d ur:| |¡ |d usJ|d urV| ||¡ |d urh| |¡ |j| fi |¤ŽS ©NF)	r   rZ   Ú	CERT_NONEÚcheck_hostnameÚverify_modeÚload_verify_locationsÚload_cert_chainrG   Úwrap_socket)	ÚsockÚssl_versionr”   r•   r–   r—   r˜   ÚkwargsÚcontextr   r   r   Útest_wrap_socketB  s    



r¤   c                 C   sr   | t krt}n$| tkrt}n| tkr*t}nt| ƒ‚t tj	¡}| 
t¡ t tj¡}| | ¡ | 
t¡ |||fS r   )ÚSIGNED_CERTFILEÚSIGNED_CERTFILE_HOSTNAMEÚSIGNED_CERTFILE2ÚSIGNED_CERTFILE2_HOSTNAMEÚ	NOSANFILEÚNOSAN_HOSTNAMEr   r   rZ   rP   r   Ú
SIGNING_CArO   rž   )Zserver_certÚhostnameÚclient_contextÚserver_contextr   r   r   Útesting_contextT  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!v 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   rš   ÚCERT_OPTIONALÚCERT_REQUIREDr<   r:   r}   r;   ry   r9   ÚassertInÚHAS_SNIÚOP_NO_SSLv2ÚOP_NO_SSLv3ÚOP_NO_TLSv1ÚOP_NO_TLSv1_3ÚOP_NO_TLSv1_1ÚOP_NO_TLSv1_2ÚassertEqualrN   r   ©Úselfr   r   r   Útest_constantsn  s&    

zBasicSocketTests.test_constantsc              	   C   sb   |   td¡B t ¡ }t |¡ W d   ƒ n1 s60    Y  W d   ƒ n1 sT0    Y  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   rN   r¼   rL   rZ   ÚassertIsrS   ©r¾   ÚprotorI   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   rl   rj   rm   rn   ÚRAND_pseudo_bytesr¼   rR   Z
RAND_bytesÚassertRaisesÚSSLErrorr   rF   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žzBt |¡ t  d¡d }|  t	|ƒd¡ t 
||¡ t |¡ W n ty   t d¡ Y n0 t d¡ nlt |¡ |  tj|¡ tj|dd t |d¡}|  t	|ƒd¡ t  d¡d }|  t	|ƒd¡ |  ||¡ d S )Nz*OpenSSL's PRNG has insufficient randomnessr   rÌ   r   )Úexitcode)r   rÐ   Úfailr   ÚpipeÚforkÚcloserÑ   r¼   rR   rn   ÚBaseExceptionÚ_exitÚ
addCleanupr   Zwait_processrA   ÚassertNotEqual)r¾   ÚstatusZrfdZwfdÚpidZchild_randomZparent_randomr   r   r   Útest_random_fork«  s.    


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.comr2   )zhttp://ocsp.verisign.comr3   )z0http://SVRIntl-G3-aia.verisign.com/SVRIntlG3.cerr4   )z0http://SVRIntl-G3-crl.verisign.com/SVRIntlG3.crl)r¼   r   Ú_sslÚ_test_decode_certÚCERTFILEÚCERTFILE_INFOr¥   ÚSIGNED_CERTFILE_INFOÚ	NOKIACERTr   rl   rj   rm   rn   ÚpprintÚpformat©r¾   Úpr   r   r   Útest_parse_certÌ  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!   ZUK))r&   zcody-cazJun 14 18:00:58 2028 GMTzJun 18 18:00:58 2018 GMTZ02)rñ   ))r&   ú#codenomicon-vm-2.test.lal.cisco.com))r(   rò   r   r)   )r   ræ   rç   ÚTALOS_INVALID_CRLDPr   rl   rj   rm   rn   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!   ZUS))ÚstateOrProvinceNameZOregon))r#   Z	Beavertonr$   ))ÚorganizationalUnitNamezPython Core Development©)r&   únull.python.org example.org))ÚemailAddresszpython-dev@python.orgr.   r*   )r   rq   rr   )©r(   zaltnull.python.org example.com©Úemailz null@python.org user@example.org©ÚURIz)http://null.python.org http://example.org©ú
IP Addressz	192.0.2.1)r  z2001:DB8:0:0:0:0:0:1)rû   rü   rþ   r   )r  z	<invalid>r/   )r   ræ   rç   ÚNULLBYTECERTr   rl   rj   rm   rn   rì   rí   r¼   ru   )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©Ú	othernameú<unsupported>r  )rý   zuser@example.org)r(   zwww.example.org)ZDirName)r    r"   r$   ))r&   zdirname example)rÿ   zhttps://www.python.org/©r  ú	127.0.0.1)r  z0:0:0:0:0:0:0:1)zRegistered IDz	1.2.3.4.5)r   ræ   rç   Ú
ALLSANFILEr¼   rî   r   r   r   Útest_parse_all_sans  s    
ÿz$BasicSocketTests.test_parse_all_sansc                 C   s    t tdƒ}| ¡ }W d   ƒ n1 s(0    Y  t |¡}t |¡}t |¡}|  ||¡ | tjd ¡sz|  	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
)r@   ÚCAFILE_CACERTrA   r   ÚPEM_cert_to_DER_certZDER_cert_to_PEM_certr¼   Ú
startswithZ
PEM_HEADERrÚ   ÚendswithZ
PEM_FOOTER)r¾   rC   ÚpemÚd1Zp2Úd2r   r   r   Útest_DER_to_PEM0  s    &


z BasicSocketTests.test_DER_to_PEMc                 C   sH  t j}t j}t j}|  |t¡ |  |t¡ |  |t¡ |  |d¡ |  	|d¡ |\}}}}}|  |d¡ |  	|d¡ |  |d¡ |  	|d¡ |  |d¡ |  	|d¡ |  |d¡ |  
|d¡ |  |d¡ |  
|d¡ d	|d
›}	|dkrd|d
›d|d
›d|d
›}
nd|d
›d|d
›d|d
›}
|  | |
|	f¡||t|ƒf¡ d S )Ni   i   @r   rŠ   r   é   é?   rt   z	LibreSSL Údr   zOpenSSL Ú.)r   ZOPENSSL_VERSION_NUMBERry   ÚOPENSSL_VERSIONÚassertIsInstanceÚintÚtuplerL   ÚassertGreaterEqualÚ
assertLessZassertLessEqualÚ
assertTruer  Úhex)r¾   ÚnÚtrÆ   ÚmajorÚminorZfixÚpatchrâ   Zlibressl_verZopenssl_verr   r   r   Útest_openssl_version<  s6    
þz%BasicSocketTests.test_openssl_versionc                 C   s`   t   t j¡}t|ƒ}t |¡}t dtf¡ ~W d   ƒ n1 sD0    Y  |  |ƒ d ¡ d S )NÚ )	rÃ   ÚAF_INETr¤   ÚweakrefÚrefr   Úcheck_warningsÚResourceWarningr¼   )r¾   rÆ   ÚssÚwrr   r   r   Útest_refcycle^  s    
 zBasicSocketTests.test_refcyclec              	   C   sð   t   t j¡}t|ƒÈ}|  t|jd¡ |  t|jtdƒ¡ |  t|jd¡ |  t|j	tdƒd¡ |  t|j
d¡ |  t|jdd¡ |  t|j¡ |  t|jdgddd¡ |  t|jd¡ |  t|jtdƒg¡ W d   ƒ n1 sâ0    Y  d S )Nr   ó   x)z0.0.0.0r   r   r   éd   )rÃ   r'  r¤   rÒ   ÚOSErrorÚrecvÚ	recv_intorÔ   ÚrecvfromÚrecvfrom_intoÚsendÚsendtoÚNotImplementedErrorÚdupÚsendmsgÚrecvmsgÚrecvmsg_into©r¾   rÆ   r,  r   r   r   Útest_wrapped_unconnectedi  s     


ÿ
ÿz)BasicSocketTests.test_wrapped_unconnectedc              	   C   s\   dD ]R}t   t j¡}| |¡ t|ƒ }|  || ¡ ¡ W d   ƒ q1 sL0    Y  qd S )N)Ng        ç      @)rÃ   r'  Ú
settimeoutr¤   r¼   Ú
gettimeout)r¾   ÚtimeoutrÆ   r,  r   r   r   Útest_timeout{  s
    

zBasicSocketTests.test_timeoutc              	   C   sø  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   ƒ n1 sˆ0    Y  |  t	¡F}t   ¡ }tj|t
d
 W d   ƒ n1 sÊ0    Y  W d   ƒ n1 sè0    Y  |  |jjtj¡ |  t	¡J}t   ¡  }tj|tt
d W d   ƒ n1 s@0    Y  W d   ƒ n1 s`0    Y  |  |jjtj¡ |  t	¡J}t   ¡  }tj|t
t
d W d   ƒ n1 s¸0    Y  W d   ƒ n1 sØ0    Y  |  |jjtj¡ d S )Nzcertfile must be specified©r˜   z5certfile must be specified for server-side operationsT©Úserver_sider&  ©rF  r—   z!can't connect in server-side modei  ©r—   ©r—   r˜   )rÃ   rÁ   r   r   rŸ   rè   ÚconnectÚHOSTrÒ   r1  ÚNONEXISTINGCERTr¼   Ú	exceptionÚerrnoÚENOENT)r¾   r    rÆ   Úcmr   r   r   Útest_errors_sslwrap„  sB    þþ
þ
ÿ"
J
ÿF
ÿFz$BasicSocketTests.test_errors_sslwrapc                 C   sl   t j t j t¡pt j|¡}t ¡ }|  |j¡ |  	t
j¡ t||d W d   ƒ n1 s^0    Y  d S )NrH  )r   r   r   r   r   ÚcurdirrÃ   rà   rÝ   rÒ   r   rÓ   r¤   ©r¾   r—   r    r   r   r   Úbad_cert_test¡  s    ÿÿzBasicSocketTests.bad_cert_testc                 C   s   |   d¡ d S )Nr6   ©rT  r½   r   r   r   Útest_empty_cert«  s    z BasicSocketTests.test_empty_certc                 C   s   |   d¡ d S )Nr7   rU  r½   r   r   r   Útest_malformed_cert¯  s    z$BasicSocketTests.test_malformed_certc                 C   s   |   d¡ d S )Nr8   rU  r½   r   r   r   Útest_malformed_key³  s    z#BasicSocketTests.test_malformed_keyc              	      sF  dd„ }‡ fdd„}ddi}||dƒ ||dƒ ||d	ƒ ||d
ƒ ||dƒ ||dƒ ddi}||dƒ ||dƒ ||dƒ ||dƒ ||dƒ ddi}||dƒ ||dƒ ||dƒ ||dƒ ||dƒ ddi}||dƒ ||dƒ ||dƒ ddi}||dƒ ||dƒ ||dƒ ||dƒ ddi}||dƒ ||dƒ ||dƒ d  d ¡ d!¡}dd"|fffi}|||ƒ dd#i}|||ƒ dd$i}|||ƒ d%  d ¡ d!¡}dd"|fffi}||d&  d ¡ d!¡ƒ ||d'  d ¡ d!¡ƒ ||d(  d ¡ d!¡ƒ ||d)  d ¡ d!¡ƒ d*d+d,d-œ}||d.ƒ ||d/ƒ ||d0ƒ ||d1ƒ d2d3d4œ}||d5ƒ ||d6ƒ ||d7ƒ dd8d9œ}||d:ƒ ||d;ƒ ||d<ƒ ||d=ƒ ||d>ƒ ||d?ƒ ||d@ƒ tjrddAd9œ}||dBƒ ||dCƒ ||dDƒ ||dEƒ ||dFƒ ||d@ƒ d2dGd4œ}||d5ƒ dHdIdJd-œ}||d5ƒ dHdGdJd-œ}||dKƒ ˆ  ttjd d¡ ˆ  ttji d¡ ddLi}ˆ  tj	dM¡ t |dN¡ W d   ƒ n1 s¦0    Y  ddOi}ˆ  tj	dP¡ t |dQ¡ W d   ƒ n1 sê0    Y  ddRi}ˆ  tj	dS¡ t |dT¡ W d   ƒ n1 s.0    Y  ddUi}ˆ  tj	dV¡ t |dW¡ W d   ƒ n1 sr0    Y  ddXi}ˆ  tj	dY¡ t |dZ¡ W d   ƒ n1 s¶0    Y  d[D ]<}ˆ  t¡ t 
|¡ W d   ƒ n1 sô0    Y  qÄd\D ]}ˆ  t 
|¡¡ qtjrBd]D ]}ˆ  t 
|¡¡ q*d S )^Nc                 S   s   t  | |¡ d S r   )r   Úmatch_hostname©Úcertr¬   r   r   r   Úok¸  s    z0BasicSocketTests.test_match_hostname.<locals>.okc                    s   ˆ   tjtj| |¡ d S r   )rÒ   r   ÚCertificateErrorrY  rZ  r½   r   r   rÚ   º  s    ÿz2BasicSocketTests.test_match_hostname.<locals>.failr.   )))r&   úexample.comr^  z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ø   rù   z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&   úlinuxfrz.org))r(   úlinuxfr.org)r(   úlinuxfr.comr  )r+   r.   r/   rb  rc  r  ra  zDec 18 23:59:59 2011 GMT)rõ   ©)rö   Ú
California©)r#   zMountain View©)r%   z
Google Inc©)r&   úmail.google.com)r+   r.   ri  z	gmail.comre  )©r(   r^  )r  ú10.11.12.13)r  ú14.15.16.17r  )r.   r/   rk  rl  z127.1z14.15.16.17 z14.15.16.17 extra dataz14.15.16.18zexample.net)rj  )r  z2001:0:0:0:0:0:0:CAFE
)r  z2003:0:0:0:0:0:0:BABA
z
2001::cafez
2003::babaz2003::baba z2003::baba extra dataz
2003::bebe)rõ   rd  rf  rg  zDec 18 23:59:59 2099 GMT)rõ   rd  rf  rh  ))r  Zblablaz
google.com)))r&   za*b.example.comz5partial wildcards in leftmost label are not supportedzaxxb.example.com)))r&   zwww.*.example.comz2wildcard can only be present in the leftmost labelzwww.sub.example.com)))r&   za*b*.example.comztoo many wildcardszaxxbxxc.example.com)))r&   Ú*z7sole wildcard without additional labels are not supportÚhost)))r&   z*.comz%hostname 'com' doesn't match '\*.com'Zcom)Ú1r&  z1.2.3z	256.0.0.1z127.0.0.1/24)r  z192.168.0.1)z::1z2001:db8:85a3::8a2e:370:7334)ÚencodeÚdecoder   ÚIPV6_ENABLEDrÒ   r   r   rY  rÁ   r]  Z_inet_patonr  )r¾   r\  rÚ   r[  r_  ÚinvalidZipaddrr   r½   r   Útest_match_hostname·  s   




























þ



ÿ


ÿ






ÿ





ÿ
û
û
þ,þ,þ,þ,þ,.z$BasicSocketTests.test_match_hostnamec                 C   sN   t  t j¡}t ¡ &}| jt|j|ddd W d   ƒ n1 s@0    Y  d S )NTzsome.hostname©Úserver_hostname)r   rZ   rO   rÃ   rÒ   r   rŸ   )r¾   rI   r    r   r   r   Útest_server_side}  s
    
ÿz!BasicSocketTests.test_server_sidec              	   C   s   t  d¡}t   t j¡}| | ¡ ¡ t|ddD}|  t¡ | d¡ W d   ƒ n1 s\0    Y  W d   ƒ n1 sz0    Y  | 	¡  d S )N©r  r   F©Údo_handshake_on_connectzunknown-type)
rÃ   Úcreate_serverr'  rJ  Úgetsocknamer¤   rÒ   r   Úget_channel_bindingrÝ   )r¾   rÆ   Úcr,  r   r   r   Útest_unknown_channel_binding„  s    
Fz-BasicSocketTests.test_unknown_channel_bindingú
tls-uniqueú*'tls-unique' channel binding not availablec                 C   s’   t   t j¡}t|ƒ }|  | d¡¡ W d   ƒ n1 s:0    Y  t   t j¡}t|dtd }|  | d¡¡ W d   ƒ n1 s„0    Y  d S )Nr€  TrG  )rÃ   r'  r¤   ÚassertIsNoner}  rè   r=  r   r   r   Útest_tls_unique_channel_bindingŽ  s    
.z0BasicSocketTests.test_tls_unique_channel_bindingc                 C   sj   t t tj¡ƒ}t|ƒ}|  t¡}d }t ¡  W d   ƒ n1 sD0    Y  |  |t	|j
jd ƒ¡ d S r   )r¤   rÃ   r'  ÚreprZassertWarnsr+  r   Ú
gc_collectr´   rL   Úwarningr^   )r¾   r,  r  rP  r   r   r   Útest_dealloc_warnš  s    &z"BasicSocketTests.test_dealloc_warnc                 C   s†   t  ¡ }|  t|ƒd¡ |  |t j¡ t ¡ D}t|d< t	|d< t  ¡ }|  |j
t	¡ |  |jt¡ W d   ƒ n1 sx0    Y  d S )Né   ÚSSL_CERT_DIRÚSSL_CERT_FILE)r   Zget_default_verify_pathsr¼   rR   r  ZDefaultVerifyPathsr   ÚEnvironmentVarGuardÚCAPATHrè   Úcafiler   )r¾   ÚpathsÚenvr   r   r   Útest_get_default_verify_paths¢  s    
z.BasicSocketTests.test_get_default_verify_pathsr
   úWindows specificc           	      C   sî   |   t d¡¡ |   t d¡¡ |  ttj¡ |  ttjd¡ tƒ }dD ]}t |¡}|  |t¡ |D ]p}|  |t	¡ |  
t|ƒd¡ |\}}}|  |t¡ |  |ddh¡ |  |tttf¡ t|ttfƒrf| |¡ qfqHd}|  ||¡ d S )	NÚCAÚROOTr&  )r’  r“  r   Úx509_asnÚ
pkcs_7_asnú1.3.6.1.5.5.7.3.1)r  r   Zenum_certificatesrÒ   rÂ   ÚWindowsErrorÚsetr  Úlistr  r¼   rR   Úbytesr´   Ú	frozensetÚboolrK   Ú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¡ |D ]D}|  |t¡ |  	t
|ƒd¡ |  |d t¡ |  |d ddh¡ qHd S )Nr’  r&  é   r   r   r”  r•  )r  r   Z	enum_crlsrÒ   rÂ   r—  r  r™  r  r¼   rR   rš  r´   )r¾   ZcrlsrŸ  r   r   r   Útest_enum_crlsÇ  s    
zBasicSocketTests.test_enum_crlsc              	   C   sà  d}t  d¡}|  ||¡ |  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ |  |t j¡ |  t	t jd¡ t j 
d¡}|  ||¡ |  |t j¡ |  t	t jj
d¡ |  t	d¡ t j 
d¡ W d   ƒ n1 sÖ0    Y  td	ƒD ]j}zt j 
|¡}W n t	y   Y qè0 |  |jt¡ |  |jt¡ |  |jt¡ |  |jttd ƒf¡ qèt j d¡}|  ||¡ |  |t j¡ |  t j d¡|¡ |  t j d¡|¡ |  t	d
¡ t j d¡ W d   ƒ n1 sÒ0    Y  d S )N)é   r¡  úTLS Web Server Authenticationr–  r–  r¥  r¡  r¦  éÿÿÿÿzunknown NID 100000i † iè  zunknown object 'serverauth'Z
serverauth)r   Ú_ASN1Objectr¼   ÚnidÚ	shortnameZlongnameÚoidr  rÒ   r   ZfromnidrÁ   Úranger  rL   ÚtypeZfromname)r¾   ÚexpectedÚvalÚiÚobjr   r   r   Útest_asn1objectÖ  sB    
*ÿ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 )Nr–  r¥  r¡  z1.3.6.1.5.5.7.3.2é‚   Z
clientAuth)
r   r¨  r  ÚPurposeÚSERVER_AUTHr¼   r©  rª  r«  ÚCLIENT_AUTH)r¾   r¯  r   r   r   Útest_purpose_enumý  s     
ÿ
ÿz"BasicSocketTests.test_purpose_enumc                 C   s¼   t   t jt j¡}|  |j¡ |  t¡}t|tj	d W d   ƒ n1 sJ0    Y  |  
t|jƒd¡ t tj¡}|  t¡}| |¡ W d   ƒ n1 sœ0    Y  |  
t|jƒd¡ d S )N©r”   z!only stream sockets are supported)rÃ   r'  Ú
SOCK_DGRAMrà   rÝ   rÒ   r8  r¤   r   rš   r¼   rL   rM  rZ   rP   rŸ   )r¾   rÆ   ZcxrI   r   r   r   Útest_unsupported_dtls  s    ,(z&BasicSocketTests.test_unsupported_dtlsc                 C   s   |   t |¡|¡ d S r   )r¼   r   Úcert_time_to_seconds)r¾   Ú
timestringZ	timestampr   r   r   Úcert_time_ok  s    zBasicSocketTests.cert_time_okc                 C   s8   |   t¡ t |¡ W d   ƒ n1 s*0    Y  d S r   )rÒ   r   r   r»  )r¾   r¼  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ÑAúJan  5 09:34:43 2018 GMTç  À¬Ñ“ÖA)r½  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 )Nr¿  rÀ  )r‘   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)r½  r¼   r   r»  r¾  )r¾   r¼  ÚtsZ
newyear_tsr   r   r   Útest_cert_time_to_seconds(  s*    







z*BasicSocketTests.test_cert_time_to_secondsÚLC_ALLr&  c                 C   s@   dd„ }|ƒ   ¡ dkr |  d¡ |  dd¡ |  |ƒ d ¡ d S )Nc                   S   s   t  dd¡S )Nz%b)	r   r£  r   rŠ   rŒ   rˆ  r   r   r   )r‚   r   r   r   r   r   Úlocal_february_nameO  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ÚskipTestr½  r¾  )r¾   rÅ  r   r   r   Ú test_cert_time_to_seconds_localeK  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 )Nr¸  )rÃ   r'  rà   rÝ   r   Ú	bind_portr¤   r   r³   Ú
connect_exrK  rN  ZECONNREFUSEDZEHOSTUNREACHZ	ETIMEDOUTÚEWOULDBLOCKr´   )r¾   ÚserverÚportrÆ   ÚrcÚerrorsr   r   r   Útest_connect_ex_errorZ  s    
ÿþz&BasicSocketTests.test_connect_ex_error)4Ú__name__Ú
__module__Ú__qualname__r¿   rÇ   rË   r×   r]   Ú
skipUnlessr   r   rä   ZmaxDiffrð   rô   r  r
  r  r%  r   Zcpython_onlyr.  r>  rC  rQ  rT  rV  rW  rX  rt  rw  r  r   ÚCHANNEL_BINDING_TYPESrƒ  r‡  r  rj   Úplatformr¢  r¤  r²  r·  rº  r½  r¾  rˆ   rÁ  rÃ  Zrun_with_localerÈ  rÐ  r   r   r   r   r°   l  sb   
"

	
 G
ÿ



'ÿ
#

r°   c                   @   s´  e Zd Zdd„ Zdd„ Zdd„ Ze edkd¡d	d
„ ƒZ	e 
ejdk d¡dd„ ƒZdd„ Zdd„ Zdd„ Zee 
ed¡dd„ ƒƒZe eƒ d¡dd„ ƒZdd„ Zdd„ Zdd „ Ze 
ed!¡d"d#„ ƒZ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/e e0dK¡dLdM„ ƒZ1dNS )OÚContextTestsc              	   C   s¶   t D ]L}t|ƒrt ¡  t |¡}W d   ƒ n1 s80    Y  |  |j|¡ qt ¡  t ¡ }W d   ƒ n1 sx0    Y  |  |jtj¡ |  	t
tjd¡ |  	t
tjd¡ d S )Nr§  é*   )Ú	PROTOCOLSrT   r   r*  r   rZ   r¼   rS   rN   rÒ   r   )r¾   rS   rI   r   r   r   Útest_constructorm  s    
(
&zContextTests.test_constructorc              	   C   sV   t D ]L}t|ƒrt ¡  t |¡}W d   ƒ n1 s80    Y  |  |j|¡ qd S r   )rÙ  rT   r   r*  r   rZ   r¼   rS   rÉ   r   r   r   Útest_protocoly  s
    
(zContextTests.test_protocolc                 C   s\   t  t j¡}| d¡ | d¡ |  t jd¡ | d¡ W d   ƒ n1 sN0    Y  d S )NÚALLÚDEFAULTúNo cipher can be selectedú^$:,;?*'dorothyx)r   rZ   rP   rG   rÁ   rÓ   ©r¾   rI   r   r   r   Útest_ciphers€  s
    

zContextTests.test_ciphersr   z+Test applies only to Python default ciphersc                 C   sf   t  t j¡}| ¡ }|D ]H}|d }|  d|¡ |  d|¡ |  d|¡ |  d|¡ |  d|¡ qd S )Nr   ZPSKZSRPZMD5ZRC4Z3DES)r   rZ   rP   Úget_ciphersZassertNotIn)r¾   rI   r–   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 ƒƒ}h d£}| |¡}|  t|ƒddt	|ƒ› dt	|ƒ› ¡ d S )NZAESGCMc                 s   s   | ]}|d  V  qdS )r   Nr   )Ú.0r  r   r   r   Ú	<genexpr>˜  ó    z0ContextTests.test_get_ciphers.<locals>.<genexpr>>   zDHE-RSA-AES128-GCM-SHA256zECDHE-ECDSA-AES256-GCM-SHA384zAES128-GCM-SHA256zECDHE-RSA-AES256-GCM-SHA384zECDHE-ECDSA-AES128-GCM-SHA256zAES256-GCM-SHA384zDHE-RSA-AES256-GCM-SHA384zECDHE-RSA-AES128-GCM-SHA256r£  z
got: z
expected: )
r   rZ   rP   rG   r˜  râ  Úintersectionr  rR   Úsorted)r¾   rI   Únamesr®  rç  r   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 tB O }|  ||j¡ | jt jO  _|  |t jB |j¡ tƒ r®|jt j @ |_|  ||j¡ d|_|  d|jt j @ ¡ n0|  t¡ d|_W d   ƒ n1 sÔ0    Y  d S r   )r   rZ   rP   ÚOP_ALLr¶   r·   r9   r<   r:   r;   r=   r>   r¼   Úoptionsr¸   rv   rÒ   r   )r¾   rI   Ú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   ƒ n1 sŠ0    Y  |  t
¡ d|_W d   ƒ n1 sº0    Y  t  t j¡}|  |jt j¡ |  |j¡ t  t j¡}|  |jt j¡ |  |j¡ d S ©NrØ  )r   rZ   rN   r¼   rœ   rš   r²   r³   rÒ   rÂ   r   rO   ÚassertFalser›   rP   r  rà  r   r   r   Útest_verify_mode_protocol¾  s$    $$z&ContextTests.test_verify_mode_protocolc                 C   sŠ   t  t j¡}|  |j¡ t jrVd|_|  |j¡ d|_|  |j¡ d|_|  |j¡ n0|  t¡ d|_W d   ƒ n1 s|0    Y  d S ©NTF)	r   rZ   rP   r  Úhostname_checks_common_nameÚHAS_NEVER_CHECK_COMMON_NAMErð  rÒ   ÚAttributeErrorrà  r   r   r   Ú test_hostname_checks_common_nameÕ  s    z-ContextTests.test_hostname_checks_common_namezsee bpo-34001c                 C   s  t  t j¡}t jjt jjt jjh}t jjt jjh}|  	|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t jjh¡ t jj|_
|  	|j
t jjt jjh¡ |  t¡ d|_
W d   ƒ n1 sP0    Y  tt jƒrþt  t j¡}|  	|j
|¡ |  |jt jj¡ |  t¡ t jj|_
W d   ƒ n1 s¾0    Y  |  t¡ t jj|_W d   ƒ n1 sô0    Y  d S rï  )r   rZ   rO   r   r[   r   rY   r\   ÚTLSv1_3r´   rE   rV   r   r¼   r   rÒ   r   rT   r   )r¾   rI   Zminimum_rangeZmaximum_ranger   r   r   Útest_min_max_versionã  st    ú
üÿÿ


ÿ
ÿ


ÿ
ÿ

ÿ
þ
þ&ÿ
ÿ*z!ContextTests.test_min_max_versionú!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   ƒ n1 s¾0    Y  d S )NÚVERIFY_X509_TRUSTED_FIRSTr   )r   rZ   rO   rM   r¼   Úverify_flagsÚVERIFY_DEFAULTÚVERIFY_CRL_CHECK_LEAFZVERIFY_CRL_CHECK_CHAINZVERIFY_X509_STRICTrÒ   rÂ   )r¾   rI   Útfr   r   r   Útest_verify_flags3  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   ƒ n1 sd0    Y  |  	|j
jtj¡ |  t jd¡ | t¡ W d   ƒ n1 s®0    Y  |  t jd¡ | t¡ W d   ƒ n1 sæ0    Y  t  t j¡}| tt¡ |jttd |jttd |  t jd¡ | t¡ W d   ƒ n1 sT0    Y  |  t jd¡ | t¡ W d   ƒ n1 sŽ0    Y  |  t jd¡ |jttd W d   ƒ n1 sÌ0    Y  t  t j¡}|  t jd¡ | tt¡ W d   ƒ n1 s0    Y  |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   ƒ n1 s¼0    Y  |  t j¡ |jtdd W d   ƒ n1 sø0    Y  |  td	¡" |jtd
d d W d   ƒ n1 s80    Y  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   ƒ n1 s0    Y  |  td	¡ |jt|d W d   ƒ n1 sB0    Y  |  td¡ |jt|d W d   ƒ n1 s~0    Y  |  td¡ |jt|	d W d   ƒ n1 sº0    Y  |jt|	d d S )NrD  úPEM librI  zkey values mismatch)Úpasswordzshould be a stringTÚbadpasszcannot be longeró   ai  c                   S   s   t S r   ©ÚKEY_PASSWORDr   r   r   r   Úgetpass_unicodev  s    z:ContextTests.test_load_cert_chain.<locals>.getpass_unicodec                   S   s   t  ¡ S r   )r  rp  r   r   r   r   Úgetpass_bytesx  s    z8ContextTests.test_load_cert_chain.<locals>.getpass_bytesc                   S   s   t t ¡ ƒS r   )rÔ   r  rp  r   r   r   r   Úgetpass_bytearrayz  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 )Nrq   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 )Nú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 r   r  r½   r   r   r   Ú__call__…  s    zCContextTests.test_load_cert_chain.<locals>.GetPassCallable.__call__c                 S   s   t S r   r  r½   r   r   r   Úgetpass‡  s    zBContextTests.test_load_cert_chain.<locals>.GetPassCallable.getpassN)rÑ  rÒ  rÓ  r  r  r   r   r   r   ÚGetPassCallable„  s   r  zmust return a stringr  )r   rZ   rO   rž   rè   rÒ   rÂ   r1  rL  r¼   rM  rN  rO  rÁ   rÓ   ÚBADCERTÚ	EMPTYCERTÚONLYCERTÚONLYKEYÚBYTES_ONLYCERTÚBYTES_ONLYKEYr  ÚCERTFILE_PROTECTEDr  rp  rÔ   ÚONLYKEY_PROTECTEDr   r  r  )r¾   rI   rP  r  r  r  r	  r
  r  r  r  r   r   r   Útest_load_cert_chainG  s€    (((**.,
ÿ
ÿ..2ÿ....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   ƒ n1 sˆ0    Y  |  
|jjtj¡ |  t jd¡ | t¡ W d   ƒ n1 sÒ0    Y  | tt¡ |jttd |  t|jd d¡ d S )N)r  r   r   ©r   T)r   rZ   rO   r   rè   ÚBYTES_CERTFILErÒ   rÂ   r1  rL  r¼   rM  rN  rO  rÁ   rÓ   r  rŒ  ÚBYTES_CAPATH©r¾   rI   rP  r   r   r   Útest_load_verify_locationsš  s    

((z'ContextTests.test_load_verify_locationsc                 C   sž  t tƒ}| ¡ }W d   ƒ n1 s&0    Y  t |¡}t tƒ}| ¡ }W d   ƒ n1 s`0    Y  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   ƒ n1 sT0    Y  |  tjd¡ |j
dd W d   ƒ n1 s0    Y  d S )NÚx509_car   ©Úcadatar   r£  rå   ÚheadÚotherZagainÚtailræ  z4no start line: cadata does not contain a certificateÚbrokenz6not enough data: cadata does not contain a certificates   broken)r@   r  rA   r   r  ÚCAFILE_NEURONIOrZ   rP   r¼   Úcert_store_statsr   r   rÒ   rÂ   ÚobjectrÁ   rÓ   )r¾   rC   Z
cacert_pemZ
cacert_derZneuronio_pemZneuronio_derrI   Zcombinedr   r   r   Útest_load_verify_cadata­  s\    
&

&

ÿþ,þz$ContextTests.test_load_verify_cadataú)Avoid mixing debug/release CRT on Windowsc                 C   sÈ   t  t j¡}| t¡ tjdkr*| t¡ |  t	|j¡ |  t	|jd ¡ |  t
¡}| t¡ W d   ƒ n1 sr0    Y  |  |jjtj¡ |  t j¡}| t¡ W d   ƒ n1 sº0    Y  d S )NÚnt)r   rZ   rO   Úload_dh_paramsÚDHFILEr   r   ÚBYTES_DHFILErÒ   rÂ   rB   rL  r¼   rM  rN  rO  rÓ   rè   r  r   r   r   Útest_load_dh_paramsì  s    


(z ContextTests.test_load_dh_paramsc                 C   sr   t D ]h}t|ƒsqt ¡  t |¡}W d   ƒ n1 s:0    Y  |  | ¡ ddddddddddddœ¡ qd S )Nr   )ZnumberrJ  Zconnect_goodZconnect_renegotiateÚacceptZaccept_goodZaccept_renegotiateÚhitsÚmissesZtimeoutsZ
cache_full)rÙ  rT   r   r*  r   rZ   r¼   Úsession_statsrÉ   r   r   r   Útest_session_statsú  s$    
(
õzContextTests.test_session_statsc                 C   s   t  t j¡}| ¡  d S r   )r   rZ   rP   Zset_default_verify_pathsrà  r   r   r   Útest_set_default_verify_paths  s    z*ContextTests.test_set_default_verify_pathsz#ECDH disabled on this OpenSSL buildc                 C   sb   t  t j¡}| d¡ | d¡ |  t|j¡ |  t|jd ¡ |  t|jd¡ |  t|jd¡ d S )NÚ
prime256v1s
   prime256v1rÏ   ó   foo)r   rZ   rO   r~   rÒ   rÂ   r   rà  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 )NrŠ   r&  c                 S   s   d S r   r   ©r    Ú
servernamerI   r   r   r   Údummycallback(  s    z5ContextTests.test_sni_callback.<locals>.dummycallback)r   rZ   rO   rÒ   rÂ   Úset_servername_callback)r¾   rI   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 r   r   )r    r;  rI   Úcycler   r   r   r<  2  s    z>ContextTests.test_sni_callback_refcycle.<locals>.dummycallback)	r   rZ   rO   r=  r(  r)  ÚgcÚcollectrÈ   )r¾   rI   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   rZ   rP   r¼   r(  rž   rè   r   r  rà  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   ƒ n1 s0    Y  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-   r4   r.   r0   T)r   rZ   rP   r¼   Úget_ca_certsr   rè   r  r“   r@   rA   r  )r¾   rI   rC   r  Úderr   r   r   Útest_get_ca_certsH  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 )Nrµ  )	r   rZ   rP   Úload_default_certsr´  rµ  r¶  rÒ   rÂ   rà  r   r   r   Útest_load_default_certsd  s    z$ContextTests.test_load_default_certsr
   znot-Windows specificz!LibreSSL doesn't support env varsc                 C   sh   t  t j¡}t ¡ @}t|d< t|d< | ¡  |  | 	¡ ddddœ¡ W d   ƒ n1 sZ0    Y  d S )Nr‰  rŠ  r   r   )rC  rD  r   )
r   rZ   rP   r   r‹  rŒ  rè   rI  r¼   r(  )r¾   rI   r  r   r   r   Útest_load_default_certs_envs  s    
z(ContextTests.test_load_default_certs_envr‘  r	   z3Debug build does not share environment between CRTsc                 C   sŒ   t  t j¡}| ¡  | ¡ }t  t j¡}t ¡ H}t|d< t|d< | ¡  |d  d7  < |  	| ¡ |¡ W d   ƒ n1 s~0    Y  d S )Nr‰  rŠ  rD  r   )
r   rZ   rP   rI  r(  r   r‹  rŒ  rè   r¼   )r¾   rI   Ú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 r   )r¼   rì  r   r¶   r9   r:   r;   r<   rà  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   ƒ n1 sd0    Y  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¼   rS   rN   rœ   r³   r  r›   rN  r@   r«   rA   rŒ  r´  r¶  rš   )r¾   rI   rC   r"  r   r   r   Útest_create_default_context›  s"    

&ÿ
z(ContextTests.test_create_default_contextc                 C   sX  t  ¡ }|  |jt j¡ |  |jt j¡ |  |j¡ |  	|¡ t
t jƒrt ¡  t  t j¡}W d   ƒ n1 st0    Y  |  |jt j¡ |  |jt j¡ |  	|¡ t ¡ $ t jt jt jdd}W d   ƒ n1 sÚ0    Y  |  |jt j¡ |  |jt j¡ |  |j¡ |  	|¡ t jt jjd}|  |jt j¡ |  |jt j¡ |  	|¡ d S )NT)r”   r›   )Zpurpose)r   Ú_create_stdlib_contextr¼   rS   rN   rœ   rš   rð  r›   rN  rT   r   r   r*  r³   r  r´  r¶  rà  r   r   r   Útest__create_stdlib_context°  s0    

*

þ$
z(ContextTests.test__create_stdlib_contextc                 C   sz  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   ƒ n1 sB0    Y  d|_|  |j¡ t j|_|  |jt j¡ d S rò  )r   rZ   rN   rð  r›   r¼   rœ   rš   r  r³   r²   rÒ   r   rà  r   r   r   Útest_check_hostnameÌ  s@    (z ContextTests.test_check_hostnamec                 C   sT   t  t j¡}|  |j¡ |  |jt j¡ t  t j¡}|  	|j¡ |  |jt j
¡ d S r   )r   rZ   rP   r  r›   r¼   rœ   r³   rO   rð  rš   rà  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   ƒ n1 sp0    Y  | 
t  ¡ t  ¡ ¡}|  	||¡ d S )Nc                   @   s   e Zd ZdS )z;ContextTests.test_context_custom_class.<locals>.MySSLSocketN©rÑ  rÒ  rÓ  r   r   r   r   ÚMySSLSocket  s   rV  c                   @   s   e Zd ZdS )z;ContextTests.test_context_custom_class.<locals>.MySSLObjectNrU  r   r   r   r   ÚMySSLObject  s   rW  TrE  )r   rÄ   Ú	SSLObjectrZ   rO   Zsslsocket_classZsslobject_classrŸ   rÃ   r  Úwrap_bioÚ	MemoryBIO)r¾   rV  rW  rI   r    r±  r   r   r   Útest_context_custom_class  s    *z&ContextTests.test_context_custom_classzTest requires OpenSSL 1.1.1c                 C   sð   t  t j¡}|  |jd¡ d|_|  |jd¡ d|_|  |jd¡ |  t¡ d|_W d   ƒ n1 sh0    Y  |  t¡ d |_W d   ƒ n1 s˜0    Y  t  t j¡}|  |jd¡ |  t¡ d|_W d   ƒ n1 sâ0    Y  d S )Nr£  r   r   r§  )	r   rZ   rO   r¼   Znum_ticketsrÒ   r   rÂ   rP   rà  r   r   r   Útest_num_tickest  s    $$zContextTests.test_num_tickestN)2rÑ  rÒ  rÓ  rÚ  rÛ  rá  r]   rÔ  r   rã  ÚskipIfr   ry   rê  rî  rñ  rö  Úrequires_minimum_versionÚIS_LIBRESSLrø  r{   rÿ  r  r  r*  ÚPy_DEBUG_WIN32r0  r5  r6  r}   r9  Ú	needs_snir>  rB  rE  rH  rJ  rj   rÖ  rK  rF   rM  rN  rP  rR  rS  rT  r[  ÚIS_OPENSSL_1_1_1r\  r   r   r   r   r×  k  sb   
ÿ


Nÿ
S?


	


+
r×  c                   @   s8   e Zd Zdd„ Ze ed¡dd„ ƒZdd„ Zdd	„ Z	d
S )ÚSSLErrorTestsc                 C   sX   t  dd¡}|  t|ƒd¡ |  |jd¡ t  dd¡}|  t|ƒd¡ |  |jd¡ d S )Nr   rÏ   )r   rÓ   r¼   rL   rN  ZSSLZeroReturnError)r¾   Úer   r   r   Útest_str'  s    zSSLErrorTests.test_strr+  c                 C   s‚   t  t j¡}|  t j¡}| t¡ W d   ƒ n1 s80    Y  |  |jj	d¡ |  |jj
d¡ t|jƒ}|  | d¡|¡ d S )NZPEMZNO_START_LINEz"[PEM: NO_START_LINE] no start line)r   rZ   rP   rÒ   rÓ   r-  rè   r¼   rM  ÚlibraryÚreasonrL   r  r  )r¾   rI   rP  rÆ   r   r   r   Útest_lib_reason1  s    (
zSSLErrorTests.test_lib_reasonc              
   C   sò   t  t j¡}d|_t j|_t d¡º}t | 	¡ ¡}| 
d¡ |j|dddr}|  t j¡}| ¡  W d   ƒ n1 sz0    Y  t|jƒ}|  | d¡|¡ |  |jjt j¡ W d   ƒ n1 sÆ0    Y  W d   ƒ n1 sä0    Y  d S )NFrx  ry  z%The operation did not complete (read))r   rZ   rP   r›   rš   rœ   rÃ   r{  Úcreate_connectionr|  ÚsetblockingrŸ   rÒ   ÚSSLWantReadErrorÚdo_handshakerL   rM  r  r  r¼   rN  ÚSSL_ERROR_WANT_READ)r¾   rI   rÆ   r~  rP  r   r   r   Útest_subclass<  s    
&
zSSLErrorTests.test_subclassc                 C   sÒ   t  ¡ }|  t¡( |jt  ¡ t  ¡ dd W d   ƒ n1 s@0    Y  |  t¡( |jt  ¡ t  ¡ dd W d   ƒ n1 s‚0    Y  |  t¡( |jt  ¡ t  ¡ dd W d   ƒ n1 sÄ0    Y  d S )Nr&  ru  z.example.orgzexample.org evil.com)r   rO  rÒ   r   rY  rZ  rÂ   rà  r   r   r   Útest_bad_server_hostnameN  s    ÿ$ÿ$ÿz&SSLErrorTests.test_bad_server_hostnameN)
rÑ  rÒ  rÓ  re  r]   r]  r`  rh  rn  ro  r   r   r   r   rc  %  s
   



rc  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 )
Nr8  ræ  ó   bars   foobaró   bazr£  s   bar   ó   z)r   rZ  rn   r¼   rA   ©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æ  r8  r£  s   for   ó   o)	r   rZ  rð  Úeofr¼   rA   rn   Ú	write_eofr  rt  r   r   r   Útest_eofk  s    
zMemoryBIOTests.test_eofc                 C   s    t  ¡ }|  |jd¡ | d¡ |  |jd¡ tdƒD ]$}| d¡ |  |jd| d ¡ q6tdƒD ] }| d¡ |  |j|d ¡ qd| ¡  |  |jd¡ d S )Nr   r8  r   r   r/  )r   rZ  r¼   Úpendingrn   r¬  rA   )r¾   ru  r°  r   r   r   Útest_pending{  s    


zMemoryBIOTests.test_pendingc                 C   sb   t  ¡ }| d¡ |  | ¡ d¡ | tdƒ¡ |  | ¡ d¡ | tdƒ¡ |  | ¡ d¡ d S )Nr8  rq  rr  )r   rZ  rn   r¼   rA   rÔ   Ú
memoryviewrt  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   rZ  rÒ   rÂ   rn   rt  r   r   r   Útest_error_types’  s
    zMemoryBIOTests.test_error_typesN)rÑ  rÒ  rÓ  rv  rz  r|  r~  r  r   r   r   r   rp  [  s
   	rp  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚSSLObjectTestsc                 C   sD   t  ¡ }|  td¡ t  ||¡ W d   ƒ n1 s60    Y  d S rÀ   )r   rZ  rÁ   rÂ   rX  rt  r   r   r   rÇ   ›  s    z SSLObjectTests.test_private_initc              	   C   s<  t ƒ \}}}t ¡ }t ¡ }t ¡ }t ¡ }|j|||d}|j||dd}	tdƒD ]p}
z| ¡  W n tjyx   Y n0 |jrŽ| | 	¡ ¡ z|	 ¡  W n tjy®   Y n0 |jrT| | 	¡ ¡ qT| ¡  |	 ¡  |  
tj¡ | ¡  W d   ƒ n1 s0    Y  | | 	¡ ¡ |	 ¡  | | 	¡ ¡ | ¡  d S )Nru  TrE  rŒ   )r¯   r   rZ  rY  r¬  rl  rk  r{  rn   rA   rÒ   Úunwrap)r¾   Z
client_ctxZ
server_ctxr¬   Zc_inZc_outZs_inZs_outÚclientrÌ  Ú_r   r   r   Útest_unwrap   s8    (zSSLObjectTests.test_unwrapN)rÑ  rÒ  rÓ  rÇ   r„  r   r   r   r   r€  š  s   r€  c                   @   sº   e Zd Zd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 r   )ÚThreadedEchoServerr¥   rK  rÍ  Úserver_addrÚ	__enter__rà   Ú__exit__)r¾   rÌ  r   r   r   ÚsetUpÍ  s    zSimpleBackgroundTests.setUpc                 C   sÀ   t t tj¡tjd8}| | j¡ |  i | ¡ ¡ |  	|j
¡ W d   ƒ n1 sT0    Y  t t tj¡tjtd6}| | j¡ |  | ¡ ¡ |  	|j
¡ W d   ƒ n1 s²0    Y  d S )Nr¸  ©r”   r•   )r¤   rÃ   r'  r   rš   rJ  r‡  r¼   Úgetpeercertrð  rF  r³   r«   r  rÅ   r   r   r   Útest_connectÓ  s    ÿ*þz"SimpleBackgroundTests.test_connectc                 C   s<   t t tj¡tjd}|  |j¡ |  tjd|j	| j
¡ d S )Nr¸  úcertificate verify failed)r¤   rÃ   r'  r   r³   rà   rÝ   rÁ   rÓ   rJ  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 )Nr‹  r   )r¤   rÃ   r'  r   r³   r«   rà   rÝ   r¼   rÊ  r‡  r  rŒ  rÅ   r   r   r   Útest_connect_exì  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¡ z| ¡  W qÂW qd tjyš   t |gg g d¡ Y qd tjy¾   t g |gg d¡ Y qd0 qd|  | ¡ ¡ d S )NF)r”   r•   rz  r   r?  )r¤   rÃ   r'  r   r³   r«   rà   rÝ   rj  rÊ  r‡  r´   rN  ZEINPROGRESSrË  Úselectrl  rk  ÚSSLWantWriteErrorr  rŒ  ©r¾   rÆ   rÎ  r   r   r   Útest_non_blocking_connect_exõ  s$    ý
z2SimpleBackgroundTests.test_non_blocking_connect_exc                 C   s  t  t j¡}| t tj¡¡,}| | j¡ |  i | 	¡ ¡ W d   ƒ n1 sP0    Y  |jt tj¡dd}| | j¡ W d   ƒ n1 s’0    Y  t j
|_| t¡ | t tj¡¡.}| | j¡ | 	¡ }|  |¡ W d   ƒ n1 sô0    Y  d S )NÚdummyru  )r   rZ   rN   rŸ   rÃ   r'  rJ  r‡  r¼   rŒ  r³   rœ   r   r«   r  ©r¾   rI   rÆ   r[  r   r   r   Útest_connect_with_context  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 )NrŽ  )r   rZ   rN   r³   rœ   rŸ   rÃ   r'  rà   rÝ   rÁ   rÓ   rJ  r‡  )r¾   rI   rÆ   r   r   r   Útest_connect_with_context_fail!  s    
ÿz4SimpleBackgroundTests.test_connect_with_context_failc                 C   sä   t  t j¡}t j|_|jtd | t tj	¡¡.}| 
| j¡ | ¡ }|  |¡ W d   ƒ n1 sf0    Y  t  t j¡}t j|_|jtd | t tj	¡¡.}| 
| j¡ | ¡ }|  |¡ W d   ƒ n1 sÖ0    Y  d S )Nr  )r   rZ   rN   r³   rœ   r   rŒ  rŸ   rÃ   r'  rJ  r‡  rŒ  r  r  r–  r   r   r   Útest_connect_capath,  s    (z)SimpleBackgroundTests.test_connect_capathc                 C   s   t tƒ}| ¡ }W d   ƒ n1 s&0    Y  t |¡}t tj¡}tj|_|j	|d | 
t tj¡¡.}| | j¡ | ¡ }|  |¡ W d   ƒ n1 s 0    Y  t tj¡}tj|_|j	|d | 
t tj¡¡.}| | j¡ | ¡ }|  |¡ W d   ƒ n1 s0    Y  d S )Nr!  )r@   r«   rA   r   r  rZ   rN   r³   rœ   r   rŸ   rÃ   r'  rJ  r‡  rŒ  r  )r¾   rC   r  rG  rI   rÆ   r[  r   r   r   Útest_connect_cadataC  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   ƒ n1 s|0    Y  |  |jjtj¡ d S r   )r¤   rÃ   r'  rJ  r‡  ÚfilenoÚmakefilerÝ   r   rA   r@  rA  rÒ   r1  r¼   rM  rN  ÚEBADF)r¾   r,  ÚfdrC   rd  r   r   r   Útest_makefile_closeX  s    *z)SimpleBackgroundTests.test_makefile_closec                 C   s¾   t   t j¡}| | j¡ | d¡ t|tjdd}|  |j	¡ d}z|d7 }| 
¡  W q¤W qB tjy~   t |gg g ¡ Y qB tjy    t g |gg ¡ Y qB0 qBtjrºtj d| ¡ d S )NF©r”   rz  r   r   z9
Needed %d calls to do_handshake() to establish session.
)rÃ   r'  rJ  r‡  rj  r¤   r   rš   rà   rÝ   rl  rk  r‘  r’  r   rl   rj   rm   rn   )r¾   rÆ   Úcountr   r   r   Útest_non_blocking_handshakek  s&    
þz1SimpleBackgroundTests.test_non_blocking_handshakec                 C   s   t | g| j¢R dtiŽ d S )Nr[  )Ú_test_get_server_certificater‡  r«   r½   r   r   r   Útest_get_server_certificate€  s    z1SimpleBackgroundTests.test_get_server_certificatec                 C   s   t | g| j¢R Ž  d S r   )Ú!_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   ƒ n1 s:0    Y  t t tj¡tjdd}| | j¡ W d   ƒ n1 s~0    Y  |  tjd¡X t tj¡,}t |tjdd}| | j¡ W d   ƒ n1 sÖ0    Y  W d   ƒ n1 sô0    Y  d S )NrÜ  )r”   r–   rÝ  rÞ  rß  )	r¤   rÃ   r'  r   rš   rJ  r‡  rÁ   rÓ   )r¾   rÆ   r    r   r   r   rá  ˆ  s     ÿ*ÿ*ÿz"SimpleBackgroundTests.test_ciphersc                 C   s”   t  t j¡}|jtd |  | ¡ g ¡ |jt tj	¡dd.}| 
| j¡ | ¡ }|  |¡ W d   ƒ n1 sr0    Y  |  t| ¡ ƒd¡ d S )Nr  r'   ru  r   )r   rZ   rP   r   rŒ  r¼   rF  rŸ   rÃ   r'  rJ  r‡  rŒ  r  rR   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^}| | j	¡ |  
|j|¡ |  
|jj|¡ ||_|  
|j|¡ |  
|jj|¡ W d   ƒ n1 s®0    Y  d S )Nr  r'   ru  )r   rZ   rP   r   rŒ  rÃ   r'  rŸ   rJ  r‡  rÈ   r£   Ú_sslobj)r¾   Zctx1Zctx2rÆ   r,  r   r   r   Útest_context_setget¢  s    z)SimpleBackgroundTests.test_context_setgetc              
   O   sú   |  dtj¡}t ¡ | }d}	t ¡ |kr4|  d¡ d }
|	d7 }	z||Ž }W n@ tjyŒ } z&|jtj	tj
fvrr‚ |j}
W Y d }~n
d }~0 0 | ¡ }| |¡ |
d u r¬qÚq|
tj	kr| d¡}|rÐ| |¡ q| ¡  qtjrötj d|	|jf ¡ |S )NrB  r   r   i €  z"Needed %d calls to complete %s().
)Úgetr   ÚSHORT_TIMEOUTr‚   Ú	monotonicrÚ   r   rÓ   rN  rm  ZSSL_ERROR_WANT_WRITErA   Úsendallr2  rn   ry  rl   rj   rm   rÑ  )r¾   r    ÚincomingÚoutgoingr`   r^   r¢   rB  Údeadliner¡  rN  Úretrd  Úbufr   r   r   Ússl_io_loop²  s:    
ÿ



ÿ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v rØ|  | d¡¡ |   ||||j!¡ |  
| ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ |  
| ¡ ¡ dtjv r>|  
| d¡¡ z|   ||||j"¡ W n tj#yj   Y n0 |  tj$|j%d¡ d S )NFr€  r8  )&rÃ   r'  rà   rÝ   rJ  r‡  r   rZ  rZ   rP   r  r›   r¼   rœ   r³   r   r«   rY  r¦   rÈ   r¨  Úownerr‚  Úcipherr0   ÚassertIsNotNoneÚshared_ciphersrÒ   r   rŒ  rÕ  r}  r³  rl  r  ZSSLSyscallErrorrÓ   rn   )r¾   r    r®  r¯  rI   Ú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 )NFó   FOO
é   s   foo
)rÃ   r'  rà   rÝ   rJ  r‡  r   rZ  rZ   rN   rš   rœ   rY  r³  rl  rn   rA   r¼   r  )r¾   r    r®  r¯  rI   r¸  Zreqr²  r   r   r   Útest_bio_read_write_dataù  s    z.SimpleBackgroundTests.test_bio_read_write_dataN)rÑ  rÒ  rÓ  rŠ  r  r  r  r”  r—  r˜  r™  rš  r]   r]  r   r   rŸ  r¢  r¤  r¦  rá  r§  ra  r©  r³  r¹  r¼  r   r   r   r   r…  Ê  s*   
	

%"r…  Znetworkc                   @   s*   e Zd Zdd„ Ze ejd¡dd„ ƒZdS )ÚNetworkedTestsc                 C   s¦   t  t¡ˆ tt tj¡tjdd}|  |j	¡ | 
d¡ | tdf¡}|dkr\|  d¡ n|tjkrp|  d¡ |  |tjtjf¡ W d   ƒ n1 s˜0    Y  d S )NFr   gH¯¼šò×z>é»  r   z!REMOTE_HOST responded too quicklyzNetwork unreachable.)r   Útransient_internetÚREMOTE_HOSTr¤   rÃ   r'  r   r³   rà   rÝ   r@  rÊ  rÇ  rN  ZENETUNREACHr´   ÚEAGAINrË  r“  r   r   r   Útest_timeout_connect_ex	  s    þ


z&NetworkedTests.test_timeout_connect_exz
Needs IPv6c                 C   sF   t  d¡( t| ddƒ t| ddƒ W d   ƒ n1 s80    Y  d S )Nzipv6.google.comr¾  )r   r¿  r£  r¥  r½   r   r   r   Ú test_get_server_certificate_ipv6	  s    z/NetworkedTests.test_get_server_certificate_ipv6N)	rÑ  rÒ  rÓ  rÂ  r]   rÔ  r   rr  rÃ  r   r   r   r   r½  
	  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!©r•   z&
Verified certificate for %s:%s is
%s
)r   Úget_server_certificaterÚ   r   rl   rj   rm   rn   )Útestrn  rÍ  r[  r  r   r   r   r£  $	  s    r£  c              
   C   sl   zt j||ftd}W n< t jyR } z"tjr>tj d| ¡ W Y d }~nd }~0 0 |  	d|||f ¡ d S )NrÄ  z%s
z$Got server certificate %s for %s:%s!)
r   rÅ  rè   rÓ   r   rl   rj   rm   rn   rÚ   )rÆ  rn  rÍ  r  Úxr   r   r   r¥  /	  s    &r¥  )Úmake_https_serverc                   @   sR   e Zd ZG dd„ dejƒZddd„Zdd	„ Zd
d„ Zddd„Z	dd„ Z
dd„ ZdS )r†  c                   @   s<   e Zd Zd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 ©NFT)
rÌ  Úrunningr    Úaddrrj  ÚsslconnÚ	threadingÚThreadÚ__init__Údaemon)r¾   rÌ  ZconnsockrË  r   r   r   rÏ  D	  s    z-ThreadedEchoServer.ConnectionHandler.__init__c              
   C   s0  zD| j jj| jdd| _| j j | j ¡ ¡ | j j | j 	¡ ¡ W  nú t
ttfy® } zL| j j t|ƒ¡ | j jrŠtdt| jƒ d ƒ d| _|  ¡  W Y d }~dS d }~0  tjtfy> } zr| j j t|ƒ¡ | j j rötdt| jƒ d ƒ |jtjkr(tjdkr(d| _| j  ¡  |  ¡  W Y d }~dS d }~0 0 | j j | j ¡ ¡ | j jjtjkrÖ| j  ¡ }t!j"rœ| j jrœt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 )NTrE  z'
 server:  bad connection attempt from z:
FÚdarwinz client cert is rå   z cert binary is z bytes
z" server: connection cipher is now z" server: selected protocol is now ))rÌ  r£   rŸ   r    rÌ  Úselected_npn_protocolsÚappendÚselected_npn_protocolÚselected_alpn_protocolsÚselected_alpn_protocolÚConnectionResetErrorÚBrokenPipeErrorÚConnectionAbortedErrorÚconn_errorsrL   Úchattyrp   r„  rË  rÊ  rÝ   r   rÓ   r1  rN  Z
EPROTOTYPErj   rÖ  Ústopr·  rœ   r³   rŒ  r   rl   rm   rn   rì   rí   rR   rµ  )r¾   rd  r[  Zcert_binaryrµ  r   r   r   Ú	wrap_connN	  sN    ÿ



ÿÿz.ThreadedEchoServer.ConnectionHandler.wrap_connc                 C   s    | j r| j  ¡ S | j d¡S d S )Nr»  )rÌ  rA   r    r2  r½   r   r   r   rA   Œ	  s    
z)ThreadedEchoServer.ConnectionHandler.readc                 C   s"   | j r| j  |¡S | j |¡S d S r   )rÌ  rn   r    r6  )r¾   rš  r   r   r   rn   ’	  s    z*ThreadedEchoServer.ConnectionHandler.writec                 C   s    | j r| j  ¡  n
| j ¡  d S r   )rÌ  rÝ   r    r½   r   r   r   rÝ   ˜	  s    z*ThreadedEchoServer.ConnectionHandler.closec              
   C   sØ  d| _ | jjs|  ¡ sd S | j rÔzÄ|  ¡ }| ¡ }|svd| _ z| j ¡ | _W n t	yb   Y n0 d | _|  
¡  np|dkr¦tjr˜| jjr˜tj d¡ |  
¡  W d S | jjrì|dkrìtjrÐ| jjrÐtj d¡ |  d¡ |  ¡ sèW d S nú| jjrd| jrd|dkrdt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 ¡ n2|dkr8tjrÜ| jjrÜtj d¡ z| j ¡  W n@ tjy* } z$|  t|ƒ d¡d ¡ W Y d }~nd }~0 0 |  d¡ n®|dkrj| j ¡ d ur^|  d¡ n
|  d¡ n||dkr˜| j ¡ }|  t|ƒ d¡d ¡ nNtjrØ| jjrØ| jr¸dpºd}tj d||| ¡ |f ¡ |  | ¡ ¡ W q ttfy4   | jjr"tjr"tj d | j¡¡ |  
¡  d| _ Y q tjy” } zFd|jkr€| jjrvtjrvtj |jd ¡ t d¡‚W Y d }~qd }~0  t	yÐ   | jjr´t dƒ |  
¡  d| _ | j !¡  Y q0 qd S )NTFs   overz" server: client closed connection
ó   STARTTLSz2 server: read STARTTLS from client, sending OK...
ó   OK
ó   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...
r€  úus-asciió   
ó   PHAz( server: initiating post handshake auth
ó   HASCERTó   TRUE
ó   FALSE
ó   GETCERTZ	encryptedZunencryptedz/ server: read %r (%s), sending back %r (%s)...
z Connection reset by peer: {}
Z!PEER_DID_NOT_RETURN_A_CERTIFICATEr   ú!tlsv13 alert certificate requiredzTest server failure:
)"rÊ  rÌ  Ústarttls_serverrÝ  rA   ÚstriprÌ  r  r    r1  rÝ   r   rl   Úconnectionchattyrj   rm   rn   r}  r„  rp  Úverify_client_post_handshaker   rÓ   rŒ  rÆ  r×  rÙ  rÛ  ÚformatrË  rg  r^   rp   rÜ  )r¾   ÚmsgÚstrippedrÖ   rd  r[  ZctypeÚerrr   r   r   Úrunž	  s®    ÿ

ÿ


.


ÿÿÿÿ

z(ThreadedEchoServer.ConnectionHandler.runN)	rÑ  rÒ  rÓ  rÏ  rÝ  rA   rn   rÝ   rñ  r   r   r   r   ÚConnectionHandler>	  s   
>rò  NTFc                 C   sð   |r|| _ n€t |d ur|ntj¡| _ |d u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 rÉ  )r£   r   rZ   rO   rš   rœ   r   rž   Úset_npn_protocolsÚset_alpn_protocolsrG   rÛ  rë  ré  rÃ   r    r   rÉ  rÍ  ÚflagÚactiverÒ  rÕ  r·  rÚ  rÍ  rÎ  rÏ  rÐ  )r¾   Zcertificater¡   ÚcertreqsÚcacertsrÛ  rë  ré  Znpn_protocolsZalpn_protocolsr–   r£   r   r   r   rÏ  
  sB    ÿþÿ
zThreadedEchoServer.__init__c                 C   s   |   t ¡ ¡ | j ¡  | S r   ©ÚstartrÍ  ÚEventrõ  Úwaitr½   r   r   r   rˆ  +
  s    
zThreadedEchoServer.__enter__c                 G   s   |   ¡  |  ¡  d S r   )rÜ  r   ©r¾   r^   r   r   r   r‰  0
  s    zThreadedEchoServer.__exit__c                 C   s   || _ tj | ¡ d S r   ©rõ  rÍ  rÎ  rú  ©r¾   rõ  r   r   r   rú  4
  s    zThreadedEchoServer.startc              
   C   s
  | j  d¡ | j  ¡  d| _| jr,| j ¡  | jrüzT| j  ¡ \}}tjrf| j	rft
j dt|ƒ d ¡ |  | ||¡}| ¡  | ¡  W q, tjyš   Y q, ty²   |  ¡  Y q, tyø } z0tjrä| j	rät
j dt|ƒ d ¡ W Y d }~q,d }~0 0 q,| j  ¡  d S )Ngš™™™™™©?Tz server:  new connection from rå   z connection handling failed: )r    r@  Úlistenrö  rõ  r˜  r1  r   rl   rÛ  rj   rm   rn   r„  rò  rú  r   rÃ   rB  ÚKeyboardInterruptrÜ  rÞ   rÝ   )r¾   ZnewconnZconnaddrÚhandlerrd  r   r   r   rñ  8
  s6    

ÿÿÿzThreadedEchoServer.runc                 C   s
   d| _ d S r™   )rö  r½   r   r   r   rÜ  S
  s    zThreadedEchoServer.stop)NNNNTFFNNNN)N)rÑ  rÒ  rÓ  rÍ  rÎ  rò  rÏ  rˆ  r‰  rú  rñ  rÜ  r   r   r   r   r†  <	  s    I     ü
%
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)rF  r—   rz  )r¤   rÃ   ÚasyncoreÚdispatcher_with_sendrÏ  Ú_ssl_acceptingÚ_do_ssl_handshake)r¾   Úconnr—   r   r   r   rÏ  ^
  s    þz8AsyncoreEchoServer.EchoServer.ConnectionHandler.__init__c                 C   s*   t | jtjƒr&| j ¡ dkr&|  ¡  qdS )Nr   T)rK   rÃ   r   rÄ   r{  Zhandle_read_eventr½   r   r   r   Úreadablef
  s    
z8AsyncoreEchoServer.EchoServer.ConnectionHandler.readablec              
   C   sª   z| j  ¡  W n tjtjfy*   Y d S  tjyD   |  ¡  Y S  tjyX   ‚ Y nN tyž } z0|j	d t
jkrŠ|  ¡ W  Y d }~S W Y d }~nd }~0 0 d| _d S )Nr   F)rÃ   rl  r   rk  r’  ZSSLEOFErrorÚhandle_closerÓ   r1  r^   rN  ZECONNABORTEDr  ©r¾   rð  r   r   r   r  l
  s    *zAAsyncoreEchoServer.EchoServer.ConnectionHandler._do_ssl_handshakec                 C   sT   | j r|  ¡  n@|  d¡}tjr4tj dt|ƒ ¡ |sB|  	¡  n|  
| ¡ ¡ d S )Nr»  z server:  read %s from client
)r  r  r2  r   rl   rj   rm   rn   r„  rÝ   r6  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   rl   rj   rm   rn   rÃ   r½   r   r   r   r
  ‡
  s    z<AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_closec                  C   s   ‚ d S r   r   r½   r   r   r   rp   Œ
  s    z<AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_errorN)	rÑ  rÒ  rÓ  rÏ  r	  r  r  r
  rp   r   r   r   r   rò  \
  s   rò  c                 C   s@   || _ t tjtj¡}t |d¡| _tj 	| |¡ |  
d¡ d S )Nr&  rŒ   )r—   rÃ   r'  ÚSOCK_STREAMr   rÉ  rÍ  r  Ú
dispatcherrÏ  r   rS  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   rl   rj   rm   rn   rò  r—   )r¾   Zsock_objrË  r   r   r   Úhandle_accepted–
  s    z-AsyncoreEchoServer.EchoServer.handle_acceptedc                  C   s   ‚ d S r   r   r½   r   r   r   rp   ›
  s    z*AsyncoreEchoServer.EchoServer.handle_errorN)	rÑ  rÒ  rÓ  r  r  rò  rÏ  r  rp   r   r   r   r   Ú
EchoServerZ
  s   3r  c                 C   s8   d | _ d| _|  |¡| _| jj| _tj | ¡ d| _d S rÉ  )	rõ  rö  r  rÌ  rÍ  rÍ  rÎ  rÏ  rÐ  )r¾   r—   r   r   r   rÏ  ž
  s    
zAsyncoreEchoServer.__init__c                 C   s   d| j j| jf S )Nz<%s %s>)Ú	__class__rÑ  rÌ  r½   r   r   r   Ú__str__¦
  s    zAsyncoreEchoServer.__str__c                 C   s   |   t ¡ ¡ | j ¡  | S r   rù  r½   r   r   r   rˆ  ©
  s    
zAsyncoreEchoServer.__enter__c                 G   sV   t jrtj d¡ |  ¡  t jr,tj d¡ |  ¡  t jrFtj d¡ tjdd d S )Nz cleanup: stopping server.
z! cleanup: joining server thread.
z cleanup: successfully joined.
T)Z
ignore_all)	r   rl   rj   rm   rn   rÜ  r   r  Z	close_allrý  r   r   r   r‰  ®
  s    zAsyncoreEchoServer.__exit__Nc                 C   s   || _ tj | ¡ d S r   rþ  rÿ  r   r   r   rú  º
  s    zAsyncoreEchoServer.startc                 C   s>   d| _ | jr| j ¡  | j r:zt d¡ W q   Y q0 qd S )NTr   )rö  rõ  r˜  r  Zloopr½   r   r   r   rñ  ¾
  s    
zAsyncoreEchoServer.runc                 C   s   d| _ | j ¡  d S r™   )rö  rÌ  rÝ   r½   r   r   r   rÜ  È
  s    zAsyncoreEchoServer.stop)N)rÑ  rÒ  rÓ  r  r  r  rÏ  r  rˆ  r‰  rú  rñ  rÜ  r   r   r   r   r  V
  s   D

r  rº  TFc                 C   sž  i }t ||dd}|p | jt ¡ ||d}	|	 t|jf¡ |t|ƒt|ƒfD ]†}
|rrtj	rrt
j d| ¡ |	 |
¡ |	 ¡ }|ržtj	ržt
j d| ¡ || ¡ krTtd|d d… t|ƒ|d d…  ¡ t|ƒf ƒ‚qT|	 d¡ |rütj	rüt
j d	¡ | |	 ¡ |	 ¡ |	 ¡ |	 ¡ |	 ¡ |	 ¡ |	j|	jd
œ¡ |	 ¡  W d   ƒ n1 sR0    Y  |j|d< |j|d< |j|d< W d   ƒ n1 s0    Y  |S )NF©r£   rÛ  rë  )rv  Úsessionú client:  sending %r...
ú client:  read %r
ú4bad data <<%r>> (%d) received; expected <<%r>> (%d)
é   ó   over
ú client:  closing connection.
)Úcompressionrµ  ÚpeercertÚclient_alpn_protocolÚclient_npn_protocolr0   Úsession_reusedr  Úserver_alpn_protocolsÚserver_npn_protocolsÚserver_shared_ciphers)r†  rŸ   rÃ   rJ  rK  rÍ  rÔ   r}  r   rl   rj   rm   rn   rA   rÆ  ÚAssertionErrorrR   r  r  rµ  rŒ  rÖ  rÔ  r0   r  r  rÝ   rÕ  rÒ  r·  )r­   r®   ÚindatarÛ  rë  Úsni_namer  rL  rÌ  rÆ   ÚargÚoutdatar   r   r   Úserver_params_testÌ
  sb    þ
ÿÿ
ÿÿÿ
ø
(

*r(  c              
   C   sÎ  |d u 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 urÄt|	dƒrÄ| t jkrÄ|	j|
krÄ|
|	_|jt jkrÚ| d¡ t|	|ƒ ||	fD ]}||_| t¡ | t¡ qìzt||	ddd	}W nX t jy>   |r:‚ Y nŒ tyx } z"|sb|jtjkrd‚ W Y d }~nZd }~0 0 |sžtd
t  	|¡t  	| ¡f ƒ‚n,|durÊ||d krÊtd||d f ƒ‚d S )Nrš   r²   r³   z %s->%s %s
z {%s->%s} %s
rE   rÜ  F©rÛ  rë  z5Client protocol %s succeeded with server protocol %s!Tr0   z%version mismatch: expected %r, got %r)r   rš   r²   r³   r   rl   rj   rm   rn   Zget_protocol_namerZ   rì  ÚPROTOCOL_TO_TLS_VERSIONrª  rF   rN   rE   rS   rG   rJ   rœ   rž   r¥   r   r«   r(  rÓ   r1  rN  Ú
ECONNRESETr#  )Zserver_protocolZclient_protocolÚexpect_successZ	certsreqsÚserver_optionsÚclient_optionsZcerttypeZ	formatstrr­   r®   Zmin_versionrI   rL  rd  r   r   r   Útry_protocol_comboþ
  sx    	ýüþÿ

ýüû


ÿ
ÿÿÿ

ÿ
ÿr/  c                   @   sð  e Zd Zdd„ Zdd„ Ze eƒ d¡dd„ ƒZdd	„ Z	e e
jd
¡dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zedƒdd„ ƒZdd„ Zdd„ Zedƒdd„ ƒZdd „ Zed!ƒd"d#„ ƒZed$ƒd%d&„ ƒZed'ƒd(d)„ ƒZe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dƒdEdF„ ƒZ'e(ed*ƒdGdH„ ƒƒZ)e(ed'ƒdIdJ„ ƒƒZ*e(ed*ƒed$ƒdKdL„ ƒƒƒZ+e(ed!ƒdMdN„ ƒƒZ,e e
j-dO¡dPdQ„ ƒZ.e dRe
j/v dS¡dTdU„ ƒZ0dVdW„ Z1e e2e
dXƒdY¡dZd[„ ƒZ3e 4e5d\¡d]d^„ ƒZ6e e7d_¡e 4e8d`¡dadb„ ƒƒZ9dcdd„ Z:e e
j;de¡dfdg„ ƒZ<e e
j;dh¡didj„ ƒZ=dkdl„ Z>e e
j?dm¡dndo„ ƒZ@dpdq„ ZAdrds„ ZBeCdtdu„ ƒZDeCdvdw„ ƒZEeCdxdy„ ƒZFeCdzd{„ ƒZGd|d}„ ZHd~d„ ZId€d„ ZJd‚dƒ„ ZKd„d…„ ZLd†S )‡ÚThreadedTestsc              	   C   s~  t jrtj d¡ tD ]~}|tjtjhv r,qt	|ƒs6q| j
tj| d< t |¡}| t¡ t|ƒ t||ddd W d   ƒ q1 sŠ0    Y  qtƒ \}}}| j
tjtjd" t||dd|d W d   ƒ n1 sÜ0    Y  d|_| j
tjtjdb |  tj¡"}t||dd|d W d   ƒ n1 s60    Y  |  dt|jƒ¡ W d   ƒ n1 sh0    Y  | j
tjtjd` |  tj¡ }t||ddd	 W d   ƒ n1 sº0    Y  |  dt|jƒ¡ W d   ƒ n1 sì0    Y  | j
tjtjd` |  tj¡ }t||ddd	 W d   ƒ n1 s>0    Y  |  dt|jƒ¡ W d   ƒ n1 sp0    Y  d S )
Nrå   )rS   Tr)  )r‚  rÌ  )r­   r®   rÛ  rë  r%  Fz%called a function you should not call)r­   r®   rÛ  rë  )r   rl   rj   rm   rn   rÙ  r   rP   rO   rT   ZsubTestÚ_PROTOCOL_NAMESrZ   rž   rè   rJ   r(  r¯   r›   rÒ   rÓ   r´   rL   rM  )r¾   rS   r£   r­   r®   r¬   rd  r   r   r   Ú	test_echoI  sd    

ÿ&ý$ý&ÿ$þ&ÿ$þ&ÿzThreadedTests.test_echoc           
   
   C   sž  t jrtj d¡ tƒ \}}}t|dd}|X |jt ¡ d|d }| 	t
|jf¡ |  t¡ | ¡  W d   ƒ n1 s‚0    Y  | ¡  | ¡ }|  |d¡ | ¡ }t jrätj t |¡d ¡ tj dt|ƒ d ¡ d|vr|  d	t |¡ ¡ d
|d vr|  d¡ |  d|¡ |  d|¡ t |d ¡}t |d ¡}	|  ||	¡ W d   ƒ n1 sp0    Y  W d   ƒ n1 s0    Y  d S )Nrå   F©r£   rÛ  )rz  rv  úCan't get peer certificate.zConnection cipher is z.
r.   z$No subject field in certificate: %s.r$   zkMissing or invalid 'organizationName' field in certificate subject; should be 'Python Software Foundation'.r,   r+   )r   rl   rj   rm   rn   r¯   r†  rŸ   rÃ   rJ  rK  rÍ  rÒ   r   rŒ  rl  r  rµ  rì   rí   rL   rÚ   r´   r   r»  r  )
r¾   r­   r®   r¬   rÌ  rÆ   r[  rµ  ÚbeforeZafterr   r   r   Útest_getpeercert{  sF    
þ&
ÿÿÿzThreadedTests.test_getpeercertrù  c              
   C   s  t jrtj d¡ tƒ \}}}ttddƒ}|  |j	tj
|B ¡ t|dd}|f |jt ¡ |d4}| t|jf¡ | ¡ }|  |d¡ W d   ƒ n1 sœ0    Y  W d   ƒ n1 sº0    Y  | j	tjO  _	t|dd}|„ |jt ¡ |dP}|  tjd¡  | t|jf¡ W d   ƒ n1 s00    Y  W d   ƒ n1 sP0    Y  W d   ƒ n1 sp0    Y  | t¡ t|dd}|h |jt ¡ |d4}| t|jf¡ | ¡ }|  |d¡ W d   ƒ n1 sä0    Y  W d   ƒ n1 s0    Y  d S )	Nrå   rú  r   Tr3  ru  r4  rŽ  )r   rl   rj   rm   rn   r¯   rM   r   r¼   rû  rü  r†  rŸ   rÃ   rJ  rK  rÍ  rŒ  r  rý  rÁ   rÓ   r   ÚCRLFILE)r¾   r­   r®   r¬   rþ  rÌ  rÆ   r[  r   r   r   Útest_crl_checkŸ  sF    
ÿH
ÿÿp

ÿzThreadedTests.test_crl_checkc              
   C   sà  t jrtj d¡ tƒ \}}}t|dd}|f |jt ¡ |d4}| 	t
|jf¡ | ¡ }|  |d¡ W d   ƒ n1 s|0    Y  W d   ƒ n1 sš0    Y  t|dd}|‚ |jt ¡ ddN}|  tjd¡  | 	t
|jf¡ W d   ƒ n1 sþ0    Y  W d   ƒ n1 s0    Y  W d   ƒ n1 s>0    Y  t|dd}|r t ¡ H}|  td¡ | |¡ W d   ƒ n1 s’0    Y  W d   ƒ n1 s²0    Y  W d   ƒ n1 sÒ0    Y  d S )	Nrå   Tr3  ru  r4  rs  z:Hostname mismatch, certificate is not valid for 'invalid'.z'check_hostname requires server_hostname)r   rl   rj   rm   rn   r¯   r†  rŸ   rÃ   rJ  rK  rÍ  rŒ  r  rÁ   r   r]  r   )r¾   r­   r®   r¬   rÌ  rÆ   r[  r   r   r   rS  É  s<    
ÿH
ÿþn
ÿz!ThreadedTests.test_check_hostnamez)test requires hostname_checks_common_namec              
   C   s>  t ƒ \}}}d|_t|dd}|R |jt ¡ |d }| t|jf¡ W d   ƒ n1 s\0    Y  W d   ƒ n1 sz0    Y  t tƒ\}}}d|_t|dd}|€ |jt ¡ |dL}|  	t
j¡  | t|jf¡ W d   ƒ n1 sð0    Y  W d   ƒ n1 s0    Y  W d   ƒ n1 s00    Y  d S )NFTr3  ru  )r¯   ró  r†  rŸ   rÃ   rJ  rK  rÍ  r©   rÒ   r   ÚSSLCertVerificationError©r¾   r­   r®   r¬   rÌ  rÆ   r   r   r   rö  ê  s&    
ÿL
ÿz.ThreadedTests.test_hostname_checks_common_namec              	   C   sê   t  t j¡}| t¡ | d¡ t}t  t j¡}| t	¡ t
|dd}|Œ |jt ¡ |dZ}| t|jf¡ | ¡ }|  |d¡ | ¡ d  d¡}|  |d d… d	¡ W d   ƒ n1 s¾0    Y  W d   ƒ n1 sÜ0    Y  d S ©
NzECDHE:ECDSA:!NULL:!aRSATr3  ru  r4  r   ú-r£  )ZECDHEZECDSA)r   rZ   rP   r   r«   rG   ÚSIGNED_CERTFILE_ECC_HOSTNAMErO   rž   ÚSIGNED_CERTFILE_ECCr†  rŸ   rÃ   rJ  rK  rÍ  rŒ  r  rµ  Úsplit©r¾   r­   r¬   r®   rÌ  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}|Œ |jt ¡ |dZ}| t|jf¡ | ¡ }|  |d¡ | ¡ d  d¡}|  |d d… d	¡ W d   ƒ n1 sØ0    Y  W d   ƒ n1 sö0    Y  d S r;  )r   rZ   rP   r   r«   rì  r¹   rG   r=  rO   rž   r>  r¥   r†  rŸ   rÃ   rJ  rK  rÍ  rŒ  r  rµ  r?  r@  r   r   r   Útest_dual_rsa_ecc  s&    




ÿzThreadedTests.test_dual_rsa_eccc           	   
   C   s¬  t jrtj d¡ t tj¡}| t	¡ t tj
¡}tj|_d|_| t¡ g d¢}|D ]ª\}}t|dd}|‚ |jt ¡ |dP}|  |j|¡ | t|jf¡ | ¡ }|  |j|¡ |  |d¡ W d   ƒ n1 sÚ0    Y  W d   ƒ qX1 sø0    Y  qXt|dd}|‚ |jt ¡ ddN}|  tj¡  | t|jf¡ W d   ƒ n1 s^0    Y  W d   ƒ n1 s~0    Y  W d   ƒ n1 sž0    Y  d S )Nrå   T))u   kÃ¶nig.idn.pythontest.netúxn--knig-5qa.idn.pythontest.net)rC  rC  )s   xn--knig-5qa.idn.pythontest.netrC  )u(   kÃ¶nigsgÃ¤ÃŸchen.idna2003.pythontest.netú.xn--knigsgsschen-lcb0w.idna2003.pythontest.net)rD  rD  )s.   xn--knigsgsschen-lcb0w.idna2003.pythontest.netrD  )ú.xn--knigsgchen-b4a3dun.idna2008.pythontest.netrE  )s.   xn--knigsgchen-b4a3dun.idna2008.pythontest.netrE  r3  ru  r4  zpython.example.org)r   rl   rj   rm   rn   r   rZ   rO   rž   ÚIDNSANSFILErP   r³   rœ   r›   r   r«   r†  rŸ   rÃ   r¼   rv  rJ  rK  rÍ  rŒ  r  rÒ   r]  )	r¾   r®   r£   Zidn_hostnamesrv  Zexpected_hostnamerÌ  rÆ   r[  r   r   r   Útest_check_hostname_idn1  s:    


ÿJ
ÿz%ThreadedTests.test_check_hostname_idnc                 C   s6  t ƒ \}}}| t¡ tj|_tjj|_t	|ddd}|æ |j
t ¡ |d²}z| t|jf¡ W n‚ tjy  } z"tjrŒtj d| ¡ W Y d }~nZd }~0  tyæ } z0|jtjkr¼‚ tjrÒtj d| ¡ W Y d }~nd }~0 0 |  d¡ W d   ƒ n1 s0    Y  W d   ƒ n1 s(0    Y  d S )NTr  ru  ú
SSLError is %r
ú
socket.error is %r
ú'Use of invalid cert should have failed!)r¯   rž   rè   r   r³   rœ   r   rY   rV   r†  rŸ   rÃ   rJ  rK  rÍ  rÓ   r   rl   rj   rm   rn   r1  rN  r+  rÚ   ©r¾   r­   r®   r¬   rÌ  rÆ   rd  r   r   r   Útest_wrong_cert_tls12i  s0    

ÿ
ÿÿ$&z#ThreadedTests.test_wrong_cert_tls12r÷  c                 C   sV  t ƒ \}}}| t¡ tj|_tjj|_tjj|_t	|ddd}|ü |j
t ¡ |dÈ}| t|jf¡ z| d¡ | d¡ W n„ tjy¾ } z"tjrªtj d| ¡ W Y d }~n\d }~0  ty } z0|jtjkrÜ‚ tjròtj d| ¡ W Y d }~nd }~0 0 |  d¡ W d   ƒ n1 s(0    Y  W d   ƒ n1 sH0    Y  d S )	NTr  ru  ó   datarŠ   rH  rI  rJ  )r¯   rž   rè   r   r³   rœ   r   r÷  rE   r†  rŸ   rÃ   rJ  rK  rÍ  rn   rA   rÓ   r   rl   rj   rm   r1  rN  r+  rÚ   rK  r   r   r   Útest_wrong_cert_tls13Ž  s6    


ÿ
ÿÿ
$&z#ThreadedTests.test_wrong_cert_tls13c                    s|   t  ¡ ‰t  ¡ ‰ t ¡ ‰t ˆt¡‰‡ ‡‡fdd„}‡ ‡‡‡fdd„}t j|d}| ¡  z|ƒ  W | ¡  n
| ¡  0 d S )Nc                     s8   ˆ  ¡  ˆ ¡  ˆ ¡ \} }|  ¡  ˆ ¡  ˆ  ¡  d S r   )r   r˜  r1  rÝ   )ZnewsockrË  )Úlistener_goneÚlistener_readyrÆ   r   r   Úlistener»  s    z2ThreadedTests.test_rude_shutdown.<locals>.listenerc               	      st   ˆ  ¡  t ¡ P} |  tˆf¡ ˆ   ¡  zt| ƒ}W n tyF   Y n0 ˆ d¡ W d   ƒ n1 sf0    Y  d S )Nz2connecting to closed SSL socket should have failed)rü  rÃ   rJ  rK  r¤   r1  rÚ   )r~  Ússl_sock)rO  rP  rÍ  r¾   r   r   Ú	connectorÃ  s    
z3ThreadedTests.test_rude_shutdown.<locals>.connector©Útarget)	rÍ  rû  rÃ   r   rÉ  rK  rÎ  rú  r   )r¾   rQ  rS  r!  r   )rO  rP  rÍ  rÆ   r¾   r   Útest_rude_shutdown­  s    z ThreadedTests.test_rude_shutdownc                 C   s&  t jrtj d¡ t tj¡}| t	¡ t tj
¡}t|dd}|Ì |jt ¡ tdš}z| t|jf¡ W nt tjyâ } zZd}|  |tj¡ |  |jd¡ |  |j|¡ |  |t|ƒ¡ |  dt|ƒ¡ W Y d }~n
d }~0 0 W d   ƒ n1 sø0    Y  W d   ƒ n1 s0    Y  d S )Nrå   Tr3  ru  z&unable to get local issuer certificater  rŽ  )r   rl   rj   rm   rn   r   rZ   rO   rž   r¥   rP   r†  rŸ   rÃ   r¦   rJ  rK  rÍ  rÓ   r  r9  r¼   Zverify_codeZverify_messager´   r„  )r¾   r®   r£   rÌ  rÆ   rd  rî  r   r   r   Útest_ssl_cert_verify_errorÖ  s(    

ÿz(ThreadedTests.test_ssl_cert_verify_errorrU   c                 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dƒrrt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å   TFr   ©r.  )r   rl   rj   rm   rn   r/  r   ÚPROTOCOL_SSLv2r²   r³   rN   rQ   ÚPROTOCOL_SSLv3r   rz   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dƒrnzttjtj	dƒ W n> t
yl } z&t jrXtj dt|ƒ ¡ W Y d }~n
d }~0 0 tdƒr†ttjtjdƒ ttjtjdƒ tdƒr®ttjtjdƒ tdƒrÊttjtjdtjƒ ttjtjdtjƒ tdƒrúttjtjdtjƒ tdƒrttjtjdtjƒ ttjtjdtjƒ tdƒrJttjtjdtjƒ tdƒrjttjtjdtjd ttjtjdtjtjB d tdƒr¦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   rl   rj   rm   rn   rQ   r/  r   rN   rY  r1  rL   rZ  r   r²   r³   r·   r¶   r¸   )r¾   rÇ  r   r   r   Útest_PROTOCOL_TLS  sL    ÿÿ


ÿ
ÿ
ÿzThreadedTests.test_PROTOCOL_TLSr   c                 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
dƒrbt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   FrX  )r   rl   rj   rm   rn   r/  r   rZ  r²   r³   rQ   rY  rN   r·   r   rz   r¶   r½   r   r   r   Útest_protocol_sslv3-  s    ÿ
ÿz!ThreadedTests.test_protocol_sslv3r   c                 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
dƒrbttjtjdƒ t
dƒrzttjtjdƒ ttjtjdtjd d S )Nrå   r   rU   Fr   rX  )r   rl   rj   rm   rn   r/  r   r   r²   r³   rQ   rY  rZ  rN   r¸   r½   r   r   r   Útest_protocol_tlsv1?  s    ÿz!ThreadedTests.test_protocol_tlsv1r   c                 C   sœ   t jrtj d¡ ttjtjdƒ tdƒr:ttjtj	dƒ tdƒrRt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å   úTLSv1.1rU   Fr   rX  )r   rl   rj   rm   rn   r/  r   r   rQ   rY  rZ  rN   rº   ÚPROTOCOL_TLSv1_2r½   r   r   r   Útest_protocol_tlsv1_1N  s    ÿz#ThreadedTests.test_protocol_tlsv1_1rY   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
dƒrPttjtjdƒ t
dƒrhttjtjdƒ ttjtjdtjd ttjtjdƒ ttjƒr¸ttjtjdƒ ttjtjdƒ ttjƒrâttjtjdƒ ttjtjdƒ d S )Nrå   úTLSv1.2)r-  r.  rU   Fr   rX  )r   rl   rj   rm   rn   r/  r   r`  r·   r¶   rQ   rY  rZ  rN   r»   rT   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}|l t ¡ }| d¡ | t|jf¡ tjrTt	j
 d¡ |D ]Ú}tjrrt	j
 d| ¡ |rŠ| |¡ | ¡ }n| |¡ | d¡}| ¡  ¡ }|dkrà| d	¡ràtjrÒt	j
 d
| ¡ t|ƒ}d}qX|dkr| d	¡rtjrt	j
 d| ¡ | ¡ }d}qXtjrXt	j
 d| ¡ qXtjrHt	j
 d¡ |rZ| d¡ n
| d¡ |rt| ¡  n| ¡  W d   ƒ n1 s’0    Y  d S )N)s   msg 1s   MSG 2rÞ  s   MSG 3s   msg 4rà  s   msg 5s   msg 6T)ré  rÛ  rë  Frå   r  r»  rÞ  s   okz/ client:  read %r from server, starting TLS...
rà  z- client:  read %r from server, ending TLS...
z client:  read %r from server
r  r  )r†  rè   rÃ   rj  rJ  rK  rÍ  r   rl   rj   rm   rn   rA   r6  r2  rê  rÆ  r  r¤   r  rÝ   )	r¾   ZmsgsrÌ  ÚwrappedrÆ   r$  r  r'  rî  r   r   r   Útest_starttlsx  sl    ý
ÿ



ÿÿÿÿÿ

zThreadedTests.test_starttlsc                 C   sü   t | td}tjrtj d¡ ttdƒ}| 	¡ }W d   ƒ n1 sF0    Y  d}d|j
tj t¡d f }tjtd}tjj||d}zV| ¡  d	¡}|rÖt|ƒd
krÖ| 	t|ƒ¡}tjrÖtj dt|ƒ|f ¡ W | ¡  n
| ¡  0 |  ||¡ d S )NrH  rå   Úrbr&  zhttps://localhost:%d/%sr   ©r  ©r£   zcontent-lengthr   z/ client: read %d bytes from remote server '%s'
)rÈ  r¥   r   rl   rj   rm   rn   r@   rè   rA   rÍ  r   r   r?  r   rO  r«   ÚurllibÚrequestÚurlopenÚinforª  r  rR   rÝ   r¼   )r¾   rÌ  rC   r  r  Úurlr£   Zdlenr   r   r   Útest_socketserver±  s.    &ÿ
ÿÿzThreadedTests.test_socketserverc              	   C   s  t jrtj d¡ d}ttƒ}|Þ tt ¡ ƒ}| 	d|j
f¡ t jrVtj d| ¡ | |¡ | ¡ }t jr~tj d| ¡ || ¡ kr¼|  d|d d… t|ƒ|d d…  ¡ t|ƒf ¡ | d¡ t jrØtj d	¡ | ¡  t jròtj d
¡ W d   ƒ n1 s0    Y  d S )Nrå   rº  r  r  r  r  r  r  r  z client:  connection closed.
)r   rl   rj   rm   rn   r  rè   r¤   rÃ   rJ  rÍ  rA   rÆ  rÚ   rR   rÝ   )r¾   r$  rÌ  rÆ   r'  r   r   r   Útest_asyncore_serverË  s:    ÿ
ÿÿÿ
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}|D ]ú\}}}	}
}||  d¡}zz||g|
¢R Ž }d |¡}| j|||ƒ|d ˆ  ¡ }|| ¡ krx|  dj||d d… t|ƒ|d d… t|ƒd¡ W qä tyÜ } zH|	r¤|  dj|d¡ t|ƒ |¡sÈ|  dj||d¡ W Y d }~qäd }~0 0 qä|D ]Þ\}}}	}
||  d¡}zVˆ  |¡ ||
Ž }|| ¡ krR|  dj||d d… t|ƒ|d d… t|ƒd¡ W nj ty¾ } zP|	r~|  d j|d¡ t|ƒ |¡s¢|  dj||d¡ ˆ  ¡  W Y d }~n
d }~0 0 qäd!}ˆ  |¡ tt|ƒƒ}|  ˆ  d"|¡t|ƒ¡ |  ||¡ t d u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   ƒ n1 sÌ0    Y  d S )%Nrå   TF©r÷  r¡   rø  rÛ  rë  ©rF  r—   r•   r”   r¡   c                     s   t dƒ} ˆ  | ¡}| d |… S ©Nsd                                                                                                       )rÔ   r3  )Úbr¡  ©rÆ   r   r   Ú
_recv_intoü  s    
z0ThreadedTests.test_recv_send.<locals>._recv_intoc                     s"   t dƒ} ˆ  | ¡\}}| d |… S rr  )rÔ   r5  )rs  r¡  rË  rt  r   r   Ú_recvfrom_into  s    z4ThreadedTests.test_recv_send.<locals>._recvfrom_intor6  r7  zsome.addressr­  c                 S   s   d S r   r   )rÇ  r   r   r   Ú<lambda>
  ræ  z.ThreadedTests.test_recv_send.<locals>.<lambda>r2  r4  r3  r5  ZPREFIX_r`  zsending with {}©rî  zpWhile sending with <<{name:s}>> bad data <<{outdata:r}>> ({nout:d}) received; expected <<{indata:r}>> ({nin:d})
r  )r   r'  Znoutr$  Zninz>Failed to send with method <<{name:s}>>; expected to succeed.
r   zFMethod <<{name:s}>> failed with unexpected exception message: {exp:s}
)r   ÚexpzrWhile receiving with <<{name:s}>> bad data <<{outdata:r}>> ({nout:d}) received; expected <<{indata:r}>> ({nin:d})
zAFailed to receive with method <<{name:s}>>; expected to succeed.
rM  r§  r0  r  )*r   rl   rj   rm   rn   r†  rè   r   rš   rO   r¤   rÃ   rP   rJ  rK  rÍ  r6  rR   r7  r­  r2  r4  rp  rí  r¼   rA   rÆ  rÚ   r   rL   r  rÔ   ÚctypesZc_ubyteZfrom_buffer_copyrÒ   r8  r9  r:  r;  r<  rÝ   )r¾   rÌ  ru  rv  Zsend_methodsZrecv_methodsZdata_prefixZ	meth_nameZ	send_methr,  r^   Zret_val_methr$  r±  rî  r'  rd  Z	recv_methrÖ   ÚbufferZubyteZ	bytesliker   rt  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_eofsrM  r   ræ  )r†  rè   rˆ  rà   r‰  rÃ   ri  rK  rÍ  rÝ   r¤   r6  r¼   r2  rA   rj  r3  rÔ   )r¾   rÌ  rÆ   r   r   r   Útest_recv_zeroq  s    

zThreadedTests.test_recv_zeroc              	      s²   t ttjtjtddd}|‚ 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   ƒ n1 s¤0    Y  d S )NTFrp  rq  i    c                      s   ˆ  ˆ ¡ q d S r   )r6  r   ©r²  rÆ   r   r   Úfill_buffer™  s    z8ThreadedTests.test_nonblocking_send.<locals>.fill_buffer)r†  rè   r   rš   rO   r¤   rÃ   rP   rJ  rK  rÍ  rj  rÔ   rÒ   r’  rk  rÝ   )r¾   rÌ  r  r   r~  r   Útest_nonblocking_send…  s4    ûû
ÿÿ
z#ThreadedTests.test_nonblocking_sendc                    s"  t   t j¡‰d}t ˆ¡}t ¡ ‰d‰ ‡ ‡‡fdd„}tj|d}| ¡  ˆ ¡  z´zBt   t j¡}| 	d¡ | 
||f¡ |  t jdt|¡ W | ¡  n
| ¡  0 zBt   t j¡}t|ƒ}| 	d¡ |  t jd|j
||f¡ W | ¡  n
| ¡  0 W d‰ | ¡  ˆ ¡  nd‰ | ¡  ˆ ¡  0 d S )	Nr  Fc                     sb   ˆ  ¡  ˆ ¡  g } ˆ sLt ˆgg g d¡\}}}ˆ|v r|  ˆ ¡ d ¡ q| D ]}| ¡  qPd S )Ngš™™™™™¹?r   )r   r˜  r‘  rÓ  r1  rÝ   )Zconnsr  Úwrd  r    ©ZfinishrÌ  Ústartedr   r   Úserve«  s    z3ThreadedTests.test_handshake_timeout.<locals>.serverT  gš™™™™™É?z	timed outT)rÃ   r'  r   rÉ  rÍ  rû  rÎ  rú  rü  r@  rJ  rÁ   rB  r¤   rÝ   r   )r¾   rn  rÍ  r„  r!  r~  r   r‚  r   Útest_handshake_timeout£  s@    


ÿ


ÿ
þ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 )Nr  TrE  c                      s0   ˆ  ¡  ˆ  ¡  ˆ ¡ \‰‰ˆ ˆ d¡¡ d S )NrŠ   )r   r˜  r1  r6  r2  r   ©ZevtZpeerZremoterÌ  r   r   r„  ä  s    z/ThreadedTests.test_server_accept.<locals>.serverT  rM  )r   rZ   rN   r³   rœ   r   r«   rž   r¥   rÃ   r'  r   rÉ  rŸ   r  rF  rÍ  rû  rÎ  rú  rü  rJ  r6  r2  r|  rÝ   r   r  rÄ   r¼   )r¾   r£   rn  rÍ  r„  r!  r‚  Zclient_addrr   r†  r   Útest_server_acceptÔ  s6    



z ThreadedTests.test_server_acceptc              	   C   s‚   t  t j¡}| t ¡ ¡T}|  t¡}| ¡  W d   ƒ n1 sD0    Y  |  |j	j
t
j¡ W d   ƒ n1 st0    Y  d S r   )r   rZ   rN   rŸ   rÃ   rÒ   r1  rŒ  r¼   rM  rN  ÚENOTCONN©r¾   r£   r    rP  r   r   r   Útest_getpeercert_enotconný  s
    &z'ThreadedTests.test_getpeercert_enotconnc              	   C   s‚   t  t j¡}| t ¡ ¡T}|  t¡}| ¡  W d   ƒ n1 sD0    Y  |  |j	j
t
j¡ W d   ƒ n1 st0    Y  d S r   )r   rZ   rN   rŸ   rÃ   rÒ   r1  rl  r¼   rM  rN  rˆ  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t ¡ |dJ}|  t	¡  | 
t|jf¡ W d   ƒ n1 s€0    Y  W d   ƒ n1 sž0    Y  W d   ƒ n1 s¼0    Y  |  d|jd ¡ d S )NZAES128ÚAES256rh  ru  zno shared cipherr   )r¯   rì  r   r¹   rG   r†  rŸ   rÃ   rÒ   r1  rJ  rK  rÍ  r´   rÚ  r:  r   r   r   Útest_no_shared_ciphers  s    


ÿj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dƒrˆ|  | ¡ d¡ n,t jdkr¤|  | ¡ d¡ n|  | ¡ d¡ W d   ƒ n1 sÈ0    Y  |  |jd ¡ |  | ¡ d ¡ W d   ƒ n1 s0    Y  d S )NF)r¡   rÛ  r÷  úTLSv1.3)r   r   r£  rb  )r   rb  )r   rZ   rP   r›   rš   rœ   r†  rè   rO   rŸ   rÃ   rÈ   r0   r¨  rJ  rK  rÍ  rb  rQ   r¼   ry   r´   ©r¾   r£   rÌ  rÆ   r   r   r   Útest_version_basic  s&    þ
.z ThreadedTests.test_version_basicc              	   C   sÆ   t  t j¡}| t¡ | jt jt jB t jB O  _t	|dv}| 
t ¡ ¡H}| t|jf¡ |  | ¡ d h d£¡ |  | ¡ d¡ W d   ƒ n1 sš0    Y  W d   ƒ n1 s¸0    Y  d S )Nrh  r   >   ZTLS_AES_128_GCM_SHA256ZTLS_CHACHA20_POLY1305_SHA256ZTLS_AES_256_GCM_SHA384rŽ  )r   rZ   rN   rž   rè   rì  r¸   rº   r»   r†  rŸ   rÃ   rJ  rK  rÍ  r´   rµ  r¼   r0   r  r   r   r   Útest_tls1_31  s    
ÿzThreadedTests.test_tls1_3c              	   C   s´   t ƒ \}}}tjj|_tjj|_tjj|_tjj|_t|db}|jt	 	¡ |d0}| 
t|jf¡ |  | ¡ d¡ W d   ƒ n1 sˆ0    Y  W d   ƒ n1 s¦0    Y  d S )Nrh  ru  rb  )r¯   r   r   r   rE   rY   rV   r†  rŸ   rÃ   rJ  rK  rÍ  r¼   r0   r:  r   r   r   Útest_min_max_version_tlsv1_2B  s    




ÿz*ThreadedTests.test_min_max_version_tlsv1_2c              	   C   s¾   t ƒ \}}}tjj|_tjj|_tjj|_tjj|_t||ƒ t	|db}|j
t ¡ |d0}| t|jf¡ |  | ¡ d¡ W d   ƒ n1 s’0    Y  W d   ƒ n1 s°0    Y  d S )Nrh  ru  r_  )r¯   r   r   r   rE   rY   rV   r   rJ   r†  rŸ   rÃ   rJ  rK  rÍ  r¼   r0   r:  r   r   r   Útest_min_max_version_tlsv1_1S  s    





ÿz*ThreadedTests.test_min_max_version_tlsv1_1c              
   C   sì   t ƒ \}}}tjj|_tjj|_tjj|_tjj|_t||ƒ t|d}|j	t
 
¡ |d^}|  tj¡ }| t|jf¡ W d   ƒ n1 s0    Y  |  dt|jƒ¡ W d   ƒ n1 sÀ0    Y  W d   ƒ n1 sÞ0    Y  d S )Nrh  ru  Zalert)r¯   r   r   rY   rV   rE   r   rJ   r†  rŸ   rÃ   rÒ   rÓ   rJ  rK  rÍ  r´   rL   rM  rK  r   r   r   Útest_min_max_version_mismatchd  s    





ÿ.z+ThreadedTests.test_min_max_version_mismatchc              	   C   s´   t ƒ \}}}tjj|_tjj|_tjj|_t||ƒ t|db}|jt	 	¡ |d0}| 
t|jf¡ |  | ¡ d¡ W d   ƒ n1 sˆ0    Y  W d   ƒ n1 s¦0    Y  d S )Nrh  ru  r   )r¯   r   r   r   rE   rV   rJ   r†  rŸ   rÃ   rJ  rK  rÍ  r¼   r0   r:  r   r   r   Útest_min_max_version_sslv3w  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b}| 
t ¡ ¡4}| t|jf¡ |  d| ¡ d ¡ W d   ƒ n1 sŽ0    Y  W d   ƒ n1 s¬0    Y  d S )N)r   r   r   zECCdraft:ECDHrh  ZECDHr   )r   rZ   rN   rž   rè   rì  r¹   ry   rG   r†  rŸ   rÃ   rJ  rK  rÍ  r´   rµ  r  r   r   r   Útest_default_ecdh_curve†  s    


z%ThreadedTests.test_default_ecdh_curver€  r  c           	   	   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   ƒ n1 sò0    Y  |jt ¡ |d¶}| 	t
|jf¡ | d¡}t jrDtj d |¡¡ |  ||¡ |  |¡ | ¡ dkrz|  t|ƒd	¡ n|  t|ƒd
¡ | d¡ | ¡  ¡ }|  |t|ƒ d¡¡ W d   ƒ n1 sÌ0    Y  W d   ƒ n1 sì0    Y  d S )Nrå   TFr  ru  r€  z! got channel binding data: {0!r}
rŽ  é0   é   s   CB tls-unique
rá  z(got another channel binding data: {0!r}
)r   rl   rj   rm   rn   r¯   r†  rŸ   rÃ   rJ  rK  rÍ  r}  rí  r¶  r0   r¼   rR   rA   rê  r„  rp  rá   )	r¾   r­   r®   r¬   rÌ  rÆ   Zcb_dataZpeer_data_reprZnew_cb_datar   r   r   rƒ  š  sf    þþ
ÿ

ÿ"þ
ÿÿ

ÿz-ThreadedTests.test_tls_unique_channel_bindingc                 C   sR   t ƒ \}}}t||dd|d}tjr:tj d |d ¡¡ |  |d h d£¡ d S )NT©rÛ  rë  r%  z got compression: {!r}
r  >   ZRLENZZLIB)	r¯   r(  r   rl   rj   rm   rn   rí  r´   ©r¾   r­   r®   r¬   rL  r   r   r   Útest_compressionÖ  s    þzThreadedTests.test_compressionr9   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 )NTr™  r  )r¯   rì  r   r9   r(  rÈ   rš  r   r   r   Útest_compression_disabledß  s    þz'ThreadedTests.test_compression_disabledr+  c                 C   s–   t ƒ \}}}| jtjO  _| t¡ | d¡ | jtjO  _t||dd|d}|d d }| d¡}d|vr’d|vr’d	|vr’|  	d
|d  ¡ d S )NZkEDHTr™  rµ  r   r<  ZADHZEDHZDHEzNon-DH cipher: )
r¯   rì  r   r¹   r-  r.  rG   r(  r?  rÚ   )r¾   r­   r®   r¬   rL  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  _zt||dd|d}W n tjyú   Y n0 t	r|  
d¡ d S )Nr|   zECDHE:!eNULL:!aNULLTr™  r7  zmismatch curve did not fail)r¯   r~   rG   rì  r   r¸   rº   r(  rÓ   ÚIS_OPENSSL_1_1_0rÚ   rš  r   r   r   Útest_ecdh_curveû  s<    

þ

þ


þ
zThreadedTests.test_ecdh_curvec                 C   s2   t ƒ \}}}t||dd|d}|  |d d ¡ d S )NTr™  r  ©r¯   r(  rÈ   rš  r   r   r   Útest_selected_alpn_protocol"  s    þz)ThreadedTests.test_selected_alpn_protocolzALPN support requiredc                 C   s@   t ƒ \}}}| ddg¡ t||dd|d}|  |d d ¡ d S )NrÏ   ÚbarTr™  r  )r¯   rô  r(  rÈ   rš  r   r   r   Ú/test_selected_alpn_protocol_if_server_uses_alpn*  s    þz=ThreadedTests.test_selected_alpn_protocol_if_server_uses_alpnz!ALPN support needed for this testc                 C   s8  g d¢}ddgdfddgdfdgdfddgd fg}|D ]ü\}}t ƒ \}}}| |¡ | |¡ zt||dd|d}W n* tjyž }	 z|	}W Y d }	~	n
d }	~	0 0 |d u rÆtrÆtjd	k rÆ|  |tj¡ q6d
t|ƒt|ƒt|ƒf }
|d }|  	|||
|df ¡ t
|d ƒr|d d nd}|  	|||
|df ¡ q6d S )N)rÏ   r£  Ú	milkshakerÏ   r£  r¥  zhttp/3.0zhttp/4.0Tr™  )r   r   r   rˆ  úKfailed trying %s (s) and %s (c).
was expecting %s, but got %%s from the %%sr  r‚  r   r§  ÚnothingrÌ  )r¯   rô  r(  r   rÓ   rŸ  ry   r  rL   r¼   rR   )r¾   Úserver_protocolsÚprotocol_testsÚclient_protocolsr®  r­   r®   r¬   rL  rd  rî  Úclient_resultÚserver_resultr   r   r   Útest_alpn_protocols4  sN    


ü

ü
ÿÿþ
ÿ
ÿÿ
ÿz!ThreadedTests.test_alpn_protocolsc                 C   s2   t ƒ \}}}t||dd|d}|  |d d ¡ d S )NTr™  r  r¡  rš  r   r   r   Útest_selected_npn_protocol\  s    þz(ThreadedTests.test_selected_npn_protocolz NPN support needed for this testc                 C   sâ   ddg}ddgdfddgdfddgdfddgdfg}|D ]¤\}}t ƒ \}}}| |¡ | |¡ t||dd|d}dt|ƒt|ƒt|ƒf }	|d	 }
|  |
||	|
d
f ¡ t|d ƒrÂ|d d nd}|  |||	|df ¡ q8d S )Nzhttp/1.1zspdy/2rÆ  ÚabcÚdefTr™  r¦  r  r‚  r!  r§  r§  rÌ  )r¯   ró  r(  rL   r¼   rR   )r¾   r¨  r©  rª  r®  r­   r®   r¬   rL  rî  r«  r¬  r   r   r   Útest_npn_protocolsd  s4    



ü

þÿþ
ÿÿz ThreadedTests.test_npn_protocolsc                 C   sL   t  t j¡}| t¡ t  t j¡}| t¡ t  t j¡}| t¡ |||fS r   )	r   rZ   rO   rž   r¥   r§   rP   r   r«   )r¾   r®   Úother_contextr­   r   r   r   Úsni_contexts~  s    


zThreadedTests.sni_contextsc                 C   s"   |d }|   d|ff|d ¡ d S )Nr  r&   r.   )r´   )r¾   rL  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 urˆ| _d S r   )rÓ  r£   ©rR  Zserver_nameZinitial_context©Zcallsr²  r   r   Úservername_cb’  s    z6ThreadedTests.test_sni_callback.<locals>.servername_cbTÚsupermessage©rÛ  r%  r5   Znotfunny)r³  r›   r=  r(  r¼   r´  r¦   )r¾   r®   r­   r·  rL  r   r¶  r   r>  ‹  s4    
þþ
þzThreadedTests.test_sni_callbackc                 C   sp   |   ¡ \}}}dd„ }| |¡ |  tj¡ }t||ddd}W d   ƒ n1 sR0    Y  |  |jjd¡ d S )Nc                 S   s   t jS r   )r   ZALERT_DESCRIPTION_ACCESS_DENIEDrµ  r   r   r   Úcb_returning_alert¹  s    zAThreadedTests.test_sni_callback_alert.<locals>.cb_returning_alertFr¸  r¹  ZTLSV1_ALERT_ACCESS_DENIED)	r³  r=  rÒ   r   rÓ   r(  r¼   rM  rg  )r¾   r®   r²  r­   rº  rP  rL  r   r   r   Útest_sni_callback_alert´  s    
þ$z%ThreadedTests.test_sni_callback_alertc              	   C   s¨   |   ¡ \}}}dd„ }| |¡ t ¡ l}|  tj¡ }t||ddd}W d   ƒ n1 s\0    Y  |  |j	j
d¡ |  |jjt¡ W d   ƒ n1 sš0    Y  d S )Nc                 S   s   dd  d S )Nr   r   r   rµ  r   r   r   Ú
cb_raisingÇ  s    z;ThreadedTests.test_sni_callback_raising.<locals>.cb_raisingFr¸  r¹  ZSSLV3_ALERT_HANDSHAKE_FAILURE)r³  r=  r   Úcatch_unraisable_exceptionrÒ   r   rÓ   r(  r¼   rM  rg  Ú
unraisableÚexc_typeÚZeroDivisionError)r¾   r®   r²  r­   r¼  ÚcatchrP  rL  r   r   r   Útest_sni_callback_raisingÂ  s    

þ$
ÿz'ThreadedTests.test_sni_callback_raisingc              	   C   s¨   |   ¡ \}}}dd„ }| |¡ t ¡ l}|  tj¡ }t||ddd}W d   ƒ n1 s\0    Y  |  |j	j
d¡ |  |jjt¡ W d   ƒ n1 sš0    Y  d S )Nc                 S   s   dS )NrÏ   r   rµ  r   r   r   Úcb_wrong_return_typeÛ  s    zOThreadedTests.test_sni_callback_wrong_return_type.<locals>.cb_wrong_return_typeFr¸  r¹  ZTLSV1_ALERT_INTERNAL_ERROR)r³  r=  r   r½  rÒ   r   rÓ   r(  r¼   rM  rg  r¾  r¿  rÂ   )r¾   r®   r²  r­   rÃ  rÁ  rP  rL  r   r   r   Ú#test_sni_callback_wrong_return_typeÕ  s    

þ$z1ThreadedTests.test_sni_callback_wrong_return_typec           	         s†   t ƒ \}}}| d¡ | d¡ g d¢}t|||d}|d d }|  t|ƒd¡ |D ]*\‰ }}t‡ fdd„|D ƒƒsV|  ˆ ¡ qVd S )	NzAES128:AES256rŒ  )rŒ  zAES-256ZTLS_CHACHA20ZTLS_AES©r%  r"  r   c                 3   s   | ]}|ˆ v V  qd S r   r   )rä  Zalgr   r   r   rå  ø  ræ  z4ThreadedTests.test_shared_ciphers.<locals>.<genexpr>)r¯   rG   r(  ÚassertGreaterrR   ÚanyrÚ   )	r¾   r­   r®   r¬   Zexpected_algsrL  r–   Ztls_versionÚbitsr   r   r   Útest_shared_ciphersé  s    

ÿz!ThreadedTests.test_shared_ciphersc                 C   sŠ   t ƒ \}}}t|dd}|Z |jt ¡ |d}| t|jf¡ | ¡  |  t	|j
d¡ |  t	|jd¡ W d   ƒ n1 s|0    Y  d S )NFr3  ru  r»  s   hello)r¯   r†  rŸ   rÃ   rJ  rK  rÍ  rÝ   rÒ   r   rA   rn   r:  r   r   r   Ú,test_read_write_after_close_raises_valuerrorû  s    
ÿz:ThreadedTests.test_read_write_after_close_raises_valuerrorc              
   C   s0  d}t tjdƒ}| |¡ W d   ƒ n1 s00    Y  |  tjtj¡ t tj¡}tj	|_
| t¡ | t¡ t|dd}|˜ | t ¡ ¡h}| t|jf¡ t tjdƒ,}| |¡ |  | d¡|¡ W d   ƒ n1 sâ0    Y  W d   ƒ n1 s0    Y  W d   ƒ n1 s"0    Y  d S )Ns   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxÚwbFr3  rf  r»  )r@   r   ÚTESTFNrn   rà   Úunlinkr   rZ   rN   r³   rœ   r   r«   rž   r¥   r†  rŸ   rÃ   rJ  rK  rÍ  Úsendfiler¼   r2  )r¾   Z	TEST_DATArC   r£   rÌ  rÆ   Úfiler   r   r   Útest_sendfile  s    (


zThreadedTests.test_sendfilec           
      C   s@  t ƒ \}}}| jtjO  _t|||d}|d }|  |j¡ |  |jd¡ |  |j	d¡ |  |j
¡ tjdkr~|  |jd¡ |  |d ¡ | ¡ }|  |d d¡ |  |d d¡ t||||d	}| ¡ }|  |d d
¡ |  |d d¡ |  |d ¡ |d }|  |j|j¡ |  ||¡ |  ||¡ |  |j|j¡ |  |j	|j	¡ t|||d}|  |d ¡ |d }|  |j|j¡ |  ||¡ | ¡ }|  |d d¡ |  |d d¡ t||||d	}|  |d ¡ |d }	|  |	j|j¡ |  |	|¡ |  |	j|j¡ |  |	j	|j	¡ | ¡ }|  |d d¡ |  |d d
¡ d S )NrÅ  r  r   r±   r  r1  r   r2  )r  r%  r£  r   rŠ   )r¯   rì  r   r¹   r(  r  ÚidrÆ  r‚   rB  Z
has_ticketry   Zticket_lifetime_hintrð  r4  r¼   ZassertIsNotr  rá   )
r¾   r­   r®   r¬   rL  r  Z	sess_statZsession2Zsession3Zsession4r   r   r   Útest_session  sf    ÿ
ÿÿÿzThreadedTests.test_sessionc           
   
   C   s¨  t ƒ \}}}t ƒ \}}}| jtjO  _| jtjO  _t|dd}|H |jt ¡ |dŽ}|  |jd ¡ |  |j	d ¡ | 
t|jf¡ |j}|  |¡ |  t¡}	t|_W d   ƒ n1 sÂ0    Y  |  t|	jƒd¡ W d   ƒ n1 sò0    Y  |jt ¡ |dd}| 
t|jf¡ |  t¡}	||_W d   ƒ n1 sH0    Y  |  t|	jƒd¡ W d   ƒ n1 sz0    Y  |jt ¡ |dT}||_| 
t|jf¡ |  |jj|j¡ |  |j|¡ |  |j	d¡ W d   ƒ n1 sò0    Y  |jt ¡ |dd}|  t¡&}	||_| 
t|jf¡ W d   ƒ n1 sH0    Y  |  t|	jƒd¡ W d   ƒ n1 sz0    Y  W d   ƒ n1 sš0    Y  d S )NFr3  ru  zValue is not a SSLSession.z#Cannot set session after handshake.Tz)Session refers to a different SSLContext.)r¯   rì  r   r¹   r†  rŸ   rÃ   r¼   r  r  rJ  rK  rÍ  r  rÒ   rÂ   r)  rL   rM  r   rÑ  )
r¾   r­   r®   r¬   Zclient_context2rƒ  rÌ  rÆ   r  rd  r   r   r   Útest_session_handlingS  s^    
ÿ
$0
ÿ&ÿ$
ÿ.
ÿ0ÿz#ThreadedTests.test_session_handlingN)MrÑ  rÒ  rÓ  r2  r6  r]   rÔ  r{   r8  rS  r   rô  rö  rA  rB  rG  rL  rf   rN  rV  rW  r[  r\  r]  r^  ra  rc  re  rn  ro  r|  r}  r€  r…  r‡  rŠ  r‹  r  r  r‘  r^  r’  r“  r”  r•  r}   r–  rÕ  rƒ  r›  rF   rœ  r]  r`  rž  ÚHAVE_SECP_CURVESrb  r   r¢  ZHAS_ALPNr¤  r­  r®  ZHAS_NPNr±  r³  r´  ra  r>  r»  rÂ  rÄ  rÉ  rÊ  rÐ  rÒ  rÓ  r   r   r   r   r0  G  sÂ   2$ÿ
(!ÿ
8%
)
*



9 
1)

ÿ
:	ÿ
	



%
	
'
	
(


:r0  r÷  zTest needs TLS 1.3c                   @   sT   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚTestPostHandshakeAuthc                 C   sÀ   t jt jt jg}|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d S rÉ  )
r   rN   rO   rP   rZ   r¼   Úpost_handshake_authr³   rœ   r²   )r¾   Z	protocolsrS   rI   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   ƒ n1 s0    Y  W d   ƒ n1 s,0    Y  d S )NTFr3  ru  rä  r»  ræ  rã  rß  rå  rç  i   rá  r1   )r¯   rÖ  r   r³   rœ   rž   r¥   r†  rŸ   rÃ   rJ  rK  rÍ  rn   r¼   r2  rq  r´   )r¾   r­   r®   r¬   rÌ  rÆ   Z	cert_textr   r   r   Útest_pha_required   s.    

ÿ




z'TestPostHandshakeAuth.test_pha_requiredc                 C   s  t ƒ \}}}d|_tj|_d|_t ¡ à}t|dd}|° |jt	 	¡ |d~}| 
t|jf¡ | d¡ |  | d¡d¡ | d¡ |  tjd	¡ | d¡ W d   ƒ n1 s´0    Y  W d   ƒ n1 sÒ0    Y  W d   ƒ n1 sð0    Y  W d   ƒ n1 s0    Y  d S )
NTFr3  ru  rã  r»  rß  rä  rè  )r¯   rÖ  r   r³   rœ   r   Zcatch_threading_exceptionr†  rŸ   rÃ   rJ  rK  rÍ  rn   r¼   r2  rÁ   rÓ   )r¾   r­   r®   r¬   rP  rÌ  rÆ   r   r   r   Útest_pha_required_nocert¹  s(    

ÿ

þz.TestPostHandshakeAuth.test_pha_required_nocertc              	   C   s  t jrtj d¡ tƒ \}}}d|_tj|_	d|_| 
t¡ tj|_	t|dd}|¦ |jt ¡ |dt}| t|jf¡ | d¡ |  | d¡d¡ | d	¡ |  | d¡d
¡ | d¡ |  | d¡d¡ W d   ƒ n1 sâ0    Y  W d   ƒ n1 s0    Y  d S )Nrå   TFr3  ru  rä  r»  ræ  rã  rß  rå  )r   rl   rj   rm   rn   r¯   rÖ  r   r³   rœ   rž   r¥   r²   r†  rŸ   rÃ   rJ  rK  rÍ  r¼   r2  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t}| t|jf¡ | d¡ |  | d¡d¡ | d	¡ |  | d¡d
¡ | d¡ |  | d¡d¡ W d   ƒ n1 sÐ0    Y  W d   ƒ n1 sî0    Y  d S )Nrå   TFr3  ru  rä  r»  ræ  rã  rß  )r   rl   rj   rm   rn   r¯   rÖ  r   r²   rœ   r†  rŸ   rÃ   rJ  rK  rÍ  r¼   r2  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}|¤ |jt	 	¡ |dr}| 
t|jf¡ |  tjd¡ | ¡  W d   ƒ n1 s†0    Y  | d¡ |  d| d¡¡ W d   ƒ n1 sÀ0    Y  W d   ƒ n1 sÞ0    Y  d S )	NTFr3  ru  z
not serverrã  s   extension not receivedr»  )r¯   rÖ  r   r³   rœ   rž   r¥   r†  rŸ   rÃ   rJ  rK  rÍ  rÁ   rÓ   rì  rn   r´   r2  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t}| 
t|jf¡ | d¡ |  | d¡d¡ | d¡ |  | d¡d	¡ | d¡ |  | d¡d¡ W d   ƒ n1 sÂ0    Y  W d   ƒ n1 sà0    Y  d S )
NTFr3  ru  rä  r»  rå  rã  rß  )r¯   r   r³   rœ   rÖ  rž   r¥   r†  rŸ   rÃ   rJ  rK  rÍ  rn   r¼   r2  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}|n |jt ¡ |d<}| t|jf¡ | d¡ |  d| d¡¡ W d   ƒ n1 s”0    Y  W d   ƒ n1 s²0    Y  d S )NTFr3  ru  rã  s   WRONG_SSL_VERSIONr»  )r¯   r   r³   rœ   r   rY   rV   rÖ  rž   r¥   r†  rŸ   rÃ   rJ  rK  rÍ  rn   r´   r2  r:  r   r   r   Útest_pha_not_tls13$  s    


ÿ
z(TestPostHandshakeAuth.test_pha_not_tls13c              	   C   s:  t }t tj¡}d|_| t¡ d|_tj|_	t tj
¡}| t¡ | t¡ d|_tj|_	t|dd}|¸ |jt ¡ |d„}| t|jf¡ | d¡ |  | d¡d¡ | d¡ |  | d¡d	¡ | d¡ |  | d¡d
¡ |  | ¡ i ¡ W d   ƒ n1 s0    Y  W d   ƒ n1 s,0    Y  d S )NTFr3  ru  rä  r»  ræ  rã  rß  rå  )r¦   r   rZ   rP   rÖ  rž   r¥   r›   rš   rœ   rO   r   r«   r³   r†  rŸ   rÃ   rJ  rK  rÍ  rn   r¼   r2  rŒ  )r¾   r¬   r­   r®   rÌ  rÆ   r   r   r   Útest_bpo37428_pha_cert_none5  s2    



ÿ


z1TestPostHandshakeAuth.test_bpo37428_pha_cert_noneN)rÑ  rÒ  rÓ  r×  rØ  rÙ  rÚ  rÛ  rÜ  rÝ  rÞ  rß  r   r   r   r   rÕ  †  s   rÕ  Úkeylog_filenamez0test requires OpenSSL 1.1.1 with keylog callbackc                   @   sŠ   e Zd Zejfdd„Zee e	d¡dd„ ƒƒZ
ee e	d¡dd„ ƒƒZee ejjd¡e e	d¡d	d
„ ƒƒƒZdd„ Zdd„ Zdd„ ZdS )ÚTestSSLDebugc                 C   s8   t |ƒ}tt|ƒƒW  d   ƒ S 1 s*0    Y  d S r   )r@   rR   r™  )r¾   ZfnamerC   r   r   r   Úkeylog_lines[  s    
zTestSSLDebug.keylog_linesr+  c                 C   s  |   tjtj¡ t tj¡}|  |jd ¡ |  	t
j tj¡¡ tj|_|  |jtj¡ |  t
j tj¡¡ |  |  ¡ d¡ d |_|  |jd ¡ |  ttf¡( t
j t
j tj¡¡|_W d   ƒ n1 sÊ0    Y  |  t¡ d|_W d   ƒ n1 sú0    Y  d S )Nr   )rà   r   rÍ  rÌ  r   rZ   rP   r¼   rà  rð  r   r   Úisfiler  râ  rÒ   ÚIsADirectoryErrorÚPermissionErrorr   ÚabspathrÂ   rà  r   r   r   Útest_keylog_defaults_  s     ÿ$z!TestSSLDebug.test_keylog_defaultsc              	   C   sÞ  |   tjtj¡ tƒ \}}}tj|_t|dd}|R |jt ¡ |d }| 	t
|jf¡ W d   ƒ n1 sn0    Y  W d   ƒ n1 sŒ0    Y  |  |  ¡ d¡ d |_tj|_t|dd}|R |jt ¡ |d }| 	t
|jf¡ W d   ƒ n1 sþ0    Y  W d   ƒ n1 s0    Y  |  |  ¡ d¡ tj|_tj|_t|dd}|T |jt ¡ |d }| 	t
|jf¡ W d   ƒ n1 s”0    Y  W d   ƒ n1 s´0    Y  |  |  ¡ d¡ d |_d |_d S )NFr3  ru  rˆ  é   é   )rà   r   rÍ  rÌ  r¯   rà  r†  rŸ   rÃ   rJ  rK  rÍ  r¼   râ  r  r:  r   r   r   Útest_keylog_filenamew  sB    
ÿL
ÿN
ÿPz!TestSSLDebug.test_keylog_filenamez.test is not compatible with ignore_environmentc                 C   s®   |   tjtj¡ tjj tj	¡z tjtj	d< |  
tj	d tj¡ t tj¡}|  
|jd ¡ t ¡ }|  
|jtj¡ t ¡ }|  
|jtj¡ W d   ƒ n1 s 0    Y  d S )NZSSLKEYLOGFILE)rà   r   rÍ  rÌ  r]   Zmockr$  Údictr   Úenvironr¼   r   rZ   rP   rà  rO  rQ  rà  r   r   r   Útest_keylog_env›  s    zTestSSLDebug.test_keylog_envc                 C   sl   t ƒ \}}}dd„ }|  |jd ¡ ||_|  |j|¡ |  t¡ tƒ |_W d   ƒ n1 s^0    Y  d S )Nc                 S   s   d S r   r   ©r  Ú	directionr0   Zcontent_typeZmsg_typerÖ   r   r   r   Úmsg_cb±  s    z.TestSSLDebug.test_msg_callback.<locals>.msg_cb)r¯   rÈ   Ú_msg_callbackrÒ   rÂ   r)  )r¾   r­   r®   r¬   rð  r   r   r   Útest_msg_callback®  s    zTestSSLDebug.test_msg_callbackc              	      sÞ   t ƒ \}}}| jtjO  _g ‰ ‡ ‡fdd„}||_t|dd}|R |jt ¡ |d }| t	|j
f¡ W d   ƒ n1 s~0    Y  W d   ƒ n1 sœ0    Y  ˆ dtjtjtjfˆ ¡ ˆ dtjtjtjfˆ ¡ d S )Nc                    s@   ˆ  | tj¡ ˆ  |t¡ ˆ |ddh¡ ˆ  ||||f¡ d S )NrA   rn   )r  r   rÄ   rš  r´   rÓ  rî  ©rî  r¾   r   r   rð  À  s    z4TestSSLDebug.test_msg_callback_tls12.<locals>.msg_cbFr3  ru  rA   rn   )r¯   rì  r   r¹   rñ  r†  rŸ   rÃ   rJ  rK  rÍ  r´   r   rY   r   Z	HANDSHAKEr   ZSERVER_KEY_EXCHANGEZCHANGE_CIPHER_SPEC)r¾   r­   r®   r¬   rð  rÌ  rÆ   r   ró  r   Útest_msg_callback_tls12º  s0    
ÿL
ÿý
ÿýz$TestSSLDebug.test_msg_callback_tls12c              	      sî   t ƒ \}}}t ƒ d ‰ dd„ }‡ fdd„}||_||_t|dd}|” |jt ¡ |d }| t|jf¡ W d   ƒ n1 s€0    Y  |jt ¡ |d }| t|jf¡ W d   ƒ n1 sÂ0    Y  W d   ƒ n1 sà0    Y  d S )	Nr   c                 S   s   d S r   r   rî  r   r   r   rð  Ý  s    z@TestSSLDebug.test_msg_callback_deadlock_bpo43577.<locals>.msg_cbc                    s
   ˆ | _ d S r   rh  r:  ©Zserver_context2r   r   Úsni_cbà  s    z@TestSSLDebug.test_msg_callback_deadlock_bpo43577.<locals>.sni_cbFr3  ru  )	r¯   rñ  Zsni_callbackr†  rŸ   rÃ   rJ  rK  rÍ  )r¾   r­   r®   r¬   rð  rö  rÌ  rÆ   r   rõ  r   Ú#test_msg_callback_deadlock_bpo43577Ù  s$    

ÿ.
ÿz0TestSSLDebug.test_msg_callback_deadlock_bpo43577N)rÑ  rÒ  rÓ  r   rÌ  râ  Úrequires_keylogr]   r]  r`  rç  rê  rj   ÚflagsÚignore_environmentrí  rò  rô  r÷  r   r   r   r   rá  Y  s    

"
ÿ
rá  c              	   C   s    |   tjtjt ddd¡¡ d S )NÚiir   r   )Ú
setsockoptrÃ   Ú
SOL_SOCKETÚ	SO_LINGERÚstructÚpack)r    r   r   r   Ú)set_socket_so_linger_on_with_zero_timeoutð  s    r  c                   @   s>   e Zd ZG dd„ dejƒZdd„ Zdd„ Zdd„ Zd	d
„ Z	dS )ÚTestPreHandshakeClosec                       sF   e Zd Zddœ‡ fdd„
Zdd„ Zdd„ Z‡ fd	d
„Zdd„ Z‡  ZS )z6TestPreHandshakeClose.SingleConnectionTestServerThreadN)rB  c                   sH   || _ d| _d | _d | _d | _|d u r0tj| _n|| _tƒ j	|d d S )Nræ  r   )
Úcall_after_acceptÚreceived_dataÚ
wrap_errorrQ  rÍ  r   r«  rB  ÚsuperrÏ  )r¾   r   r  rB  ©r  r   r   rÏ  ú  s    
z?TestPreHandshakeClose.SingleConnectionTestServerThread.__init__c                 C   s   |   ¡  | S r   )rú  r½   r   r   r   rˆ    s    z@TestPreHandshakeClose.SingleConnectionTestServerThread.__enter__c                 G   s:   z| j r| j  ¡  W n ty&   Y n0 |  ¡  d | _d S r   )rQ  rÝ   r1  r   r  rý  r   r   r   r‰  
  s    z?TestPreHandshakeClose.SingleConnectionTestServerThread.__exit__c                    sx   t  t jj¡| _t j| j_| jjtd | jj	tt
d t ¡ | _t | j¡| _| j | j¡ | j d¡ tƒ  ¡  d S )Nrg  rI  r   )r   rO  r´  r¶  Ússl_ctxr³   rœ   r   r  rž   r  rÃ   rQ  r   rÉ  rÍ  r@  rB  r   r  rú  r½   r  r   r   rú    s    

z<TestPreHandshakeClose.SingleConnectionTestServerThread.startc                 C   sö   zBz| j  ¡ \}}W n  ty4   Y W | j  ¡  d S 0 W | j  ¡  n| j  ¡  0 |Ž |  |¡rpW d   ƒ d S z| jj|dd}W n* ty® } z|| _W Y d }~n.d }~0 0 z| 	d¡| _
W n tyÒ   Y n0 W d   ƒ n1 sè0    Y  d S )NTrE  é  )rQ  r1  ÚTimeoutErrorrÝ   r  r  rŸ   r1  r  r2  r  )r¾   r  ÚaddressZ
tls_socketrð  r   r   r   rñ    s$    
þ
z:TestPreHandshakeClose.SingleConnectionTestServerThread.run)	rÑ  rÒ  rÓ  rÏ  rˆ  r‰  rú  rñ  Ú__classcell__r   r   r  r   Ú SingleConnectionTestServerThreadø  s
   	r  c                 C   sr   t jdkrd S t|tƒsFt|tƒr.|jtjksFt dt	|ddƒtj
¡rnz |  dt j› d|›¡ W d }nd }0 d S )NÚlinuxzwrong.version.numberrg  r&  z!Could not recreate conditions on z: err=)rj   rÖ  rK   r×  r1  rN  ÚEINVALÚreÚsearchrM   ÚIrÇ  r  r   r   r   Ú"non_linux_skip_if_other_okay_error4  s    

ÿ
ÿþÿ
z8TestPreHandshakeClose.non_linux_skip_if_other_okay_errorc                    sP  t  ¡ ‰t  ¡ ‰ ‡ ‡fdd„}| j|dd}| ¡  |  |j¡ t ¡ L}| |j 	¡ ¡ t
|ƒ | d¡ ˆ ¡  | d¡ | ¡  W d   ƒ n1 sš0    Y  ˆ  ¡  | ¡  |j}d |_z€|  d|j¡ |  |t¡ |  |¡ |  |tj¡ |  d|jd	 ¡ |  d|j¡ |  d
|jd
 ¡ | j|jdd W d }d }n
d }d }0 d S )Nc                    s    ˆ  ¡  ˆ  tj¡stdƒ‚dS )Nz+wrap_socket event never set, test may fail.F)r˜  rü  r   r«  ÚRuntimeError)Zunused©Zready_for_server_wrap_socketZserver_accept_calledr   r   r  Q  s    zPTestPreHandshakeClose.test_preauth_data_to_tls_server.<locals>.call_after_acceptZpreauth_data_to_tls_server©r  r   Fs   DELETE /data HTTP/1.0

ræ  úbefore TLS handshake with datar   r   úattr must existrx  )rÍ  rû  r  rˆ  rà   r‰  rÃ   rJ  rQ  r|  r  rj  rü  r6  rÝ   r˜  r   r  r¼   r  r  r1  r  r   rÓ   r´   r^   rg  rá   r‚  rf  )r¾   r  rÌ  r‚  r  r   r  r   Útest_preauth_data_to_tls_serverM  sB    þ


&
ÿz5TestPreHandshakeClose.test_preauth_data_to_tls_serverc           	         s”  t  ¡ ‰t  ¡ ‰ ‡ ‡fdd„}| j|dd}| ¡  |  |j¡ t|jƒ t ¡ œ}| 	|j 
¡ ¡ ˆ ¡  ˆ  tj¡s‚|  d¡ t ¡ }z|j|dd}W n, tyÈ } z|}d}W Y d }~n d }~0 0 d }| d	¡}| ¡  W d   ƒ n1 sô0    Y  | ¡  z~|  d|¡ |  |t¡ |  |¡ |  |tj¡ |  d
|jd ¡ |  d
|j¡ |  d|jd ¡ | j|j dd W d }d }n
d }d }0 d S )Nc                    s:   ˆ  tj¡stdƒ t| ƒ |  d¡ |  ¡  ˆ  ¡  dS )Nz ERROR: test client took too longsW   HTTP/1.0 307 Temporary Redirect
Location: https://example.com/someone-elses-server

T)rü  r   r«  Úprintr  r6  rÝ   r˜  ©Zconn_to_client©Z$client_can_continue_with_wrap_socketZ$server_can_continue_with_wrap_socketr   r   r  ~  s    ÿzPTestPreHandshakeClose.test_preauth_data_to_tls_client.<locals>.call_after_acceptZpreauth_data_to_tls_clientr  ztest server took too longr'   ru  ræ  r	  r  r   r   r  rx  )!rÍ  rû  r  rˆ  rà   r‰  r  rQ  rÃ   rJ  r|  r˜  rü  r   r«  rÚ   r   rO  rŸ   r1  r2  rÝ   r   r¼   r  r  rÓ   r´   r^   rg  rá   r‚  rf  )	r¾   r  rÌ  r‚  r  Z
tls_clientrð  r  r  r   r  r   Útest_preauth_data_to_tls_clientz  sP    þ


ÿ

&
ÿz5TestPreHandshakeClose.test_preauth_data_to_tls_clientc                    sÐ   t  ¡ ‰ G ‡ fdd„dtjjƒ}‡ fdd„}d}| j|d|d}| ¡  |  |j¡ t	|j
ƒ ||j
 ¡ d |jt ¡ |d	}|  t¡, |jd
dddid | ¡ }W d   ƒ n1 sº0    Y  | ¡  d S )Nc                       s   e Zd Z‡ fdd„ZdS )zeTestPreHandshakeClose.test_https_client_non_tls_response_ignored.<locals>.SynchronizedHTTPSConnectionc                    sF   t jj | ¡ ˆ  tj¡s,tjr,tj	 
d¡ | jj| j| jd| _d S )Nz"server_responding event never set.ru  )Úhttpr‚  ZHTTPConnectionrJ  rü  r   r«  rl   rj   rm   rn   Z_contextrŸ   r    rn  r½   ©Zserver_respondingr   r   rJ  º  s    ÿzmTestPreHandshakeClose.test_https_client_non_tls_response_ignored.<locals>.SynchronizedHTTPSConnection.connectN)rÑ  rÒ  rÓ  rJ  r   r  r   r   ÚSynchronizedHTTPSConnection¹  s   r   c                    s&   t | ƒ |  d¡ |  ¡  ˆ  ¡  dS )Ns!   HTTP/1.0 402 Payment Required

T)r  r6  rÝ   r˜  r  r  r   r   r  Å  s    ÿz[TestPreHandshakeClose.test_https_client_non_tls_response_ignored.<locals>.call_after_acceptg       @Znon_tls_http_RST_responder)r  r   rB  r   )rÍ  r£   rB  ZHEADz/testZHostr'   )Zheaders)rÍ  rû  r  r‚  ZHTTPSConnectionr  rˆ  rà   r‰  r  rQ  r|  rÍ  r   rO  rÒ   r1  rj  Zgetresponser   )r¾   r   r  rB  rÌ  Ú
connectionÚresponser   r  r   Ú*test_https_client_non_tls_response_ignored¶  s,    
ý
ü&z@TestPreHandshakeClose.test_https_client_non_tls_response_ignoredN)
rÑ  rÒ  rÓ  rÍ  rÎ  r  r  r  r  r#  r   r   r   r   r  ô  s
   <-<r  c                  C   s  t jr¶tjtjdœ} |  ¡ D ]*\}}|ƒ }|r|d rd||f } qTqtt ¡ ƒ}tdtj	tj
f ƒ td| ƒ tdtj ƒ tdtj ƒ ztdtj ƒ W n ty´   Y n0 ttttttttttttfD ]}tj |¡sÒt  d	| ¡‚qÒt  ¡ }t j!t j"g|¢R Ž  d S )
N)ZMacZWindowsr   z%s %rztest_ssl: testing with %r %rz          under %sz          HAS_SNI = %rz          OP_ALL = 0x%8xz          OP_NO_TLSv1_1 = 0x%8xzCan't read certificate file %r)#r   rl   rÖ  Zmac_verZ	win32_verÚitemsr„  r  r   r  ry   rµ   rë  rº   rõ  rè   r  r  r  r  r  r¥   r§   r«   r  ÚBADKEYr  r   r   ÚexistsZ
TestFailedZthreading_setupr]   ZaddModuleCleanupZthreading_cleanup)Zplatsr   r`   ZplatÚfilenameÚthread_infor   r   r   ÚsetUpModuleì  s:    þ
ÿür)  Ú__main__)N)rº  TFNN)Nr   r   )™rj   r]   Zunittest.mockrÆ  r   Ztest.supportr   r   r  rÃ   r‘  rÿ  r‚   r   r@  Zhttp.clientr  r   rN  rì   Zurllib.requestri  rÍ  rh   r  r(  rÖ  Z	sysconfigrb   rz  ÚImportErrorÚimport_moduler   r   r   r   rF   ZPy_DEBUGr`  rè  r1  rÙ  rK  r  r  r_  ry   rŸ  rb  rX   Zget_config_varr   r*  rÊ   ÚverrM   rõ  r   rè   Úfsencoder  r  r  r  r  r  r  r  rŒ  r  r'  r  ré   r7  r¥   r¦   rê   r§   r¨   r>  r=  r«   r	  rF  r©   rª   rÀ  r  r  rL  r%  rë   r  ró   r.  r/  r9   r:   r;   r<   r=   r>   rD   rJ   rT   Ú	lru_cacherQ   rf   rÔ  rZ   r^  rp   rv   rz   r{   r€   rÔ  rˆ   r“   rµ   ra  rN   rš   r¤   r¯   ZTestCaser°   r×  rc  rp  r€  r…  Zrequires_resourcer½  r£  r¥  Ztest.ssl_serversrÈ  rÎ  r†  r  r(  r/  r0  rÕ  Z
HAS_KEYLOGrø  rá  r  r  r)  rÑ  Úmainr   r   r   r   Ú<module>   s†  











óñ

	
	
(
þþ           ?6?0  B
  v   þ
3 ÿ
I            K Oÿ  y#
