o
    HXīh2f ć                   @   s  d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dlm
Z
 d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZzd dlZW n e y   dZY nw d dl!Z!e! "”  e! #de$” d dl%Z%W d   n1 s§w   Y  e &d	”Z'd dl(Z(d d
l'm)Z)m*Z*m+Z+m,Z, e-e dZ.e.oĢe jdkZ/e0e'j1Z2ej3Z3e'j4dkZ5e 6d”Z7i Z8dD ]\Z9Z:ze;e'e9Z9e;e'j)e:Z:W n	 e<yż   Y qćw e:e8e9< qćdd Z=e=dZ>e ?e>”Z@e=dZAe=dZBe ?eA”ZCe ?eB”ZDe=dZEe=dZFdZGe=dZHe ?eH”ZIe=ddZJe=ddZKddddddd d!ZLe=d"ZMe=d#ZNd$ZOd%d&d'd(d)d*d+ddd d,
ZPe=d-ZQd.ZRe=d/ZSd0ZTe=dd1ZUe=d2ZVe=d3ZWe=d4ZXd$ZYd5ZZe=d6Z[e=d7Z\e=d8Z]e=d9Z^e=d:Z_e=d;Z`e=d<Zae=d=Zbe ?eb”Zce;e'd>d Zde;e'd?d Zee;e'd@d Zfe;e'dAd Zge;e'dBd ZhdCdD Ziei rŃdEdF ZjndGdF ZjdHdI ZkejldJdK ZmdLdM ZndNdO ZodPdQ Zpe
jqe$dRZre'jsdddddSdTdUZteNfdVdWdXdYZuG dZd[ d[ejvZwG d\d] d]ejvZxG d^d_ d_ejvZyG d`da daejvZzG dbdc dcejvZ{G ddde deejvZ|e }df”G dgdh dhejvZ~ddidjZdkdl Zd dmlmZ G dndo doejZG dpdq dqejZ	r		ddtduZ	 ddvdwZG dxdy dyejvZe emdzd{”G d|d} d}ejvZe-e'jd~Ze ed”ZG dd dejvZdd ZG dd dejvZdd ZedkrÅe ”  dS dS )é    N)Śsupport)Śimport_helper)Ś	os_helper)Śsocket_helper)Śthreading_helper)Śwarnings_helperŚignoreŚssl)Ś
TLSVersionŚ_TLSContentTypeŚ_TLSMessageTypeŚ_TLSAlertTypeŚgettotalrefcountŚwin32)é   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    ś7/opt/python-3.10.19/usr/lib/python3.10/test/test_ssl.pyŚ	data_fileB   ó   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/   r0   r1   r2   r3   r4   r5   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_COMPATc                  C   sV   z t ddd} d|  ” v W  d    W S 1 sw   Y  W d S  ty*   Y dS w )Nz/etc/os-releasezutf-8)ŚencodingZubuntuF)ŚopenŚreadŚFileNotFoundError)Śfr    r    r!   Ś	is_ubuntu¤   s   
(’’rH   c                  G   s2   	 | D ]}t |dr|jtjjkr| d” qd S )NŚminimum_versionz@SECLEVEL=1:ALL)ŚhasattrrI   r	   r
   r   Śset_ciphers)ŚctxsŚctxr    r    r!   Śseclevel_workaround®   s   ’
ūrN   c                  G   ó   d S r   r    )rL   r    r    r!   rN   ·   ó   c                 C   sV   	 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   
žrZ   c                 C   sŖ   	 | dkrdS t | trtjj|  } ttd| j sdS tr'| tjjk r'dS t 	tj
”}t|dr@|jtjjkr@| |jk r@dS t|drS|jtjjkrS| |jkrSdS dS )NŚSSLv2FZHAS_rI   Śmaximum_versionT)rQ   rR   r	   r
   Ś__members__rS   r   ŚIS_OPENSSL_3_0_0ŚTLSv1_2Ś
SSLContextrV   rJ   rI   ŚMINIMUM_SUPPORTEDr\   ŚMAXIMUM_SUPPORTED)r5   rM   r    r    r!   rW   Š   s*   
’
’
rW   c                    s   	  fdd}|S )Nc                    s   t   ” fdd}|S )Nc                     s&   t st  d” | i |¤S )Nz is not available.)rW   ŚunittestZSkipTest)ŚargsŚkw)Śfuncr5   r    r!   Śwrapper   s   z8requires_tls_version.<locals>.decorator.<locals>.wrapper)Ś	functoolsŚwraps)rf   rg   ©r5   )rf   r!   Ś	decorator’   s   z'requires_tls_version.<locals>.decoratorr    )r5   rk   r    rj   r!   Śrequires_tls_versionł   s   rl   c                 C   s2   d  tjt ”  ”}tjrtj | | ” d S d S )Nś )	r   Ś	tracebackŚformat_exceptionŚsysŚexc_infor   ŚverboseŚstdoutŚwrite)ŚprefixZ
exc_formatr    r    r!   Śhandle_error
  s   ’rv   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~   )Ścategory)Ś	cert_reqsŚca_certsŚciphersŚcertfileŚkeyfilec                K   s   |  d”st|d< t tj”}nt tj”}|d ur%|tjkr"d|_||_|d ur.| 	|” |d us6|d ur<| 
||” |d urE| |” |j| fi |¤S )NŚserver_sideŚserver_hostnameF)ŚgetŚSIGNED_CERTFILE_HOSTNAMEr	   r`   rV   rU   Ś	CERT_NONEŚcheck_hostnameŚverify_modeŚload_verify_locationsŚload_cert_chainrK   Śwrap_socket)Śsockr   r   r   r   r   ŚkwargsŚcontextr    r    r!   Śtest_wrap_socket  s   



r   T©Śserver_chainc                C   sx   	 | t krt}n| tkrt}n| tkrt}nt| t tj	”}| 
t” t tj”}| | ” |r7| 
t” |||fS r   )ŚSIGNED_CERTFILEr   ŚSIGNED_CERTFILE2ŚSIGNED_CERTFILE2_HOSTNAMEŚ	NOSANFILEŚNOSAN_HOSTNAMEŚ
ValueErrorr	   r`   rV   r   Ś
SIGNING_CArU   r   )Zserver_certr   ŚhostnameŚclient_contextŚserver_contextr    r    r!   Śtesting_context2  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dd Zdd Zej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'd( Zed)d* Zd+d, Zd-d. Ze d/ej v d0”d1d2 Z!d3d4 Z"d5d6 Z#e e$j%d7kd8”d9d: Z&e e$j%d7kd8”d;d< Z'd=d> Z(d?d@ Z)dAdB Z*dCdD Z+dEdF Z,e e- dG”dHdI Z.dJdK Z/e 0dLdM”dNdO Z1dPdQ Z2dRdS Z3dTS )UŚBasicSocketTestsc                 C   s   t j t j t j t j t j t j t j |  t j	d” |  t j
d” |  t jd” |  t jd” t j t j t j t j t j t j |  t jt j” d S )NT)r	   r   ŚCERT_OPTIONALŚCERT_REQUIREDrA   r?   r@   r>   ŚassertEqualŚHAS_SNIŚHAS_ECDHZHAS_TLSv1_2ZHAS_TLSv1_3ŚOP_NO_SSLv2ŚOP_NO_SSLv3ŚOP_NO_TLSv1ŚOP_NO_TLSv1_3ŚOP_NO_TLSv1_1ŚOP_NO_TLSv1_2rT   r   ©Śselfr    r    r!   Śtest_constantsM  s$   zBasicSocketTests.test_constantsc              
   C   s   t jt jt jt jt jt jg}|D ]1}| j|d! |  t	d” d |_
W d    n1 s-w   Y  W d    n1 s<w   Y  qt | t j” d S )N)Śssl_typezimmutable type)Ś_sslZ_SSLContextZ
_SSLSocketŚ	MemoryBIOZCertificateZ
SSLSessionŚSSLErrorŚsubTestŚassertRaisesRegexŚ	TypeErrorŚvaluer   Zcheck_disallow_instantiation)r­   Z	ssl_typesrÆ   r    r    r!   Śtest_ssl_typesa  s    ś’’zBasicSocketTests.test_ssl_typesc              	   C   st   |   td”* t ” }t |” W d    n1 sw   Y  W d    d S W d    d S 1 s3w   Y  d S ©Nzpublic constructor)r“   rµ   Śsocketr	   Ś	SSLSocket©r­   Śsr    r    r!   Śtest_private_initp  s   
’’"’z"BasicSocketTests.test_private_initc                 C   s2   t j}|  t|d” t  |”}|  |j|” d S )Nz_SSLMethod.PROTOCOL_TLS_CLIENT)r	   rV   r£   rR   r`   ŚassertIsrY   ©r­   ŚprotorM   r    r    r!   Śtest_str_for_enumsu  s   
z#BasicSocketTests.test_str_for_enumsc                 C   s&  t  ” }tjrtj d||rdpdf ” t ”  t  	d”\}}W d    n1 s+w   Y  |  
t|d” |  
||dk” |rPt  d”}|  
t|d” n	|  t jt jd” |  tt jd” t ”  |  tt j	d” W d    n1 sxw   Y  t  dd” t  d	d” t  td
d” d S )Nz
 RAND_status is %d (%s)
zsufficient randomnesszinsufficient randomnessé   é   éū’’’zthis is a random stringg     ĄR@s   this is a random bytes objects!   this is a random bytearray object)r	   ZRAND_statusr   rr   rp   rs   rt   r   Ścheck_warningsZRAND_pseudo_bytesr£   rX   Z
RAND_bytesŚassertRaisesr²   r   ZRAND_addŚ	bytearray)r­   ŚvŚdataZis_cryptographicr    r    r!   Śtest_random}  s.   
’’
’

’zBasicSocketTests.test_randomc                 C   s   |   tj t”t” |   tj t”t” tj t”}t	j
r*tj dt |” d ” |   |d d” |   |d d” |   |d d” |   |d d	” d S )
NŚ
r4   ))r-   zprojects.developer.nokia.com)r-   zprojects.forum.nokia.comr7   )zhttp://ocsp.verisign.comr8   )z0http://SVRIntl-G3-aia.verisign.com/SVRIntlG3.cerr9   )z0http://SVRIntl-G3-crl.verisign.com/SVRIntlG3.crl)r£   r	   r°   Ś_test_decode_certŚCERTFILEŚCERTFILE_INFOr   ŚSIGNED_CERTFILE_INFOŚ	NOKIACERTr   rr   rp   rs   rt   Ś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   rr   rp   rs   rt   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r0d}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.orgr3   r/   )r   é	   é   )©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>r4   )r	   r°   rĢ   ŚNULLBYTECERTr   rr   rp   rs   rt   rŃ   rŅ   r£   Z_OPENSSL_API_VERSION)r­   rŌ   r3   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 )Nr4   )
)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w   Y  t |”}t |”}t |”}|  ||” | tjd ”s=|  	d| ” | 
dtj d ”sP|  	d| ” d S d S )NŚrrĖ   z-DER-to-PEM didn't include correct header:
%r
z-DER-to-PEM didn't include correct footer:
%r
)rD   ŚCAFILE_CACERTrE   r	   ŚPEM_cert_to_DER_certZDER_cert_to_PEM_certr£   Ś
startswithZ
PEM_HEADERŚfailŚendswithZ
PEM_FOOTER)r­   rG   ŚpemŚd1Zp2Śd2r    r    r!   Śtest_DER_to_PEMū  s   
’


’z BasicSocketTests.test_DER_to_PEMc                 C   sF  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   é   é?   é   z	LibreSSL Śdr   zOpenSSL Ś.)r	   ZOPENSSL_VERSION_NUMBERŚOPENSSL_VERSION_INFOŚOPENSSL_VERSIONŚassertIsInstanceŚintŚtuplerR   ŚassertGreaterEqualŚ
assertLessZassertLessEqualŚ
assertTruerõ   Śhex)r­   ŚnŚtr¼   ŚmajorŚminorZfixŚpatchŚstatusZ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 s"w   Y  |  | d ” d S )NŚ )	r¹   ŚAF_INETr   ŚweakrefŚrefr   rÅ   ŚResourceWarningr£   )r­   r¼   ŚssŚwrr    r    r!   Śtest_refcycle*  s   
’zBasicSocketTests.test_refcyclec              	   C   sņ   t   t j”}t|e}|  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    d S 1 srw   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_unconnected5  s"   


’
’"õz)BasicSocketTests.test_wrapped_unconnectedc              	   C   s\   dD ])}t   t j”}| |” t|}|  || ” ” W d    n1 s&w   Y  qd S )N)Ng        ē      @)r¹   r  Ś
settimeoutr   r£   Ś
gettimeout)r­   Śtimeoutr¼   r  r    r    r!   Śtest_timeoutG  s   

’żzBasicSocketTests.test_timeoutc           	   
   C   sō  t jt jt jt jg}t jt jt jt jg}t j	j
t j	jt j	jg}|D ]C}| j|d3 t  t j”}|  t”}| j|O  _W d    n1 sGw   Y  |  dt|j” W d    n1 s_w   Y  q!|D ]E}t|snqg| j|d0 |  t”}t  |” W d    n1 sw   Y  |  d|j dt|j” W d    n1 s§w   Y  qg|D ]H}t|s¶qÆ| j|d3 t  t j”}|  t”}||_W d    n1 sÖw   Y  |  d|dt|j” W d    n1 sņw   Y  qÆd S )N)Śoptionz4ssl.OP_NO_SSL*/ssl.OP_NO_TLS* options are deprecated)rY   zssl.z is deprecatedrj   )r	   rØ   rŖ   r«   r©   r   r   ŚPROTOCOL_TLSv1_2rT   r
   r   r   r   r³   r`   rV   ŚassertWarnsŚDeprecationWarningŚoptionsr£   rR   ŚwarningrZ   r   rW   rI   )	r­   r3  Ś	protocolsZversionsr/  rM   ŚcmrY   r5   r    r    r!   Śtest_openssl111_deprecationsP  sl   üüż’žü	’žż’
žüżz-BasicSocketTests.test_openssl111_deprecationsc              	   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 sDw   Y  |  t	”#}t   ” }tj|t
d
 W d    n1 sew   Y  W d    n1 stw   Y  |  |jjtj” |  t	”$}t   ” }tj|tt
