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 dmlm‚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¡ZG d€d„ dejvƒZŽd‚dƒ„ ZG d„d…„ d…ejvƒZd†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   s0   | D ]}t |dƒr|jtjjkr| d¡ qdS )z@"Lower security level to '1' and allow all ciphers for TLS 1.0/1Úminimum_versionz@SECLEVEL=1:ALLN)Ú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   sT   t | tƒrtt| dƒ} | du rdS | tjtjtjhv rdS | j}t|t	dƒd… ƒS )z€Check if a TLS protocol is available and enabled

    :param protocol: enum ssl._SSLMethod member or name
    :return: bool
    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ƒrR|jtjjkrR| |jkrRdS dS )z{Check if a TLS/SSL version is enabled

    :param version: TLS version name or ssl.TLSVersion member
    :return: bool
    Ú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 )z•Decorator to skip tests when a required TLS version is not available

    :param version: TLS version name or ssl.TLSVersion member
    :return:
    c                    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   sv   | t krt}n| tkrt}n| tkrt}nt| ƒ‚t tj	¡}| 
t¡ t tj¡}| | ¡ |r6| 
t¡ |||fS )zUCreate context

    client_context, server_context, hostname = testing_context()
    )Ú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   sn   t j t j t¡pt j|¡}t ¡ }|  |j¡ |  	t
j¡ t||d W d  ƒ dS 1 s0w   Y  dS )z;Check that trying to use the given client certificate failsr;  N)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 )z Wrapping with an empty cert filer;   N©rH  r¬   r    r    r!   Útest_empty_cert¬  ó   z BasicSocketTests.test_empty_certc                 C   rI  )z:Wrapping with a badly formatted certificate (syntax error)r<   NrJ  r¬   r    r    r!   Útest_malformed_cert°  rL  z$BasicSocketTests.test_malformed_certc                 C   rI  )z2Wrapping with a badly formatted key (syntax error)r=   NrJ  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ECDHE-ECDSA-AES128-GCM-SHA256zECDHE-ECDSA-AES256-GCM-SHA384zECDHE-RSA-AES256-GCM-SHA384zDHE-RSA-AES256-GCM-SHA384zECDHE-RSA-AES128-GCM-SHA256zDHE-RSA-AES128-GCM-SHA256zAES256-GCM-SHA384z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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d0S )1ÚSimpleBackgroundTestsz?Tests that connect to a simple server running in the backgroundc                 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Ñ  Ú__doc__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Zdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )z$ThreadedEchoServer.ConnectionHandlerzºA mildly complicated class, because we want it to work both
        with and without the SSL wrapper around the socket connection, so
        that we can test the STARTTLS functionality.c                 C   s@   || _ d| _|| _|| _| j d¡ d | _tj | ¡ d| _	d S ©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pd}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á  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rz*| 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rt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}
|r7tj	r7t
j d| ¡ |	 |
¡ |	 ¡ }|rMtj	rMt
j d| ¡ || ¡ krkt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 )zW
    Launch a server, connect a client to it and try various reads
    and writes.
    F©r‘   rê  rù  )r†   Úsessionú client:  sending %r...
ú client:  read %r
ú4bad data <<%r>> (%d) received; expected <<%r>> (%d)
Né   ó   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’  r4  rÅ  r  rå  r5   r7  r-  rF  rä  rÆ  )r   rž   Úindatarê  rù  Úsni_namer-  rQ  rÅ  r¼   ÚargÚoutdatar    r    r!   Úserver_params_test  sh   þ
ÿÿ
ÿÿÿÿ
ù
	á
 
Þ#Ý#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 sUw   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 )a<  
    Try to SSL-connect using *client_protocol* to *server_protocol*.
    If *expect_success* is true, assert that the connection succeeds,
    if it's false, assert that the connection fails.
    Also, if *expect_success* is a string, assert that it is the protocol
    version actually used by the connection.
    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  Ú
ECONNRESETr:  )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†   	ýüþÿ


ûý


ÿ



ÿÿÿ€ÿÿÿÿ

