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   sb   t | tƒr|  d¡sJ ‚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
    Z	PROTOCOL_NFT)Ú
isinstanceÚstrÚ
startswithÚgetattrr	   ÚPROTOCOL_TLSÚPROTOCOL_TLS_SERVERÚPROTOCOL_TLS_CLIENTr   Úhas_tls_versionÚlen)Úprotocolr   r    r    r!   Úhas_tls_protocol»   s   
þr[   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__rT   r   ÚIS_OPENSSL_3_0_0ÚTLSv1_2Ú
SSLContextrW   rJ   rI   ÚMINIMUM_SUPPORTEDr]   ÚMAXIMUM_SUPPORTED)r5   rM   r    r    r!   rX   Ð   s(   
ÿ
ÿ
rX   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.)rX   ÚunittestZSkipTest)ÚargsÚkw)Úfuncr5   r    r!   Úwrapper   s   z8requires_tls_version.<locals>.decorator.<locals>.wrapper)Ú	functoolsÚwraps)rg   rh   ©r5   )rg   r!   Ú	decoratorÿ   s   z'requires_tls_version.<locals>.decoratorr    )r5   rl   r    rk   r!   Úrequires_tls_versionù   s   rm   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   ÿrw   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	   ra   rW   rV   Ú	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	   ra   rW   r   Ú
SIGNING_CArV   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_2rU   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	   rW   r¤   rR   ra   ÚassertIsrZ   ©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   rs   rq   rt   ru   r   Úcheck_warningsZRAND_pseudo_bytesr¤   rY   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   rs   rq   rt   ru   Ú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   rs   rq   rt   ru   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   rs   rq   rt   ru   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¤   rS   Z
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Ú
assertTruerS   Ú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)rZ   zssl.z is deprecatedrk   )r	   r©   r«   r¬   rª   r   r   ÚPROTOCOL_TLSv1_2rU   r
   r   r   r   r´   ra   rW   ÚassertWarnsÚDeprecationWarningÚoptionsr¤   rR   Úwarningr[   r   rX   rI   )	r®   r3  Ú	protocolsZversionsr/  rM   ÚcmrZ   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	   ra   rV   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 rx   )r“   rº   r  Úreprr1  r  r   Ú