d W d    n1 sw   Y  W d    n1 s®w   Y  |  |jjtj” |  t	”$}t   ” }tj|t
t
d W d    n1 sŁw   Y  W d    n1 sčw   Y  |  |jjtj” d S )Nzcertfile must be specified©r   z5certfile must be specified for server-side operationsT©r   r  ©r   r   z!can't connect in server-side modei  ©r   ©r   r   )r¹   r“   r   r	   r   rĶ   ŚconnectŚHOSTrĘ   r  ŚNONEXISTINGCERTr£   Ś	exceptionŚerrnoŚENOENT)r­   r   r¼   r6  r    r    r!   Śtest_errors_sslwrap  sV   žž
ž
’’
’’
’’’
’’’z$BasicSocketTests.test_errors_sslwrapc                 C   sp   	 t j t j t”pt j|”}t ” }|  |j” |  	t
j” t||d W d    d S 1 s1w   Y  d S )Nr;  )r   r   r   r   r   Ścurdirr¹   Ś
addCleanupŚcloserĘ   r	   r²   r   ©r­   r   r   r    r    r!   Śbad_cert_test¢  s   ’’"’zBasicSocketTests.bad_cert_testc                 C   ó   	 |   d” d S )Nr;   ©rH  r¬   r    r    r!   Śtest_empty_cert¬  ó   z BasicSocketTests.test_empty_certc                 C   rI  )Nr<   rJ  r¬   r    r    r!   Śtest_malformed_cert°  rL  z$BasicSocketTests.test_malformed_certc                 C   rI  )Nr=   rJ  r¬   r    r    r!   Śtest_malformed_key“  rL  z#BasicSocketTests.test_malformed_keyc              	      sJ  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Ów   Y  ddOi}  tj	dP” t |dQ” W d    n	1 sõw   Y  ddRi}  tj	dS” t |dT” W d    n	1 sw   Y  ddUi}  tj	dV” t |dW” W d    n	1 s9w   Y  ddXi}  tj	dY” t |dZ” W d    n	1 s[w   Y  d[D ]}  t” t 
|” W d    n	1 szw   Y  qbd\D ]}  t 
|”” qtjr”d]D ]}  t 
|”” qd S 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	   ŚCertificateErrorrO  rP  r¬   r    r!   rö   ¼  s   ’z2BasicSocketTests.test_match_hostname.<locals>.failr3   )))r+   śexample.comrT  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ė   )r0   r3   r4   rX  rY  rķ   rW  zDec 18 23:59:59 2011 GMT)rŚ   ©)rŪ   Ś
California©)r(   zMountain View©)r*   z
Google Inc©)r+   śmail.google.com)r0   r3   r_  z	gmail.comr[  )©r-   rT  )rč   ś10.11.12.13)rč   ś14.15.16.17rī   )r3   r4   ra  rb  z127.1z14.15.16.17 z14.15.16.17 extra dataz14.15.16.18zexample.net)r`  )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Ś   rZ  r\  r]  zDec 18 23:59:59 2099 GMT)rŚ   rZ  r\  r^  ))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	   rO  r“   rS  Z_inet_patonr	  )r­   rR  rö   rQ  rU  ŚinvalidZipaddrr    r¬   r!   Śtest_match_hostnameø  s   




























ž



’


’






’





’
ū
ū
žżžżžżžżžż’žz$BasicSocketTests.test_match_hostnamec                 C   sP   t  t j”}t ” }| jt|j|ddd W d    d S 1 s!w   Y  d S )NTzsome.hostname©r   )r	   r`   rU   r¹   rĘ   r   r   )r­   rM   r   r    r    r!   Śtest_server_side  s   
’"’z!BasicSocketTests.test_server_sidec              	   C   s   t  d”}t   t j”}| | ” ” t|dd"}|  t” | d” W d    n1 s.w   Y  W d    n1 s=w   Y  | 	”  d S )N©rļ   r   F©Śdo_handshake_on_connectzunknown-type)
r¹   Ścreate_serverr  r=  Śgetsocknamer   rĘ   r   Śget_channel_bindingrF  )r­   r¼   Ścr  r    r    r!   Śtest_unknown_channel_binding  s   
’’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w   Y  t   t j”}t|dtd}|  | d”” W d    d S 1 sCw   Y  d S )Nru  Tr:  )r¹   r  r   ŚassertIsNonerr  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 s"w   Y  |  |t	|j
jd ” d S rw   )r   r¹   r  Śreprr1  r  r   Ś
gc_collectŚassertInrR   r4  rd   )r­   r  rņ   r6  r    r    r!   Śtest_dealloc_warn  s   
žz"BasicSocketTests.test_dealloc_warnc                 C   s   t  ” }|  t|d” |  |t j” t ” #}t|d< t	|d< t  ” }|  |j
t	” |  |jt” W d    d S 1 s=w   Y  d S )Né   ŚSSL_CERT_DIRŚSSL_CERT_FILE)r	   Zget_default_verify_pathsr£   rX   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 ]H}t |”}|  |t” |D ]8}|  |t	” |  
t|d” |\}}}|  |t” |  |ddh” |  |tttf” t|ttfrk| |” q3q$d}|  ||” 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£   rX   Śbytesr{  Ś	frozensetŚboolrQ   Śupdate)	r­   Z
trust_oidsZ	storenameŚstoreŚelementrQ  Ś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 ]"}|  |t” |  	t
|d” |  |d t” |  |d ddh” q$d S )Nr  r  é   r   rĆ   r  r  )r	  r	   Z	enum_crlsrĘ   rµ   r  r  r  r  r£   rX   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 skw   Y  td	D ]4}zt j 
|”}W n	 t	y   Y qtw |  |jt” |  |jt” |  |jt” |  |jttd f” qtt j d”}|  ||” |  |t j” |  t j d”|” |  t j d”|” |  t	d
” t j d” W d    d S 1 sčw   Y  d S )N)é   r  śTLS Web Server Authenticationr  r  r  r  r  é’’’’zunknown NID 100000i  éč  zunknown object 'serverauth'Z
serverauth)r	   Ś_ASN1Objectr£   ŚnidŚ	shortnameZlongnameŚoidr  rĘ   r   Zfromnidr“   Śranger  rR   ŚtypeZfromname)r­   ŚexpectedŚvalŚiŚobjr    r    r!   Śtest_asn1objectŲ  sH   
’’’"’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 s%w   Y  |  
t|jd” t tj”}|  t”}| |” W d    n1 sNw   Y  |  
t|jd” d S )N©r   z!only stream sockets are supported)r¹   r  Ś
SOCK_DGRAMrE  rF  rĘ   r#  r   r	   r   r£   rR   r@  r`   rV   r   )r­   r¼   ZcxrM   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   s:   |   t” t |” W d    d S 1 sw   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¶  )Z	cert_timez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   )rx   Śstrftimer    r    r    r!   Ślocal_february_nameQ  ó   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_localeM  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  rE  rF  r   Ś	bind_portr   r	   r¢   Ś
connect_exr>  rA  ZECONNREFUSEDZEHOSTUNREACHZ	ETIMEDOUTŚEWOULDBLOCKr{  )r­   ŚserverŚportr¼   ŚrcŚerrorsr    r    r!   Śtest_connect_ex_error\  s   
’žz&BasicSocketTests.test_connect_ex_errorc              	   C   s¶   t  \}}}t|d}|D |jt ” |d"}| t|jf” |  | d”d” |  | 	d”d” W d    n1 s<w   Y  W d    d S W d    d S 1 sTw   Y  d S )N©r   rk  r   ó    )
r   ŚThreadedEchoServerr   r¹   r=  r>  rĘ  r£   r  r!  ©r­   r   r   r   rÅ  r¼   r    r    r!   Śtest_read_write_zerol  s   

’ü’"’z%BasicSocketTests.test_read_write_zeroN)4Ś__name__Ś
__module__Ś__qualname__r®   r·   r½   rĮ   rŹ   rÕ   rŁ   rź   rń   rū   r  r   Zcpython_onlyr  r)  r.  r7  Śignore_deprecationrC  rH  rK  rM  rN  rj  rl  rt  rc   Ś
skipUnlessr	   ŚCHANNEL_BINDING_TYPESrx  r|  r  rp   Śplatformr  r  rØ  r­  r°  r³  r“  r~   r·  r¹  Zrun_with_localerĮ  rÉ  rĪ  r    r    r    r!   r    K  sh    #

	4


 G
’



'’

#
r    c                   @   s|  e Zd Zdd Zdd Ze edkd”dd Zd	d
 Z	dd Z
dd Zdd Zedd Ze eejdd”dd Z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d)d* Zd+d, Zd-d. Z d/d0 Z!d1d2 Z"e e#j$d3kd4”d5d6 Z%e e#j$d3kd7”e ee#d8d9”d:d; Z&d<d= Z'd>d? Z(d@dA Z)dBdC Z*dDdE Z+dFdG Z,dHdI Z-dJS )KŚContextTestsc              	   C   s¶   t D ]&}t|r(t ”  t |”}W d    n1 sw   Y  |  |j|” qt ”  t ” }W d    n1 s<w   Y  |  |jtj” |  	t
tjd” |  	t
tjd” d S )Nr  é*   )Ś	PROTOCOLSrZ   r   rÅ   r	   r`   r£   rY   rT   rĘ   r   )r­   rY   rM   r    r    r!   Śtest_constructorz  s   
’

’zContextTests.test_constructorc                 C   s^   t  t j”}| d” | d” |  t jd” | d” W d    d S 1 s(w   Y  d S )NŚALLŚDEFAULTśNo cipher can be selectedś^$:,;?*'dorothyx)r	   r`   rV   rK   r“   r²   ©r­   rM   r    r    r!   Śtest_ciphers  s   

"’zContextTests.test_ciphersrĆ   z+Test applies only to Python default ciphersc                 C   sf   t  t j”}| ” }|D ]$}|d }|  d|” |  d|” |  d|” |  d|” |  d|” qd S )Nr   ZPSKZSRPZMD5ZRC4Z3DES)r	   r`   rV   Śget_ciphersZassertNotIn)r­   rM   r   Zsuiter   r    r    r!   Śtest_python_ciphers  s   śz ContextTests.test_python_ciphersc              	   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-AES128-GCM-SHA256zECDHE-ECDSA-AES256-GCM-SHA384zAES128-GCM-SHA256zECDHE-RSA-AES256-GCM-SHA384zAES256-GCM-SHA384zDHE-RSA-AES256-GCM-SHA384zECDHE-RSA-AES128-GCM-SHA256r  z
got: z
expected: )
r	   r`   rV   rK   r  rą  Śintersectionr  rX   Śsorted)r­   rM   Ś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 O }|  ||j” t ”  | jt jO  _W d    n1 s9w   Y  |  |t jB |j” t ”  |jt j @ |_W d    n1 s_w   Y  |  ||j” d|_|  d|jt j @ ” d S rw   )r	   r`   rV   ŚOP_ALLr¦   r§   r>   rA   r?   r@   rB   r£   r3  r   rÅ   rØ   )r­   rM   Śdefaultr    r    r!   Śtest_options­  s(   ’’ž
’
’zContextTests.test_optionsc                 C   s@  t  ”  t tj”}W d    n1 sw   Y  |  |jtj” tj|_|  |jtj” tj	|_|  |jtj	” tj|_|  |jtj” |  
t” d |_W d    n1 sYw   Y  |  
t” d|_W d    n1 sqw   Y  t tj”}|  |jtj” |  |j” t tj”}|  |jtj	” |  |j” d S ©Nr×  )r   rÅ   r	   r`   rT   r£   r   r   r”   r¢   rĘ   rµ   r   rU   ŚassertFalser   rV   r	  rŽ  r    r    r!   Śtest_verify_mode_protocolĄ  s,   
’’’z&ContextTests.test_verify_mode_protocolc                 C   s   t  t j”}|  |j” t jr,d|_|  |j” d|_|  |j” d|_|  |j” d S |  t” d|_W d    d S 1 s@w   Y  d S ©NTF)	r	   r`   rV   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_namec                 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 s§w   Y  tt jržt  t j”}|  	|j
|” |  |jt jj” |  t” t jj|_
W d    n1 sÜw   Y  |  t” t jj|_W d    d S 1 s÷w   Y  d S d S rģ  )r	   r`   rU   r
   ra   r   r_   rb   ŚTLSv1_3r{  rI   r\   r   r£   r   rĘ   r   rZ   r   )r­   rM   Zminimum_rangeZmaximum_ranger    r    r!   Śtest_min_max_versionę  s|   ś
ü’’


’
’


’
’

’
ž
ž’
’
’’"’õz!ContextTests.test_min_max_versionŚsecurity_levelzrequires OpenSSL >= 1.1.0c                 C   s&   t  t j”}h d£}|  |j|” d S )N>   r   rĆ   r  r   rü   r»  )r	   r`   rV   r{  rö  )r­   rM   Zsecurity_level_ranger    r    r!   Śtest_security_level5  s   z ContextTests.test_security_levelc                 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	|_|  |jt j	” t jt j
B |_|  |jt jt j
B ” |  t” d |_W d    d S 1 slw   Y  d S )NŚVERIFY_X509_TRUSTED_FIRSTr   )r	   r`   rU   rS   r£   Śverify_flagsŚVERIFY_DEFAULTŚVERIFY_CRL_CHECK_LEAFZVERIFY_CRL_CHECK_CHAINZVERIFY_ALLOW_PROXY_CERTSZVERIFY_X509_STRICTrĘ   rµ   )r­   rM   Śtfr    r    r!   Śtest_verify_flagsH  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 s2w   Y  |  	|j
jtj” |  t jd” | t” W d    n1 sWw   Y  |  t jd” | t” W d    n1 ssw   Y  t  t j”}| tt” |jttd |jttd |  t jd” | t” W d    n1 s©w   Y  |  t jd” | t” W d    n1 sÅw   Y  |  t jd” |jttd W d    n1 sćw   Y  t  t j”}|  t jd” | tt” W d    n	1 sw   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[w   Y  |  t j” |jtdd W d    n	1 syw   Y  |  td	” |jtd
d d W d    n	1 sw   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 w   Y  |  td	” |jt|d W d    n	1 sw   Y  |  td” |jt|d W d    n	1 s<w   Y  |  td” |jt|	d W d    n	1 sZw   Y  |jt|	d d S )Nr8  śPEM libr<  zkey values mismatch)Śpasswordzshould be a stringTŚbadpasszcannot be longeró   ai  c                   S   ó   t S r   ©ŚKEY_PASSWORDr    r    r    r!   Śgetpass_unicode  rP   z:ContextTests.test_load_cert_chain.<locals>.getpass_unicodec                   S   s   t  ” S r   )r  rf  r    r    r    r!   Śgetpass_bytes  ó   z8ContextTests.test_load_cert_chain.<locals>.getpass_bytesc                   S   s   t t ” S r   )rĒ   r  rf  r    r    r    r!   Śgetpass_bytearray  r¾  z<ContextTests.test_load_cert_chain.<locals>.getpass_bytearrayc                   S   ó   dS )Nr   r    r    r    r    r!   Śgetpass_badpass  rP   z:ContextTests.test_load_cert_chain.<locals>.getpass_badpassc                   S   s   dd S )Nr  i   r    r    r    r    r!   Śgetpass_huge  r  z7ContextTests.test_load_cert_chain.<locals>.getpass_hugec                   S   r	  )Nrą   r    r    r    r    r!   Śgetpass_bad_type  rP   z;ContextTests.test_load_cert_chain.<locals>.getpass_bad_typec                   S   s   t d)Nśgetpass error)Ś	Exceptionr    r    r    r!   Śgetpass_exception  r  z<ContextTests.test_load_cert_chain.<locals>.getpass_exceptionc                   @   ó   e Zd Zdd Zdd ZdS )z:ContextTests.test_load_cert_chain.<locals>.GetPassCallablec                 S   r  r   r  r¬   r    r    r!   Ś__call__  rP   zCContextTests.test_load_cert_chain.<locals>.GetPassCallable.__call__c                 S   r  r   r  r¬   r    r    r!   Śgetpass  rP   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	   r`   rU   r   rĶ   rĘ   rµ   r  r?  r£   r@  rA  rB  r“   r²   ŚBADCERTŚ	EMPTYCERTŚONLYCERTŚONLYKEYŚBYTES_ONLYCERTŚBYTES_ONLYKEYró   ŚCERTFILE_PROTECTEDr  rf  rĒ   ŚONLYKEY_PROTECTEDr   r  r  )r­   rM   r6  r  r  r  r
  r  r  r  r  r    r    r!   Śtest_load_cert_chain\  s   ’’’’’’’