ÿþrE  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 sXw   Y  |  dt|jƒ¡ W d  ƒ n1 spw   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 )	z2Basic test of an SSL client connecting to a serverrË   )r†  rÅ  T)r   rž   rê  rù  r<  NFz@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–  s`   ýÿýÿþúþÿþû
þÿþ"û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   TrH  rk  rI  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 sw   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Ë   TrH  rk  rI  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 )NFTrH  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:!aRSATrH  rk  rI  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 sw   Y  d S rO  )r	   r`   rV   rŒ   r›   r
   r_   r\   rK   rQ  rU   r   rR  r•   rÌ  rŽ   r¹   r=  r>  rÆ  r  r	  rÅ  rS  rT  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)rW  rW  )s   xn--knig-5qa.idn.pythontest.netrW  )u(   kÃ¶nigsgÃ¤ÃŸchen.idna2003.pythontest.netú.xn--knigsgsschen-lcb0w.idna2003.pythontest.net)rX  rX  )s.   xn--knigsgsschen-lcb0w.idna2003.pythontest.netrX  )ú.xn--knigsgchen-b4a3dun.idna2008.pythontest.netrY  )s.   xn--knigsgchen-b4a3dun.idna2008.pythontest.netrY  rH  rk  rI  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   sD  t ƒ \}}}| t¡ tj|_tjj|_t	|ddd}|{ |j
t ¡ |dY}z
| t|jf¡ W nA tjyP } ztjrFtj d| ¡ W Y d}~n-d}~w tys } z|jtjkr^‚ tjrit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 )zÇConnecting when the server rejects the client's certificate

        Launch a server with CERT_REQUIRED, and check that trying to
        connect to it with a wrong client certificate fails.
        Tr,  rk  ú
SSLError is %r
Nú
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  rA  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 sw   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  rA  rö   r_  r    r    r!   Útest_wrong_cert_tls13Ó  sF   


ÿ
þÿ


€€ü
€Pìz#ThreadedTests.test_wrong_cert_tls13c                    sz   t  ¡ ‰t  ¡ ‰ t ¡ ‰t ˆt¡‰‡ ‡‡fdd„}‡ ‡‡‡fdd„}t j|d}| ¡  z
|ƒ  W | ¡  dS | ¡  w )ztA brutal shutdown of an SSL server should raise an OSError
        in the client when attempting handshake.
        c                     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©  )re  rf  rÆ  r­   r    r!   Ú	connector  s   
ÿø"úz3ThreadedTests.test_rude_shutdown.<locals>.connector©ÚtargetN)	rß  r  r¹   r   rÂ  r>  rà  r  r   )r­   rg  rh  r  r    )re  rf  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Ë   TrH  rk  z&unable to get local issuer certificater1  r‘  )r   rr   rp   rs   rt   r	   r`   rU   r   r•   rV   rÌ  rŽ   r¹   rˆ   r=  r>  rÆ  r²   r  rN  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ƒr9t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 )z9Connecting to an SSLv2 server with various client optionsrË   TFr   ©rD  N)r   rr   rp   rs   rt   rE  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ƒr7z
ttjtj	dƒ W n t
y6 } zt jr,tj dt|ƒ ¡ W Y d}~nd}~ww tdƒrCttjtjdƒ ttjtjdƒ tdƒrWttjtjdƒ tdƒret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 )
z:Connecting to an SSLv23 server with various client optionsrË   r[   Tz; SSL2 client to SSL23 server test unexpectedly failed:
 %s
Nr   Fr   )rC  )r   rr   rp   rs   rt   rW   rE  r	   rT   rn  r  rR   ro  r   r¡   r¢   r§   r¦   r¨   )r­   rÙ  r    r    r!   Útest_PROTOCOL_TLSG  sR   ÿÿ€ýÿ
ÿ
ÿÿ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ƒr1ttjtjdƒ ttjtjdtjd ttjtjdƒ dS )z9Connecting to an SSLv3 server with various client optionsrË   r   r[   Frm  N)r   rr   rp   rs   rt   rE  r	   ro  r¡   r¢   rW   rn  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ƒr1t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 )z8Connecting to a TLSv1 server with various client optionsrË   r   r[   Fr   rm  N)r   rr   rp   rs   rt   rE  r	   r   r¡   r¢   rW   rn  ro  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 )zjConnecting to a TLSv1.1 server with various client options.
           Testing against older TLS versions.rË   úTLSv1.1r[   Fr   rm  N)r   rr   rp   rs   rt   rE  r	   r   rW   rn  ro  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ƒr4t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ƒrsttjtjdƒ ttjtjdƒ dS dS )	zjConnecting to a TLSv1.2 server with various client options.
           Testing against older TLS versions.rË   úTLSv1.2)rC  rD  r[   Fr   rm  N)r   rr   rp   rs   rt   rE  r	   r0  r§   r¦   rW   rn  ro  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r8t	j
 d| ¡ |rD| |¡ | ¡ }n
| |¡ | d¡}| ¡  ¡ }|dkro| d	¡rotjrht	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 )z6Switching from clear text to encrypted and back again.)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
r3  r2  N)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¸  st   ý
ÿ



ÿÿÿÿÿ€