gc_collectÚassertInrR   r4  re   )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¤   rY   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¤   rY   Ú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¤   rY   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@  ra   rW   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   )ry   Ú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  rd   Ú
skipUnlessr	   ÚCHANNEL_BINDING_TYPESrx  r|  r…  rq   Ú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œ  é*   )Ú	PROTOCOLSr[   r   rÆ   r	   ra   r¤   rZ   rU   rÇ   r›   )r®   rZ   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	   ra   rW   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	   ra   rW   Úget_ciphersZassertNotIn)r®   rM   rƒ   Zsuiter   r    r    r!   Útest_python_ciphers  s   úz ContextTests.test_python_ciphersc              	   C   sh   t  t j¡}| d¡ tdd„ | ¡ D ƒƒ}h d£}| |¡}|  t|ƒddt	|ƒ› dt	|ƒ› ¡ d S )NZAESGCMc                 s   s    | ]}|d  V  qdS )r   Nr    )Ú.0r   r    r    r!   Ú	<genexpr>  ó   € z0ContextTests.test_get_ciphers.<locals>.<genexpr>>   zDHE-RSA-AES128-GCM-SHA256zECDHE-ECDSA-AES256-GCM-SHA384zAES256-GCM-SHA384zECDHE-RSA-AES256-GCM-SHA384zDHE-RSA-AES256-GCM-SHA384zECDHE-ECDSA-AES128-GCM-SHA256zAES128-GCM-SHA256zECDHE-RSA-AES128-GCM-SHA256r˜  z
got: z
expected: )
r	   ra   rW   rK   r  rà  Úintersectionr  rY   Ú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 rx   )r	   ra   rW   Ú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	   ra   rU   r¤   rŒ   rŠ   r¢   r£   rÇ   r¶   r›   rV   ÚassertFalser‹   rW   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	   ra   rW   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	   ra   rV   r
   rb   r   r`   rc   ÚTLSv1_3r{  rI   r]   r   r¤   r   rÇ   r›   r[   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	   ra   rW   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	   ra   rV   rT   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	   ra   rV   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	   ra   rV   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_NEURONIOra   rW   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	   ra   rV   Ú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	   rW   rV   ra   r¤   Úsession_statsrÀ   r    r    r!   Útest_session_stats  s    


õþzContextTests.test_session_statsc                 C   s   t  t j¡}| ¡  d S r   )r	   ra   rW   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	   ra   rV   Ú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	   ra   rV   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	   ra   rV   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	   ra   rW   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	   ra   rW   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	   ra   rW   Ú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	   ra   rW   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	   ra   rW   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 rx   )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¤   rZ   rW   rŒ   r£   r	  r‹   rS  rD   rœ   rE   r  rª  r¬  rV   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¤   rZ   rW   rŒ   rŠ   rí  r‹   rS  r[   r   r   rÆ   r0  r£   r	  rª  r¬  rV   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	   ra   rU   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	   ra   rW   r	  r‹   r¤   rŒ   r£   rV   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»   Ú	SSLObjectra   rV   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	   ra   rV   r¤   Znum_ticketsrÇ   r›   r¶   rW   rÞ  r    r    r!   Útest_num_tickest$  s"   ÿÿ"ÿzContextTests.test_num_tickestN).rÏ  rÐ  rÑ  rÙ  rß  rd   rÓ  r   rá  rè  rë  rî  ró  rÒ  rõ  rJ   r	   ra   r÷  rý  r  r!  r,  ÚskipIfÚPy_DEBUG_WIN32r2  r8  r9  r¦   r>  rC  rG  rJ  rM  rO  rq   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	   ra   rW   rÇ   r³   r/  rÎ   r¤   r@  ÚlibraryÚreasonrR   r	  rS   )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	   ra   rW   r‹   rŠ   rŒ   rº   rp  Úcreate_connectionrq  Úsetblockingr   rÇ   ÚSSLWantReadErrorÚdo_handshakerR   r@  r	  rS   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  rd   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²   ru   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   ru   Ú	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¤   Úpendingru   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²   ru   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¶   ru   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}  ru   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	   ra   rV   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	   ra   rW   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	   ra   rW   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	   ra   rW   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õ   ra   rW   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 rx   )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   rs   rq   rt   ru   )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   rs   rq   rt   ru   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çš™™™™™É?)ry   Ú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	   ra   rW   r   r  r¤   rK  r   rº   r  r=  rŠ  r  r	  rY   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	   ra   rW   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_TIMEOUTry   Ú	monotonicrö   r	   r³   rA  ro  ZSSL_ERROR_WANT_WRITErE   Úsendallr  ru   r{  rs   rq   rt   rÏ  )r®   r   ÚincomingÚoutgoingrg   re   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²   ra   rW   r	  r‹   r¤   rŒ   r£   r   rœ   r`  r‰   r¿   r¹  Úownerrw  Úcipherr5   Úshared_ciphersrÇ   r›   r  rÔ  rr  rÃ  rn  ÚassertIsNotNonerƒ  ZSSLSyscallErrorr³   ru   )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²   ra   rW   r‹   rŠ   rŒ   r`  rÃ  rn  ru   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œ  rd   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Ö  rd   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   rs   rq   rt   ru   )Ú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   rs   rq   rt   ru   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   Úchattyrw   ry  rÝ  rÜ  rF  r	   r³   r  rA  Z
EPROTOTYPErq   rÕ  rÆ  rŒ   r£   r  r   rs   rt   ru   rÒ   rÓ   rY   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Þ  ru   r   r!  )r®   r  r    r    r!   ru   Ô	  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   rs   Úconnectionchattyrq   rt   ru   rr  ry  rf  Úverify_client_post_handshaker	   r³   r  r¹  Úget_verified_chainrY   Úto_bytesÚget_unverified_chainr¿  rê  rQ   ÚConnectionErrorÚprintrÝ  rw   )r®   ÚmsgÚstrippedrÊ   rf  rQ  ZcertsZctyper    r    r!   Úrunà	  s¼   ü
ÿ
€
$€ÿ




ÿÿ€
ÿÿ€ï·z(ThreadedEchoServer.ConnectionHandler.runN)
rÏ  rÐ  rÑ  rÏ  rá  rë  rE   ru   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	   ra   rV   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$   | j sJ ‚d| _ |  ¡  |  ¡  d S ©NF)r  Ústopr   ©r®   re   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   rs   rê  rq   rt   ru   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  re   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   rs   rq   rt   ru   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   rs   rq   rt   ru   rº   r­   r    r    r!   r   Ñ
  s   ÿz<AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_closec                  C   ó   ‚ r   r    r­   r    r    r!   rw   Ö
  ó   z<AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_errorN)	rÏ  rÐ  rÑ  rá  r  r  r#  r   rw   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   rs   rq   rt   ru   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!   rw   å
  r%  z*AsyncoreEchoServer.EchoServer.handle_errorN)	rÏ  rÐ  rÑ  r  r  r  rá  r(  rw   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   rs   rq   rt   ru   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   rs   rq   rt   ru   rE   r¿  ÚAssertionErrorrY   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   rs   rq   rt   ru   Zget_protocol_namer   rÆ   ra   r3  ÚPROTOCOL_TO_TLS_VERSIONrˆ   rJ   rU   rI   rZ   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   rs   rq   rt   ru   r    r´   r	   rW   rV   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   rs   rq   rt   ru   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   rs   rq   rt   ru   r    rT   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   rs   rq   rt   ru   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   sV  t ƒ \}}}|jsJ ‚d|_t|dd}|) |jt ¡ |d}| t|jf¡ W d   ƒ n1 s3w   Y  W d   ƒ n1 sBw   Y  t tƒ\}}}d|_t|dd}|H |jt ¡ |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 )NFTrH  rk  )r    rð  rÌ  r   rº   r=  r>  rÆ  r™   rÇ   r	   ÚSSLCertVerificationErrorrÍ  r    r    r!   ró  /  s:   

ÿþ€ÿ
ÿÿ€þÿ"ÿ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	   ra   rW   r   rœ   rK   ÚSIGNED_CERTFILE_ECC_HOSTNAMErV   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	   ra   rW   r   rœ   r
   r`   r]   rK   rQ  rV   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   rs   rq   rt   ru   r	   ra   rV   rŽ   ÚIDNSANSFILErW   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   rs   rq   rt   ru   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Æ  ru   rE   r³   r   rs   rq   rt   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   rs   rq   rt   ru   r	   ra   rV   rŽ   r–   rW   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   rs   rq   rt   ru   rE  r	   ÚPROTOCOL_SSLv2r¢   r£   rU   rX   Ú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   rs   rq   rt   ru   rX   rE  r	   rU   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   rs   rq   rt   ru   rE  r	   ro  r¢   r£   rX   rn  rU   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   rs   rq   rt   ru   rE  r	   r   r¢   r£   rX   rn  ro  rU   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   rs   rq   rt   ru   rE  r	   r   rX   rn  ro  rU   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   rs   rq   rt   ru   rE  r	   r0  r¨   r§   rX   rn  ro  rU   r¬   r[   r   r   r­   r    r    r!   Útest_protocol_tlsv1_2   s*   

þÿ

þz#ThreadedTests.test_protocol_tlsv1_2c           	      C   s¢  d}t tdddd}d}|¹ 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   rs   rq   rt   ru   rE   r!  r  rø  r¿  rS   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   rs   rq   rt   ru   rD   rÎ   rE   rÆ  r   r   rS  r	   rT  rœ   ÚurllibÚrequestÚurlopenÚinforˆ   r  rY   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   rs   rq   rt   ru   r  rÎ   r“   rº   r=  rÆ  rE   r¿  rö   rY   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  s    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   rs   rq   rt   ru   rÌ  rÎ   r	   rŠ   rV   r“   rº   r=  r>  rÆ  r!  rY   r"  r½  r  r  rf  Úformatr¤   rE   r¿  rö   r›   rR   rS   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  re   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Š   rV   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	   ra   rW   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	   ra   rW   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	   ra   rW   r‹   rŠ   rŒ   rÌ  rÎ   rV   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_256_GCM_SHA384ZTLS_AES_128_GCM_SHA256Z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   rs   rq   rt   ru   r    rÌ  r   rº   r=  r>  rÆ  rr  r  rÇ  r5   r¤   rY   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   rs   rq   rt   ru   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¤   rY   )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   s   t jrJ ‚d S r   )r	   ZHAS_NPNr­   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	   ra   rV   rŽ   r–   r—   rW   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?  ÚassertGreaterrY   Ú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   ru   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   ÚTESTFNru   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Ï  ry   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  rd   rÓ  r	   rñ  ró  rU  rV  r[  r`  rm   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	   rV   rW   ra   r¤   Úpost_handshake_authr£   rŒ   r¢   )r®   r5  rZ   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Æ  ru   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   rs   r   ZALERTrq   rt   ru   )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Æ  ru   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   rs   rq   rt   ru   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   rs   rq   rt   ru   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ú  ru   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Æ  ru   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Æ  ru   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	   ra   rW   rÞ  rŽ   r–   r‹   rŠ   rŒ   rV   r   rœ   r£   rÌ  r   rº   r=  r>  rÆ  ru   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¤   rY   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Æ  ru   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   rY   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	   ra   rW   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Õ  rd   Zmockr  Údictr   Úenvironr¤   r	   ra   rW   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   ru   )r  r	   r»   r  r{  r§  r  ©r   r®   r    r!   rä    s   z4TestSSLDebug.test_msg_callback_tls12.<locals>.msg_cbFrH  rk  rE   ru   )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_keylogrd   rc  rd  rú  rý  rq   Ú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=)rq   rÕ  rQ   ræ  r  rA  ÚEINVALÚreÚsearchrT   Ú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{  re   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{  re   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»  rs   rq   rt   ru   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+  r1  r    r    r    r!   r  9  s    <-<r  c                  C   s  t jr[tjtjdœ} |  ¡ D ]\}}|ƒ }|r#|d r#d||f } nqtt ¡ ƒ}tdtj	tj
f ƒ td| ƒ tdtj ƒ tdtj ƒ z	tdtj ƒ W n	 tyZ   Y nw ttttttttttttfD ]}tj |¡sxt  d	| ¡‚qit  ¡ }t!j"tj#g|¢R Ž  d S )
N)ZMacZWindowsr   z%s %rztest_ssl: testing with %r %rz          under %sz          HAS_SNI = %rz          OP_ALL = 0x%8xz          OP_NO_TLSv1_1 = 0x%8xzCan't read certificate file %r)$r   rs   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_setuprd   ZaddModuleCleanupZthreading_cleanup)Zplatsr   rg   ZplatÚfilenameÚthread_infor    r    r!   ÚsetUpModule2  s@   þ€
ÿÿüÿr7  Ú__main__r   )rÊ  TFNN)Nr   r   )”rq   rd   Zunittest.mockrØ  r   Ztest.supportr   r   r   r   r   r  rº   r”  r  ry   ZdatetimerE  Zhttp.clientr,  r   rA  rÒ   Zurllib.requestr|  rß  ro   r  rÕ  Z	sysconfigri   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Á   ÚverrT   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?  r3  rÑ   rê   rÙ   r0  r1  r>   r?   r@   rA   rB   rH   rN   r[   Ú	lru_cacherX   rm   rw   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Ý  ra   Z
HAS_KEYLOGr  rô  r  r  r7  rÏ  Úmainr    r    r    r!   Ú<module>   s†  ÿ

þ





ÿ






óñ

	
	
(ÿþ      3     C6?0  t
  #v
þ1
ÿN           }  ÿ  z
#ÿ