’
’’’ü’’’’’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 sDw   Y  |  
|jjtj” |  t jd” | t” W d    n1 siw   Y  | tt” |jttd |  t|jd d” d S )N)r  r$   rž  ©r$   T)r	   r`   rU   r   rĶ   ŚBYTES_CERTFILErĘ   rµ   r  r?  r£   r@  rA  rB  r“   r²   r  r  ŚBYTES_CAPATH©r­   rM   r6  r    r    r!   Śtest_load_verify_locationsÆ  s"   

’’z'ContextTests.test_load_verify_locationsc                 C   s   t t}| ” }W d    n1 sw   Y  t |”}t t}| ” }W d    n1 s0w   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 s*w   Y  |  tjd” |j
dd W d    d S 1 sIw   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)rD   ró   rE   r	   rō   ŚCAFILE_NEURONIOr`   rV   r£   Ścert_store_statsr   r   rĘ   rµ   Śobjectr“   r²   )r­   rG   Z
cacert_pemZ
cacert_derZneuronio_pemZneuronio_derrM   Zcombinedr    r    r!   Śtest_load_verify_cadataĀ  sd   

’


’

’žüž$ü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 s9w   Y  |  |jjtj” |  t j”}| t” W d    d S 1 s^w   Y  d S )NŚnt)r	   r`   rU   Śload_dh_paramsŚDHFILEr   r   ŚBYTES_DHFILErĘ   rµ   rF   r?  r£   r@  rA  rB  r²   rĶ   r   r    r    r!   Śtest_load_dh_params  s   


’"’z ContextTests.test_load_dh_paramsc                 C   sH   t jt jhD ]}t  |”}|  | ” dddddddddddd” qd S )Nr   )Śnumberr=  Zconnect_goodZconnect_renegotiateŚacceptZaccept_goodZaccept_renegotiateŚhitsŚmissesZtimeoutsZ
cache_full)r	   rV   rU   r`   r£   Śsession_statsræ   r    r    r!   Śtest_session_stats  s    


õžzContextTests.test_session_statsc                 C   s   t  t j”}| ”  d S r   )r	   r`   rV   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
   prime256v1Śfooó   foo)r	   r`   rU   Śset_ecdh_curverĘ   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   rO   r   r    ©r   Ś
servernamerM   r    r    r!   Śdummycallback9  rP   z5ContextTests.test_sni_callback.<locals>.dummycallback)r	   r`   rU   rĘ   rµ   Śset_servername_callback)r­   rM   rA  r    r    r!   Śtest_sni_callback0  s   
zContextTests.test_sni_callbackc                 C   sJ   t  t j”}|fdd}| |” t |”}~~t ”  |  | d ” d S )Nc                 S   rO   r   r    )r   r@  rM   Ścycler    r    r!   rA  B  rP   z>ContextTests.test_sni_callback_refcycle.<locals>.dummycallback)	r	   r`   rU   rB  r  r  ŚgcŚcollectr¾   )r­   rM   rA  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	   r`   rV   r£   r*  r   rĶ   r   ró   rŽ  r    r    r!   Śtest_cert_store_statsJ  s    

’


’


’


’z"ContextTests.test_cert_store_statsc                 C   s“   t  t j”}|  | ” g ” | t” |  | ” g ” | t” |  | ” ddddddddg” tt}| 	” }W d    n1 sDw   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/   r0   r1   r2   r9   r3   r5   T)r	   r`   rV   r£   Śget_ca_certsr   rĶ   ró   rD   rE   rō   )r­   rM   rG   rų   Śderr    r    r!   Śtest_get_ca_certsX  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	   r`   rV   Śload_default_certsrŖ  r«  r¬  rĘ   rµ   rŽ  r    r    r!   Śtest_load_default_certst  s   z$ContextTests.test_load_default_certsr   znot-Windows specificc                 C   sj   t  t j”}t ” !}t|d< t|d< | ”  |  | 	” dddd” W d    d S 1 s.w   Y  d S )Nr~  r  r   rĆ   )rH  rI  r"  )
r	   r`   rV   r   r  r  rĶ   rN  r£   r*  )r­   rM   r  r    r    r!   Śtest_load_default_certs_env  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 ” %}t|d< t|d< | ”  |d  d7  < |  	| ” |” W d    d S 1 s@w   Y  d S )Nr~  r  rI  rĆ   )
r	   r`   rV   rN  r*  r   r  r  rĶ   r£   )r­   rM   Ś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r|   |jt@ t” tdkr%|   |jt@ t” tdkr2|   |jt@ t” tdkrA|   |jt@ t” d S d S rw   )r£   r3  r	   r¦   r>   r?   r@   rA   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 s2w   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£   rY   rV   r   r¢   r	  r   rS  rD   r   rE   r  rŖ  r¬  rU   r   )r­   rM   rG   r$  r    r    r!   Śtest_create_default_contextŖ  s$   


’’
z(ContextTests.test_create_default_contextc                 C   sV  t  ” }|  |jt j” |  |jt j” |  |j” |  	|” t
t jrSt ”  t  t j”}W d    n1 s9w   Y  |  |jt j” |  |jt j” |  	|” t ”  t jt jt jdd}W d    n1 slw   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£   rY   rV   r   r   rķ  r   rS  rZ   r   r   rÅ   r0  r¢   r	  rŖ  r¬  rU   rŽ  r    r    r!   Śtest__create_stdlib_contextæ  s6   


’

ż’
z(ContextTests.test__create_stdlib_contextc                 C   s   t  ”  t tj”}W d    n1 sw   Y  |  |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 s“w   Y  d|_|  |j” tj	|_|  |jtj	” d S rļ  )r   rÅ   r	   r`   rT   rķ  r   r£   r   r   r	  r¢   r”   rĘ   r   rŽ  r    r    r!   Śtest_check_hostnameŻ  sF   
’
’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	   r`   rV   r	  r   r£   r   r¢   rU   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 s8w   Y  |j
t  ” t  ” dd}|  	||” d S )Nc                   @   ó   e Zd ZdS )z;ContextTests.test_context_custom_class.<locals>.MySSLSocketN©rĻ  rŠ  rŃ  r    r    r    r!   ŚMySSLSocket  ó    r\  c                   @   rZ  )z;ContextTests.test_context_custom_class.<locals>.MySSLObjectNr[  r    r    r    r!   ŚMySSLObject  r]  r^  Tr9  )r	   rŗ   Ś	SSLObjectr`   rU   Zsslsocket_classZsslobject_classr   r¹   r  Śwrap_bior±   )r­   r\  r^  rM   r   r§  r    r    r!   Śtest_context_custom_class  s   ’z&ContextTests.test_context_custom_classc                 C   sņ   t  t j”}|  |jd” d|_|  |jd” d|_|  |jd” |  t” d|_W d    n1 s4w   Y  |  t” d |_W d    n1 sLw   Y  t  t j”}|  |jd” |  t” d|_W d    d S 1 srw   Y  d S )Nr  rĆ   r   r  )	r	   r`   rU   r£   Znum_ticketsrĘ   r   rµ   rV   rŽ  r    r    r!   Śtest_num_tickest$  s"   ’’"’zContextTests.test_num_tickestN).rĻ  rŠ  rŃ  rŁ  rß  rc   rÓ  r   rį  rč  rė  rī  ró  rŅ  rõ  rJ   r	   r`   r÷  rż  r  r!  r,  ŚskipIfŚPy_DEBUG_WIN32r2  r8  r9  r„   r>  rC  rG  rJ  rM  rO  rp   rÕ  rP  rR  rS  rU  rW  rX  rY  ra  rb  r    r    r    r!   rÖ  x  sZ    
’

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£   rR   rA  ZSSLZeroReturnError)r­   Śer    r    r!   Śtest_str8  s   zSSLErrorTests.test_strr-  c                 C   s   t  t j”}|  t j”}| t” W d    n1 sw   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	   r`   rV   rĘ   r²   r/  rĶ   r£   r@  ŚlibraryŚreasonrR   r	  rõ   )r­   rM   r6  r¼   r    r    r!   Śtest_lib_reasonB  s   ’
zSSLErrorTests.test_lib_reasonc              
   C   s  t  t j”}d|_t j|_t d”f}t | 	” ”}| 
d” |j|ddd9}|  t j”}| ”  W d    n1 s=w   Y  t|j}|  | d”|” |  |jjt j” W d    n1 scw   Y  W d    d S W d    d S 1 s{w   Y  d S )NFrm  rn  z%The operation did not complete (read))r	   r`   rV   r   r   r   r¹   rp  Ścreate_connectionrq  Śsetblockingr   rĘ   ŚSSLWantReadErrorŚdo_handshakerR   r@  r	  rõ   r£   rA  ŚSSL_ERROR_WANT_READ)r­   rM   r¼   rs  r6  r    r    r!   Śtest_subclassM  s"   

’
śż"żzSSLErrorTests.test_subclassc                 C   sŌ   t  ” }|  t” |jt  ” t  ” dd W d    n1 s w   Y  |  t” |jt  ” t  ” dd W d    n1 sAw   Y  |  t” |jt  ” t  ” dd W d    d S 1 scw   Y  d S )Nr  rk  z.example.orgzexample.org evil.com)r	   rT  rĘ   r   r`  r±   rµ   rŽ  r    r    r!   Śtest_bad_server_hostname_  s    ’’’’’"’z&SSLErrorTests.test_bad_server_hostnameN)
rĻ  rŠ  rŃ  rg  rc   rc  rd  rj  rp  rq  r    r    r    r!   re  6  s    



re  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 )
Nr<  rĖ  ó   bars   foobaró   bazr  s   barĆ   ó   z)r	   r±   rt   r£   rE   ©r­   Śbior    r    r!   Śtest_read_writen  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Ė  r<  r  s   forĆ   ó   o)	r	   r±   rķ  Śeofr£   rE   rt   Ś	write_eofr	  rv  r    r    r!   Śtest_eof|  s   
zMemoryBIOTests.test_eofc                 C   s    t  ” }|  |jd” | d” |  |jd” tdD ]}| d” |  |jd| d ” qtdD ]}| d” |  |j|d ” q2| ”  |  |jd” d S )Nr   r<  r   rĆ   r  )r	   r±   r£   Śpendingrt   r¢  rE   )r­   rw  r¦  r    r    r!   Śtest_pending  s   


zMemoryBIOTests.test_pendingc                 C   sb   t  ” }| d” |  | ” d” | td” |  | ” d” | td” |  | ” d” d S )Nr<  rs  rt  )r	   r±   rt   r£   rE   rĒ   Ś
memoryviewrv  r    r    r!   Śtest_buffer_types  s   
z MemoryBIOTests.test_buffer_typesc                 C   sL   t  ” }|  t|jd” |  t|jd ” |  t|jd” |  t|jd” d S )Nr;  TrĆ   )r	   r±   rĘ   rµ   rt   rv  r    r    r!   Śtest_error_types£  s
   zMemoryBIOTests.test_error_typesN)rĻ  rŠ  rŃ  rx  r|  r~  r  r  r    r    r    r!   rr  l  s    	rr  c                   @   r  )ŚSSLObjectTestsc                 C   sF   t  ” }|  td” t  ||” W d    d S 1 sw   Y  d S rø   )r	   r±   r“   rµ   r_  rv  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 ]8}
z| ”  W n
 tjy<   Y nw |jrG| | 	” ” z|	 ”  W n
 tjyW   Y nw |jrb| | 	” ” q*| ”  |	 ”  |  
tj” | ”  W d    n1 sw   Y  | | 	” ” |	 ”  | | 	” ” | ”  d S )Nrk  Tr9  r»  )r   r	   r±   r`  r¢  rn  rm  r}  rt   rE   rĘ   Śunwrap)r­   Ś
client_ctxŚ
server_ctxr   Zc_inZc_outZs_inZs_outŚclientrÅ  Ś_r    r    r!   Śtest_unwrap±  s@   ’’
’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d!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/S )0ŚSimpleBackgroundTestsc                 C   sP   t  t j”| _| j t” t| jd}t|jf| _	| 
”  |  |jd d d ” d S )NrŹ  )r	   r`   rU   r   r   r   rĢ  r>  rĘ  Śserver_addrŚ	__enter__rE  Ś__exit__)r­   rÅ  r    r    r!   ŚsetUpŽ  s   zSimpleBackgroundTests.setUpc                 C   sĀ   t t tj”tjd}| | j” |  i | ” ” |  	|j
” W d    n1 s*w   Y  t t tj”tjtd}| | j” |  | ” ” |  	|j
” W d    d S 1 sZw   Y  d S )Nr®  ©r   r   )r   r¹   r  r	   r   r=  r  r£   Śgetpeercertrķ  r   r¢   r   r	  r»   r    r    r!   Śtest_connectę  s"   ’üž"ūz"SimpleBackgroundTests.test_connectc                 C   s<   t t tj”tjd}|  |j” |  tjd|j	| j
” d S )Nr®  ścertificate verify failed)r   r¹   r  r	   r¢   rE  rF  r“   r²   r=  r  r»   r    r    r!   Śtest_connect_failõ  s   ’
’z'SimpleBackgroundTests.test_connect_failc                 C   sJ   t t tj”tjtd}|  |j” |  d| 	| j
”” |  | ” ” d S )Nr  r   )r   r¹   r  r	   r¢   r   rE  rF  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 n& tjyL   t |gg g d” Y n tjy^   t g |gg d” Y nw q3|  | ” ” d S )NF)r   r   ro  r   r*  )r   r¹   r  r	   r¢   r   rE  rF  rl  rĆ  r  r{  rA  ZEINPROGRESSrÄ  Śselectrn  rm  Ś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”}d|_t j|_| t tj””}| 	| j
” |  i | ” ” W d    n1 s/w   Y  |jt tj”dd}| 	| j
” W d    n1 sPw   Y  t j|_| t” | t tj””}| 	| j
” | ” }|  |” W d    d S 1 sw   Y  d S )NFZdummyrk  )r	   r`   rV   r   r   r   r   r¹   r  r=  r  r£   r  r¢   r   r   r	  ©r­   rM   r¼   rQ  r    r    r!   Śtest_connect_with_context"  s(   ž’ž
"żz/SimpleBackgroundTests.test_connect_with_contextc                 C   sH   t  t j”}|jt tj”td}|  |j” |  	t j
d|j| j” d S )Nrk  r  )r	   r`   rV   r   r¹   r  r   rE  rF  r“   r²   r=  r  )r­   rM   r¼   r    r    r!   Śtest_connect_with_context_fail6  s   
ž
’z4SimpleBackgroundTests.test_connect_with_context_failc                 C   sŽ   t  t j”}|jtd |jt tj”td}| 	| j
” | ” }|  |” W d    n1 s1w   Y  t  t j”}|jtd |jt tj”td}| 	| j
” | ” }|  |” W d    d S 1 shw   Y  d S )Nr  rk  )r	   r`   rV   r   r  r   r¹   r  r   r=  r  r  r	  r  r  r    r    r!   Śtest_connect_capathC  s(   ’ü’"üz)SimpleBackgroundTests.test_connect_capathc                 C   s  t t}| ” }W d    n1 sw   Y  t |”}t tj”}|j|d |jt	 	t	j
”td}| | j” | ” }|  |” W d    n1 sNw   Y  t tj”}|j|d |jt	 	t	j
”td}| | j” | ” }|  |” W d    d S 1 sw   Y  d S )Nr#  rk  )rD   r   rE   r	   rō   r`   rV   r   r   r¹   r  r   r=  r  r  r	  )r­   rG   rų   rL  rM   r¼   rQ  r    r    r!   Śtest_connect_cadataZ  s0   