Ò,"Ô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
¡}|rkt|ƒdkrk| 	t|ƒ¡}tjrktj dt|ƒ|f ¡ W | ¡  n| ¡  w |  ||¡ dS )z8Using socketserver to create and manage SSL connections.r;  rË   ÚrbNr  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   rS  r	   rT  r›   ÚurllibÚrequestÚurlopenÚinfor‡   r  rX   rF  r£   )r­   rÅ  rG   rù   rú   Úurlr‘   Zdlenr    r    r!   Útest_socketserverñ  s2   
ÿÿ
ÿÿ€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rltj d
¡ | ¡  t jrtj d¡ W d  ƒ dS W d  ƒ dS 1 sŒw   Y  dS )z'Check the example asyncore integration.rË   rÊ  rï   r.  r/  r0  Nr1  r2  r3  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  s@   ÿ
ÿÿÿ
ì"íz"ThreadedTests.test_asyncore_serverc                    sÊ  t jr	tj d¡ tttjtj	tddd}|Â t
t ¡ dtttj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 qp tyè } z"|	rÍ|  dj|d¡ t|ƒ |¡sÞ|  dj||d¡ W Y d}~qpd}~ww |D ]m\}}}	}
||  d¡}z+ˆ  |¡ ||
Ž }|| ¡ kr"|  d j||dd… t|ƒ|dd… t|ƒd¡ W që tyX } z(|	r8|  d!j|d¡ t|ƒ |¡sJ|  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 )&z Test recv(), send() and friends.rË   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})
Nr1  )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.
rc  rœ  r  r2  ))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_methrB  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)rb  rc  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>.serveri  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>.serveri  rk  rc  )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 sGw   Y  |  |jd¡ |  | ¡ d¡ W d  ƒ dS 1 sfw   Y  dS )zt
        Basic tests for SSLSocket.version().
        More tests are done in the test_protocol_*() methods.
        F)r  rê  Nú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_AES_128_GCM_SHA256ZTLS_AES_256_GCM_SHA384ZTLS_CHACHA20_POLY1305_SHA256r¥  )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  rv  )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  rt  )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rP|  t|ƒd	¡ n|  t|ƒd
¡ | d¡ | ¡  ¡ }|  |t|ƒ d¡¡ W d  ƒ n1 sxw   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 )z Test tls-unique channel binding.rË   TFr,  rk  ru  z! got channel binding data: {0!r}
r¥  é0   é   s   CB tls-unique
rï  Nz(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  Ï  sp   þþ
ÿ

ÿìþ
ÿÿ

ÿíç"ç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}
r4  >   NZZLIBZRLE)	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°  r4  )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   rP  ZADHZEDHZDHEzNon-DH cipher: )rŸ   r	   r
   r_   r\   r/  r0  rK   r?  rS  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°  r6  )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°  r6  )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 %%sr6  r†  r8  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 )Nr5  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<  r9  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 )NFrH  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ÚwbFrH  rk  rz  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   r7  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 sw   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 )NFrH  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-  r7  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Ñ  rG  rK  rM  rX  rc   rÓ  r	   rñ  ró  rU  rV  r[  r`  rl   rd  rk  rl  rp  rq  rr  rs  ru  rw  ry  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!   rF  ”  s¨    ,$(!ÿ
8%
!)
*



9 	1(

ÿ
:	ÿ

	
	"	(9rF  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 sw   Y  d S )NTFrH  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_cbrH  Fra  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Ë   TFrH  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Ë   TFrH  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 )	NTFrH  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 )
NTFrH  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 )NTFrH  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 sw   Y  d S )NTFrH  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“   rH  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 )NFrH  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 )NFrH  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_cbFrH  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_cbFrH  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                   @   sB   e Zd ZdZG dd„ dejƒZdd„ Zdd„ Zdd	„ Z	d
d„ Z
dS )ÚTestPreHandshakeClosezQVerify behavior of close sockets with received data before to the handshake.
    c                       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_errorrg  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   )rg  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 )Nr{  r<  rÃ   )r	   rT  rª  r¬  Ússl_ctxr¢   r‹   rŒ   r  r   r  r¹   rg  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  é  )rg  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=  rg  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  rg  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  rg  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)  r,  r2  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@   þ€
ÿÿüÿr8  Ú__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Î   rL  r•   rˆ   rÏ   r–   r—   rR  rQ  r›   rð   rZ  r˜   r™   rÔ  r  r  r?  r4  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?  rE  rF  rÓ  rÞ  r`   Z
HAS_KEYLOGr	  rõ  r  r  r8  rÏ  Úmainr    r    r    r!   Ú<module>   s†  ÿ

þ





ÿ






óñ

	
	
(ÿþ      3     C6?0  t
  #v
þ1
ÿN           }  ÿ  z
#ÿ