’
’ü’"ü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>w   Y  |  |jjtj” d S rw   )r   r¹   r  r=  r  ŚfilenoŚmakefilerF  r   rE   rE  rF  rĘ   r  r£   r@  rA  ŚEBADF)r­   r  ŚfdrG   rf  r    r    r!   Śtest_makefile_closeo  s   ’z)SimpleBackgroundTests.test_makefile_closec                 C   sĄ   t   t j”}| | j” | d” t|tjdd}|  |j	” d}	 z
|d7 }| 
”  W n$ tjy>   t |gg g ” Y n tjyO   t g |gg ” Y nw q"tjr^tj d| ” d S d S )NF©r   ro  r   TrĆ   z9
Needed %d calls to do_handshake() to establish session.
)r¹   r  r=  r  rl  r   r	   r   rE  rF  rn  rm  r  r  r   rr   rp   rs   rt   )r­   r¼   Ścountr    r    r!   Śtest_non_blocking_handshake  s.   
ž’ł	’z1SimpleBackgroundTests.test_non_blocking_handshakec                 C   s   t | g| j¢R dti d S )NrQ  )Ś_test_get_server_certificater  r   r¬   r    r    r!   Śtest_get_server_certificate  r#   z1SimpleBackgroundTests.test_get_server_certificatec                    s¢   | j \}}g   fdd}| j |” t ||f”}|s%|  d||f ” tj||ftd}|s9|  d||f ” tjrGt	j
 d|||f ” |   ||g” d S )Nc                    s      |” d S r   )Śappend©Śssl_sockZserver_nameZinitial_context©Zserver_namesr    r!   Śservername_cb  ó   zLSimpleBackgroundTests.test_get_server_certificate_sni.<locals>.servername_cbśNo server certificate on %s:%s!©r   ś&
Verified certificate for %s:%s is
%s
)r  r   rB  r	   Śget_server_certificaterö   r   r   rr   rp   rs   rt   r£   )r­   rd  rĘ  r«  rų   r    rŖ  r!   Śtest_get_server_certificate_sni  s   
z5SimpleBackgroundTests.test_get_server_certificate_snic                 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   sX   dd }| j  |” |  tj” tj| jtdd W d    d S 1 s%w   Y  d S )Nc                 S   s   t  d” d S )NēÉ?)rx   ŚsleeprØ  r    r    r!   r«  µ  r¬  zPSimpleBackgroundTests.test_get_server_certificate_timeout.<locals>.servername_cbē¹?)r   r-  )	r   rB  rĘ   r¹   r-  r	   r°  r  r   )r­   r«  r    r    r!   Ś#test_get_server_certificate_timeout“  s   
’"’z9SimpleBackgroundTests.test_get_server_certificate_timeoutc              	   C   s  t t tj”tjdd}| | j” W d    n1 sw   Y  t t tj”tjdd}| | j” W d    n1 s?w   Y  |  tjd”5 t tj”}t |tjdd}| | j” W d    n1 skw   Y  W d    d S W d    d S 1 sw   Y  d S )NrŚ  )r   r   rŪ  rÜ  rŻ  )	r   r¹   r  r	   r   r=  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 s9w   Y  |  t| ” d” d S )Nr  r,   rk  rĆ   )r	   r`   rV   r   r  r£   rK  r   r¹   r  r=  r  r  r	  rX   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0}| | j	” |  
|j|” |  
|jj|” ||_|  
|j|” |  
|jj|” W d    d S 1 sXw   Y  d S )Nr  r,   rk  )r	   r`   rV   r   r  r¹   r  r   r=  r  r¾   r   Ś_sslobj)r­   Zctx1Zctx2r¼   r  r    r    r!   Śtest_context_setget×  s   "śz)SimpleBackgroundTests.test_context_setgetc              
   O   sś   |  dtj”}t ” | }d}		 t ” |kr|  d” d }
|	d7 }	z|| }W n  tjyG } z|jtj	tj
fvr: |j}
W Y d }~nd }~ww | ” }| |” |
d u rVn|
tj	krl| d”}|rh| |” n| ”  qtjr{tj d|	|jf ” |S )Nr-  r   TrĆ   i   z"Needed %d calls to complete %s().
)r   r   ŚSHORT_TIMEOUTrx   Ś	monotonicrö   r	   r²   rA  ro  ZSSL_ERROR_WANT_WRITErE   Śsendallr  rt   r{  rr   rp   rs   rĻ  )r­   r   ŚincomingŚoutgoingrf   rd   r   r-  Śdeadliner£  rA  Śretrf  Śbufr    r    r!   Śssl_io_loopę  sB   
’ü


ē’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 rl|  | d”” |  ||||j ” |  
| ” ” |  | ” ” |  !| ” ” |  
| ” ” dtjv r|  
| d”” z|  ||||j"” W n
 tj#y³   Y nw |  tj$|j%d” d S )NFru  r<  )&r¹   r  rE  rF  r=  r  r	   r±   r`   rV   r	  r   r£   r   r¢   r   r   r`  r   r¾   r¹  Śownerrw  Ścipherr5   Śshared_ciphersrĘ   r   r  rŌ  rr  rĆ  rn  ŚassertIsNotNoner  ZSSLSyscallErrorr²   rt   )r­   r   r¾  ræ  rM   Śsslobjr    r    r!   Śtest_bio_handshake	  s@   

’

żz(SimpleBackgroundTests.test_bio_handshakec                 C   s¼   t   t j”}|  |j” | | j” t ” }t ” }t tj	”}d|_
tj|_| ||d”}|  ||||j” d}|  ||||j|” |  ||||jd”}|  |d” |  ||||j” d S )NFó   FOO
é   s   foo
)r¹   r  rE  rF  r=  r  r	   r±   r`   rV   r   r   r   r`  rĆ  rn  rt   rE   r£   r  )r­   r   r¾  ræ  rM   rČ  ZreqrĀ  r    r    r!   Śtest_bio_read_write_data-	  s   z.SimpleBackgroundTests.test_bio_read_write_datac                 C   s   t  \}}}t tj”4}| | j” t ” }t ” }|j|||d}|  ||||j	” | 
”  |  tj|j” W d    d S 1 sCw   Y  d S )Nrk  )r   r¹   r  r=  r  r	   r±   r`  rĆ  rn  r{  rĘ   ŚSSLEOFErrorrE   )r­   r   r   r   r   r¾  ræ  rČ  r    r    r!   Śtest_transport_eof>	  s   ’"öz(SimpleBackgroundTests.test_transport_eofN)rĻ  rŠ  rŃ  r  r  r  r  r  r  r  r  r  rc   rc  r   r   r”  r¤  r¦  r±  r³  r·  rß  rø  rŗ  rĆ  rÉ  rĢ  rĪ  r    r    r    r!   r  Ū  s2    
	
	%"r  Śnetworkc                   @   s*   e Zd Zdd Ze ejd”dd ZdS )ŚNetworkedTestsc                 C   sØ   t  t”E tt tj”tjdd}|  |j	” | 
d” | tdf”}|dkr.|  d” n
|tjkr8|  d” |  |tjtjf” W d    d S 1 sMw   Y  d S )NFr¢  gHÆ¼ņ×z>é»  r   z!REMOTE_HOST responded too quicklyzNetwork unreachable.)r   Śtransient_internetŚREMOTE_HOSTr   r¹   r  r	   r¢   rE  rF  r+  rĆ  rĄ  rA  ZENETUNREACHr{  ŚEAGAINrÄ  r  r    r    r!   Śtest_timeout_connect_exP	  s   ž


"õz&NetworkedTests.test_timeout_connect_exz
Needs IPv6c                 C   sH   t  d” t| dd t| dd W d    d S 1 sw   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Õ  rc   rÓ  r   rh  rÖ  r    r    r    r!   rŠ  M	  s    rŠ  c                 C   sp   t  ||f”}|s|  d||f ” t j||f|d}|s&|  d||f ” tjr6tj d|||f ” d S d S )Nr­  r®  rÆ  )r	   r°  rö   r   rr   rp   rs   rt   )Śtestrd  rĘ  rQ  rų   r    r    r!   r„  g	  s   ’r„  c              
   C   s|   zt j||ftd}W n& t jy1 } ztjr&tj d| ” W Y d }~d S W Y d }~d S d }~ww |  	d|||f ” d S )Nr®  z%s
z$Got server certificate %s for %s:%s!)
r	   r°  rĶ   r²   r   rr   rp   rs   rt   rö   )r×  rd  rĘ  rų   Śxr    r    r!   r²  r	  s   ’žr²  )Śmake_https_serverc                   @   sd   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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   Śaddrrl  ŚsslconnŚ	threadingŚThreadŚ__init__Śdaemon)r­   rÅ  ZconnsockrÜ  r    r    r!   rą  	  s   
z-ThreadedEchoServer.ConnectionHandler.__init__c              
   C   sź  z| j jj| jdd| _| j j | j ” ” W nt tt	t
fyL } z&| j j t|” | j jr:tdt| j d  d| _|  ”  W Y d }~dS d }~w tjtfy } z1| j j t|” | j jrntdt| j d  |jtjkrtjdkrd| _|  ”  W Y d }~dS d }~ww | 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Ū|d u rĻtj  !d	” ntj  !d
t$| d” | j %” }tjró| j jrótj  !dt| d ” dS )NTr9  z'
 server:  bad connection attempt from z:
FŚdarwinz client cert is rĖ   z client did not provide a cert
z cert binary is zb
z" server: connection cipher is now )&rÅ  r   r   r   rŻ  Śselected_alpn_protocolsr§  Śselected_alpn_protocolŚConnectionResetErrorŚBrokenPipeErrorŚConnectionAbortedErrorŚconn_errorsrR   Śchattyrv   ry  rÜ  rŪ  rF  r	   r²   r  rA  Z
EPROTOTYPErp   rÕ  rĘ  r   r¢   r  r   rr   rs   rt   rŃ   rŅ   rX   rÅ  )r­   rf  rQ  Zcert_binaryrÅ  r    r    r!   Ś	wrap_conn	  sJ   ’ė

z.ThreadedEchoServer.ConnectionHandler.wrap_connc                 C   s   | j r| j  ” S | j d”S )NrĖ  )rŻ  rE   r   r  r¬   r    r    r!   rE   Ī	  s   
z)ThreadedEchoServer.ConnectionHandler.readc                 C   s   | j r	| j  |”S | j |”S r   )rŻ  rt   r   r!  )r­   r  r    r    r!   rt   Ō	  s   z*ThreadedEchoServer.ConnectionHandler.writec                 C   s"   | j r
| j  ”  d S | j ”  d S r   )rŻ  rF  r   r¬   r    r    r!   rF  Ś	  s   z*ThreadedEchoServer.ConnectionHandler.closec                 C   sŠ  d| _ | jjs|  ” sd S | j ręz|  ” }| ” }|s;d| _ z| j ” | _W n	 t	y1   Y nw d | _|  
”  n\|dkrStjrL| jjrLtj d” |  
”  W d S | jjrv|dkrvtjrh| jjrhtj d” |  d” |  ” stW d S n!| jjrŖ| jrŖ|dkrŖt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 ” nÉ|dkrtjrą| jjrątj d” z| j ”  W n  tjy } z|  t| d”d ” W Y d }~nd }~ww |  d” n|dkr'| j ” d ur!|  d” nv|  d” np|dkr>| j ” }|  t| d”d ” nY|dkrW| jj ” }|  t| dd”d ” n@|dkrp| jj ” }|  t| dd”d ” n'tjr| jjr| jrdpd}tj d||| ” |f ” |  | ” ” W nH t	yą } z;| jjr½tjr½t|t r¹t!d| j"  nt#d z|  d” W n
 t	yĪ   Y nw |  
”  d| _ W Y d }~nd }~ww | j sd S 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...
ru  śus-asciió   
ó   PHAz( server: initiating post handshake auth
ó   HASCERTó   TRUE
ó   FALSE
ó   GETCERTs   VERIFIEDCHAINrĆ   Śbigs   UNVERIFIEDCHAINZ	encryptedZunencryptedz/ server: read %r (%s), sending back %r (%s)...
z Connection reset by peer: zTest server failure:
s   ERROR
)$rŪ  rÅ  Śstarttls_serverrź  rE   ŚstriprŻ  r  r   r  rF  r   rr   Śconnectionchattyrp   rs   rt   rr  ry  rf  Śverify_client_post_handshaker	   r²   r  r¹  Śget_verified_chainrX   Śto_bytesŚget_unverified_chainræ  ré  rQ   ŚConnectionErrorŚprintrÜ  rv   )r­   ŚmsgŚstrippedrÉ   rf  rQ  ZcertsZctyper    r    r!   Śruną	  s¼   ü
’

$’




’’
’’ļ·z(ThreadedEchoServer.ConnectionHandler.runN)	rĻ  rŠ  rŃ  rą  rź  rE   rt   rF  r  r    r    r    r!   ŚConnectionHandler	  s    
=r  NTFc                 C   są   |
r|
| _ n8t |d ur|ntj”| _ |d ur|ntj| j _|r&| j  |” |r.| j  |” |r6| j  |” |	r>| j  	|	” || _
|| _|| _t ” | _t | j”| _d | _d| _g | _g | _g | _tj | ” d| _d| _d S rŚ  )r   r	   r`   rU   r   r   r   r   Śset_alpn_protocolsrK   ré  rų  rö  r¹   r   r   rĀ  rĘ  ŚflagŚactiverć  rĘ  rč  rŽ  rß  rą  rį  Ś_in_context)r­   ZcertificateŚssl_versionŚcertreqsŚcacertsré  rų  rö  Zalpn_protocolsr   r   r    r    r!   rą  A
  s>   ’ž’

zThreadedEchoServer.__init__c                 C   s0   | j rtdd| _ |  t ” ” | j ”  | S )Nz&Re-entering ThreadedEchoServer contextT)r  r   ŚstartrŽ  ŚEventr  Śwaitr¬   r    r    r!   r  d
  s   
zThreadedEchoServer.__enter__c                 G   s   d| _ |  ”  |  ”  d S ©NF)r  Śstopr   ©r­   rd   r    r    r!   r  l
  s   zThreadedEchoServer.__exit__c                 C   s$   | j std|| _tj | ” d S )Nś4ThreadedEchoServer must be used as a context manager)r  r   r  rŽ  rß  r
  ©r­   r  r    r    r!   r
  r
  s   ’zThreadedEchoServer.startc              
   C   sF  | j std| j d” | j d” d| _| jr| j ”  | jrz*| j ” \}}t	j
r;| jr;tj dt| d ” |  | ||”}| ”  | ”  W nN tyj } zt	j
r`tj d|d” W Y d }~n4d }~w tyv   |  ”  Y n$ ty } zt	j
r| jrtj dt| d ” W Y d }~nd }~ww | js!|  ”  d S )	Nr  g      š?r»  Tz server:  new connection from rĖ   z connection timeout z connection handling failed: )r  r   r   r+  Ślistenr  r  r  r4  r   rr   ré  rp   rs   rt   ry  r  r
  r   ŚTimeoutErrorŚKeyboardInterruptr  ŚBaseExceptionrF  )r­   ZnewconnZconnaddrŚhandlerrf  r    r    r!   r  y
  sH   ’
’’’žņzThreadedEchoServer.runc                 C   s"   | j d ur| j  ”  d | _ d S d S r   )r   rF  r¬   r    r    r!   rF  
  s   


žzThreadedEchoServer.closec                 C   s
   d| _ d S r  )r  r¬   r    r    r!   r  
  ó   
zThreadedEchoServer.stop)
NNNNTFFNNNr   )rĻ  rŠ  rŃ  rŽ  rß  r  rą  r  r  r
  r  rF  r  r    r    r    r!   rĢ  	  s     A
ü#
rĢ  c                   @   sX   e Zd ZG dd dejZdd Zdd Zdd Zd	d
 Z	dddZ
dd Zdd ZdS )ŚAsyncoreEchoServerc                   @   s6   e Zd ZG dd dejZdd Zdd Zdd Zd	S )
zAsyncoreEchoServer.EchoServerc                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )z/AsyncoreEchoServer.EchoServer.ConnectionHandlerc                 C   s4   t |d|dd| _tj | | j” d| _|  ”  d S )NTF)r   r   ro  )r   r¹   ŚasyncoreŚdispatcher_with_sendrą  Ś_ssl_acceptingŚ_do_ssl_handshake)r­   Śconnr   r    r    r!   rą  Ø
  s   žz8AsyncoreEchoServer.EchoServer.ConnectionHandler.__init__c                 C   s6   t | jtjr| j ” dkr|  ”  | j ” dksdS )Nr   T)rQ   r¹   r	   rŗ   r}  Zhandle_read_eventr¬   r    r    r!   Śreadable°
  s
   ’z8AsyncoreEchoServer.EchoServer.ConnectionHandler.readablec              
   C   sØ   z| j  ”  W nG tjtjfy   Y d S  tjy"   |  ”  Y S  tjy*     tyN } z|j	d t
jkrC|  ” W  Y d }~S W Y d }~d S d }~ww d| _d S )Nr   F)r¹   rn  r	   rm  r  rĶ  Śhandle_closer²   r  rd   rA  ZECONNABORTEDr  ©r­   Śerrr    r    r!   r  ¶
  s   ’’
zAAsyncoreEchoServer.EchoServer.ConnectionHandler._do_ssl_handshakec                 C   sX   | j r	|  ”  d S |  d”}tjrtj dt| ” |s#|  	”  d S |  
| ” ” d S )NrĖ  z server:  read %s from client
)r  r  r  r   rr   rp   rs   rt   ry  rF  r!  ræ  )r­   rÉ   r    r    r!   Śhandle_readÅ
  s   
z;AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_readc                 C   s(   |   ”  tjrtj d| j ” d S d S )Nz server:  closed connection %s
)rF  r   rr   rp   rs   rt   r¹   r¬   r    r    r!   r  Ń
  s   ’z<AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_closec                  C   ó    r   r    r¬   r    r    r!   rv   Ö
  ó   z<AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_errorN)	rĻ  rŠ  rŃ  rą  r  r  r"  r  rv   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  rG  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   rr   rp   rs   rt   r  r   )r­   Zsock_objrÜ  r    r    r!   Śhandle_acceptedą
  s   z-AsyncoreEchoServer.EchoServer.handle_acceptedc                  C   r#  r   r    r¬   r    r    r!   rv   å
  r$  z*AsyncoreEchoServer.EchoServer.handle_errorN)	rĻ  rŠ  rŃ  r  r  r  rą  r'  rv   r    r    r    r!   Ś
EchoServer¤
  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¬   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r#t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   rr   rp   rs   rt   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    r    r!   r
    s   zAsyncoreEchoServer.startc                 C   sB   d| _ | jr| j ”  | j rzt d” W n   Y | j sd S 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Å  rF  r¬   r    r    r!   r    s   zAsyncoreEchoServer.stopr   )rĻ  rŠ  rŃ  r  r&  r(  rą  r*  r  r  r
  r  r  r    r    r    r!   r   
  s    D

r  rŹ  Fc                 C   s  	 i }t ||dd}|Æ | jt ” ||d}	|	 t|jf” |t|t|fD ]C}
|r8tj	r8t
j d| ” |	 |
” |	 ” }|rNtj	rNt
j d| ” || ” krltd|d d t||d d  ” t|f q)|	 d” |r}tj	r}t
j d	” | |	 ” |	 ” |	 ” |	 ” |	 ” |	j|	jd
” |	 ”  W d    n1 s¤w   Y  |j|d< |j|d< W d    |S 1 s¾w   Y  |S )NF©r   ré  rų  )r   Śsessionś client:  sending %r...
ś client:  read %r
ś4bad data <<%r>> (%d) received; expected <<%r>> (%d)
é   ó   over
ś client:  closing connection.
)ŚcompressionrÅ  ŚpeercertŚclient_alpn_protocolr5   Śsession_reusedr,  Śserver_alpn_protocolsŚserver_shared_ciphers)rĢ  r   r¹   r=  r>  rĘ  rĒ   r  r   rr   rp   rs   rt   rE   ræ  ŚAssertionErrorrX   r  r3  rÅ  r  rä  r5   r6  r,  rF  rć  rĘ  )r   r   Śindataré  rų  Śsni_namer,  rQ  rÅ  r¼   ŚargŚoutdatar    r    r!   Śserver_params_test  sj   ž
’’
’’’’
ł
	į
 
Ž#Ż#r>  c              
   C   s  	 |d u rt j}t jdt jdt jdi| }tjr/|rdpd}tj |t  	|”t  	| ”|f ” t
 ”   t  |”}| j|O  _t  | ”}	|	 j|O  _W d    n1 sVw   Y  t |d ”}
|
d urt|	dr| t jkr|	j|
krt
 ”  |
|	_W d    n1 sw   Y  |jt jkr| d” t|	| ||	fD ]}||_| t” | t” qz
t||	ddd	}W n) t jyĒ   |rÄ Y d S  tyā } z|sÖ|jtjkr× W Y d }~d S d }~ww |sót d
t  	|”t  	| ”f |dur	||d krt d||d f d S d S )Nr   r”   r¢   z %s->%s %s
z {%s->%s} %s
rI   rŚ  F)ré  rų  z5Client protocol %s succeeded with server protocol %s!Tr5   z%version mismatch: expected %r, got %r)!r	   r   r”   r¢   r   rr   rp   rs   rt   Zget_protocol_namer   rÅ   r`   r3  ŚPROTOCOL_TO_TLS_VERSIONr   rJ   rT   rI   rY   rK   rN   r   r   r   r   r   r>  r²   r  rA  Ś
ECONNRESETr9  )Zserver_protocolZclient_protocolŚexpect_successZ	certsreqsŚserver_optionsŚclient_optionsZcerttypeZ	formatstrr   r   Zmin_versionrM   rQ  rf  r    r    r!   Śtry_protocol_comboF  s   żüž’


ūż


’



’’’’’’’

’žrD  c                   @   s~  e Zd Zdd Zdd Zdd Zdd Ze e	j
d	”d
d Zdd Zdd Z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.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Z d:d; Z!d<d= Z"d>d? Z#d@dA Z$dBdC Z%eddDdE Z&ed)ed#e'dFdG Z(ed&e'dHdI Z)ed)ed#e'dJdK Z*ed dLdM Z+dNdO Z,e dPe	j-v dQ”dRdS Z.dTdU Z/e e0e	dVdW”dXdY Z1e 2e3dZ”d[d\ Z4d]d^ Z5d_d` Z6dadb Z7dcdd Z8dedf Z9dgdh Z:didj Z;dkdl Z<dmdn Z=dodp Z>dqdr Z?dsdt Z@dudv ZAdwdx ZBdydz ZCd{d| ZDd}S )~ŚThreadedTestsc              	   C   sņ  	 t jr
tj d” t \}}}| jtjtj	d t
||dd|d W d    n1 s-w   Y  d|_| jtj	tjd0 |  tj”}t
||dd|d W d    n1 sYw   Y  |  dt|j” W d    n1 sqw   Y  | jtj	tj	d/ |  tj”}t
||ddd W d    n1 sw   Y  |  dt|j” W d    n1 s±w   Y  | jtjtjd0 |  tj”}t
||ddd W d    n1 sŁw   Y  |  dt|j” W d    d S 1 sņw   Y  d S )NrĖ   )r  rÅ  T)r   r   ré  rų  r;  Fz@Cannot create a client socket with a PROTOCOL_TLS_SERVER context)r   r   ré  rų  )r   rr   rp   rs   rt   r   r³   r	   rV   rU   r>  r   rĘ   r²   r{  rR   r@  )r­   r   r   r   rf  r    r    r!   Ś	test_echo  sb   ż’ż’žśž’žū
ž’ž"ūzThreadedTests.test_echoc           
   
   C   s¤  t jr	tj d” t \}}}t|dd}|± |jt ” d|d}| 	t
|jf” |  t” | ”  W d    n1 s?w   Y  | ”  | ” }|  |d” | ” }t jrpt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 s³w   Y  W d    d S W d    d S 1 sĖw   Y  d S )NrĖ   F©r   ré  )ro  r   śCan't get peer certificate.zConnection cipher is z.
r3   z$No subject field in certificate: %s.r)   zkMissing or invalid 'organizationName' field in certificate subject; should be 'Python Software Foundation'.r1   r0   )r   rr   rp   rs   rt   r   rĢ  r   r¹   r=  r>  rĘ  rĘ   r   r  rn  r	  rÅ  rŃ   rŅ   rR   rö   r{  r	   r±  r  )
r­   r   r   r   rÅ  r¼   rQ  rÅ  ŚbeforeZafterr    r    r!   Śtest_getpeercertĀ  sP   
ž
’’’’å’"’zThreadedTests.test_getpeercertc              
   C   s  t jr	tj d” t \}}}ttdd}|  |j	tj
|B ” t|dd}|3 |jt ” |d}| t|jf” | ” }|  |d” W d    n1 sNw   Y  W d    n1 s]w   Y  | j	tjO  _	t|dd}|@ |jt ” |d'}|  tjd” | t|jf” W d    n1 sw   Y  W d    n1 s¦w   Y  W d    n1 sµw   Y  | t” t|dd}|< |jt ” |d}| t|jf” | ” }|  |d” W d    n1 sīw   Y  W d    d S W d    d S 1 sw   Y  d S )	NrĖ   rų  r   TrG  rk  rH  r  )r   rr   rp   rs   rt   r   rS   r	   r£   rł  rś  rĢ  r   r¹   r=  r>  rĘ  r  r	  rū  r“   r²   r   ŚCRLFILE)r­   r   r   r   rü  rÅ  r¼   rQ  r    r    r!   Śtest_crl_checkę  s^   
’ü’
’’žž’

’ü’$’zThreadedTests.test_crl_checkc              
   C   sč  t jr	tj d” t \}}}t|dd}|3 |jt ” |d}| 	t
|jf” | ” }|  |d” W d    n1 s>w   Y  W d    n1 sMw   Y  t|dd}|@ |jt ” dd'}|  tjd” | 	t
|jf” W d    n1 sw   Y  W d    n1 sw   Y  W d    n1 sw   Y  t|dd}|@ t ” #}|  td” | |” W d    n1 sĘw   Y  W d    n1 sÕw   Y  W d    d S W d    d S 1 sķw   Y  d S )	NrĖ   TrG  rk  rH  ri  z:Hostname mismatch, certificate is not valid for 'invalid'.z'check_hostname requires server_hostname)r   rr   rp   rs   rt   r   rĢ  r   r¹   r=  r>  rĘ  r  r	  r“   r	   rS  r   )r­   r   r   r   rÅ  r¼   rQ  r    r    r!   rX    sX   
’ü’
’žżž’	
’ž’’"’z!ThreadedTests.test_check_hostnamez)test requires hostname_checks_common_namec              
   C   sL  t  \}}}d|_t|dd}|) |jt ” |d}| t|jf” W d    n1 s.w   Y  W d    n1 s=w   Y  t t\}}}d|_t|dd}|H |jt ” |d&}|  	t
j” | t|jf” W d    n1 sxw   Y  W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )NFTrG  rk  )r   rš  rĢ  r   r¹   r=  r>  rĘ  r   rĘ   r	   ŚSSLCertVerificationErrorrĶ  r    r    r!   ró  /  s8   
’ž’
’’ž’"’z.ThreadedTests.test_hostname_checks_common_namec              	   C   sü   t  t j”}| t” | d” t}t  t j”}| t	” t
|dd}|O |jt ” |d-}| t|jf” | ” }|  |d” | ” d  d”}|  |d d d	” W d    n1 s_w   Y  W d    d S W d    d S 1 sww   Y  d S ©
NzECDHE:ECDSA:!NULL:!aRSATrG  rk  rH  r   ś-r  )ZECDHEZECDSA)r	   r`   rV   r   r   rK   ŚSIGNED_CERTFILE_ECC_HOSTNAMErU   r   ŚSIGNED_CERTFILE_ECCrĢ  r   r¹   r=  r>  rĘ  r  r	  rÅ  Śsplit©r­   r   r   r   rÅ  r¼   rQ  rÅ  r    r    r!   Śtest_ecc_certG  s*   



’ś’"’zThreadedTests.test_ecc_certc              	   C   s  t  t j”}| t” t jj|_| d” t	}t  t j
”}| t” | t” t|dd}|O |jt ” |d-}| t|jf” | ” }|  |d” | ” d  d”}|  |d d d	” W d    n1 siw   Y  W d    d S W d    d S 1 sw   Y  d S rN  )r	   r`   rV   r   r   r
   r_   r\   rK   rP  rU   r   rQ  r   rĢ  r   r¹   r=  r>  rĘ  r  r	  rÅ  rR  rS  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 ]U\}}t|dd}|A |jt ” |d(}|  |j|” | t|jf” | ” }|  |j|” |  |d” W d    n1 smw   Y  W d    n1 s|w   Y  q,t|dd}|H |jt ” dd&}|  tj” | t|jf” W d    n1 s®w   Y  W d    n1 s½w   Y  W d    d S W d    d S 1 sÕw   Y  d S )NrĖ   T))u   kĆ¶nig.idn.pythontest.netśxn--knig-5qa.idn.pythontest.net)rV  rV  )s   xn--knig-5qa.idn.pythontest.netrV  )u(   kĆ¶nigsgĆ¤Ćchen.idna2003.pythontest.netś.xn--knigsgsschen-lcb0w.idna2003.pythontest.net)rW  rW  )s.   xn--knigsgsschen-lcb0w.idna2003.pythontest.netrW  )ś.xn--knigsgchen-b4a3dun.idna2008.pythontest.netrX  )s.   xn--knigsgchen-b4a3dun.idna2008.pythontest.netrX  rG  rk  rH  zpython.example.org)r   rr   rp   rs   rt   r	   r`   rU   r   ŚIDNSANSFILErV   r¢   r   r   r   r   rĢ  r   r¹   r£   r   r=  r>  rĘ  r  r	  rĘ   rS  )	r­   r   r   Zidn_hostnamesr   Zexpected_hostnamerÅ  r¼   rQ  r    r    r!   Śtest_check_hostname_idnv  sN   


’ś’

’’ž’"’z%ThreadedTests.test_check_hostname_idnc                 C   sF  	 t  \}}}| t” tj|_tjj|_t	|ddd}|{ |j
t ” |dY}z
| t|jf” W nA tjyQ } ztjrGtj d| ” W Y d }~n-d }~w tyt } z|jtjkr_ tjrjtj d| ” W Y d }~n
d }~ww |  d” W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )NTr+  rk  ś
SSLError is %r
ś
socket.error is %r
ś'Use of invalid cert should have failed!)r   r   rĶ   r	   r¢   r   r
   r_   r\   rĢ  r   r¹   r=  r>  rĘ  r²   r   rr   rp   rs   rt   r  rA  r@  rö   ©r­   r   r   r   rÅ  r¼   rf  r    r    r!   Śtest_wrong_cert_tls12®  s<   

’
’’ü
Pļz#ThreadedTests.test_wrong_cert_tls12rō  c                 C   sx  t  \}}}| t” tj|_tjj|_tjj|_t	|ddd}| |j
t ” |ddm}| t|jf” z| d” | d” | d” | d” W nA tjyj } ztjr`tj d| ” W Y d }~n-d }~w ty } z|jtjkrx tjrtj d	| ” W Y d }~n
d }~ww |  d
” W d    n1 sw   Y  W d    d S W d    d S 1 sµw   Y  d S )NTr+  F©r   Śsuppress_ragged_eofsó   datar  s   should have failed alreadyr[  r\  r]  )r   r   rĶ   r	   r¢   r   r
   rō  rI   rĢ  r   r¹   r=  r>  rĘ  rt   rE   r²   r   rr   rp   rs   r  rA  r@  rö   r^  r    r    r!   Śtest_wrong_cert_tls13Ó  sF   


’
ž’


ü
Pģz#ThreadedTests.test_wrong_cert_tls13c                    s|   	 t  ” t  ”  t ” t t” fdd} fdd}t j|d}| ”  z
|  W | ”  d S | ”  w )Nc                     s8     ”   ”   ” \} }|  ”   ”    ”  d S r   )r  r  r4  rF  )ZnewsockrÜ  )Ślistener_goneŚlistener_readyr¼   r    r!   Ślistener  s   z2ThreadedTests.test_rude_shutdown.<locals>.listenerc               	      s     ”  t ” 1} |  tf”    ”  zt| }W n	 ty#   Y nw  d” W d    d S W d    d S 1 s<w   Y  d S )Nz2connecting to closed SSL socket should have failed)r  r¹   r=  r>  r   r  rö   )rs  r©  )rd  re  rĘ  r­   r    r!   Ś	connector  s   
’ų"śz3ThreadedTests.test_rude_shutdown.<locals>.connector©Śtarget)	rŽ  r  r¹   r   rĀ  r>  rß  r
  r   )r­   rf  rg  r  r    )rd  re  rĘ  r¼   r­   r!   Śtest_rude_shutdownõ  s   z ThreadedTests.test_rude_shutdownc                 C   s6  t jr	tj d” t tj”}| t	” t tj
”}t|dd}|o |jt ” tdM}z
| t|jf” W n: tjyq } z-d}|  |tj” |  |jd” |  |j|” |  |t|” |  dt|” W Y d }~nd }~ww W d    n1 s|w   Y  W d    d S W d    d S 1 sw   Y  d S )NrĖ   TrG  rk  z&unable to get local issuer certificater0  r  )r   rr   rp   rs   rt   r	   r`   rU   r   r   rV   rĢ  r   r¹   r   r=  r>  rĘ  r²   r  rM  r£   Zverify_codeZverify_messager{  ry  )r­   r   r   rÅ  r¼   rf  r’  r    r    r!   Śtest_ssl_cert_verify_error  s6   

’śü’"’z(ThreadedTests.test_ssl_cert_verify_errorr[   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r:ttjtjd ttj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   ©rC  )r   rr   rp   rs   rt   rD  r	   ŚPROTOCOL_SSLv2r”   r¢   rT   rW   ŚPROTOCOL_SSLv3r   r§   rØ   r¬   r    r    r!   Śtest_protocol_sslv25  s    ’
’z!ThreadedTests.test_protocol_sslv2c              
   C   sØ  	 t jr
tj d” tdr8z
ttjtj	d W n t
y7 } zt jr-tj dt| ” W Y d }~nd }~ww tdrDttjtjd ttjtjd tdrXttjtjd tdrft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r¤ttjtjdtj tdr³t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 d S )	NrĖ   r[   Tz; SSL2 client to SSL23 server test unexpectedly failed:
 %s
r   Fr   )rB  )r   rr   rp   rs   rt   rW   rD  r	   rT   rm  r  rR   rn  r   r”   r¢   r§   r¦   rØ   )r­   rŲ  r    r    r!   Śtest_PROTOCOL_TLSG  sT   ’’ż’
’
’’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r2ttjtjd ttjtjdtjd ttjtjd d S )NrĖ   r   r[   Frl  )r   rr   rp   rs   rt   rD  r	   rn  r”   r¢   rW   rm  rT   r§   r   r¬   r    r    r!   Śtest_protocol_sslv3q  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r2ttjtjd t
dr>ttjtjd ttjtjdtjd d S )NrĖ   r   r[   Fr   rl  )r   rr   rp   rs   rt   rD  r	   r   r”   r¢   rW   rm  rn  rT   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r*t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.1r[   Fr   rl  )r   rr   rp   rs   rt   rD  r	   r   rW   rm  rn  rT   rŖ   r0  r¬   r    r    r!   Śtest_protocol_tlsv1_1  s   ’z#ThreadedTests.test_protocol_tlsv1_1r_   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r)ttjtjd t
dr5t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rtttjtjd ttjtjd d S d S )NrĖ   śTLSv1.2)rB  rC  r[   Fr   rl  )r   rr   rp   rs   rt   rD  r	   r0  r§   r¦   rW   rm  rn  rT   r«   rZ   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}|¹ t ” }| d” | t|jf” tjr*t	j
 d” |D ]j}tjr9t	j
 d| ” |rE| |” | ” }n
| |” | d”}| ”  ” }|dkrp| d	”rptjrit	j
 d
| ” t|}d}q,|dkr| d	”rtjrt	j
 d| ” | ” }d}q,tjrt	j
 d| ” q,tjr t	j
 d” |rØ| d” n| d” |r“| ”  n| ”  W d    d S W d    d S 1 sĖw   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
r2  r1  )rĢ  rĶ   r¹   rl  r=  r>  rĘ  r   rr   rp   rs   rt   rE   r!  r  r÷  ræ  rõ   r   r  rF  )	r­   ZmsgsrÅ  Śwrappedr¼   r:  r  r=  r’  r    r    r!   Śtest_starttlsø  sv   ż
’



’’’’’


Ņ,"ŌzThreadedTests.test_starttlsc                 C   sž   	 t | td}tjrtj d” ttd}| 	” }W d    n1 s$w   Y  d}d|j
tj t”d f }tjtd}tjj||d}z+| ”  d	”}|rlt|d
krl| 	t|”}tjrltj dt||f ” W | ”  n| ”  w |  ||” d S )Nr;  rĖ   Śrbr  zhttps://localhost:%d/%srĆ   ©r  rŹ  zcontent-lengthr   z/ client: read %d bytes from remote server '%s'
)rŁ  r   r   rr   rp   rs   rt   rD   rĶ   rE   rĘ  r   r   rR  r	   rT  r   ŚurllibŚrequestŚurlopenŚinfor   r  rX   rF  r£   )r­   rÅ  rG   rł   rś   Śurlr   Zdlenr    r    r!   Śtest_socketserverń  s4   
’’
’’zThreadedTests.test_socketserverc              	   C   s(  	 t jr
tj d” d}tt}|x tt ” }| 	d|j
f” t jr,tj d| ” | |” | ” }t jr@tj d| ” || ” kr_|  d|d d t||d d  ” t|f ” | d” t jrmtj d	” | ”  t jrtj d
” W d    d S W d    d S 1 sw   Y  d S )NrĖ   rŹ  rļ   r-  r.  r/  r0  r1  r2  z client:  connection closed.
)r   rr   rp   rs   rt   r  rĶ   r   r¹   r=  rĘ  rE   ræ  rö   rX   rF  )r­   r:  rÅ  r¼   r=  r    r    r!   Śtest_asyncore_server  sB   ’
’’’
ģ"ķ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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 ]x\}}}	}
}||  d”}z<||g|
¢R  }d |”}| j||||d   ” }|| ” krŗ|  dj||d d t||d d t|d” W qq tyé } z"|	rĪ|  dj|d” t| |”sß|  dj||d” W Y d }~qqd }~ww |D ]m\}}}	}
||  d”}z+  |” ||
 }|| ” kr#|  dj||d d t||d d t|d” W qģ tyY } z(|	r9|  d j|d” t| |”sK|  dj||d”   ”  W Y d }~qģd }~ww 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    d S 1 sßw   Y  d S )%NrĖ   TF©r  r  r	  ré  rų  ©r   r   r   r   c                     s   t d}   | ”}| d | S ©Nsd                                                                                                       )rĒ   r  )Śbr£  ©r¼   r    r!   Ś
_recv_into;  s   
z0ThreadedTests.test_recv_send.<locals>._recv_intoc                     s"   t d}   | ”\}}| d | S r  )rĒ   r   )r  r£  rÜ  r  r    r!   Ś_recvfrom_into@  s   z4ThreadedTests.test_recv_send.<locals>._recvfrom_intor!  r"  zsome.addressr½  c                 S   rO   r   r    )rŲ  r    r    r!   Ś<lambda>I  ó    z.ThreadedTests.test_recv_send.<locals>.<lambda>r  r  r  r   ZPREFIX_rV  zsending with {}©r’  zpWhile sending with <<{name:s}>> bad data <<{outdata:r}>> ({nout:d}) received; expected <<{indata:r}>> ({nin:d})
r0  )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.
rb  r  r  r1  ))r   rr   rp   rs   rt   rĢ  rĶ   r	   r   rU   r   r¹   r=  r>  rĘ  r!  rX   r"  r½  r  r  rf  Śformatr£   rE   ræ  rö   r   rR   rõ   rĒ   ŚctypesZc_ubyteZfrom_buffer_copyrĘ   r#  r$  r%  r&  r'  rF  )r­   rÅ  r  r  Zsend_methodsZrecv_methodsZdata_prefixZ	meth_nameZ	send_methrA  rd   Zret_val_methr:  rĮ  r’  r=  rf  Z	recv_methrÉ   ŚbufferZubyteZ	bytesliker    r  r!   Śtest_recv_send(  sģ   ūüż

ü’
ū’	’’ž’ł
ū’	’’ž’ņ



’

$zThreadedTests.test_recv_sendc                 C   sĘ   t t}| ”  |  |jd d ” t t|jf”}|  |j	” t
|dd}|  |j	” | d” |  | d”d” |  | d”d” |  | ” d” | d” |  | d”d” |  | t ”d” d S )NF)ra  rb  r   rĖ  )rĢ  rĶ   r  rE  r  r¹   rk  r>  rĘ  rF  r   r!  r£   r  rE   rl  r  rĒ   )r­   rÅ  r¼   r    r    r!   Śtest_recv_zero°  s   

zThreadedTests.test_recv_zeroc                    s°   t ttjtjtddd}|@ tt ” dtttjd t|j	f”  
d” td  fdd}|  tjtjf|”  
d”  ”  W d    d S 1 sQw   Y  d S )NTFr  r  i    c                      s   	    ” qr   )r!  r    ©rĀ  r¼   r    r!   Śfill_buffer×  s   
’z8ThreadedTests.test_nonblocking_send.<locals>.fill_buffer)rĢ  rĶ   r	   r   rU   r   r¹   r=  r>  rĘ  rl  rĒ   rĘ   r  rm  rF  )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}| ”   ”  zYz t   t j”}| 	d” | 
||f” |  tdt|” W | ”  n| ”  w z t   t j”}t|}| 	d” |  td|j
||f” W | ”  n| ”  w W d | ”   ”  d S d | ”   ”  w )	Nrļ   Fc                     sd     ”   ”  g }  s't gg g d”\}}}|v r%|   ” d ”  r| D ]}| ”  q)d S )Nr¶  r   )r  r  r  r§  r4  rF  )Zconnsrņ   Śwrf  r   ©ZfinishrÅ  Śstartedr    r!   Śserveé  s   ū
’z3ThreadedTests.test_handshake_timeout.<locals>.serverh  r“  z	timed outT)r¹   r  r   rĀ  rŽ  r  rß  r
  r  r+  r=  r“   r  r   rF  r   )r­   rd  rĘ  r  r  rs  r    r  r!   Śtest_handshake_timeoutį  s@   

’

’ž
z$ThreadedTests.test_handshake_timeoutc           
         sö   t  \}}}t tj”d}t ”}|jdd|  j” t 	”  d d  fdd}tj
|d}| ”    ”  |jt ” |d}| ||f” | d” | ”  | ” }	| ”  | ”   ”   ”  |  tj” |  |	” d S )	Nrļ   Tr9  c                      s0     ”    ”   ” \  d”” d S )Nrü   )r  r  r4  r!  r  r    ©ZevtZpeerZremoterÅ  r    r!   r    s   z/ThreadedTests.test_server_accept.<locals>.serverh  rk  rb  )r   r¹   r  r   rĀ  r   r	  r   rŽ  r  rß  r
  r  r=  r!  r  rq  rF  r   r  r	   rŗ   r£   )
r­   r  r  r   rd  rĘ  r  r  r  Zclient_addrr    r  r!   Śtest_server_accept  s4   
’
z ThreadedTests.test_server_acceptc              	   C   ó   t  t j”}d|_| t ” ”+}|  t”}| ”  W d    n1 s%w   Y  |  	|j
jtj” W d    d S 1 s>w   Y  d S r  )r	   r`   rV   r   r   r¹   rĘ   r  r  r£   r@  rA  ŚENOTCONN©r­   r   r   r6  r    r    r!   Śtest_getpeercert_enotconn:  ó   
’"żz'ThreadedTests.test_getpeercert_enotconnc              	   C   r  r  )r	   r`   rV   r   r   r¹   rĘ   r  rn  r£   r@  rA  r  r  r    r    r!   Śtest_do_handshake_enotconnB  r   z(ThreadedTests.test_do_handshake_enotconnc              
   C   sÖ   t  \}}}tjj|_| d” | d” t|d>}|jt ” |d%}|  	t
” | t|jf” W d    n1 s=w   Y  W d    n1 sLw   Y  W d    n1 s[w   Y  |  d|jd ” d S )NZAES128ŚAES256rŹ  rk  zno shared cipherr   )r   r	   r
   r_   r\   rK   rĢ  r   r¹   rĘ   r  r=  r>  rĘ  r{  rč  rĶ  r    r    r!   Śtest_no_shared_ciphersJ  s"   



’’ž’z$ThreadedTests.test_no_shared_ciphersc              	   C   sÜ   	 t  t j”}d|_t j|_ttt jddN}| 	t
 
” ”'}|  | ” d ” |  |jd ” | t|jf” |  | ” d” W d    n1 sHw   Y  |  |jd ” |  | ” d ” W d    d S 1 sgw   Y  d S )NF)r  ré  śTLSv1.3)r	   r`   rV   r   r   r   rĢ  rĶ   rU   r   r¹   r¾   r5   r¹  r=  r>  rĘ  r£   )r­   r   rÅ  r¼   r    r    r!   Śtest_version_basicX  s$   žü"÷z ThreadedTests.test_version_basicc              	   C   sĄ   t  \}}}tjj|_t|dF}|jt ” |d$}| t	|j
f” |  | ” d h d£” |  | ” d” W d    n1 sAw   Y  W d    d S W d    d S 1 sYw   Y  d S )NrŹ  rk  r   >   ZTLS_CHACHA20_POLY1305_SHA256ZTLS_AES_128_GCM_SHA256ZTLS_AES_256_GCM_SHA384r¤  )r   r	   r
   rō  rI   rĢ  r   r¹   r=  r>  rĘ  r{  rÅ  r£   r5   rĶ  r    r    r!   Śtest_tls1_3k  s   

’ų’"’zThreadedTests.test_tls1_3c              	   C   sĘ   t  \}}}tjj|_tjj|_tjj|_tjj|_t|d:}|jt	 	” |d}| 
t|jf” |  | ” d” W d    n1 sDw   Y  W d    d S W d    d S 1 s\w   Y  d S )NrŹ  rk  ru  )r   r	   r
   r   rI   r_   r\   rĢ  r   r¹   r=  r>  rĘ  r£   r5   rĶ  r    r    r!   Śtest_min_max_version_tlsv1_2z  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:}|j
t ” |d}| t|jf” |  | ” d” W d    n1 sIw   Y  W d    d S W d    d S 1 saw   Y  d S )NrŹ  rk  rs  )r   r	   r
   r   rI   r_   r\   r   rN   rĢ  r   r¹   r=  r>  rĘ  r£   r5   rĶ  r    r    r!   Śtest_min_max_version_tlsv1_1  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Q}|j	t
 
” |d/}|  tj”}| t|jf” W d    n1 sHw   Y  |  dt|j” W d    n1 s`w   Y  W d    d S W d    d S 1 sxw   Y  d S )NrŹ  rk  Zalert)r   r	   r
   r_   r\   rI   r   rN   rĢ  r   r¹   rĘ   r²   r=  r>  rĘ  r{  rR   r@  r^  r    r    r!   Śtest_min_max_version_mismatch  s&   





’’ü’"’z+ThreadedTests.test_min_max_version_mismatchc              	   C   sĘ   t  \}}}tjj|_tjj|_tjj|_t|| t|d:}|jt	 	” |d}| 
t|jf” |  | ” d” W d    n1 sDw   Y  W d    d S W d    d S 1 s\w   Y  d S )NrŹ  rk  r   )r   r	   r
   r   rI   r\   rN   rĢ  r   r¹   r=  r>  rĘ  r£   r5   rĶ  r    r    r!   Śtest_min_max_version_sslv3°  s    




’ż’"’z(ThreadedTests.test_min_max_version_sslv3c              	   C   s¬   t  \}}}tjj|_t|d<}|jt ” |d}| t	|j
f” |  d| ” d ” W d    n1 s7w   Y  W d    d S W d    d S 1 sOw   Y  d S )NrŹ  rk  ZECDHr   )r   r	   r
   r_   r\   rĢ  r   r¹   r=  r>  rĘ  r{  rÅ  rĶ  r    r    r!   Śtest_default_ecdh_curve¾  s   

’ż’"’z%ThreadedTests.test_default_ecdh_curveru  rv  c           	   	   C   s  	 t jr
tj d” t \}}}t|ddd}|ß |jt ” |dS}| 	t
|jf” | d”}t jr=tj d |”” |  |” | ” dkrQ|  t|d	” n|  t|d
” | d” | ”  ” }|  |t| d”” W d    n1 syw   Y  |jt ” |dY}| 	t
|jf” | d”}t jr”tj d |”” |  ||” |  |” | ” dkr»|  t|d	” n|  t|d
” | d” | ”  ” }|  |t| d”” W d    n1 sćw   Y  W d    d S W d    d S 1 sūw   Y  d S )NrĖ   TFr+  rk  ru  z! got channel binding data: {0!r}
r¤  é0   é   s   CB tls-unique
rī  z(got another channel binding data: {0!r}
)r   rr   rp   rs   rt   r   rĢ  r   r¹   r=  r>  rĘ  rr  r  rĒ  r5   r£   rX   rE   r÷  ry  rf  ŚassertNotEqual)	r­   r   r   r   rÅ  r¼   Zcb_dataZpeer_data_reprZnew_cb_datar    r    r!   rx  Ļ  sr   žž
’

’ģž
’’

’ķē"ē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}
r3  >   ZRLENZZLIB)	r   r>  r   rr   rp   rs   rt   r  r{  ©r­   r   r   r   rQ  r    r    r!   Śtest_compression  s   žzThreadedTests.test_compressionr>   z*ssl.OP_NO_COMPRESSION needed for this testc                 C   sR   t  \}}}| jtjO  _| jtjO  _t||dd|d}|  |d d ” d S )NTrÆ  r3  )r   r3  r	   r>   r>  r¾   r°  r    r    r!   Śtest_compression_disabled  s   žz'ThreadedTests.test_compression_disabledr-  c                 C   s   t  \}}}tjj|_| t” | d” tjj|_t||dd|d}|d d }| 	d”}d|vrEd|vrGd	|vrI|  
d
|d  ” d S d S d S d S )NZkEDHTrÆ  rÅ  r   rO  ZADHZEDHZDHEzNon-DH cipher: )r   r	   r
   r_   r\   r/  r0  rK   r>  rR  rö   )r­   r   r   r   rQ  rÅ  Śpartsr    r    r!   Śtest_dh_params  s   



ž
’zThreadedTests.test_dh_paramsc                 C   sš   t  \}}}| d” | d” tjj|_t||dd|d}t  \}}}| d” | d” tjj|_t||dd|d}t  \}}}| d” | d” | d” tjj|_|  tj	” t||dd|d W d    d S 1 sqw   Y  d S )NZ	secp384r1zECDHE:!eNULL:!aNULLTrÆ  r:  )
r   r=  rK   r	   r
   r_   rI   r>  rĘ   r²   r°  r    r    r!   Śtest_ecdh_curve0  s6   


ž


ž



ž"’zThreadedTests.test_ecdh_curvec                 C   s2   t  \}}}t||dd|d}|  |d d ” d S )NTrÆ  r5  )r   r>  r¾   r°  r    r    r!   Śtest_selected_alpn_protocolO  s   žz)ThreadedTests.test_selected_alpn_protocolc                 C   s@   t  \}}}| ddg” t||dd|d}|  |d d ” d S )Nr;  ŚbarTrÆ  r5  )r   r  r>  r¾   r°  r    r    r!   Ś/test_selected_alpn_protocol_if_server_uses_alpnW  s   žz=ThreadedTests.test_selected_alpn_protocol_if_server_uses_alpnc                 C   s  g d¢}ddgdfddgdfdgdfddgd fg}|D ]j\}}t  \}}}| |” | |” zt||dd|d}W n tjyO }	 z|	}W Y d }	~	nd }	~	ww d	t|t|t|f }
|d
 }|  |||
|df ” t|d rx|d d nd}|  |||
|df ” qd S )N)r;  r·  Ś	milkshaker;  r·  r¹  zhttp/3.0zhttp/4.0TrÆ  zKfailed trying %s (s) and %s (c).
was expecting %s, but got %%s from the %%sr5  r  r7  r  ZnothingrÅ  )r   r  r>  r	   r²   rR   r£   rX   )r­   Zserver_protocolsZprotocol_testsZclient_protocolsr¤  r   r   r   rQ  rf  r’  Zclient_resultZserver_resultr    r    r!   Śtest_alpn_protocols`  sL   


ü


ü’’ž
’
’’
’éz!ThreadedTests.test_alpn_protocolsc                 C   rO   r   r    r¬   r    r    r!   Śtest_npn_protocols  r  z ThreadedTests.test_npn_protocolsc                 C   sL   t  t j”}| t” t  t j”}| t” t  t j”}| t” |||fS r   )	r	   r`   rU   r   r   r   rV   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 )Nr4  r+   r3   )r{  )r­   rQ  r   rQ  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 d S r   )r§  r   rØ  ©Zcallsr¼  r    r!   r«    s   
’z6ThreadedTests.test_sni_callback.<locals>.servername_cbTŚsupermessage©ré  r;  r:   Znotfunny)r½  r   rB  r>  r£   r¾  r   )r­   r   r   r«  rQ  r    ræ  r!   rC    s4   
žž
žzThreadedTests.test_sni_callbackc                 C   sp   |   ” \}}}dd }| |” |  tj”}t||ddd}W d    n1 s)w   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½  rB  rĘ   r	   r²   r>  r£   r@  ri  )r­   r   r¼  r   rĀ  r6  rQ  r    r    r!   Śtest_sni_callback_alertŗ  s   
ž’z%ThreadedTests.test_sni_callback_alertc              	   C   óŖ   |   ” \}}}dd }| |” t ” 7}|  tj”}t||ddd}W d    n1 s.w   Y  |  |j	j
d” |  |jjt” W d    d S 1 sNw   Y  d S )Nc                 S   s   dd  d S )NrĆ   r   r    rØ  r    r    r!   Ś
cb_raisingĖ  r¾  z;ThreadedTests.test_sni_callback_raising.<locals>.cb_raisingFrĄ  rĮ  ZSSLV3_ALERT_HANDSHAKE_FAILURE)r½  rB  r   Ścatch_unraisable_exceptionrĘ   r	   r²   r>  r£   r@  ri  Ś
unraisableŚexc_typeŚZeroDivisionError)r­   r   r¼  r   rÅ  Ścatchr6  rQ  r    r    r!   Śtest_sni_callback_raisingĒ  s   

ž’
’"ųz'ThreadedTests.test_sni_callback_raisingc              	   C   rÄ  )Nc                 S   r	  )Nr;  r    rØ  r    r    r!   Ścb_wrong_return_typeŽ  rP   zOThreadedTests.test_sni_callback_wrong_return_type.<locals>.cb_wrong_return_typeFrĄ  rĮ  ZTLSV1_ALERT_INTERNAL_ERROR)r½  rB  r   rĘ  rĘ   r	   r²   r>  r£   r@  ri  rĒ  rČ  rµ   )r­   r   r¼  r   rĢ  rŹ  r6  rQ  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 s@|   ” q+d S )	NzAES128:AES256zAES256:eNULL)r¢  zAES-256ZTLS_CHACHA20ZTLS_AES©r;  r8  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   rK   r>  ŚassertGreaterrX   Śanyrö   )	r­   r   r   r   Zexpected_algsrQ  r   Ztls_versionŚbitsr    r   r!   Śtest_shared_ciphersģ  s   

’
žz!ThreadedTests.test_shared_ciphersc                 C   s   t  \}}}t|dd}|. |jt ” |d}| t|jf” | ”  |  t	|j
d” |  t	|jd” W d    d S 1 s?w   Y  d S )NFrG  rk  rĖ  s   hello)r   rĢ  r   r¹   r=  r>  rĘ  rF  rĘ   r   rE   rt   rĶ  r    r    r!   Ś,test_read_write_after_close_raises_valuerrorž  s   
’"łz:ThreadedTests.test_read_write_after_close_raises_valuerrorc           	   
   C   s&  d}t tjd}| |” W d    n1 sw   Y  |  tjtj” t \}}}t|dd}|V |jt	 	” |d4}| 
t|jf” t tjd}| |” |  | d”|” W d    n1 sew   Y  W d    n1 stw   Y  W d    d S W d    d S 1 sw   Y  d S )Ns   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxŚwbFrG  rk  ry  rĖ  )rD   r   ŚTESTFNrt   rE  Śunlinkr   rĢ  r   r¹   r=  r>  rĘ  Śsendfiler£   r  )	r­   Z	TEST_DATArG   r   r   r   rÅ  r¼   Śfiler    r    r!   Śtest_sendfile  s,   ’
’
žż’"’zThreadedTests.test_sendfilec           
      C   s0  t  \}}}tjj|_t|||d}|d }|  |j” |  |j	d” |  |j
d” |  |j” |  |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   r6  r4  rĆ   r5  )r,  r;  r  r   rü   )r   r	   r
   r_   r\   r>  r	  ŚidrĻ  rx   r-  Z
has_ticketZticket_lifetime_hintrķ  r7  r£   ZassertIsNotr  r®  )
r­   r   r   r   rQ  r,  Z	sess_statZsession2Zsession3Zsession4r    r    r!   Śtest_session  sd   
’’’’zThreadedTests.test_sessionc           
   
   C   sØ  t  \}}}t  \}}}tjj|_tjj|_t|dd}|* |jt ” |dG}|  |j	d ” |  |j
d ” | t|jf” |j	}|  |” |  t”}	t|_	W d    n1 s[w   Y  |  t|	jd” W d    n1 ssw   Y  |jt ” |d1}| t|jf” |  t”}	||_	W d    n1 sw   Y  |  t|	jd” W d    n1 sµw   Y  |jt ” |d*}||_	| t|jf” |  |j	j|j” |  |j	|” |  |j
d” W d    n1 sšw   Y  |jt ” |d2}|  t”}	||_	| t|jf” W d    n	1 sw   Y  |  t|	jd” W d    n1 s4w   Y  W d    d S W d    d S 1 sMw   Y  d S )NFrG  rk  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,  r6  r=  r>  rĘ  r	  rĘ   rµ   r+  rR   r@  r   rŚ  )
r­   r   r   r   Zclient_context2r  rÅ  r¼   r,  rf  r    r    r!   Śtest_session_handlingS  sr   


’
’ö
’’’ś
	’ų

’ž’ śą $ąz#ThreadedTests.test_session_handlingN)ErĻ  rŠ  rŃ  rF  rJ  rL  rX  rc   rÓ  r	   rń  ró  rT  rU  rZ  r_  rl   rc  rj  rk  ro  rp  rq  rr  rt  rv  rx  r  r  r  r  r  r  r  r  r”  r£  r„  r¦  rŅ  r§  rØ  r©  rŖ  r«  rŌ  rx  r±  rJ   r²  rc  rd  r“  rµ  r¶  rø  rŗ  r»  r½  r¾  rC  rĆ  rĖ  rĶ  rŅ  rÓ  rŁ  rŪ  rÜ  r    r    r    r!   rE    sØ    ,$(!’
8%
!)
*



9 	1(

’
:	’

	
	"	(9rE  rō  zTest needs TLS 1.3c                   @   sd   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d Zdd ZdS )ŚTestPostHandshakeAuthc                 C   s¼   t jt jg}|D ]S}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	   rU   rV   r`   r£   Śpost_handshake_authr¢   r   r”   )r­   r5  rY   rM   r    r    r!   Śtest_pha_setter  s$   ’
īz%TestPostHandshakeAuth.test_pha_setterc              	   C   sH  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w   Y  W d    d S W d    d S 1 sw   Y  d S )NTFrG  rk  rń  rĖ  ró  rš  rģ  rņ  rō  i   rī  r6   )r   rŽ  r	   r¢   r   r   r   rĢ  r   r¹   r=  r>  rĘ  rt   r£   r  rg  r{  )r­   r   r   r   rÅ  r¼   Z	cert_textr    r    r!   Śtest_pha_required   s6   

’




ņ’"’z'TestPostHandshakeAuth.test_pha_requiredc              
   C   s   t  \}}}d|_tj|_d|_dd }||_||_t|dd}|d |jt ” |ddA}| 	t
|jf” | d” |  tjd” | d	”}|  |d
” | d” | d	” W d    n1 sbw   Y  W d    n1 sqw   Y  W d    d S W d    d S 1 sw   Y  d S )NTc                 S   s@   t jr|tjkr| |||||f}tj d|d” d S d S d S )NzTLS: rĖ   )r   rr   r   ZALERTrp   rs   rt   )r  Ś	directionr5   Ścontent_typeŚmsg_typerÉ   r~  r    r    r!   Śmsg_cbæ  s   žz>TestPostHandshakeAuth.test_pha_required_nocert.<locals>.msg_cbrG  Fr`  rš  z#(certificate required|EOF occurred)rĖ  rģ  rń  )r   rŽ  r	   r¢   r   Ś_msg_callbackrĢ  r   r¹   r=  r>  rĘ  rt   r“   r²   r  r£   )r­   r   r   r   rä  rÅ  r¼   rÉ   r    r    r!   Śtest_pha_required_nocert¹  s<   
ž
ž

ōł’"’z.TestPostHandshakeAuth.test_pha_required_nocertc              	   C   s   t jr	tj d” t \}}}d|_tj|_	d|_| 
t” tj|_	t|dd}|\ |jt ” |d:}| t|jf” | d” |  | d”d” | d	” |  | d”d
” | d” |  | d”d” W d    n1 sqw   Y  W d    d S W d    d S 1 sw   Y  d S )NrĖ   TFrG  rk  rń  rĖ  ró  rš  rģ  rņ  )r   rr   rp   rs   rt   r   rŽ  r	   r¢   r   r   r   r”   rĢ  r   r¹   r=  r>  rĘ  r£   r  rĶ  r    r    r!   Śtest_pha_optionalŽ  s2   

’


ų’"’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|jf” | d” |  | d”d” | d	” |  | d”d
” | d” |  | d”d” W d    n1 shw   Y  W d    d S W d    d S 1 sw   Y  d S )NrĖ   TFrG  rk  rń  rĖ  ró  rš  rģ  )r   rr   rp   rs   rt   r   rŽ  r	   r”   r   rĢ  r   r¹   r=  r>  rĘ  r£   r  rĶ  r    r    r!   Śtest_pha_optional_nocertö  s.   
’


÷’"’z.TestPostHandshakeAuth.test_pha_optional_nocertc              
   C   sž   t  \}}}d|_tj|_| t” t|dd}|[ |jt	 	” |d9}| 
t|jf” |  tjd” | ”  W d    n1 sCw   Y  | d” |  d| d”” W d    n1 s`w   Y  W d    d S W d    d S 1 sxw   Y  d S )	NTFrG  rk  z
not serverrš  s   extension not receivedrĖ  )r   rŽ  r	   r¢   r   r   r   rĢ  r   r¹   r=  r>  rĘ  r“   r²   rł  rt   r{  r  rĶ  r    r    r!   Śtest_pha_no_pha_client  s(   

’
’
ś’"’z,TestPostHandshakeAuth.test_pha_no_pha_clientc              	   C   s   t  \}}}tj|_d|_| t” t|dd}|\ |jt	 	” |d:}| 
t|jf” | d” |  | d”d” | d” |  | d”d	” | d” |  | d”d” W d    n1 saw   Y  W d    d S W d    d S 1 syw   Y  d S )
NTFrG  rk  rń  rĖ  rņ  rš  rģ  )r   r	   r¢   r   rŽ  r   r   rĢ  r   r¹   r=  r>  rĘ  rt   r£   r  rĶ  r    r    r!   Śtest_pha_no_pha_server  s*   

’


÷’"’z,TestPostHandshakeAuth.test_pha_no_pha_serverc              	   C   sŅ   t  \}}}tj|_tjj|_d|_| t	” t
|dd}|@ |jt ” |d}| t|jf” | d” |  d| d”” W d    n1 sJw   Y  W d    d S W d    d S 1 sbw   Y  d S )NTFrG  rk  rš  s   WRONG_SSL_VERSIONrĖ  )r   r	   r¢   r   r
   r_   r\   rŽ  r   r   rĢ  r   r¹   r=  r>  rĘ  rt   r{  r  rĶ  r    r    r!   Śtest_pha_not_tls130  s$   


’
ū’"’z(TestPostHandshakeAuth.test_pha_not_tls13c              	   C   sH  t }t tj”}d|_| t” d|_tj|_	t tj
”}| t” | t” d|_tj|_	t|dd}|d |jt ” |dB}| t|jf” | d” |  | d”d” | d” |  | d”d	” | d” |  | d”d
” |  | ” i ” W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )NTFrG  rk  rń  rĖ  ró  rš  rģ  rņ  )r   r	   r`   rV   rŽ  r   r   r   r   r   rU   r   r   r¢   rĢ  r   r¹   r=  r>  rĘ  rt   r£   r  r  )r­   r   r   r   rÅ  r¼   r    r    r!   Śtest_bpo37428_pha_cert_noneA  s:   



’


ö’"’z1TestPostHandshakeAuth.test_bpo37428_pha_cert_nonec              	   C   sŹ  t dd\}}}t|dd}|Ė |jt ” |d©}| t|jf” |j ” }|  	t
|d” |\}}|j ” }	|  	t
|	d” |  	||	d ” |  	t|t|	d ” |  	t|t|	d ” |  ||” |  t|t|” |  t|t|” |  | ” | ” ” |  dt|” |  d	t|” | tj”}
| tj”}|  |
t” |  d
|
” |  |t” |  	t |
”|” W d    n1 sĘw   Y  W d    d S W d    d S 1 sŽw   Y  d S )NFr   rG  rk  r  rĆ   r   zCN=localhostzCN=our-ca-serverz-----BEGIN CERTIFICATE-----)r   rĢ  r   r¹   r=  r>  rĘ  r¹  rś  r£   rX   rü  Śhashry  r®  Zget_infor{  Zpublic_bytesr°   ZENCODING_PEMZENCODING_DERr  rR   r  r	   rō   )r­   r   r   r   rÅ  r¼   ZvcŚeeŚcaZuvcrų   rL  r    r    r!   Śtest_internal_chain_client`  sJ   ’ž


’å’"’z0TestPostHandshakeAuth.test_internal_chain_clientc              	   C   sš   t  \}}}| t” tj|_tjj|_t	|dd}|R |j
t ” |d0}| t|jf” | d” | d”}|  |d” | d” | d”}|  |d” W d    n1 sYw   Y  W d    d S W d    d S 1 sqw   Y  d S )NFrG  rk  s   VERIFIEDCHAIN
rĖ  s   
s   UNVERIFIEDCHAIN
)r   r   r   r	   r¢   r   r
   r_   r\   rĢ  r   r¹   r=  r>  rĘ  rt   r  r£   )r­   r   r   r   rÅ  r¼   Śresr    r    r!   Śtest_internal_chain_server  s,   

ž



ö’"’z0TestPostHandshakeAuth.test_internal_chain_serverN)rĻ  rŠ  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w   Y  d S r   )rD   rX   r  )r­   ZfnamerG   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 sew   Y  |  t” d|_W d    d S 1 s~w   Y  d S )NrĆ   )rE  r   rÖ  rÕ  r	   r`   rV   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}|) |jt ” |d}| 	t
|jf” W d    n1 s7w   Y  W d    n1 sFw   Y  |  |  ” d” d |_tj|_t|dd}|) |jt ” |d}| 	t
|jf” W d    n1 sw   Y  W d    n1 sw   Y  |  |  ” d” tj|_tj|_t|dd}|) |jt ” |d}| 	t
|jf” W d    n1 sČw   Y  W d    n1 s×w   Y  |  |  ” d” d |_d |_d S )NFrG  rk  r}  é   é   )rE  r   rÖ  rÕ  r   ró  rĢ  r   r¹   r=  r>  rĘ  r£   rõ  r  rĶ  r    r    r!   Śtest_keylog_filename¼  sT   
’ž’
’ž’
’ž’
z!TestSSLDebug.test_keylog_filenamez.test is not compatible with ignore_environmentc                 C   s°   |   tjtj” tjj tj	”> 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    d S 1 sQw   Y  d S )NZSSLKEYLOGFILE)rE  r   rÖ  rÕ  rc   Zmockr  Śdictr   Śenvironr£   r	   r`   rV   ró  rT  rV  rŽ  r    r    r!   Śtest_keylog_envą  s   "õzTestSSLDebug.test_keylog_envc                 C   sn   t  \}}}dd }|  |jd ” ||_|  |j|” |  t” t |_W d    d S 1 s0w   Y  d S )Nc                 S   rO   r   r    ©r  rį  r5   rā  rć  rÉ   r    r    r!   rä  ö  rP   z.TestSSLDebug.test_msg_callback.<locals>.msg_cb)r   r¾   rå  rĘ   rµ   r+  )r­   r   r   r   rä  r    r    r!   Śtest_msg_callbackó  s   
"’zTestSSLDebug.test_msg_callbackc              	      sŲ   t  \}}}tjj|_g   fdd}||_t|dd}|) |jt ” |d}| 	t
|jf” W d    n1 s<w   Y  W d    n1 sKw   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 )NrE   rt   )r  r	   rŗ   r  r{  r§  r  ©r’  r­   r    r!   rä    s   z4TestSSLDebug.test_msg_callback_tls12.<locals>.msg_cbFrG  rk  rE   rt   )r   r	   r
   r_   r\   rå  rĢ  r   r¹   r=  r>  rĘ  r{  r   Z	HANDSHAKEr   ZSERVER_KEY_EXCHANGEZCHANGE_CIPHER_SPEC)r­   r   r   r   rä  rÅ  r¼   r    r  r!   Śtest_msg_callback_tls12’  s6   

’ž’
’ż
’żz$TestSSLDebug.test_msg_callback_tls12c              	      s   t  \}}}t  d  dd } fdd}||_||_t|dd}|S |jt ” |d}| t|jf” W d    n1 s@w   Y  |jt ” |d}| t|jf” W d    n1 saw   Y  W d    d S W d    d S 1 syw   Y  d S )	NrĆ   c                 S   rO   r   r    r  r    r    r!   rä  "  rP   z@TestSSLDebug.test_msg_callback_deadlock_bpo43577.<locals>.msg_cbc                    s
    | _ d S r   rŹ  r?  ©Zserver_context2r    r!   Śsni_cb%  r  z@TestSSLDebug.test_msg_callback_deadlock_bpo43577.<locals>.sni_cbFrG  rk  )	r   rå  Zsni_callbackrĢ  r   r¹   r=  r>  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_keylogrc   rc  rd  rś  rż  rp   ŚflagsŚignore_environmentr   r  r  r  r    r    r    r!   rō    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_timeout5  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)r-  c                   sH   || _ d| _d | _d | _d | _|d u rtj| _n|| _t j	|d d S )NrĖ  r   )
Ścall_after_acceptŚreceived_dataŚ
wrap_errorrf  rĘ  r   r»  r-  Śsuperrą  )r­   r   r  r-  ©r)  r    r!   rą  ?  s   
z?TestPreHandshakeClose.SingleConnectionTestServerThread.__init__c                 C   s   |   ”  | S r   )r
  r¬   r    r    r!   r  K  s   z@TestPreHandshakeClose.SingleConnectionTestServerThread.__enter__c                 G   s:   z
| j r	| j  ”  W n	 ty   Y nw |  ”  d | _d S r   )rf  rF  r  r   r  r  r    r    r!   r  O  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 )Nrz  r<  rĆ   )r	   rT  rŖ  r¬  Śssl_ctxr¢   r   r   r  r   r  r¹   rf  r   rĀ  rĘ  r+  r-  r  r  r
  r¬   r  r    r!   r
  X  s   

z<TestPreHandshakeClose.SingleConnectionTestServerThread.startc                 C   s  z!z	| j  ” \}}W n ty   Y W | j  ”  d S w W | j  ”  n| j  ”  w |Y |  |”r9	 W d    d S z
| jj|dd}W n tyX } z	|| _W Y d }~nd }~ww z| 	d”| _
W n tyj   Y nw W d    d S W d    d S W d    d S 1 sw   Y  d S )NTr9  é  )rf  r4  r  rF  r  r  r   r  r  r  r  )r­   r  ŚaddressZ
tls_socketr!  r    r    r!   r  c  s:   ü’
ž’’üś	÷"õz:TestPreHandshakeClose.SingleConnectionTestServerThread.run)	rĻ  rŠ  rŃ  rą  r  r  r
  r  Ś__classcell__r    r    r  r!   Ś SingleConnectionTestServerThread=  s    	r  c                 C   st   t jdkrd S t|ts#t|tr|jtjks#t dt	|ddtj
”r8z|  dt j d|” W d }d S d }w d S )NŚlinuxzwrong.version.numberri  r  z!Could not recreate conditions on z: err=)rp   rÕ  rQ   rå  r  rA  ŚEINVALŚreŚsearchrS   ŚIrĄ  r   r    r    r!   Ś"non_linux_skip_if_other_okay_errory  s   

’’

’ńz8TestPreHandshakeClose.non_linux_skip_if_other_okay_errorc                    sN  t  ” t  ”   fdd}| j|dd}| ”  |  |j” t ” &}| |j 	” ” t
| | d”  ”  | d” | ”  W d    n1 sMw   Y    ”  | ”  |j}d |_zA|  d|j” |  |t” |  |” |  |tj” |  d|jd	 ” |  d|j” |  d
|jd
 ” | j|jdd W d }d }d S d }d }w )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    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 existr  )rŽ  r  r  r  rE  r  r¹   r=  rf  rq  r  rl  r  r!  rF  r  r   r  r£   r  r  r  r"  r	   r²   r{  rd   ri  r®  rw  rh  )r­   r  rÅ  r  r  r    r$  r!   Śtest_preauth_data_to_tls_server  sD   ž



ų

’z5TestPreHandshakeClose.test_preauth_data_to_tls_serverc           	         s  t  ” t  ”   fdd}| j|dd}| ”  |  |j” t|j t ” N}| 	|j 
” ”  ”    tj”sA|  d” t ” }z	|j|dd}W n tyd } z
|}d}W Y d }~nd }~ww d }| d	”}| ”  W d    n1 szw   Y  | ”  z@|  d|” |  |t” |  |” |  |tj” |  d
|jd ” |  d
|j” |  d|jd ” | j|j dd W d }d }d S d }d }w )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»  rž  r  r!  rF  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,   rk  rĖ  r  r&  rĆ   r   r'  r  )!rŽ  r  r  r  rE  r  r  rf  r¹   r=  rq  r  r  r   r»  rö   r	   rT  r   r  r  rF  r   r£   r  r"  r²   r{  rd   ri  r®  rw  rh  )	r­   r  rÅ  r  r  Z
tls_clientr!  r  r  r    r*  r!   Śtest_preauth_data_to_tls_clientæ  sX   ž



’ž
š
’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]w   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.rk  )Śhttpr  ZHTTPConnectionr=  r  r   r»  rr   rp   rs   rt   Z_contextr   r   rd  r¬   ©Zserver_respondingr    r!   r=  ’  s   ’zmTestPreHandshakeClose.test_https_client_non_tls_response_ignored.<locals>.SynchronizedHTTPSConnection.connectN)rĻ  rŠ  rŃ  r=  r    r-  r    r!   ŚSynchronizedHTTPSConnectionž  s    r.  c                    s&   t |  |  d” |  ”    ”  dS )Ns!   HTTP/1.0 402 Payment Required

T)r  r!  rF  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   r-  r   )rĘ  r   r-  ZHEADz/testZHostr,   )Zheaders)rŽ  r  r,  r  ZHTTPSConnectionr  r  rE  r  r  rf  rq  rĘ  r	   rT  rĘ   r  r|  Zgetresponser   )r­   r.  r  r-  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+  r1  r    r    r    r!   r  9  s    <-<r  c                  C   s  t jr[tjtjd} |  ” D ]\}}| }|r#|d r#d||f } nq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yZ   Y nw ttttttttttttfD ]}tj |”sxt  d	| ”qit  ” }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   rr   rÕ  Zmac_verZ	win32_verŚitemsry  rž  r	   r  r  r¤   ré  rŖ   rņ  rĶ   r  r  r  r  r  r   r   r   r  ŚBADKEYr  r   r   ŚexistsZ
TestFailedr   Zthreading_setuprc   ZaddModuleCleanupZthreading_cleanup)Zplatsr   rf   ZplatŚfilenameŚthread_infor    r    r!   ŚsetUpModule2  s@   ž
’’ü’r7  Ś__main__r   )rŹ  TFNN)Nr   r   )rp   rc   Zunittest.mockr×  r   Ztest.supportr   r   r   r   r   r  r¹   r  r  rx   ZdatetimerE  Zhttp.clientr,  r   rA  rŃ   Zurllib.requestr{  rŽ  rn   r  rÕ  Z	sysconfigrh   r  ŚImportErrorŚwarningsŚcatch_warningsŚsimplefilterr2  r  Śimport_moduler	   r°   r
   r   r   r   rJ   ZPy_DEBUGrd  rę  Z_PROTOCOL_NAMESrŲ  r>  r  r^   Zget_config_varr   r?  rĄ   ŚverrS   rņ  r"   rĶ   Śfsencoder  r  r  r  r  r  r  r  r  r  r)  ró   rĪ   rK  r   r   rĻ   r   r   rQ  rP  r   rš   rY  r   r   rÓ  r  r  r?  r3  rŠ   ré   rŲ   r0  r1  r>   r?   r@   rA   rB   rH   rN   rZ   Ś	lru_cacherW   rl   rv   r~   Zignore_warningsrŅ  r   r   r   ZTestCaser    rÖ  re  rr  r  r  Zrequires_resourcerŠ  r„  r²  Ztest.ssl_serversrŁ  rß  rĢ  r  r>  rD  rE  rÓ  rŻ  r`   Z
HAS_KEYLOGr  rō  r  r  r7  rĻ  Śmainr    r    r    r!   Ś<module>   s  ’

ž





’






óń

	
	
(’ž      3     C6?0  t
  #v
ž1
’N           }  ’  z
#’