a
    ¼3jÆ. ã                   @   sl  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Zd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZzd dlZW n eyÒ   dZY n0 e d¡Zd dlmZmZmZ ee dƒZ e o
e jdkZ!e"ej#ƒZ$ej%Z%ej& 'd¡Z(e( o8ej)d	kZ*e( oJej)d
kZ+e( o\ej)dkZ,e -d¡Z.i Z/dD ]H\Z0Z1ze2ee0ƒZ0e2eje1ƒZ1W n e3y¬   Y qpY n0 e1e/e0< qpdd„ Z4e4dƒZ5e 6e5¡Z7e4dƒZ8e4dƒZ9e 6e8¡Z:e 6e9¡Z;e4dƒZ<e4dƒZ=dZ>e4dƒZ?e 6e?¡Z@e4ddƒZAe4ddƒZBddddddddœZCe4d ƒZDe4d!ƒZEd"ZFd#d$d%d&d'd(d)dddd*œ
ZGe4d+ƒZHd,ZIe4d-ƒZJd.ZKe4dd/ƒZLe4d0ƒZMe4d1ƒZNe4d2ƒZOd"ZPd3ZQe4d4ƒZRe4d5ƒZSe4d6ƒZTe4d7ƒZUe4d8ƒZVe4d9ƒZWe4d:ƒZXe4d;ƒZYe 6eY¡ZZe2ed<d ƒZ[e2ed=d ƒZ\e2ed>d ƒZ]e2ed?d ƒZ^e2ed@d ƒZ_e2edAd ƒZ`dBdC„ Zaeaƒ rbdDdE„ ZbndFdE„ ZbdGdH„ ZcejddIdJ„ ƒZedKdL„ Zfe geejhdMƒdN¡ZidOdP„ ZjdQdR„ ZkdSdT„ ZldUdV„ ZmdWdX„ Znenƒ ZodYdZ„ Zpd[d\„ Zqe gejrd]¡Zsejtfejuddddd^œd_d`„ZveEfdadb„ZwG dcdd„ ddejxƒZyG dedf„ dfejxƒZzG dgdh„ dhejxƒZ{G didj„ djejxƒZ|G dkdl„ dlejxƒZ}G dmdn„ dnejxƒZ~e do¡G dpdq„ dqejxƒƒZ€ddrds„Zdtdu„ Z‚d dvlƒm„Z„ G dwdx„ dxej…ƒZ†G dydz„ dzej…ƒZ‡dd~d„Zˆd‘d€d„Z‰G d‚dƒ„ dƒejxƒZŠe geed„ƒd…¡G d†d‡„ d‡ejxƒƒZ‹eejhdˆƒZŒe geŒd‰¡ZG dŠd‹„ d‹ejxƒZŽdŒd„ ZedŽkrhe ‘¡  dS )’é    N)Úsupport)Úsocket_helperÚssl)Ú
TLSVersionÚ_TLSContentTypeÚ_TLSMessageTypeÚgettotalrefcountÚwin32ZLibreSSL)é   r
   r   )r
   r
   r
   )é   r   r   ÚPY_SSL_DEFAULT_CIPHERS))ÚPROTOCOL_SSLv23ÚSSLv3)ÚPROTOCOL_TLSv1ÚTLSv1)ÚPROTOCOL_TLSv1_1ÚTLSv1_1c                  G   s   t jjt j t¡g| ¢R Ž S ©N)ÚosÚpathÚjoinÚdirnameÚ__file__©Úname© r   úI/www/server/python_manager/versions/3.9.10/lib/python3.9/test/test_ssl.pyÚ	data_file9   s    r   zkeycert.pemzssl_cert.pemzssl_key.pemzkeycert.passwd.pemzssl_key.passwd.pemZsomepassÚcapathz
4e1295a3.0z
5ed36f99.0)©)ÚcountryNameZXY©)ÚlocalityNamezCastle Anthrax©)ÚorganizationNamezPython Software Foundation))Ú
commonNameÚ	localhostzAug 26 14:23:15 2028 GMTzAug 29 14:23:15 2018 GMTZ98A7CF88C74A32ED))ÚDNSr&   r   ©ÚissuerÚnotAfterÚ	notBeforeÚserialNumberÚsubjectÚsubjectAltNameÚversionzrevocation.crlzkeycert3.pemr&   )z)http://testca.pythontest.net/testca/ocsp/)z0http://testca.pythontest.net/testca/pycacert.cer)z2http://testca.pythontest.net/testca/revocation.crl)r   ))r$   úPython Software Foundation CA))r%   zour-ca-serverzOct 28 14:23:16 2037 GMTzAug 29 14:23:16 2018 GMTZCB2D80995A69525C)
ÚOCSPÚ	caIssuersÚcrlDistributionPointsr)   r*   r+   r,   r-   r.   r/   zkeycert4.pemÚfakehostnamezkeycertecc.pemzlocalhost-eccz
ceff1710.0zallsans.pemzidnsans.pemz	nosan.pemzself-signed.pythontest.netúnullcert.pemúbadcert.pemzXXXnonexisting.pemú
badkey.pemz	nokia.pemznullbytecert.pemztalos-2019-0758.pemzffdh3072.pemÚOP_NO_COMPRESSIONÚOP_SINGLE_DH_USEÚOP_SINGLE_ECDH_USEÚOP_CIPHER_SERVER_PREFERENCEÚOP_ENABLE_MIDDLEBOX_COMPATÚOP_IGNORE_UNEXPECTED_EOFc                  C   sX   z>t ddd} d|  ¡ v W  d   ƒ W S 1 s20    Y  W n tyR   Y dS 0 d S )Nz/etc/os-releasezutf-8)ÚencodingZubuntuF)ÚopenÚreadÚFileNotFoundError)Úfr   r   r   Ú	is_ubuntuœ   s
    0rC   c                  G   s0   | D ]&}t |dƒr|jtjjkr| d¡ qd S )NÚminimum_versionz@SECLEVEL=1:ALL)ÚhasattrrD   r   r   r   Úset_ciphers)ÚctxsÚctxr   r   r   Úseclevel_workaround¦   s    ÿþrI   c                  G   s   d S r   r   )rG   r   r   r   rI   ¯   s    c                 C   sT   t | tƒr"tt| d ƒ} | d u r"dS | tjtjtjhv r:dS | j}t|t	dƒd … ƒS )NFTZ	PROTOCOL_)
Ú
isinstanceÚstrÚgetattrr   ÚPROTOCOL_TLSÚPROTOCOL_TLS_SERVERÚPROTOCOL_TLS_CLIENTr   Úhas_tls_versionÚlen)Úprotocolr   r   r   r   Úhas_tls_protocol³   s    
þrS   c                 C   s¤   | dkrdS t | tƒr"tjj|  } ttd| j› ƒs8dS trL| tjjk rLdS t 	¡ }t
|dƒrz|jtjjkrz| |jk rzdS t
|dƒr |jtjjkr | |jkr dS dS )NÚSSLv2FZHAS_rD   Úmaximum_versionT)rJ   rK   r   r   Ú__members__rL   r   ÚIS_OPENSSL_3_0_0ÚTLSv1_2Ú
SSLContextrE   rD   ÚMINIMUM_SUPPORTEDrU   ÚMAXIMUM_SUPPORTED)r/   rH   r   r   r   rP   È   s0    
ÿþýÿþýrP   c                    s   ‡ fdd„}|S )Nc                    s   t  ˆ ¡‡ ‡fdd„ƒ}|S )Nc                     s,   t ˆƒst ˆ› d¡‚nˆ | i |¤ŽS d S )Nz is not available.)rP   ÚunittestZSkipTest)ÚargsÚkw)Úfuncr/   r   r   Úwrapperø   s    z8requires_tls_version.<locals>.decorator.<locals>.wrapper)Ú	functoolsÚwraps)r_   r`   ©r/   )r_   r   Ú	decorator÷   s    z'requires_tls_version.<locals>.decoratorr   )r/   rd   r   rc   r   Úrequires_tls_versionñ   s    re   rD   zrequired OpenSSL >= 1.1.0gc                 C   s.   d  tjt ¡ Ž ¡}tjr*tj | | ¡ d S )Nú )	r   Ú	tracebackÚformat_exceptionÚsysÚexc_infor   ÚverboseÚstdoutÚwrite)ÚprefixZ
exc_formatr   r   r   Úhandle_error  s    ro   c                   C   s
   t jdkS )N)r   é	   é   é   é   )r   Ú_OPENSSL_API_VERSIONr   r   r   r   Úcan_clear_options  s    ru   c                   C   s
   t jdkS )N)r   rp   é   rq   rs   ©r   ÚOPENSSL_VERSION_INFOr   r   r   r   Úno_sslv2_implies_sslv3_hello  s    ry   c                   C   s
   t jdkS )N)r   rp   rq   r   rs   rw   r   r   r   r   Úhave_verify_flags  s    rz   c                  C   sB   t js
dS t  t j¡} z|  d¡ W n ty8   Y dS 0 dS d S )NFÚ	secp384r1T)r   ÚHAS_ECDHrY   rN   Úset_ecdh_curveÚ
ValueError)rH   r   r   r   Ú_have_secp_curves  s    r   c                   C   s$   t jrt  ¡ jdkrt j S t j S ©Nr   )ÚtimeÚdaylightÚ	localtimeÚtm_isdstÚaltzoneÚtimezoner   r   r   r   Ú
utc_offset(  s    r‡   c                 C   s^   t jdkrZd}tj | |¡}|jdd}| |¡} | d dkrZ| d d… d | dd …  } | S )	N)r   rp   rq   rp   rs   z%b %d %H:%M:%S %Y GMTr   )Úsecondé   Ú0rf   é   )r   rt   ÚdatetimeÚstrptimeÚreplaceÚstrftime)Ú	cert_timeÚfmtZdtr   r   r   Úasn1time.  s    

r’   z SNI support needed for this test)Ú	cert_reqsÚca_certsÚciphersÚcertfileÚkeyfilec          	      K   sz   t  |¡}|d ur(|t jkr"d|_||_|d ur:| |¡ |d usJ|d urV| ||¡ |d urh| |¡ |j| fi |¤ŽS ©NF)	r   rY   Ú	CERT_NONEÚcheck_hostnameÚverify_modeÚload_verify_locationsÚload_cert_chainrF   Úwrap_socket)	ÚsockÚssl_versionr“   r”   r•   r–   r—   ÚkwargsÚcontextr   r   r   Útest_wrap_socket?  s    



r£   c                 C   sr   | t krt}n$| tkrt}n| tkr*t}nt| ƒ‚t tj	¡}| 
t¡ t tj¡}| | ¡ | 
t¡ |||fS r   )ÚSIGNED_CERTFILEÚSIGNED_CERTFILE_HOSTNAMEÚSIGNED_CERTFILE2ÚSIGNED_CERTFILE2_HOSTNAMEÚ	NOSANFILEÚNOSAN_HOSTNAMEr~   r   rY   rO   rœ   Ú
SIGNING_CArN   r   )Zserver_certÚhostnameÚclient_contextÚserver_contextr   r   r   Útesting_contextQ  s    


r®   c                   @   s˜  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Ze e	j
d	kd
¡dd„ ƒZdZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zejdd„ ƒZdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Ze d0e j!v d1¡d2d3„ ƒZ"d4d5„ Z#d6d7„ Z$e e%j&d8kd9¡d:d;„ ƒZ'e e%j&d8kd9¡d<d=„ ƒZ(d>d?„ Z)d@dA„ Z*dBdC„ Z+dDdE„ Z,dFdG„ Z-e e.ƒ dH¡dIdJ„ ƒZ/dKdL„ Z0e 1dMdN¡dOdP„ ƒZ2dQdR„ Z3dS )SÚBasicSocketTestsc                 C   s    t j t j t j t j t j t jr*t j t jdkr:t j	 |  
t jddh¡ |  
t jddh¡ t j t j t j t j t jdkrŒt j t j |  t jt j¡ d S )N)r
   r   TF©r
   r   r
   )r   r™   ÚCERT_OPTIONALÚCERT_REQUIREDr;   r9   r|   r:   rx   r8   ÚassertInÚHAS_SNIÚOP_NO_SSLv2ÚOP_NO_SSLv3ÚOP_NO_TLSv1ÚOP_NO_TLSv1_3ÚOP_NO_TLSv1_1ÚOP_NO_TLSv1_2ÚassertEqualrM   r   ©Úselfr   r   r   Útest_constantsk  s&    

zBasicSocketTests.test_constantsc              	   C   sb   |   td¡B t ¡ }t |¡ W d   ƒ n1 s60    Y  W d   ƒ n1 sT0    Y  d S ©Nzpublic constructor)ÚassertRaisesRegexÚ	TypeErrorÚsocketr   Ú	SSLSocket©r½   Úsr   r   r   Útest_private_init€  s    
z"BasicSocketTests.test_private_initc                 C   s2   t j}|  t|ƒd¡ t  |¡}|  |j|¡ d S )Nz_SSLMethod.PROTOCOL_TLS)r   rM   r»   rK   rY   ÚassertIsrR   ©r½   ÚprotorH   r   r   r   Útest_str_for_enums…  s    
z#BasicSocketTests.test_str_for_enumsc                 C   s  t  ¡ }tjr*tj d||r dp"df ¡ t  d¡\}}|  t	|ƒd¡ |  ||dk¡ |rxt  
d¡}|  t	|ƒd¡ n|  t jt j
d¡ |  tt j
d¡ |  tt jd¡ tt dƒrÖ|  tt jd¡ |  tt jdd¡ t  d	d
¡ t  dd
¡ t  tdƒd
¡ d S )Nz
 RAND_status is %d (%s)
zsufficient randomnesszinsufficient randomnessé   r
   éûÿÿÿÚRAND_egdÚfoozthis is a random stringg     ÀR@s   this is a random bytes objects!   this is a random bytearray object)r   ÚRAND_statusr   rk   ri   rl   rm   ÚRAND_pseudo_bytesr»   rQ   Z
RAND_bytesÚassertRaisesÚSSLErrorr~   rE   rÁ   rÍ   ZRAND_addÚ	bytearray)r½   ÚvÚdataZis_cryptographicr   r   r   Útest_random  s,    
ÿÿ

zBasicSocketTests.test_randomÚposixzrequires posixc                 C   s  t  ¡ }|s|  d¡ t ¡ \}}t ¡ }|dkržzBt |¡ t  d¡d }|  t	|ƒd¡ t 
||¡ t |¡ W n ty   t d¡ Y n0 t d¡ nlt |¡ |  tj|¡ tj|dd t |d¡}|  t	|ƒd¡ t  d¡d }|  t	|ƒd¡ |  ||¡ d S )Nz*OpenSSL's PRNG has insufficient randomnessr   rË   r
   )Úexitcode)r   rÏ   Úfailr   ÚpipeÚforkÚcloserÐ   r»   rQ   rm   ÚBaseExceptionÚ_exitÚ
addCleanupr   Zwait_processr@   ÚassertNotEqual)r½   ÚstatusZrfdZwfdÚpidZchild_randomZparent_randomr   r   r   Útest_random_fork¨  s.    


z!BasicSocketTests.test_random_forkNc                 C   s˜   |   tj t¡t¡ |   tj t¡t¡ tj t¡}t	j
rTtj dt |¡ d ¡ |   |d d¡ |   |d d¡ |   |d d¡ |   |d d	¡ d S )
NÚ
r.   ))r'   zprojects.developer.nokia.com)r'   zprojects.forum.nokia.comr1   )zhttp://ocsp.verisign.comr2   )z0http://SVRIntl-G3-aia.verisign.com/SVRIntlG3.cerr3   )z0http://SVRIntl-G3-crl.verisign.com/SVRIntlG3.crl)r»   r   Ú_sslÚ_test_decode_certÚCERTFILEÚCERTFILE_INFOr¤   ÚSIGNED_CERTFILE_INFOÚ	NOKIACERTr   rk   ri   rl   rm   Ú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   rk   ri   rl   rm   rë   rì   r»   rí   r   r   r   Útest_parse_cert_CVE_2019_5010æ  s    õþz.BasicSocketTests.test_parse_cert_CVE_2019_5010c                 C   sx   t j t¡}tjr,tj dt	 
|¡ d ¡ d}|  |d |¡ |  |d |¡ t jdkr`d}nd}|  |d |¡ d S )	Nrä   )©)r    ZUS))ÚstateOrProvinceNameZOregon))r"   Z	Beavertonr#   ))ÚorganizationalUnitNamezPython Core Development©)r%   únull.python.org example.org))ÚemailAddresszpython-dev@python.orgr-   r)   )r   rp   rq   )©r'   zaltnull.python.org example.com©Úemailz null@python.org user@example.org©ÚURIz)http://null.python.org http://example.org©ú
IP Addressz	192.0.2.1)r   z2001:DB8:0:0:0:0:0:1)rú   rû   rý   rÿ   )r   z	<invalid>r.   )r   rå   ræ   ÚNULLBYTECERTr   rk   ri   rl   rm   rë   rì   r»   rt   )r½   rî   r-   Zsanr   r   r   Útest_parse_cert_CVE_2013_4238û  s    
z.BasicSocketTests.test_parse_cert_CVE_2013_4238c                 C   s    t j t¡}|  |d d¡ d S )Nr.   )
)r'   Zallsans©Ú	othernameú<unsupported>r  )rü   zuser@example.org)r'   zwww.example.org)ZDirName)r   r!   r#   ))r%   zdirname example)rþ   zhttps://www.python.org/©r   ú	127.0.0.1)r   z0:0:0:0:0:0:0:1)zRegistered IDz	1.2.3.4.5)r   rå   ræ   Ú
ALLSANFILEr»   rí   r   r   r   Útest_parse_all_sans  s    
ÿz$BasicSocketTests.test_parse_all_sansc                 C   s    t tdƒ}| ¡ }W d   ƒ n1 s(0    Y  t |¡}t |¡}t |¡}|  ||¡ | tjd ¡sz|  	d| ¡ | 
dtj d ¡sœ|  	d| ¡ d S )NÚrrä   z-DER-to-PEM didn't include correct header:
%r
z-DER-to-PEM didn't include correct footer:
%r
)r?   ÚCAFILE_CACERTr@   r   ÚPEM_cert_to_DER_certZDER_cert_to_PEM_certr»   Ú
startswithZ
PEM_HEADERrÙ   ÚendswithZ
PEM_FOOTER)r½   rB   ÚpemÚd1Zp2Úd2r   r   r   Útest_DER_to_PEM-  s    &


z BasicSocketTests.test_DER_to_PEMc                 C   sH  t j}t j}t j}|  |t¡ |  |t¡ |  |t¡ |  |d¡ |  	|d¡ |\}}}}}|  |d¡ |  	|d¡ |  |d¡ |  	|d¡ |  |d¡ |  	|d¡ |  |d¡ |  
|d¡ |  |d¡ |  
|d¡ d	|d
›}	|dkrd|d
›d|d
›d|d
›}
nd|d
›d|d
›d|d
›}
|  | |
|	f¡||t|ƒf¡ d S )Ni   i   @r
   r‰   r   é   é?   rs   z	LibreSSL Údr   zOpenSSL Ú.)r   ZOPENSSL_VERSION_NUMBERrx   ÚOPENSSL_VERSIONÚassertIsInstanceÚintÚtuplerK   ÚassertGreaterEqualÚ
assertLessZassertLessEqualÚ
assertTruer  Úhex)r½   ÚnÚtrÅ   ÚmajorÚminorZfixÚpatchrá   Zlibressl_verZopenssl_verr   r   r   Útest_openssl_version9  s6    
þz%BasicSocketTests.test_openssl_versionc                 C   s`   t   t j¡}t|ƒ}t |¡}t dtf¡ ~W d   ƒ n1 sD0    Y  |  |ƒ d ¡ d S )NÚ )	rÂ   ÚAF_INETr£   ÚweakrefÚrefr   Zcheck_warningsÚResourceWarningr»   )r½   rÅ   ÚssÚwrr   r   r   Útest_refcycle[  s    
 zBasicSocketTests.test_refcyclec              	   C   sð   t   t j¡}t|ƒÈ}|  t|jd¡ |  t|jtdƒ¡ |  t|jd¡ |  t|j	tdƒd¡ |  t|j
d¡ |  t|jdd¡ |  t|j¡ |  t|jdgddd¡ |  t|jd¡ |  t|jtdƒg¡ W d   ƒ n1 sâ0    Y  d S )Nr
   ó   x)z0.0.0.0r   r   r   éd   )rÂ   r&  r£   rÑ   ÚOSErrorÚrecvÚ	recv_intorÓ   ÚrecvfromÚrecvfrom_intoÚsendÚsendtoÚNotImplementedErrorÚdupÚsendmsgÚrecvmsgÚrecvmsg_into©r½   rÅ   r*  r   r   r   Útest_wrapped_unconnectedf  s     


ÿ
ÿz)BasicSocketTests.test_wrapped_unconnectedc              	   C   s\   dD ]R}t   t j¡}| |¡ t|ƒ }|  || ¡ ¡ W d   ƒ q1 sL0    Y  qd S )N)Ng        ç      @)rÂ   r&  Ú
settimeoutr£   r»   Ú
gettimeout)r½   ÚtimeoutrÅ   r*  r   r   r   Útest_timeoutx  s
    

zBasicSocketTests.test_timeoutc              	   C   sø  t   ¡ }| jtdtj|td | jtdtj|dd | jtdtj|ddd tj|dtd&}|  td|jtd	f¡ W d   ƒ n1 sˆ0    Y  |  t	¡F}t   ¡ }tj|t
d
 W d   ƒ n1 sÊ0    Y  W d   ƒ n1 sè0    Y  |  |jjtj¡ |  t	¡J}t   ¡  }tj|tt
d W d   ƒ n1 s@0    Y  W d   ƒ n1 s`0    Y  |  |jjtj¡ |  t	¡J}t   ¡  }tj|t
t
d W d   ƒ n1 s¸0    Y  W d   ƒ n1 sØ0    Y  |  |jjtj¡ d S )Nzcertfile must be specified©r—   z5certfile must be specified for server-side operationsT©Úserver_sider%  ©rD  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Å   Úcmr   r   r   Útest_errors_sslwrap  sB    þþ
þ
ÿ"
J
ÿF
ÿFz$BasicSocketTests.test_errors_sslwrapc                 C   sl   t j t j t¡pt j|¡}t ¡ }|  |j¡ |  	t
j¡ t||d W d   ƒ n1 s^0    Y  d S )NrF  )r   r   r   r   r   ÚcurdirrÂ   rß   rÜ   rÑ   r   rÒ   r£   ©r½   r–   rŸ   r   r   r   Úbad_cert_testž  s    ÿÿzBasicSocketTests.bad_cert_testc                 C   s   |   d¡ d S )Nr5   ©rR  r¼   r   r   r   Útest_empty_cert¨  s    z BasicSocketTests.test_empty_certc                 C   s   |   d¡ d S )Nr6   rS  r¼   r   r   r   Útest_malformed_cert¬  s    z$BasicSocketTests.test_malformed_certc                 C   s   |   d¡ d S )Nr7   rS  r¼   r   r   r   Útest_malformed_key°  s    z#BasicSocketTests.test_malformed_keyc              	      sF  dd„ }‡ fdd„}ddi}||dƒ ||dƒ ||d	ƒ ||d
ƒ ||dƒ ||dƒ ddi}||dƒ ||dƒ ||dƒ ||dƒ ||dƒ ddi}||dƒ ||dƒ ||dƒ ||dƒ ||dƒ ddi}||dƒ ||dƒ ||dƒ ddi}||dƒ ||dƒ ||dƒ ||dƒ ddi}||dƒ ||dƒ ||dƒ d  d ¡ d!¡}dd"|fffi}|||ƒ dd#i}|||ƒ dd$i}|||ƒ d%  d ¡ d!¡}dd"|fffi}||d&  d ¡ d!¡ƒ ||d'  d ¡ d!¡ƒ ||d(  d ¡ d!¡ƒ ||d)  d ¡ d!¡ƒ d*d+d,d-œ}||d.ƒ ||d/ƒ ||d0ƒ ||d1ƒ d2d3d4œ}||d5ƒ ||d6ƒ ||d7ƒ dd8d9œ}||d:ƒ ||d;ƒ ||d<ƒ ||d=ƒ ||d>ƒ ||d?ƒ ||d@ƒ tjrddAd9œ}||dBƒ ||dCƒ ||dDƒ ||dEƒ ||dFƒ ||d@ƒ d2dGd4œ}||d5ƒ dHdIdJd-œ}||d5ƒ dHdGdJd-œ}||dKƒ ˆ  ttjd d¡ ˆ  ttji d¡ ddLi}ˆ  tj	dM¡ t |dN¡ W d   ƒ n1 s¦0    Y  ddOi}ˆ  tj	dP¡ t |dQ¡ W d   ƒ n1 sê0    Y  ddRi}ˆ  tj	dS¡ t |dT¡ W d   ƒ n1 s.0    Y  ddUi}ˆ  tj	dV¡ t |dW¡ W d   ƒ n1 sr0    Y  ddXi}ˆ  tj	dY¡ t |dZ¡ W d   ƒ n1 s¶0    Y  d[D ]<}ˆ  t¡ t 
|¡ W d   ƒ n1 sô0    Y  qÄd\D ]}ˆ  t 
|¡¡ qtjrBd]D ]}ˆ  t 
|¡¡ q*d S )^Nc                 S   s   t  | |¡ d S r   )r   Úmatch_hostname©Úcertr«   r   r   r   Úokµ  s    z0BasicSocketTests.test_match_hostname.<locals>.okc                    s   ˆ   tjtj| |¡ d S r   )rÑ   r   ÚCertificateErrorrW  rX  r¼   r   r   rÙ   ·  s    ÿz2BasicSocketTests.test_match_hostname.<locals>.failr-   )))r%   úexample.comr\  zExAmple.cOmzwww.example.comz.example.comzexample.orgZexampleXcom)))r%   z*.a.comz	foo.a.comzbar.foo.a.comza.comzXa.comz.a.com)))r%   zf*.comzfoo.comzf.comzbar.comzbar.foo.com)r÷   rø   znull.python.org)))r%   z	*.*.a.com)))r%   za.*.comz	a.foo.comza..comu   pÃ¼thon.python.orgÚidnaÚasciir%   )))r%   zx*.python.org)))r%   zxn--p*.python.orgu   www*.pythÃ¶n.orgu   www.pythÃ¶n.orgu   www1.pythÃ¶n.orgu   ftp.pythÃ¶n.orgu   pythÃ¶n.orgzJun 26 21:41:46 2011 GMT)))r%   úlinuxfrz.org))r'   úlinuxfr.org)r'   úlinuxfr.comr  )r*   r-   r.   r`  ra  r  r_  zDec 18 23:59:59 2011 GMT)rô   ©)rõ   Ú
California©)r"   zMountain View©)r$   z
Google Inc©)r%   úmail.google.com)r*   r-   rg  z	gmail.comrc  )©r'   r\  )r   ú10.11.12.13)r   ú14.15.16.17r  )r-   r.   ri  rj  z127.1z14.15.16.17 z14.15.16.17 extra dataz14.15.16.18zexample.net)rh  )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ô   rb  rd  re  zDec 18 23:59:59 2099 GMT)rô   rb  rd  rf  ))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   rW  rÀ   r[  Z_inet_patonr  )r½   rZ  rÙ   rY  r]  ÚinvalidZipaddrr   r¼   r   Útest_match_hostname´  s   




























þ



ÿ


ÿ






ÿ





ÿ
û
û
þ,þ,þ,þ,þ,.z$BasicSocketTests.test_match_hostnamec                 C   sN   t  t j¡}t ¡ &}| jt|j|ddd W d   ƒ n1 s@0    Y  d S )NTzsome.hostname©Úserver_hostname)r   rY   rN   rÂ   rÑ   r~   rž   )r½   rH   rŸ   r   r   r   Útest_server_sidez  s
    
ÿz!BasicSocketTests.test_server_sidec              	   C   s   t  d¡}t   t j¡}| | ¡ ¡ t|ddD}|  t¡ | d¡ W d   ƒ n1 s\0    Y  W d   ƒ n1 sz0    Y  | 	¡  d S )N©r  r   F©Údo_handshake_on_connectzunknown-type)
rÂ   Úcreate_serverr&  rH  Úgetsocknamer£   rÑ   r~   Úget_channel_bindingrÜ   )r½   rÅ   Úcr*  r   r   r   Útest_unknown_channel_binding  s    
Fz-BasicSocketTests.test_unknown_channel_bindingú
tls-uniqueú*'tls-unique' channel binding not availablec                 C   s’   t   t j¡}t|ƒ }|  | d¡¡ W d   ƒ n1 s:0    Y  t   t j¡}t|dtd }|  | d¡¡ W d   ƒ n1 s„0    Y  d S )Nr~  TrE  )rÂ   r&  r£   ÚassertIsNoner{  rç   r;  r   r   r   Útest_tls_unique_channel_binding‹  s    
.z0BasicSocketTests.test_tls_unique_channel_bindingc                 C   sj   t t tj¡ƒ}t|ƒ}|  t¡}d }t ¡  W d   ƒ n1 sD0    Y  |  |t	|j
jd ƒ¡ d S r€   )r£   rÂ   r&  ÚreprZassertWarnsr)  r   Ú
gc_collectr³   rK   Úwarningr]   )r½   r*  r
  rN  r   r   r   Útest_dealloc_warn—  s    &z"BasicSocketTests.test_dealloc_warnc                 C   s†   t  ¡ }|  t|ƒd¡ |  |t j¡ t ¡ D}t|d< t	|d< t  ¡ }|  |j
t	¡ |  |jt¡ W d   ƒ n1 sx0    Y  d S )Né   ÚSSL_CERT_DIRÚSSL_CERT_FILE)r   Zget_default_verify_pathsr»   rQ   r  ZDefaultVerifyPathsr   ÚEnvironmentVarGuardÚCAPATHrç   Úcafiler   )r½   ÚpathsÚenvr   r   r   Útest_get_default_verify_pathsŸ  s    
z.BasicSocketTests.test_get_default_verify_pathsr	   úWindows specificc           	      C   sî   |   t d¡¡ |   t d¡¡ |  ttj¡ |  ttjd¡ tƒ }dD ]}t |¡}|  |t¡ |D ]p}|  |t	¡ |  
t|ƒd¡ |\}}}|  |t¡ |  |ddh¡ |  |tttf¡ t|ttfƒrf| |¡ qfqHd}|  ||¡ d S )	NÚCAÚROOTr%  )r  r‘  r   Úx509_asnÚ
pkcs_7_asnú1.3.6.1.5.5.7.3.1)r  r   Zenum_certificatesrÑ   rÁ   ÚWindowsErrorÚsetr  Úlistr  r»   rQ   Úbytesr³   Ú	frozensetÚboolrJ   Úupdate)	r½   Z
trust_oidsZ	storenameÚstoreÚelementrY  ÚencZtrustÚ
serverAuthr   r   r   Útest_enum_certificates«  s&    

z'BasicSocketTests.test_enum_certificatesc                 C   s’   |   t d¡¡ |  ttj¡ |  ttjd¡ t d¡}|  |t¡ |D ]D}|  |t¡ |  	t
|ƒd¡ |  |d t¡ |  |d ddh¡ qHd S )Nr  r%  é   r   r
   r’  r“  )r  r   Z	enum_crlsrÑ   rÁ   r•  r  r—  r  r»   rQ   r˜  r³   )r½   Zcrlsr  r   r   r   Útest_enum_crlsÄ  s    
zBasicSocketTests.test_enum_crlsc              	   C   sà  d}t  d¡}|  ||¡ |  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ |  |t j¡ |  t	t jd¡ t j 
d¡}|  ||¡ |  |t j¡ |  t	t jj
d¡ |  t	d¡ t j 
d¡ W d   ƒ n1 sÖ0    Y  td	ƒD ]j}zt j 
|¡}W n t	y   Y qè0 |  |jt¡ |  |jt¡ |  |jt¡ |  |jttd ƒf¡ qèt j d¡}|  ||¡ |  |t j¡ |  t j d¡|¡ |  t j d¡|¡ |  t	d
¡ t j d¡ W d   ƒ n1 sÒ0    Y  d S )N)é   rŸ  úTLS Web Server Authenticationr”  r”  r£  rŸ  r¤  éÿÿÿÿzunknown NID 100000i † iè  zunknown object 'serverauth'Z
serverauth)r   Ú_ASN1Objectr»   ÚnidÚ	shortnameZlongnameÚoidr  rÑ   r~   ZfromnidrÀ   Úranger  rK   ÚtypeZfromname)r½   ÚexpectedÚvalÚiÚobjr   r   r   Útest_asn1objectÓ  sB    
*ÿz BasicSocketTests.test_asn1objectc                 C   sÈ   t  d¡}|  t jjt j¡ |  t jj|¡ |  t jjjd¡ |  t jjjd¡ |  t jjjd¡ t  d¡}|  t jj	t j¡ |  t jj	|¡ |  t jj	jd¡ |  t jj	jd¡ |  t jj	jd¡ d S )Nr”  r£  rŸ  z1.3.6.1.5.5.7.3.2é‚   Z
clientAuth)
r   r¦  r  ÚPurposeÚSERVER_AUTHr»   r§  r¨  r©  ÚCLIENT_AUTH)r½   r­  r   r   r   Útest_purpose_enumú  s     
ÿ
ÿz"BasicSocketTests.test_purpose_enumc                 C   s¼   t   t jt j¡}|  |j¡ |  t¡}t|tj	d W d   ƒ n1 sJ0    Y  |  
t|jƒd¡ t tj¡}|  t¡}| |¡ W d   ƒ n1 sœ0    Y  |  
t|jƒd¡ d S )N©r“   z!only stream sockets are supported)rÂ   r&  Ú
SOCK_DGRAMrß   rÜ   rÑ   r6  r£   r   r™   r»   rK   rK  rY   rO   rž   )r½   rÅ   ZcxrH   r   r   r   Útest_unsupported_dtls  s    ,(z&BasicSocketTests.test_unsupported_dtlsc                 C   s   |   t |¡|¡ d S r   )r»   r   Úcert_time_to_seconds)r½   Ú
timestringZ	timestampr   r   r   Úcert_time_ok  s    zBasicSocketTests.cert_time_okc                 C   s8   |   t¡ t |¡ W d   ƒ n1 s*0    Y  d S r   )rÑ   r~   r   r¹  )r½   rº  r   r   r   Úcert_time_fail  s    zBasicSocketTests.cert_time_failz)local time needs to be different from UTCc                 C   s   |   dd¡ |   dd¡ d S )NzMay  9 00:00:00 2007 GMTg   ÀCÑAúJan  5 09:34:43 2018 GMTç  À¬Ñ“ÖA)r»  r¼   r   r   r   Ú"test_cert_time_to_seconds_timezone  s    z3BasicSocketTests.test_cert_time_to_seconds_timezonec                 C   sà   d}d}|   ||¡ |  tj|d|¡ |   d|¡ |   d|¡ |  d¡ |  d¡ |  d¡ |  d	¡ |  d
¡ |  d¡ |  d¡ d}|   d|¡ |   d|¡ |   dd¡ |   dd¡ |   dd¡ |  d¡ |   dd¡ d S )Nr½  r¾  )r   zJan 05 09:34:43 2018 GMTzJaN  5 09:34:43 2018 GmTzJan  5 09:34 2018 GMTzJan  5 09:34:43 2018zJan  5 09:34:43 2018 UTCzJan 35 09:34:43 2018 GMTzJon  5 09:34:43 2018 GMTzJan  5 24:00:00 2018 GMTzJan  5 09:60:43 2018 GMTg   àWÒAzDec 31 23:59:60 2008 GMTzJan  1 00:00:00 2009 GMTzJan  5 09:34:59 2018 GMTiÃFOZzJan  5 09:34:60 2018 GMTiÄFOZzJan  5 09:34:61 2018 GMTiÅFOZzJan  5 09:34:62 2018 GMTzDec 31 23:59:59 9999 GMTg €¿ úMB)r»  r»   r   r¹  r¼  )r½   rº  ÚtsZ
newyear_tsr   r   r   Útest_cert_time_to_seconds%  s*    







z*BasicSocketTests.test_cert_time_to_secondsÚLC_ALLr%  c                 C   s@   dd„ }|ƒ   ¡ dkr |  d¡ |  dd¡ |  |ƒ d ¡ d S )Nc                   S   s   t  dd¡S )Nz%b)	r
   r¡  r   r‰   r‹   r†  r   r   r   )r   r   r   r   r   r   Úlocal_february_nameL  s    zNBasicSocketTests.test_cert_time_to_seconds_locale.<locals>.local_february_nameZfebz>locale-specific month name needs to be different from C localezFeb  9 00:00:00 2007 GMTg   `îrÑAz  9 00:00:00 2007 GMT)ÚlowerÚskipTestr»  r¼  )r½   rÃ  r   r   r   Ú test_cert_time_to_seconds_localeH  s
    
z1BasicSocketTests.test_cert_time_to_seconds_localec                 C   sv   t   t j¡}|  |j¡ t |¡}tt   t j¡tjd}|  |j¡ | 	t
|f¡}tjtjtjtjf}|  ||¡ d S )Nr¶  )rÂ   r&  rß   rÜ   r   Ú	bind_portr£   r   r²   Ú
connect_exrI  rL  ZECONNREFUSEDZEHOSTUNREACHZ	ETIMEDOUTÚEWOULDBLOCKr³   )r½   ÚserverÚportrÅ   ÚrcÚerrorsr   r   r   Útest_connect_ex_errorW  s    
ÿþz&BasicSocketTests.test_connect_ex_error)4Ú__name__Ú
__module__Ú__qualname__r¾   rÆ   rÊ   rÖ   r\   Ú
skipUnlessr   r   rã   ZmaxDiffrï   ró   r  r	  r  r$  r   Zcpython_onlyr,  r<  rA  rO  rR  rT  rU  rV  rr  ru  r}  r   ÚCHANNEL_BINDING_TYPESr  r…  rŽ  ri   Úplatformr   r¢  r°  rµ  r¸  r»  r¼  r‡   r¿  rÁ  Zrun_with_localerÆ  rÎ  r   r   r   r   r¯   i  sb   
"

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



'ÿ
#

r¯   c                   @   s´  e Zd Zdd„ Zdd„ Zdd„ Ze edkd¡d	d
„ ƒZ	e 
ejdk d¡dd„ ƒZdd„ Zdd„ Zdd„ Zee 
ed¡dd„ ƒƒZe eƒ d¡dd„ ƒZdd„ Zdd„ Zdd „ Ze 
ed!¡d"d#„ ƒZd$d%„ Zd&d'„ Ze ejd(¡d)d*„ ƒZed+d,„ ƒZ ed-d.„ ƒZ!d/d0„ Z"d1d2„ Z#d3d4„ Z$e 
e%j&d5kd6¡e 
ed7¡d8d9„ ƒƒZ'e e%j&d5kd:¡e 
e(e%d;ƒd<¡d=d>„ ƒƒZ)d?d@„ Z*dAdB„ Z+dCdD„ Z,dEdF„ Z-dGdH„ Z.dIdJ„ Z/e e0dK¡dLdM„ ƒZ1dNS )OÚContextTestsc                 C   sP   t D ]}t |¡ qt ¡ }|  |jtj¡ |  ttjd¡ |  ttjd¡ d S )Nr¥  é*   )Ú	PROTOCOLSr   rY   r»   rR   rM   rÑ   r~   )r½   rR   rH   r   r   r   Útest_constructorj  s    zContextTests.test_constructorc                 C   s&   t D ]}t |¡}|  |j|¡ qd S r   )r×  r   rY   r»   rR   rÈ   r   r   r   Útest_protocolr  s    
zContextTests.test_protocolc                 C   s\   t  t j¡}| d¡ | d¡ |  t jd¡ | d¡ W d   ƒ n1 sN0    Y  d S )NÚALLÚDEFAULTúNo cipher can be selectedú^$:,;?*'dorothyx)r   rY   rO   rF   rÀ   rÒ   ©r½   rH   r   r   r   Útest_ciphersw  s
    

zContextTests.test_ciphersr
   z+Test applies only to Python default ciphersc                 C   sf   t  t j¡}| ¡ }|D ]H}|d }|  d|¡ |  d|¡ |  d|¡ |  d|¡ |  d|¡ qd S )Nr   ZPSKZSRPZMD5ZRC4Z3DES)r   rY   rO   Úget_ciphersZassertNotIn)r½   rH   r•   Zsuiter   r   r   r   Útest_python_ciphers~  s    z ContextTests.test_python_ciphers)r
   r   r¡  r   r   zOpenSSL too oldc                 C   sH   t  t j¡}| d¡ tdd„ | ¡ D ƒƒ}|  d|¡ |  d|¡ 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AES256-GCM-SHA384zAES128-GCM-SHA256)r   rY   rO   rF   r–  rà  r³   )r½   rH   Únamesr   r   r   Útest_get_ciphers‹  s
    
zContextTests.test_get_ciphersc                 C   sâ   t  t j¡}t jt jB t jB }|ttB tB t	B t
B tB O }|  ||j¡ | jt jO  _|  |t jB |j¡ tƒ r®|jt j @ |_|  ||j¡ d|_|  d|jt j @ ¡ n0|  t¡ d|_W d   ƒ n1 sÔ0    Y  d S r€   )r   rY   rO   ÚOP_ALLrµ   r¶   r8   r;   r9   r:   r<   r=   r»   Úoptionsr·   ru   rÑ   r~   )r½   rH   Údefaultr   r   r   Útest_options“  s*    ÿÿþýzContextTests.test_optionsc                 C   s  t  t j¡}|  |jt j¡ t j|_|  |jt j¡ t j|_|  |jt j¡ t j|_|  |jt j¡ |  t	¡ d |_W d   ƒ n1 sŠ0    Y  |  t
¡ d|_W d   ƒ n1 sº0    Y  t  t j¡}|  |jt j¡ |  |j¡ t  t j¡}|  |jt j¡ |  |j¡ d S ©NrÖ  )r   rY   rM   r»   r›   r™   r±   r²   rÑ   rÁ   r~   rN   ÚassertFalserš   rO   r  rÞ  r   r   r   Útest_verify_mode_protocol©  s$    $$z&ContextTests.test_verify_mode_protocolc                 C   sŠ   t  t j¡}|  |j¡ t jrVd|_|  |j¡ d|_|  |j¡ d|_|  |j¡ n0|  t¡ d|_W d   ƒ n1 s|0    Y  d S ©NTF)	r   rY   rO   r  Úhostname_checks_common_nameÚHAS_NEVER_CHECK_COMMON_NAMErì  rÑ   ÚAttributeErrorrÞ  r   r   r   Ú test_hostname_checks_common_nameÀ  s    z-ContextTests.test_hostname_checks_common_namezsee bpo-34001c                 C   sð  t  t j¡}t jjt jjt jjh}t jjt jjh}|  	|j
|¡ |  	|j|¡ t jj|_
t jj|_|  |j
t jj¡ |  |jt jj¡ t jj|_
t jj|_|  |j
t jj¡ |  |jt jj¡ t jj|_|  |jt jj¡ t jj|_|  	|jt jjt jjh¡ t jj|_
|  	|j
t jjt jjh¡ |  t¡ d|_
W d   ƒ n1 sJ0    Y  t  t j¡}|  	|j
|¡ |  |jt jj¡ |  t¡ t jj|_
W d   ƒ n1 s¬0    Y  |  t¡ t jj|_W d   ƒ n1 sâ0    Y  d S rë  )r   rY   rN   r   rZ   r   rX   r[   ÚTLSv1_3r³   rD   rU   r   r»   r   rÑ   r~   r   )r½   rH   Zminimum_rangeZmaximum_ranger   r   r   Útest_min_max_versionÎ  sr    ú
üÿÿ


ÿ
ÿ


ÿ
ÿ

ÿ
þ
þ&ÿ
ÿ*z!ContextTests.test_min_max_versionú!verify_flags need OpenSSL > 0.9.8c                 C   sÌ   t  t j¡}tt ddƒ}|  |jt j|B ¡ t j|_|  |jt j¡ t j|_|  |jt j¡ t j|_|  |jt j¡ t jt j	B |_|  |jt jt j	B ¡ |  
t¡ d |_W d   ƒ n1 s¾0    Y  d S )NÚVERIFY_X509_TRUSTED_FIRSTr   )r   rY   rN   rL   r»   Úverify_flagsÚVERIFY_DEFAULTÚVERIFY_CRL_CHECK_LEAFZVERIFY_CRL_CHECK_CHAINZVERIFY_X509_STRICTrÑ   rÁ   )r½   rH   Útfr   r   r   Útest_verify_flags  s    
ÿzContextTests.test_verify_flagsc                 C   sÖ  t  t j¡}|jtd d |jttd | jt|jtd |  t¡}| t¡ W d   ƒ n1 sd0    Y  |  	|j
jtj¡ |  t jd¡ | t¡ W d   ƒ n1 s®0    Y  |  t jd¡ | t¡ W d   ƒ n1 sæ0    Y  t  t j¡}| tt¡ |jttd |jttd |  t jd¡ | t¡ W d   ƒ n1 sT0    Y  |  t jd¡ | t¡ W d   ƒ n1 sŽ0    Y  |  t jd¡ |jttd W d   ƒ n1 sÌ0    Y  t  t j¡}|  t jd¡ | tt¡ W d   ƒ n1 s0    Y  |jttd |jtt ¡ d |jttt ¡ ƒd | ttt¡ | ttt ¡ ¡ | tttt ¡ ƒ¡ |  td¡ |jtdd W d   ƒ n1 s¼0    Y  |  t j¡ |jtdd W d   ƒ n1 sø0    Y  |  td	¡" |jtd
d d W d   ƒ n1 s80    Y  dd„ }dd„ }dd„ }dd„ }dd„ }dd„ }dd„ }	G dd„ dƒ}
|jt|d |jt|d |jt|d |jt|
ƒ d |jt|
ƒ jd |  t j¡ |jt|d W d   ƒ n1 s0    Y  |  td	¡ |jt|d W d   ƒ n1 sB0    Y  |  td¡ |jt|d W d   ƒ n1 s~0    Y  |  td¡ |jt|	d W d   ƒ n1 sº0    Y  |jt|	d d S )NrB  úPEM librG  zkey values mismatch)Úpasswordzshould be a stringTÚbadpasszcannot be longeró   ai  c                   S   s   t S r   ©ÚKEY_PASSWORDr   r   r   r   Úgetpass_unicodea  s    z:ContextTests.test_load_cert_chain.<locals>.getpass_unicodec                   S   s   t  ¡ S r   )r  rn  r   r   r   r   Úgetpass_bytesc  s    z8ContextTests.test_load_cert_chain.<locals>.getpass_bytesc                   S   s   t t ¡ ƒS r   )rÓ   r  rn  r   r   r   r   Úgetpass_bytearraye  s    z<ContextTests.test_load_cert_chain.<locals>.getpass_bytearrayc                   S   s   dS )Nrþ  r   r   r   r   r   Úgetpass_badpassg  s    z:ContextTests.test_load_cert_chain.<locals>.getpass_badpassc                   S   s   dd S )Nrÿ  i   r   r   r   r   r   Úgetpass_hugei  s    z7ContextTests.test_load_cert_chain.<locals>.getpass_hugec                   S   s   dS )Nrp   r   r   r   r   r   Úgetpass_bad_typek  s    z;ContextTests.test_load_cert_chain.<locals>.getpass_bad_typec                   S   s   t dƒ‚d S )Núgetpass error)Ú	Exceptionr   r   r   r   Úgetpass_exceptionm  s    z<ContextTests.test_load_cert_chain.<locals>.getpass_exceptionc                   @   s   e Zd Zdd„ Zdd„ ZdS )z:ContextTests.test_load_cert_chain.<locals>.GetPassCallablec                 S   s   t S r   r   r¼   r   r   r   Ú__call__p  s    zCContextTests.test_load_cert_chain.<locals>.GetPassCallable.__call__c                 S   s   t S r   r   r¼   r   r   r   Úgetpassr  s    zBContextTests.test_load_cert_chain.<locals>.GetPassCallable.getpassN)rÏ  rÐ  rÑ  r  r  r   r   r   r   ÚGetPassCallableo  s   r  zmust return a stringr  )r   rY   rN   r   rç   rÑ   rÁ   r/  rJ  r»   rK  rL  rM  rÀ   rÒ   ÚBADCERTÚ	EMPTYCERTÚONLYCERTÚONLYKEYÚBYTES_ONLYCERTÚBYTES_ONLYKEYr  ÚCERTFILE_PROTECTEDr  rn  rÓ   ÚONLYKEY_PROTECTEDr~   r  r	  )r½   rH   rN  r  r  r  r  r  r  r
  r  r   r   r   Útest_load_cert_chain2  s€    (((**.,
ÿ
ÿ..2ÿ....z!ContextTests.test_load_cert_chainc                 C   s  t  t j¡}| t¡ |jtd d | t¡ |jtd d |  t|j¡ |  t|jd d d ¡ |  t¡}| t	¡ W d   ƒ n1 sˆ0    Y  |  
|jjtj¡ |  t jd¡ | t¡ W d   ƒ n1 sÒ0    Y  | tt¡ |jttd |  t|jd d¡ d S )N)r‹  r   rü  ©r   T)r   rY   rN   rœ   rç   ÚBYTES_CERTFILErÑ   rÁ   r/  rJ  r»   rK  rL  rM  rÀ   rÒ   r  rŠ  ÚBYTES_CAPATH©r½   rH   rN  r   r   r   Útest_load_verify_locations…  s    

((z'ContextTests.test_load_verify_locationsc                 C   sž  t tƒ}| ¡ }W d   ƒ n1 s&0    Y  t |¡}t tƒ}| ¡ }W d   ƒ n1 s`0    Y  t |¡}t tj¡}|  | 	¡ d d¡ |j
|d |  | 	¡ d d¡ |j
|d |  | 	¡ d d¡ |j
|d |  | 	¡ d d¡ t tj¡}d ||f¡}|j
|d |  | 	¡ d d¡ t tj¡}d|d|d	|d
g}|j
d |¡d |  | 	¡ d d¡ t tj¡}|j
|d |j
|d |  | 	¡ d d¡ |j
|d |  | 	¡ d d¡ t tj¡}d ||f¡}|j
|d |  | 	¡ d d¡ t tj¡}| jt|j
td |  tjd¡ |j
dd W d   ƒ n1 sT0    Y  |  tjd¡ |j
dd W d   ƒ n1 s0    Y  d S )NÚx509_car   ©Úcadatar
   r¡  rä   ÚheadÚotherZagainÚtailrä  z4no start line: cadata does not contain a certificateÚbrokenz6not enough data: cadata does not contain a certificates   broken)r?   r  r@   r   r  ÚCAFILE_NEURONIOrY   rO   r»   Úcert_store_statsrœ   r   rÑ   rÁ   ÚobjectrÀ   rÒ   )r½   rB   Z
cacert_pemZ
cacert_derZneuronio_pemZneuronio_derrH   Zcombinedr   r   r   Útest_load_verify_cadata˜  s\    
&

&

ÿþ,þz$ContextTests.test_load_verify_cadataú)Avoid mixing debug/release CRT on Windowsc                 C   sÈ   t  t j¡}| t¡ tjdkr*| t¡ |  t	|j¡ |  t	|jd ¡ |  t
¡}| t¡ W d   ƒ n1 sr0    Y  |  |jjtj¡ |  t j¡}| t¡ W d   ƒ n1 sº0    Y  d S )NÚnt)r   rY   rN   Úload_dh_paramsÚDHFILEr   r   ÚBYTES_DHFILErÑ   rÁ   rA   rJ  r»   rK  rL  rM  rÒ   rç   r  r   r   r   Útest_load_dh_params×  s    


(z ContextTests.test_load_dh_paramsc                 C   s@   t D ]6}t |¡}|  | ¡ ddddddddddddœ¡ qd S )Nr   )ZnumberrH  Zconnect_goodZconnect_renegotiateÚacceptZaccept_goodZaccept_renegotiateÚhitsÚmissesZtimeoutsZ
cache_full)r×  r   rY   r»   Úsession_statsrÈ   r   r   r   Útest_session_statså  s    

õzContextTests.test_session_statsc                 C   s   t  t j¡}| ¡  d S r   )r   rY   rO   Zset_default_verify_pathsrÞ  r   r   r   Útest_set_default_verify_pathsö  s    z*ContextTests.test_set_default_verify_pathsz#ECDH disabled on this OpenSSL buildc                 C   sb   t  t j¡}| d¡ | d¡ |  t|j¡ |  t|jd ¡ |  t|jd¡ |  t|jd¡ d S )NÚ
prime256v1s
   prime256v1rÎ   ó   foo)r   rY   rN   r}   rÑ   rÁ   r~   rÞ  r   r   r   Útest_set_ecdh_curveü  s    

z ContextTests.test_set_ecdh_curvec                 C   sj   t  t j¡}|  t|j¡ |  t|jd¡ |  t|jd¡ |  t|j|¡ dd„ }| d ¡ | |¡ d S )Nr‰   r%  c                 S   s   d S r   r   ©rŸ   Ú
servernamerH   r   r   r   Údummycallback  s    z5ContextTests.test_sni_callback.<locals>.dummycallback)r   rY   rN   rÑ   rÁ   Úset_servername_callback)r½   rH   r8  r   r   r   Útest_sni_callback  s    
zContextTests.test_sni_callbackc                 C   sJ   t  t j¡}|fdd„}| |¡ t |¡}~~t ¡  |  |ƒ d ¡ d S )Nc                 S   s   d S r   r   )rŸ   r7  rH   Úcycler   r   r   r8    s    z>ContextTests.test_sni_callback_refcycle.<locals>.dummycallback)	r   rY   rN   r9  r'  r(  ÚgcÚcollectrÇ   )r½   rH   r8  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   rY   rO   r»   r$  r   rç   rœ   r  rÞ  r   r   r   Útest_cert_store_stats"  s     

ÿ


ÿ


ÿ


ÿz"ContextTests.test_cert_store_statsc                 C   s¼   t  t j¡}|  | ¡ g ¡ | t¡ |  | ¡ g ¡ | t¡ |  | ¡ dtdƒtdƒdddddœg¡ t	tƒ}| 
¡ }W d   ƒ n1 s0    Y  t  |¡}|  | d¡|g¡ d S )	N)))r$   zRoot CA))rö   zhttp://www.cacert.org))r%   zCA Cert Signing Authority))rù   zsupport@cacert.orgzMar 29 12:29:49 2033 GMTzMar 30 12:29:49 2003 GMTZ00)z!https://www.cacert.org/revoke.crlr   )r)   r*   r+   r,   r3   r-   r/   T)r   rY   rO   r»   Úget_ca_certsrœ   rç   r  r’   r?   r@   r  )r½   rH   rB   r  Úderr   r   r   Útest_get_ca_certs0  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   rY   rO   Úload_default_certsr²  r³  r´  rÑ   rÁ   rÞ  r   r   r   Útest_load_default_certsL  s    z$ContextTests.test_load_default_certsr	   znot-Windows specificz!LibreSSL doesn't support env varsc                 C   sh   t  t j¡}t ¡ @}t|d< t|d< | ¡  |  | 	¡ ddddœ¡ W d   ƒ n1 sZ0    Y  d S )Nr‡  rˆ  r   r
   )r?  r@  r  )
r   rY   rO   r   r‰  rŠ  rç   rE  r»   r$  )r½   rH   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 ¡ H}t|d< t|d< | ¡  |d  d7  < |  	| ¡ |¡ W d   ƒ n1 s~0    Y  d S )Nr‡  rˆ  r@  r
   )
r   rY   rO   rE  r$  r   r‰  rŠ  rç   r»   )r½   rH   Ústatsr  r   r   r   Ú#test_load_default_certs_env_windowse  s    
z0ContextTests.test_load_default_certs_env_windowsc                 C   s‚   |   |jtj@ tj¡ tdkr0|   |jt@ t¡ tdkrJ|   |jt@ t¡ tdkrd|   |jt@ t¡ tdkr~|   |jt@ t¡ d S r€   )r»   rè  r   rµ   r8   r9   r:   r;   rÞ  r   r   r   Ú_assert_context_optionst  s"    ÿÿÿÿz$ContextTests._assert_context_optionsc                 C   sä   t  ¡ }|  |jt j¡ |  |jt j¡ |  |j¡ |  	|¡ t
tƒ}| ¡ }W d   ƒ n1 sd0    Y  t jtt|d}|  |jt j¡ |  |jt j¡ |  	|¡ t  t jj¡}|  |jt j¡ |  |jt j¡ |  	|¡ d S )N)r‹  r   r  )r   Úcreate_default_contextr»   rR   rM   r›   r²   r  rš   rJ  r?   rª   r@   rŠ  r²  r´  r™   )r½   rH   rB   r  r   r   r   Útest_create_default_contextƒ  s"    

&ÿ
z(ContextTests.test_create_default_contextc                 C   sü   t  ¡ }|  |jt j¡ |  |jt j¡ |  |j¡ |  	|¡ t  t j
¡}|  |jt j
¡ |  |jt j¡ |  	|¡ t jt j
t jdd}|  |jt j
¡ |  |jt j¡ |  |j¡ |  	|¡ t jt jjd}|  |jt j¡ |  |jt j¡ |  	|¡ d S )NT)r“   rš   )Zpurpose)r   Ú_create_stdlib_contextr»   rR   rM   r›   r™   rì  rš   rJ  r   r²   r  r²  r´  rÞ  r   r   r   Útest__create_stdlib_context˜  s*    

þ
z(ContextTests.test__create_stdlib_contextc                 C   sz  t  t j¡}|  |j¡ |  |jt j¡ d|_|  |j¡ |  |jt j	¡ d|_t j	|_|  |j¡ |  |jt j	¡ d|_t j|_d|_|  |j¡ |  |jt j¡ d|_|  |j¡ |  |jt j	¡ d|_t j
|_d|_|  |j¡ |  |jt j
¡ d|_|  |j¡ |  |jt j
¡ |  t¡ t j|_W d   ƒ n1 sB0    Y  d|_|  |j¡ t j|_|  |jt j¡ d S rî  )r   rY   rM   rì  rš   r»   r›   r™   r  r²   r±   rÑ   r~   rÞ  r   r   r   Útest_check_hostname±  s@    (z ContextTests.test_check_hostnamec                 C   sT   t  t j¡}|  |j¡ |  |jt j¡ t  t j¡}|  	|j¡ |  |jt j
¡ d S r   )r   rY   rO   r  rš   r»   r›   r²   rN   rì  r™   rÞ  r   r   r   Útest_context_client_serverÜ  s    z'ContextTests.test_context_client_serverc                 C   sž   G dd„ dt jƒ}G dd„ dt jƒ}t  t j¡}||_||_|jt ¡ dd}|  	||¡ W d   ƒ n1 sp0    Y  | 
t  ¡ t  ¡ ¡}|  	||¡ d S )Nc                   @   s   e Zd ZdS )z;ContextTests.test_context_custom_class.<locals>.MySSLSocketN©rÏ  rÐ  rÑ  r   r   r   r   ÚMySSLSocketè  s   rR  c                   @   s   e Zd ZdS )z;ContextTests.test_context_custom_class.<locals>.MySSLObjectNrQ  r   r   r   r   ÚMySSLObjectë  s   rS  TrC  )r   rÃ   Ú	SSLObjectrY   rN   Zsslsocket_classZsslobject_classrž   rÂ   r  Úwrap_bioÚ	MemoryBIO)r½   rR  rS  rH   rŸ   r¯  r   r   r   Útest_context_custom_classç  s    *z&ContextTests.test_context_custom_classzTest requires OpenSSL 1.1.1c                 C   sð   t  t j¡}|  |jd¡ d|_|  |jd¡ d|_|  |jd¡ |  t¡ d|_W d   ƒ n1 sh0    Y  |  t¡ d |_W d   ƒ n1 s˜0    Y  t  t j¡}|  |jd¡ |  t¡ d|_W d   ƒ n1 sâ0    Y  d S )Nr¡  r
   r   r¥  )	r   rY   rN   r»   Znum_ticketsrÑ   r~   rÁ   rO   rÞ  r   r   r   Útest_num_tickest÷  s    $$zContextTests.test_num_tickestN)2rÏ  rÐ  rÑ  rØ  rÙ  rß  r\   rÒ  r   rá  ÚskipIfr   rx   ræ  rê  rí  rò  Úrequires_minimum_versionÚIS_LIBRESSLrô  rz   rû  r  r  r&  ÚPy_DEBUG_WIN32r,  r1  r2  r|   r5  Ú	needs_snir:  r>  rA  rD  rF  ri   rÔ  rG  rE   rI  rJ  rL  rN  rO  rP  rW  ÚIS_OPENSSL_1_1_1rX  r   r   r   r   rÕ  h  sb   
ÿ


Nÿ
S?


	


+
rÕ  c                   @   s8   e Zd Zdd„ Ze ed¡dd„ ƒZdd„ Zdd	„ Z	d
S )ÚSSLErrorTestsc                 C   sX   t  dd¡}|  t|ƒd¡ |  |jd¡ t  dd¡}|  t|ƒd¡ |  |jd¡ d S )Nr
   rÎ   )r   rÒ   r»   rK   rL  ZSSLZeroReturnError)r½   Úer   r   r   Útest_str  s    zSSLErrorTests.test_strr'  c                 C   s‚   t  t j¡}|  t j¡}| t¡ W d   ƒ n1 s80    Y  |  |jj	d¡ |  |jj
d¡ t|jƒ}|  | d¡|¡ d S )NZPEMZNO_START_LINEz"[PEM: NO_START_LINE] no start line)r   rY   rO   rÑ   rÒ   r)  rç   r»   rK  ZlibraryÚreasonrK   r  r  )r½   rH   rN  rÅ   r   r   r   Útest_lib_reason  s    (
zSSLErrorTests.test_lib_reasonc              
   C   sò   t  t j¡}d|_t j|_t d¡º}t | 	¡ ¡}| 
d¡ |j|dddr}|  t j¡}| ¡  W d   ƒ n1 sz0    Y  t|jƒ}|  | d¡|¡ |  |jjt j¡ W d   ƒ n1 sÆ0    Y  W d   ƒ n1 sä0    Y  d S )NFrv  rw  z%The operation did not complete (read))r   rY   rO   rš   r™   r›   rÂ   ry  Úcreate_connectionrz  Úsetblockingrž   rÑ   ÚSSLWantReadErrorÚdo_handshakerK   rK  r  r  r»   rL  ÚSSL_ERROR_WANT_READ)r½   rH   rÅ   r|  rN  r   r   r   Útest_subclass!  s    
&
zSSLErrorTests.test_subclassc                 C   sÒ   t  ¡ }|  t¡( |jt  ¡ t  ¡ dd W d   ƒ n1 s@0    Y  |  t¡( |jt  ¡ t  ¡ dd W d   ƒ n1 s‚0    Y  |  t¡( |jt  ¡ t  ¡ dd W d   ƒ n1 sÄ0    Y  d S )Nr%  rs  z.example.orgzexample.org evil.com)r   rK  rÑ   r~   rU  rV  rÁ   rÞ  r   r   r   Útest_bad_server_hostname3  s    ÿ$ÿ$ÿz&SSLErrorTests.test_bad_server_hostnameN)
rÏ  rÐ  rÑ  ra  r\   rY  r\  rc  ri  rj  r   r   r   r   r_  
  s
   



r_  c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚMemoryBIOTestsc                 C   sª   t  ¡ }| d¡ |  | ¡ d¡ |  | ¡ d¡ | d¡ | d¡ |  | ¡ d¡ |  | ¡ d¡ | d¡ |  | d¡d¡ |  | d¡d	¡ |  | d¡d¡ d S )
Nr4  rä  ó   bars   foobaró   bazr¡  s   bar
   ó   z)r   rV  rm   r»   r@   ©r½   Úbior   r   r   Útest_read_writeB  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ä  r4  r¡  s   for
   ó   o)	r   rV  rì  Úeofr»   r@   rm   Ú	write_eofr  ro  r   r   r   Útest_eofP  s    
zMemoryBIOTests.test_eofc                 C   s    t  ¡ }|  |jd¡ | d¡ |  |jd¡ tdƒD ]$}| d¡ |  |jd| d ¡ q6tdƒD ] }| d¡ |  |j|d ¡ qd| ¡  |  |jd¡ d S )Nr   r4  r   r
   r-  )r   rV  r»   Úpendingrm   rª  r@   )r½   rp  r®  r   r   r   Útest_pending`  s    


zMemoryBIOTests.test_pendingc                 C   sb   t  ¡ }| d¡ |  | ¡ d¡ | tdƒ¡ |  | ¡ d¡ | tdƒ¡ |  | ¡ d¡ d S )Nr4  rl  rm  )r   rV  rm   r»   r@   rÓ   Ú
memoryviewro  r   r   r   Útest_buffer_typesn  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   rV  rÑ   rÁ   rm   ro  r   r   r   Útest_error_typesw  s
    zMemoryBIOTests.test_error_typesN)rÏ  rÐ  rÑ  rq  ru  rw  ry  rz  r   r   r   r   rk  @  s
   	rk  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚSSLObjectTestsc                 C   sD   t  ¡ }|  td¡ t  ||¡ W d   ƒ n1 s60    Y  d S r¿   )r   rV  rÀ   rÁ   rT  ro  r   r   r   rÆ   €  s    z SSLObjectTests.test_private_initc              	   C   s<  t ƒ \}}}t ¡ }t ¡ }t ¡ }t ¡ }|j|||d}|j||dd}	tdƒD ]p}
z| ¡  W n tjyx   Y n0 |jrŽ| | 	¡ ¡ z|	 ¡  W n tjy®   Y n0 |jrT| | 	¡ ¡ qT| ¡  |	 ¡  |  
tj¡ | ¡  W d   ƒ n1 s0    Y  | | 	¡ ¡ |	 ¡  | | 	¡ ¡ | ¡  d S )Nrs  TrC  r‹   )r®   r   rV  rU  rª  rg  rf  rv  rm   r@   rÑ   Úunwrap)r½   Z
client_ctxZ
server_ctxr«   Zc_inZc_outZs_inZs_outÚclientrÊ  Ú_r   r   r   Útest_unwrap…  s8    (zSSLObjectTests.test_unwrapN)rÏ  rÐ  rÑ  rÆ   r  r   r   r   r   r{    s   r{  c                   @   sº   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Ze ejdkd¡dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zed!d"„ ƒZd#d$„ Zd%d&„ Zd'd(„ Zd)S )*ÚSimpleBackgroundTestsc                 C   s2   t tƒ}t|jf| _| ¡  |  |jd d d ¡ d S r   )ÚThreadedEchoServerr¤   rI  rË  Úserver_addrÚ	__enter__rß   Ú__exit__)r½   rÊ  r   r   r   ÚsetUp²  s    zSimpleBackgroundTests.setUpc                 C   sÀ   t t tj¡tjd8}| | j¡ |  i | ¡ ¡ |  	|j
¡ W d   ƒ n1 sT0    Y  t t tj¡tjtd6}| | j¡ |  | ¡ ¡ |  	|j
¡ W d   ƒ n1 s²0    Y  d S )Nr¶  ©r“   r”   )r£   rÂ   r&  r   r™   rH  r‚  r»   Úgetpeercertrì  rD  r²   rª   r  rÄ   r   r   r   Útest_connect¸  s    ÿ*þz"SimpleBackgroundTests.test_connectc                 C   s<   t t tj¡tjd}|  |j¡ |  tjd|j	| j
¡ d S )Nr¶  úcertificate verify failed)r£   rÂ   r&  r   r²   rß   rÜ   rÀ   rÒ   rH  r‚  rÄ   r   r   r   Útest_connect_failÇ  s    ÿ
ÿz'SimpleBackgroundTests.test_connect_failc                 C   sJ   t t tj¡tjtd}|  |j¡ |  d| 	| j
¡¡ |  | ¡ ¡ d S )Nr†  r   )r£   rÂ   r&  r   r²   rª   rß   rÜ   r»   rÈ  r‚  r  r‡  rÄ   r   r   r   Útest_connect_exÑ  s    þz%SimpleBackgroundTests.test_connect_exc              	   C   sÔ   t t tj¡tjtdd}|  |j¡ | d¡ | 	| j
¡}|  |dtjtjf¡ t g |gg d¡ z| ¡  W qÂW qd tjyš   t |gg g d¡ Y qd tjy¾   t g |gg d¡ Y qd0 qd|  | ¡ ¡ d S )NF)r“   r”   rx  r   r=  )r£   rÂ   r&  r   r²   rª   rß   rÜ   re  rÈ  r‚  r³   rL  ZEINPROGRESSrÉ  Úselectrg  rf  ÚSSLWantWriteErrorr  r‡  ©r½   rÅ   rÌ  r   r   r   Útest_non_blocking_connect_exÚ  s$    ý
z2SimpleBackgroundTests.test_non_blocking_connect_exc                 C   s  t  t j¡}| t tj¡¡,}| | j¡ |  i | 	¡ ¡ W d   ƒ n1 sP0    Y  |jt tj¡dd}| | j¡ W d   ƒ n1 s’0    Y  t j
|_| t¡ | t tj¡¡.}| | j¡ | 	¡ }|  |¡ W d   ƒ n1 sô0    Y  d S )NÚdummyrs  )r   rY   rM   rž   rÂ   r&  rH  r‚  r»   r‡  r²   r›   rœ   rª   r  ©r½   rH   rÅ   rY  r   r   r   Útest_connect_with_contextô  s    .ÿ*
z/SimpleBackgroundTests.test_connect_with_contextc                 C   sL   t  t j¡}t j|_| t tj¡¡}|  |j	¡ |  
t jd|j| j¡ d S )Nr‰  )r   rY   rM   r²   r›   rž   rÂ   r&  rß   rÜ   rÀ   rÒ   rH  r‚  )r½   rH   rÅ   r   r   r   Útest_connect_with_context_fail  s    
ÿz4SimpleBackgroundTests.test_connect_with_context_failc                 C   sä   t  t j¡}t j|_|jtd | t tj	¡¡.}| 
| j¡ | ¡ }|  |¡ W d   ƒ n1 sf0    Y  t  t j¡}t j|_|jtd | t tj	¡¡.}| 
| j¡ | ¡ }|  |¡ W d   ƒ n1 sÖ0    Y  d S )Nr  )r   rY   rM   r²   r›   rœ   rŠ  rž   rÂ   r&  rH  r‚  r‡  r  r  r‘  r   r   r   Útest_connect_capath  s    (z)SimpleBackgroundTests.test_connect_capathc                 C   s   t tƒ}| ¡ }W d   ƒ n1 s&0    Y  t |¡}t tj¡}tj|_|j	|d | 
t tj¡¡.}| | j¡ | ¡ }|  |¡ W d   ƒ n1 s 0    Y  t tj¡}tj|_|j	|d | 
t tj¡¡.}| | j¡ | ¡ }|  |¡ W d   ƒ n1 s0    Y  d S )Nr  )r?   rª   r@   r   r  rY   rM   r²   r›   rœ   rž   rÂ   r&  rH  r‚  r‡  r  )r½   rB   r  rC  rH   rÅ   rY  r   r   r   Útest_connect_cadata(  s"    
&
(z)SimpleBackgroundTests.test_connect_cadatar(  z*Can't use a socket as a file under Windowsc                 C   sœ   t t tj¡ƒ}| | j¡ | ¡ }| ¡ }| ¡  t 	|d¡ | ¡  t
 ¡  |  t¡}t 	|d¡ W d   ƒ n1 s|0    Y  |  |jjtj¡ d S r€   )r£   rÂ   r&  rH  r‚  ÚfilenoÚmakefilerÜ   r   r@   r<  r=  rÑ   r/  r»   rK  rL  ÚEBADF)r½   r*  ÚfdrB   r`  r   r   r   Útest_makefile_close=  s    *z)SimpleBackgroundTests.test_makefile_closec                 C   s¾   t   t j¡}| | j¡ | d¡ t|tjdd}|  |j	¡ d}z|d7 }| 
¡  W q¤W qB tjy~   t |gg g ¡ Y qB tjy    t g |gg ¡ Y qB0 qBtjrºtj d| ¡ d S )NF©r“   rx  r   r
   z9
Needed %d calls to do_handshake() to establish session.
)rÂ   r&  rH  r‚  re  r£   r   r™   rß   rÜ   rg  rf  rŒ  r  r   rk   ri   rl   rm   )r½   rÅ   Úcountr   r   r   Útest_non_blocking_handshakeP  s&    
þz1SimpleBackgroundTests.test_non_blocking_handshakec                 C   s   t | g| j¢R dtiŽ d S )NrY  )Ú_test_get_server_certificater‚  rª   r¼   r   r   r   Útest_get_server_certificatee  s    z1SimpleBackgroundTests.test_get_server_certificatec                 C   s   t | g| j¢R Ž  d S r   )Ú!_test_get_server_certificate_failr‚  r¼   r   r   r   Ú test_get_server_certificate_failh  s    z6SimpleBackgroundTests.test_get_server_certificate_failc              	   C   s  t t tj¡tjdd}| | j¡ W d   ƒ n1 s:0    Y  t t tj¡tjdd}| | j¡ W d   ƒ n1 s~0    Y  |  tjd¡X t tj¡,}t |tjdd}| | j¡ W d   ƒ n1 sÖ0    Y  W d   ƒ n1 sô0    Y  d S )NrÚ  )r“   r•   rÛ  rÜ  rÝ  )	r£   rÂ   r&  r   r™   rH  r‚  rÀ   rÒ   )r½   rÅ   rŸ   r   r   r   rß  m  s     ÿ*ÿ*ÿz"SimpleBackgroundTests.test_ciphersc                 C   s”   t  t j¡}|jtd |  | ¡ g ¡ |jt tj	¡dd.}| 
| j¡ | ¡ }|  |¡ W d   ƒ n1 sr0    Y  |  t| ¡ ƒd¡ d S )Nr  r&   rs  r
   )r   rY   rO   rœ   rŠ  r»   rB  rž   rÂ   r&  rH  r‚  r‡  r  rQ   r‘  r   r   r   Útest_get_ca_certs_capath{  s    ÿ(z.SimpleBackgroundTests.test_get_ca_certs_capathc                 C   s¼   t  t j¡}|jtd t  t j¡}|jtd t tj¡}|j|dd^}| | j	¡ |  
|j|¡ |  
|jj|¡ ||_|  
|j|¡ |  
|jj|¡ W d   ƒ n1 s®0    Y  d S )Nr  r&   rs  )r   rY   rO   rœ   rŠ  rÂ   r&  rž   rH  r‚  rÇ   r¢   Ú_sslobj)r½   Zctx1Zctx2rÅ   r*  r   r   r   Útest_context_setget‡  s    z)SimpleBackgroundTests.test_context_setgetc              
   O   sú   |  dtj¡}t ¡ | }d}	t ¡ |kr4|  d¡ d }
|	d7 }	z||Ž }W n@ tjyŒ } z&|jtj	tj
fvrr‚ |j}
W Y d }~n
d }~0 0 | ¡ }| |¡ |
d u r¬qÚq|
tj	kr| d¡}|rÐ| |¡ q| ¡  qtjrötj d|	|jf ¡ |S )Nr@  r   r
   i €  z"Needed %d calls to complete %s().
)Úgetr   ZSHORT_TIMEOUTr   Ú	monotonicrÙ   r   rÒ   rL  rh  ZSSL_ERROR_WANT_WRITEr@   Úsendallr0  rm   rt  rk   ri   rl   rÏ  )r½   rŸ   ÚincomingÚoutgoingr_   r]   r¡   r@  Údeadlinerœ  rL  Úretr`  Úbufr   r   r   Ússl_io_loop—  s:    
ÿ



ÿz!SimpleBackgroundTests.ssl_io_loopc                 C   s‚  t   t j¡}|  |j¡ | | j¡ t ¡ }t ¡ }t tj	¡}|  
|j¡ |  |jtj¡ | t¡ | ||dt¡}|  |jj|¡ |  | ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ |  t|j¡ dtjv rØ|  | d¡¡ |   ||||j!¡ |  
| ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ |  
| ¡ ¡ dtjv r>|  
| d¡¡ z|   ||||j"¡ W n tj#yj   Y n0 |  tj$|j%d¡ d S )NFr~  r4  )&rÂ   r&  rß   rÜ   rH  r‚  r   rV  rY   rO   r  rš   r»   r›   r²   rœ   rª   rU  r¥   rÇ   r£  Úownerr€  Úcipherr/   ÚassertIsNotNoneÚshared_ciphersrÑ   r~   r‡  rÓ  r{  r­  rg  r|  ZSSLSyscallErrorrÒ   rm   )r½   rŸ   r¨  r©  rH   Ússlobjr   r   r   Útest_bio_handshake¼  s>    

ÿ
z(SimpleBackgroundTests.test_bio_handshakec                 C   s¶   t   t j¡}|  |j¡ | | j¡ t ¡ }t ¡ }t tj	¡}tj
|_| ||d¡}|  ||||j¡ d}|  ||||j|¡ |  ||||jd¡}|  |d¡ |  ||||j¡ d S )NFó   FOO
é   s   foo
)rÂ   r&  rß   rÜ   rH  r‚  r   rV  rY   rM   r™   r›   rU  r­  rg  rm   r@   r»   r|  )r½   rŸ   r¨  r©  rH   r²  Zreqr¬  r   r   r   Útest_bio_read_write_dataÞ  s    z.SimpleBackgroundTests.test_bio_read_write_dataN)rÏ  rÐ  rÑ  r…  rˆ  rŠ  r‹  r  r’  r“  r”  r•  r\   rY  r   r   rš  r  rŸ  r¡  rß  r¢  r]  r¤  r­  r³  r¶  r   r   r   r   r€  ¯  s*   
	

%"r€  Znetworkc                   @   s*   e Zd Zdd„ Ze ejd¡dd„ ƒZdS )ÚNetworkedTestsc                 C   s¦   t  t¡ˆ tt tj¡tjdd}|  |j	¡ | 
d¡ | tdf¡}|dkr\|  d¡ n|tjkrp|  d¡ |  |tjtjf¡ W d   ƒ n1 s˜0    Y  d S )NFr›  gH¯¼šò×z>é»  r   z!REMOTE_HOST responded too quicklyzNetwork unreachable.)r   Útransient_internetÚREMOTE_HOSTr£   rÂ   r&  r   r²   rß   rÜ   r>  rÈ  rÅ  rL  ZENETUNREACHr³   ÚEAGAINrÉ  rŽ  r   r   r   Útest_timeout_connect_exò  s    þ


z&NetworkedTests.test_timeout_connect_exz
Needs IPv6c                 C   sF   t  d¡( t| ddƒ t| ddƒ W d   ƒ n1 s80    Y  d S )Nzipv6.google.comr¸  )r   r¹  rž  r   r¼   r   r   r   Ú test_get_server_certificate_ipv6	  s    z/NetworkedTests.test_get_server_certificate_ipv6N)	rÏ  rÐ  rÑ  r¼  r\   rÒ  r   rp  r½  r   r   r   r   r·  ï  s   r·  c                 C   sl   t  ||f¡}|s$|  d||f ¡ t j||f|d}|sL|  d||f ¡ tjrhtj d|||f ¡ d S )NzNo server certificate on %s:%s!©r”   z&
Verified certificate for %s:%s is
%s
)r   Úget_server_certificaterÙ   r   rk   ri   rl   rm   )Útestrl  rË  rY  r  r   r   r   rž  		  s    rž  c              
   C   sl   zt j||ftd}W n< t jyR } z"tjr>tj d| ¡ W Y d }~nd }~0 0 |  	d|||f ¡ d S )Nr¾  z%s
z$Got server certificate %s for %s:%s!)
r   r¿  rç   rÒ   r   rk   ri   rl   rm   rÙ   )rÀ  rl  rË  r  Úxr   r   r   r   	  s    &r   )Úmake_https_serverc                   @   sR   e Zd ZG dd„ dejƒZddd„Zdd	„ Zd
d„ Zddd„Z	dd„ Z
dd„ ZdS )r  c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )z$ThreadedEchoServer.ConnectionHandlerc                 C   s@   || _ d| _|| _|| _| j d¡ d | _tj | ¡ d| _	d S ©NFT)
rÊ  ÚrunningrŸ   Úaddrre  ÚsslconnÚ	threadingÚThreadÚ__init__Údaemon)r½   rÊ  ZconnsockrÅ  r   r   r   rÉ  )	  s    z-ThreadedEchoServer.ConnectionHandler.__init__c              
   C   s0  zD| j jj| jdd| _| j j | j ¡ ¡ | j j | j 	¡ ¡ W  nú t
ttfy® } zL| j j t|ƒ¡ | j jrŠtdt| jƒ d ƒ d| _|  ¡  W Y d }~dS d }~0  tjtfy> } zr| j j t|ƒ¡ | j j rötdt| jƒ d ƒ |jtjkr(tjdkr(d| _| j  ¡  |  ¡  W Y d }~dS d }~0 0 | j j | j ¡ ¡ | j jjtjkrÖ| j  ¡ }t!j"rœ| j jrœtj# $dt% &|¡ d ¡ | j  d¡}t!j"rÖ| j jrÖtj# $d	tt'|ƒƒ d
 ¡ | j (¡ }t!j"r(| j jr(tj# $dt|ƒ d ¡ tj# $dt| j ¡ ƒ d ¡ dS d S )NTrC  z'
 server:  bad connection attempt from z:
FÚdarwinz client cert is rä   z cert binary is z bytes
z" server: connection cipher is now z" server: selected protocol is now ))rÊ  r¢   rž   rŸ   rÆ  Úselected_npn_protocolsÚappendÚselected_npn_protocolÚselected_alpn_protocolsÚselected_alpn_protocolÚConnectionResetErrorÚBrokenPipeErrorÚConnectionAbortedErrorÚconn_errorsrK   Úchattyro   r‚  rÅ  rÄ  rÜ   r   rÒ   r/  rL  Z
EPROTOTYPEri   rÔ  Ústopr±  r›   r²   r‡  r   rk   rl   rm   rë   rì   rQ   r¯  )r½   r`  rY  Zcert_binaryr¯  r   r   r   Ú	wrap_conn3	  sN    ÿ



ÿÿz.ThreadedEchoServer.ConnectionHandler.wrap_connc                 C   s    | j r| j  ¡ S | j d¡S d S )Nrµ  )rÆ  r@   rŸ   r0  r¼   r   r   r   r@   q	  s    
z)ThreadedEchoServer.ConnectionHandler.readc                 C   s"   | j r| j  |¡S | j |¡S d S r   )rÆ  rm   rŸ   r4  )r½   r˜  r   r   r   rm   w	  s    z*ThreadedEchoServer.ConnectionHandler.writec                 C   s    | j r| j  ¡  n
| j ¡  d S r   )rÆ  rÜ   rŸ   r¼   r   r   r   rÜ   }	  s    z*ThreadedEchoServer.ConnectionHandler.closec              
   C   sØ  d| _ | jjs|  ¡ sd S | j rÔzÄ|  ¡ }| ¡ }|svd| _ z| j ¡ | _W n t	yb   Y n0 d | _|  
¡  np|dkr¦tjr˜| jjr˜tj d¡ |  
¡  W d S | jjrì|dkrìtjrÐ| jjrÐtj d¡ |  d¡ |  ¡ sèW d S nú| jjrd| jrd|dkrdtjr&| jjr&tj d	¡ |  d¡ | j ¡ | _d | _tjræ| jjrætj d
¡ n‚|dkr´tjrŒ| jjrŒtj d¡ | j d¡}|  t|ƒ d¡d ¡ n2|dkr8tjrÜ| jjrÜtj d¡ z| j ¡  W n@ tjy* } z$|  t|ƒ d¡d ¡ W Y d }~nd }~0 0 |  d¡ n®|dkrj| j ¡ d ur^|  d¡ n
|  d¡ n||dkr˜| j ¡ }|  t|ƒ d¡d ¡ nNtjrØ| jjrØ| jr¸dpºd}tj d||| ¡ |f ¡ |  | ¡ ¡ W q ttfy4   | jjr"tjr"tj d | j¡¡ |  
¡  d| _ Y q tjy” } zFd|jkr€| jjrvtjrvtj |jd ¡ t d¡‚W Y d }~qd }~0  t	yÐ   | jjr´t dƒ |  
¡  d| _ | j !¡  Y q0 qd S )NTFs   overz" server: client closed connection
ó   STARTTLSz2 server: read STARTTLS from client, sending OK...
ó   OK
ó   ENDTLSz0 server: read ENDTLS from client, sending OK...
z* server: connection is now unencrypted...
s   CB tls-uniquez@ server: read CB tls-unique from client, sending our CB data...
r~  úus-asciió   
ó   PHAz( server: initiating post handshake auth
ó   HASCERTó   TRUE
ó   FALSE
ó   GETCERTZ	encryptedZunencryptedz/ server: read %r (%s), sending back %r (%s)...
z Connection reset by peer: {}
Z!PEER_DID_NOT_RETURN_A_CERTIFICATEr
   ú!tlsv13 alert certificate requiredzTest server failure:
)"rÄ  rÊ  Ústarttls_serverr×  r@   ÚstriprÆ  r|  rŸ   r/  rÜ   r   rk   Úconnectionchattyri   rl   rm   r{  r‚  rn  Úverify_client_post_handshaker   rÒ   r‡  rÄ  rÑ  rÓ  rÕ  ÚformatrÅ  rb  r]   ro   rÖ  )r½   ÚmsgÚstrippedrÕ   r`  rY  ZctypeÚerrr   r   r   Úrunƒ	  s®    ÿ

ÿ


.


ÿÿÿÿ

z(ThreadedEchoServer.ConnectionHandler.runN)	rÏ  rÐ  rÑ  rÉ  r×  r@   rm   rÜ   rë  r   r   r   r   ÚConnectionHandler#	  s   
>rì  NTFc                 C   sð   |r|| _ n€t |d ur|ntj¡| _ |d ur2|ntj| j _|rL| j  |¡ |r\| j  |¡ |rl| j  |¡ |	r|| j  	|	¡ |
rŒ| j  
|
¡ || _|| _|| _t ¡ | _t | j¡| _d | _d| _g | _g | _g | _g | _tj | ¡ d| _d S rÃ  )r¢   r   rY   rN   r™   r›   rœ   r   Úset_npn_protocolsÚset_alpn_protocolsrF   rÕ  rå  rã  rÂ   rŸ   r   rÇ  rË  ÚflagÚactiverÌ  rÏ  r±  rÔ  rÇ  rÈ  rÉ  rÊ  )r½   Zcertificater    ÚcertreqsÚcacertsrÕ  rå  rã  Znpn_protocolsZalpn_protocolsr•   r¢   r   r   r   rÉ  ë	  sB    ÿþÿ
zThreadedEchoServer.__init__c                 C   s   |   t ¡ ¡ | j ¡  | S r   ©ÚstartrÇ  ÚEventrï  Úwaitr¼   r   r   r   rƒ  
  s    
zThreadedEchoServer.__enter__c                 G   s   |   ¡  |  ¡  d S r   )rÖ  r   ©r½   r]   r   r   r   r„  
  s    zThreadedEchoServer.__exit__c                 C   s   || _ tj | ¡ d S r   ©rï  rÇ  rÈ  rô  ©r½   rï  r   r   r   rô  
  s    zThreadedEchoServer.startc              
   C   s
  | j  d¡ | j  ¡  d| _| jr,| j ¡  | jrüzT| j  ¡ \}}tjrf| j	rft
j dt|ƒ d ¡ |  | ||¡}| ¡  | ¡  W q, tjyš   Y q, ty²   |  ¡  Y q, tyø } z0tjrä| j	rät
j dt|ƒ d ¡ W Y d }~q,d }~0 0 q,| j  ¡  d S )Ngš™™™™™©?Tz server:  new connection from rä   z connection handling failed: )rŸ   r>  Úlistenrð  rï  r–  r-  r   rk   rÕ  ri   rl   rm   r‚  rì  rô  r   rÂ   r@  ÚKeyboardInterruptrÖ  rÝ   rÜ   )r½   ZnewconnZconnaddrÚhandlerr`  r   r   r   rë  
  s6    

ÿÿÿzThreadedEchoServer.runc                 C   s
   d| _ d S r˜   )rð  r¼   r   r   r   rÖ  8
  s    zThreadedEchoServer.stop)NNNNTFFNNNN)N)rÏ  rÐ  rÑ  rÇ  rÈ  rì  rÉ  rƒ  r„  rô  rë  rÖ  r   r   r   r   r  !	  s    I     ü
%
r  c                   @   sX   e Zd ZG dd„ dejƒZdd„ Zdd„ Zdd„ Zd	d
„ Z	ddd„Z
dd„ Zdd„ ZdS )ÚAsyncoreEchoServerc                   @   s6   e Zd ZG dd„ dejƒZdd„ Zdd„ Zdd„ Zd	S )
zAsyncoreEchoServer.EchoServerc                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )z/AsyncoreEchoServer.EchoServer.ConnectionHandlerc                 C   s4   t |d|dd| _tj | | j¡ d| _|  ¡  d S )NTF)rD  r–   rx  )r£   rÂ   ÚasyncoreÚdispatcher_with_sendrÉ  Ú_ssl_acceptingÚ_do_ssl_handshake)r½   Úconnr–   r   r   r   rÉ  C
  s    þz8AsyncoreEchoServer.EchoServer.ConnectionHandler.__init__c                 C   s*   t | jtjƒr&| j ¡ dkr&|  ¡  qdS )Nr   T)rJ   rÂ   r   rÃ   rv  Zhandle_read_eventr¼   r   r   r   ÚreadableK
  s    
z8AsyncoreEchoServer.EchoServer.ConnectionHandler.readablec              
   C   sª   z| j  ¡  W n tjtjfy*   Y d S  tjyD   |  ¡  Y S  tjyX   ‚ Y nN tyž } z0|j	d t
jkrŠ|  ¡ W  Y d }~S W Y d }~nd }~0 0 d| _d S )Nr   F)rÂ   rg  r   rf  r  ZSSLEOFErrorÚhandle_closerÒ   r/  r]   rL  ZECONNABORTEDr   )r½   rê  r   r   r   r  Q
  s    *zAAsyncoreEchoServer.EchoServer.ConnectionHandler._do_ssl_handshakec                 C   sT   | j r|  ¡  n@|  d¡}tjr4tj dt|ƒ ¡ |sB|  	¡  n|  
| ¡ ¡ d S )Nrµ  z server:  read %s from client
)r   r  r0  r   rk   ri   rl   rm   r‚  rÜ   r4  rÄ  )r½   rÕ   r   r   r   Úhandle_read`
  s    


z;AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_readc                 C   s$   |   ¡  tjr tj d| j ¡ d S )Nz server:  closed connection %s
)rÜ   r   rk   ri   rl   rm   rÂ   r¼   r   r   r   r  l
  s    z<AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_closec                  C   s   ‚ d S r   r   r¼   r   r   r   ro   q
  s    z<AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_errorN)	rÏ  rÐ  rÑ  rÉ  r  r  r  r  ro   r   r   r   r   rì  A
  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ú  rQ  r   r   r   rÉ  t
  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   rk   ri   rl   rm   rì  r–   )r½   Zsock_objrÅ  r   r   r   Úhandle_accepted{
  s    z-AsyncoreEchoServer.EchoServer.handle_acceptedc                  C   s   ‚ d S r   r   r¼   r   r   r   ro   €
  s    z*AsyncoreEchoServer.EchoServer.handle_errorN)	rÏ  rÐ  rÑ  rþ  rÿ  rì  rÉ  r  ro   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ƒ  Ž
  s    
zAsyncoreEchoServer.__enter__c                 G   sV   t jrtj d¡ |  ¡  t jr,tj d¡ |  ¡  t jrFtj d¡ tjdd d S )Nz cleanup: stopping server.
z! cleanup: joining server thread.
z cleanup: successfully joined.
T)Z
ignore_all)	r   rk   ri   rl   rm   rÖ  r   rþ  Z	close_allr÷  r   r   r   r„  “
  s    zAsyncoreEchoServer.__exit__Nc                 C   s   || _ tj | ¡ d S r   rø  rù  r   r   r   rô  Ÿ
  s    zAsyncoreEchoServer.startc                 C   s>   d| _ | jr| j ¡  | j r:zt d¡ W q   Y q0 qd S )NTr
   )rð  rï  r–  rþ  Zloopr¼   r   r   r   rë  £
  s    
zAsyncoreEchoServer.runc                 C   s   d| _ | j ¡  d S r˜   )rð  rÊ  rÜ   r¼   r   r   r   rÖ  ­
  s    zAsyncoreEchoServer.stop)N)rÏ  rÐ  rÑ  rþ  r  r	  rÉ  r  rƒ  r„  rô  rë  rÖ  r   r   r   r   rý  ;
  s   D

rý  r´  TFc                 C   sž  i }t ||dd}|p | jt ¡ ||d}	|	 t|jf¡ |t|ƒt|ƒfD ]†}
|rrtj	rrt
j d| ¡ |	 |
¡ |	 ¡ }|ržtj	ržt
j d| ¡ || ¡ krTtd|d d… t|ƒ|d d…  ¡ t|ƒf ƒ‚qT|	 d¡ |rütj	rüt
j d	¡ | |	 ¡ |	 ¡ |	 ¡ |	 ¡ |	 ¡ |	 ¡ |	j|	jd
œ¡ |	 ¡  W d   ƒ n1 sR0    Y  |j|d< |j|d< |j|d< W d   ƒ n1 s0    Y  |S )NF©r¢   rÕ  rå  )rt  Úsessionú client:  sending %r...
ú client:  read %r
ú4bad data <<%r>> (%d) received; expected <<%r>> (%d)
é   ó   over
ú client:  closing connection.
)Úcompressionr¯  ÚpeercertÚclient_alpn_protocolÚclient_npn_protocolr/   Úsession_reusedr  Úserver_alpn_protocolsÚserver_npn_protocolsÚserver_shared_ciphers)r  rž   rÂ   rH  rI  rË  rÓ   rx  r   rk   ri   rl   rm   r@   rÄ  ÚAssertionErrorrQ   r›  r  r¯  r‡  rÐ  rÎ  r/   r  r  rÜ   rÏ  rÌ  r±  )r¬   r­   ÚindatarÕ  rå  Úsni_namer  rH  rÊ  rÅ   ÚargÚoutdatar   r   r   Úserver_params_test±
  sb    þ
ÿÿ
ÿÿÿ
ø
(

*r!  c              
   C   sÎ  |d u rt j}t jdt jdt jdi| }tjr\|r6dp8d}tj |t  	|¡t  	| ¡|f ¡ t  
|¡}| j|O  _t  
| ¡}	|	 j|O  _t |d ¡}
|
d urÄt|	dƒrÄ| t jkrÄ|	j|
krÄ|
|	_|jt jkrÚ| d¡ t|	|ƒ ||	fD ]}||_| t¡ | t¡ qìzt||	ddd	}W nX t jy>   |r:‚ Y nŒ tyx } z"|sb|jtjkrd‚ W Y d }~nZd }~0 0 |sžtd
t  	|¡t  	| ¡f ƒ‚n,|durÊ||d krÊtd||d f ƒ‚d S )Nr™   r±   r²   z %s->%s %s
z {%s->%s} %s
rD   rÚ  F©rÕ  rå  z5Client protocol %s succeeded with server protocol %s!Tr/   z%version mismatch: expected %r, got %r)r   r™   r±   r²   r   rk   ri   rl   rm   Zget_protocol_namerY   rè  ÚPROTOCOL_TO_TLS_VERSIONr¥  rE   rM   rD   rR   rF   rI   r›   r   r¤   rœ   rª   r!  rÒ   r/  rL  Ú
ECONNRESETr  )Zserver_protocolZclient_protocolÚexpect_successZ	certsreqsÚserver_optionsÚclient_optionsZcerttypeZ	formatstrr¬   r­   Zmin_versionrH   rH  r`  r   r   r   Útry_protocol_comboã
  sx    	ýüþÿ

ýüû


ÿ
ÿÿÿ

ÿ
ÿr(  c                   @   sð  e Zd Zdd„ Zdd„ Ze eƒ d¡dd„ ƒZdd	„ Z	e e
jd
¡dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zedƒdd„ ƒZdd„ Zdd„ Zedƒdd„ ƒZdd „ Zed!ƒd"d#„ ƒZed$ƒd%d&„ ƒZed'ƒd(d)„ ƒZed*ƒd+d,„ ƒZd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Z d9d:„ Z!d;d<„ Z"d=d>„ Z#d?d@„ Z$dAdB„ Z%dCdD„ Z&edƒdEdF„ ƒZ'e(ed*ƒdGdH„ ƒƒZ)e(ed'ƒdIdJ„ ƒƒZ*e(ed*ƒed$ƒdKdL„ ƒƒƒZ+e(ed!ƒdMdN„ ƒƒZ,e e
j-dO¡dPdQ„ ƒZ.e dRe
j/v dS¡dTdU„ ƒZ0dVdW„ Z1e e2e
dXƒdY¡dZd[„ ƒZ3e 4e5d\¡d]d^„ ƒZ6e e7d_¡e 4e8d`¡dadb„ ƒƒZ9dcdd„ Z:e e
j;de¡dfdg„ ƒZ<e e
j;dh¡didj„ ƒZ=dkdl„ Z>e e
j?dm¡dndo„ ƒZ@dpdq„ ZAdrds„ ZBeCdtdu„ ƒZDeCdvdw„ ƒZEeCdxdy„ ƒZFeCdzd{„ ƒZGd|d}„ ZHd~d„ ZId€d„ ZJd‚dƒ„ ZKd„d…„ ZLd†S )‡ÚThreadedTestsc              	   C   s~  t jrtj d¡ tD ]~}|tjtjhv r,qt	|ƒs6q| j
tj| d< t |¡}| t¡ t|ƒ t||ddd W d   ƒ q1 sŠ0    Y  qtƒ \}}}| j
tjtjd" t||dd|d W d   ƒ n1 sÜ0    Y  d|_| j
tjtjdb |  tj¡"}t||dd|d W d   ƒ n1 s60    Y  |  dt|jƒ¡ W d   ƒ n1 sh0    Y  | j
tjtjd` |  tj¡ }t||ddd	 W d   ƒ n1 sº0    Y  |  dt|jƒ¡ W d   ƒ n1 sì0    Y  | j
tjtjd` |  tj¡ }t||ddd	 W d   ƒ n1 s>0    Y  |  dt|jƒ¡ W d   ƒ n1 sp0    Y  d S )
Nrä   )rR   Tr"  )r}  rÊ  )r¬   r­   rÕ  rå  r  Fz%called a function you should not call)r¬   r­   rÕ  rå  )r   rk   ri   rl   rm   r×  r   rO   rN   rS   ZsubTestÚ_PROTOCOL_NAMESrY   r   rç   rI   r!  r®   rš   rÑ   rÒ   r³   rK   rK  )r½   rR   r¢   r¬   r­   r«   r`  r   r   r   Ú	test_echo.  sd    

ÿ&ý$ý&ÿ$þ&ÿ$þ&ÿzThreadedTests.test_echoc           
   
   C   sž  t jrtj d¡ tƒ \}}}t|dd}|X |jt ¡ d|d }| 	t
|jf¡ |  t¡ | ¡  W d   ƒ n1 s‚0    Y  | ¡  | ¡ }|  |d¡ | ¡ }t jrätj t |¡d ¡ tj dt|ƒ d ¡ d|vr|  d	t |¡ ¡ d
|d vr|  d¡ |  d|¡ |  d|¡ t |d ¡}t |d ¡}	|  ||	¡ W d   ƒ n1 sp0    Y  W d   ƒ n1 s0    Y  d S )Nrä   F©r¢   rÕ  )rx  rt  úCan't get peer certificate.zConnection cipher is z.
r-   z$No subject field in certificate: %s.r#   zkMissing or invalid 'organizationName' field in certificate subject; should be 'Python Software Foundation'.r+   r*   )r   rk   ri   rl   rm   r®   r  rž   rÂ   rH  rI  rË  rÑ   r~   r‡  rg  r  r¯  rë   rì   rK   rÙ   r³   r   r¹  r  )
r½   r¬   r­   r«   rÊ  rÅ   rY  r¯  ÚbeforeZafterr   r   r   Útest_getpeercert`  sF    
þ&
ÿÿÿzThreadedTests.test_getpeercertrõ  c              
   C   s  t jrtj d¡ tƒ \}}}ttddƒ}|  |j	tj
|B ¡ t|dd}|f |jt ¡ |d4}| t|jf¡ | ¡ }|  |d¡ W d   ƒ n1 sœ0    Y  W d   ƒ n1 sº0    Y  | j	tjO  _	t|dd}|„ |jt ¡ |dP}|  tjd¡  | t|jf¡ W d   ƒ n1 s00    Y  W d   ƒ n1 sP0    Y  W d   ƒ n1 sp0    Y  | t¡ t|dd}|h |jt ¡ |d4}| t|jf¡ | ¡ }|  |d¡ W d   ƒ n1 sä0    Y  W d   ƒ n1 s0    Y  d S )	Nrä   rö  r   Tr,  rs  r-  r‰  )r   rk   ri   rl   rm   r®   rL   r   r»   r÷  rø  r  rž   rÂ   rH  rI  rË  r‡  r  rù  rÀ   rÒ   rœ   ÚCRLFILE)r½   r¬   r­   r«   rú  rÊ  rÅ   rY  r   r   r   Útest_crl_check„  sF    
ÿH
ÿÿp

ÿzThreadedTests.test_crl_checkc              
   C   sà  t jrtj d¡ tƒ \}}}t|dd}|f |jt ¡ |d4}| 	t
|jf¡ | ¡ }|  |d¡ W d   ƒ n1 s|0    Y  W d   ƒ n1 sš0    Y  t|dd}|‚ |jt ¡ ddN}|  tjd¡  | 	t
|jf¡ W d   ƒ n1 sþ0    Y  W d   ƒ n1 s0    Y  W d   ƒ n1 s>0    Y  t|dd}|r t ¡ H}|  td¡ | |¡ W d   ƒ n1 s’0    Y  W d   ƒ n1 s²0    Y  W d   ƒ n1 sÒ0    Y  d S )	Nrä   Tr,  rs  r-  rq  z:Hostname mismatch, certificate is not valid for 'invalid'.z'check_hostname requires server_hostname)r   rk   ri   rl   rm   r®   r  rž   rÂ   rH  rI  rË  r‡  r  rÀ   r   r[  r~   )r½   r¬   r­   r«   rÊ  rÅ   rY  r   r   r   rO  ®  s<    
ÿH
ÿþn
ÿz!ThreadedTests.test_check_hostnamez)test requires hostname_checks_common_namec              
   C   s>  t ƒ \}}}d|_t|dd}|R |jt ¡ |d }| t|jf¡ W d   ƒ n1 s\0    Y  W d   ƒ n1 sz0    Y  t tƒ\}}}d|_t|dd}|€ |jt ¡ |dL}|  	t
j¡  | t|jf¡ W d   ƒ n1 sð0    Y  W d   ƒ n1 s0    Y  W d   ƒ n1 s00    Y  d S )NFTr,  rs  )r®   rï  r  rž   rÂ   rH  rI  rË  r¨   rÑ   r   ÚSSLCertVerificationError©r½   r¬   r­   r«   rÊ  rÅ   r   r   r   rò  Ï  s&    
ÿL
ÿz.ThreadedTests.test_hostname_checks_common_namec              	   C   sê   t  t j¡}| t¡ | d¡ t}t  t j¡}| t	¡ t
|dd}|Œ |jt ¡ |dZ}| t|jf¡ | ¡ }|  |d¡ | ¡ d  d¡}|  |d d… d	¡ W d   ƒ n1 s¾0    Y  W d   ƒ n1 sÜ0    Y  d S ©
NzECDHE:ECDSA:!NULL:!aRSATr,  rs  r-  r   ú-r¡  )ZECDHEZECDSA)r   rY   rO   rœ   rª   rF   ÚSIGNED_CERTFILE_ECC_HOSTNAMErN   r   ÚSIGNED_CERTFILE_ECCr  rž   rÂ   rH  rI  rË  r‡  r  r¯  Úsplit©r½   r¬   r«   r­   rÊ  rÅ   rY  r¯  r   r   r   Útest_ecc_certç  s"    



ÿzThreadedTests.test_ecc_certc              	   C   s  t  t j¡}| t¡ | jt jO  _| d¡ t}t  t j	¡}| 
t¡ | 
t¡ t|dd}|Œ |jt ¡ |dZ}| t|jf¡ | ¡ }|  |d¡ | ¡ d  d¡}|  |d d… d	¡ W d   ƒ n1 sØ0    Y  W d   ƒ n1 sö0    Y  d S r4  )r   rY   rO   rœ   rª   rè  r¸   rF   r6  rN   r   r7  r¤   r  rž   rÂ   rH  rI  rË  r‡  r  r¯  r8  r9  r   r   r   Útest_dual_rsa_eccü  s&    




ÿzThreadedTests.test_dual_rsa_eccc           	   
   C   s¬  t jrtj d¡ t tj¡}| t	¡ t tj
¡}tj|_d|_| t¡ g d¢}|D ]ª\}}t|dd}|‚ |jt ¡ |dP}|  |j|¡ | t|jf¡ | ¡ }|  |j|¡ |  |d¡ W d   ƒ n1 sÚ0    Y  W d   ƒ qX1 sø0    Y  qXt|dd}|‚ |jt ¡ ddN}|  tj¡  | t|jf¡ W d   ƒ n1 s^0    Y  W d   ƒ n1 s~0    Y  W d   ƒ n1 sž0    Y  d S )Nrä   T))u   kÃ¶nig.idn.pythontest.netúxn--knig-5qa.idn.pythontest.net)r<  r<  )s   xn--knig-5qa.idn.pythontest.netr<  )u(   kÃ¶nigsgÃ¤ÃŸchen.idna2003.pythontest.netú.xn--knigsgsschen-lcb0w.idna2003.pythontest.net)r=  r=  )s.   xn--knigsgsschen-lcb0w.idna2003.pythontest.netr=  )ú.xn--knigsgchen-b4a3dun.idna2008.pythontest.netr>  )s.   xn--knigsgchen-b4a3dun.idna2008.pythontest.netr>  r,  rs  r-  zpython.example.org)r   rk   ri   rl   rm   r   rY   rN   r   ÚIDNSANSFILErO   r²   r›   rš   rœ   rª   r  rž   rÂ   r»   rt  rH  rI  rË  r‡  r  rÑ   r[  )	r½   r­   r¢   Zidn_hostnamesrt  Zexpected_hostnamerÊ  rÅ   rY  r   r   r   Útest_check_hostname_idn  s:    


ÿJ
ÿz%ThreadedTests.test_check_hostname_idnc                 C   s6  t ƒ \}}}| t¡ tj|_tjj|_t	|ddd}|æ |j
t ¡ |d²}z| t|jf¡ W n‚ tjy  } z"tjrŒtj d| ¡ W Y d }~nZd }~0  tyæ } z0|jtjkr¼‚ tjrÒtj d| ¡ W Y d }~nd }~0 0 |  d¡ W d   ƒ n1 s0    Y  W d   ƒ n1 s(0    Y  d S )NTr  rs  ú
SSLError is %r
ú
socket.error is %r
ú'Use of invalid cert should have failed!)r®   r   rç   r   r²   r›   r   rX   rU   r  rž   rÂ   rH  rI  rË  rÒ   r   rk   ri   rl   rm   r/  rL  r$  rÙ   ©r½   r¬   r­   r«   rÊ  rÅ   r`  r   r   r   Útest_wrong_cert_tls12N  s0    

ÿ
ÿÿ$&z#ThreadedTests.test_wrong_cert_tls12ró  c                 C   sV  t ƒ \}}}| t¡ tj|_tjj|_tjj|_t	|ddd}|ü |j
t ¡ |dÈ}| t|jf¡ z| d¡ | d¡ W n„ tjy¾ } z"tjrªtj d| ¡ W Y d }~n\d }~0  ty } z0|jtjkrÜ‚ tjròtj d| ¡ W Y d }~nd }~0 0 |  d¡ W d   ƒ n1 s(0    Y  W d   ƒ n1 sH0    Y  d S )	NTr  rs  ó   datar‰   rA  rB  rC  )r®   r   rç   r   r²   r›   r   ró  rD   r  rž   rÂ   rH  rI  rË  rm   r@   rÒ   r   rk   ri   rl   r/  rL  r$  rÙ   rD  r   r   r   Útest_wrong_cert_tls13s  s6    


ÿ
ÿÿ
$&z#ThreadedTests.test_wrong_cert_tls13c                    s|   t  ¡ ‰t  ¡ ‰ t ¡ ‰t ˆt¡‰‡ ‡‡fdd„}‡ ‡‡‡fdd„}t j|d}| ¡  z|ƒ  W | ¡  n
| ¡  0 d S )Nc                     s8   ˆ  ¡  ˆ ¡  ˆ ¡ \} }|  ¡  ˆ ¡  ˆ  ¡  d S r   )rú  r–  r-  rÜ   )ZnewsockrÅ  )Úlistener_goneÚlistener_readyrÅ   r   r   Úlistener   s    z2ThreadedTests.test_rude_shutdown.<locals>.listenerc               	      st   ˆ  ¡  t ¡ P} |  tˆf¡ ˆ   ¡  zt| ƒ}W n tyF   Y n0 ˆ d¡ W d   ƒ n1 sf0    Y  d S )Nz2connecting to closed SSL socket should have failed)rö  rÂ   rH  rI  r£   r/  rÙ   )r|  Ússl_sock)rH  rI  rË  r½   r   r   Ú	connector¨  s    
z3ThreadedTests.test_rude_shutdown.<locals>.connector©Útarget)	rÇ  rõ  rÂ   r   rÇ  rI  rÈ  rô  r   )r½   rJ  rL  r   r   )rH  rI  rË  rÅ   r½   r   Útest_rude_shutdown’  s    z ThreadedTests.test_rude_shutdownc                 C   s&  t jrtj d¡ t tj¡}| t	¡ t tj
¡}t|dd}|Ì |jt ¡ tdš}z| t|jf¡ W nt tjyâ } zZd}|  |tj¡ |  |jd¡ |  |j|¡ |  |t|ƒ¡ |  dt|ƒ¡ W Y d }~n
d }~0 0 W d   ƒ n1 sø0    Y  W d   ƒ n1 s0    Y  d S )Nrä   Tr,  rs  z&unable to get local issuer certificater  r‰  )r   rk   ri   rl   rm   r   rY   rN   r   r¤   rO   r  rž   rÂ   r¥   rH  rI  rË  rÒ   r  r2  r»   Zverify_codeZverify_messager³   r‚  )r½   r­   r¢   rÊ  rÅ   r`  rè  r   r   r   Útest_ssl_cert_verify_error»  s(    

ÿz(ThreadedTests.test_ssl_cert_verify_errorrT   c                 C   sÎ   t jrtj d¡ ttjtjdƒ ttjtjdtjƒ ttjtjdtj	ƒ ttjtj
dƒ tdƒrrttjtjdƒ ttjtjdƒ tƒ ržttjtj
dtjd ttjtj
dtjd ttjtj
dtjd d S )Nrä   TFr   ©r'  )r   rk   ri   rl   rm   r(  r   ÚPROTOCOL_SSLv2r±   r²   rM   rP   ÚPROTOCOL_SSLv3r   ry   rµ   r¶   r·   r¼   r   r   r   Útest_protocol_sslv2Ò  s&    ÿÿÿz!ThreadedTests.test_protocol_sslv2c              
   C   sª  t jrtj d¡ tdƒrnzttjtj	dƒ W n> t
yl } z&t jrXtj dt|ƒ ¡ W Y d }~n
d }~0 0 tdƒr†ttjtjdƒ ttjtjdƒ tdƒr®ttjtjdƒ tdƒrÊttjtjdtjƒ ttjtjdtjƒ tdƒrúttjtjdtjƒ tdƒrttjtjdtjƒ ttjtjdtjƒ tdƒrJttjtjdtjƒ tdƒrjttjtjdtjd ttjtjdtjtjB d tdƒr¦ttjtjdtjd d S )	Nrä   rT   Tz; SSL2 client to SSL23 server test unexpectedly failed:
 %s
r   Fr   )r&  )r   rk   ri   rl   rm   rP   r(  r   rM   rR  r/  rK   rS  r   r±   r²   r¶   rµ   r·   )r½   rÁ  r   r   r   Útest_PROTOCOL_TLSè  sL    ÿÿ


ÿ
ÿ
ÿzThreadedTests.test_PROTOCOL_TLSr   c                 C   s¨   t jrtj d¡ ttjtjdƒ ttjtjdtjƒ ttjtjdtj	ƒ t
dƒrbttjtjdƒ ttjtjdtjd ttjtjdƒ tƒ r¤ttjtjdtjd d S )Nrä   r   rT   FrQ  )r   rk   ri   rl   rm   r(  r   rS  r±   r²   rP   rR  rM   r¶   r   ry   rµ   r¼   r   r   r   Útest_protocol_sslv3  s    ÿ
ÿz!ThreadedTests.test_protocol_sslv3r   c                 C   s”   t jrtj d¡ ttjtjdƒ ttjtjdtjƒ ttjtjdtj	ƒ t
dƒrbttjtjdƒ t
dƒrzttjtjdƒ ttjtjdtjd d S )Nrä   r   rT   Fr   rQ  )r   rk   ri   rl   rm   r(  r   r   r±   r²   rP   rR  rS  rM   r·   r¼   r   r   r   Útest_protocol_tlsv1$  s    ÿz!ThreadedTests.test_protocol_tlsv1r   c                 C   sœ   t jrtj d¡ ttjtjdƒ tdƒr:ttjtj	dƒ tdƒrRttjtj
dƒ ttjtjdtjd ttjtjdƒ ttjtjdƒ ttjtjdƒ d S )Nrä   úTLSv1.1rT   Fr   rQ  )r   rk   ri   rl   rm   r(  r   r   rP   rR  rS  rM   r¹   ÚPROTOCOL_TLSv1_2r¼   r   r   r   Útest_protocol_tlsv1_13  s    ÿz#ThreadedTests.test_protocol_tlsv1_1rX   c                 C   sÒ   t jrtj d¡ ttjtjdtjtj	B tjtj	B d t
dƒrPttjtjdƒ t
dƒrhttjtjdƒ ttjtjdtjd ttjtjdƒ ttjtjdƒ ttjtjdƒ ttjtjdƒ ttjtjdƒ d S )Nrä   úTLSv1.2)r&  r'  rT   Fr   rQ  )r   rk   ri   rl   rm   r(  r   rY  r¶   rµ   rP   rR  rS  rM   rº   r   r   r¼   r   r   r   Útest_protocol_tlsv1_2E  s$    

þÿz#ThreadedTests.test_protocol_tlsv1_2c           	      C   s   d}t tdddd}d}|l t ¡ }| d¡ | t|jf¡ tjrTt	j
 d¡ |D ]Ú}tjrrt	j
 d| ¡ |rŠ| |¡ | ¡ }n| |¡ | d¡}| ¡  ¡ }|dkrà| d	¡ràtjrÒt	j
 d
| ¡ t|ƒ}d}qX|dkr| d	¡rtjrt	j
 d| ¡ | ¡ }d}qXtjrXt	j
 d| ¡ qXtjrHt	j
 d¡ |rZ| d¡ n
| d¡ |rt| ¡  n| ¡  W d   ƒ n1 s’0    Y  d S )N)s   msg 1s   MSG 2rØ  s   MSG 3s   msg 4rÚ  s   msg 5s   msg 6T)rã  rÕ  rå  Frä   r  rµ  rØ  s   okz/ client:  read %r from server, starting TLS...
rÚ  z- client:  read %r from server, ending TLS...
z client:  read %r from server
r  r  )r  rç   rÂ   re  rH  rI  rË  r   rk   ri   rl   rm   r@   r4  r0  rä  rÄ  r  r£   r|  rÜ   )	r½   ZmsgsrÊ  ÚwrappedrÅ   r  r  r   rè  r   r   r   Útest_starttls[  sl    ý
ÿ



ÿÿÿÿÿ

zThreadedTests.test_starttlsc                 C   sü   t | td}tjrtj d¡ ttdƒ}| 	¡ }W d   ƒ n1 sF0    Y  d}d|j
tj t¡d f }tjtd}tjj||d}zV| ¡  d	¡}|rÖt|ƒd
krÖ| 	t|ƒ¡}tjrÖtj dt|ƒ|f ¡ W | ¡  n
| ¡  0 |  ||¡ d S )NrF  rä   Úrbr%  zhttps://localhost:%d/%sr
   )r‹  ©r¢   zcontent-lengthr   z/ client: read %d bytes from remote server '%s'
)rÂ  r¤   r   rk   ri   rl   rm   r?   rç   r@   rË  r   r   r8  r   rK  rª   ÚurllibZrequestÚurlopenÚinfor¥  r  rQ   rÜ   r»   )r½   rÊ  rB   r  r  Úurlr¢   Zdlenr   r   r   Útest_socketserver”  s.    &ÿ
ÿÿzThreadedTests.test_socketserverc              	   C   s  t jrtj d¡ d}ttƒ}|Þ tt ¡ ƒ}| 	d|j
f¡ t jrVtj d| ¡ | |¡ | ¡ }t jr~tj d| ¡ || ¡ kr¼|  d|d d… t|ƒ|d d…  ¡ t|ƒf ¡ | d¡ t jrØtj d	¡ | ¡  t jròtj d
¡ W d   ƒ n1 s0    Y  d S )Nrä   r´  r  r  r  r  r  r  r  z client:  connection closed.
)r   rk   ri   rl   rm   rý  rç   r£   rÂ   rH  rË  r@   rÄ  rÙ   rQ   rÜ   )r½   r  rÊ  rÅ   r   r   r   r   Útest_asyncore_server®  s:    ÿ
ÿÿÿ
z"ThreadedTests.test_asyncore_serverc                    sÚ  t jrtj d¡ tttjtj	tddd}|” t
t ¡ dtttjtjd‰ ˆ  t|jf¡ ‡ fdd„}‡ fdd	„}d
ˆ jdg tfdˆ jddgtfdˆ jdg dd„ fg}dˆ jdg fdˆ jddgfd|dg fd|dg fg}d}|D ]ú\}}}	}
}||  d¡}zz||g|
¢R Ž }d |¡}| j|||ƒ|d ˆ  ¡ }|| ¡ krx|  dj||d d… t|ƒ|d d… t|ƒd¡ W qä tyÜ } zH|	r¤|  dj|d¡ t|ƒ |¡sÈ|  dj||d¡ W Y d }~qäd }~0 0 qä|D ]Þ\}}}	}
||  d¡}zVˆ  |¡ ||
Ž }|| ¡ krR|  dj||d d… t|ƒ|d d… t|ƒd¡ W nj ty¾ } zP|	r~|  d j|d¡ t|ƒ |¡s¢|  dj||d¡ ˆ  ¡  W Y d }~n
d }~0 0 qäd!}ˆ  |¡ tt|ƒƒ}|  ˆ  d"|¡t|ƒ¡ |  ||¡ t d ur>t j!t|ƒ }| "|¡}ˆ  |¡ |  ˆ  ¡ |¡ |  #t$ˆ j%¡ |  #t$ˆ j&d!g¡ |  #t$ˆ j'd#¡ |  #t$ˆ j(td#ƒg¡ ˆ  d$¡ |  #tˆ jd"¡ |  #tˆ jd"¡ ˆ  )¡  W d   ƒ n1 sÌ0    Y  d S )%Nrä   TF©rñ  r    rò  rÕ  rå  ©rD  r–   r”   r“   r    c                     s   t dƒ} ˆ  | ¡}| d |… S ©Nsd                                                                                                       )rÓ   r1  )Úbrœ  ©rÅ   r   r   Ú
_recv_intoß  s    
z0ThreadedTests.test_recv_send.<locals>._recv_intoc                     s"   t dƒ} ˆ  | ¡\}}| d |… S ri  )rÓ   r3  )rj  rœ  rÅ  rk  r   r   Ú_recvfrom_intoä  s    z4ThreadedTests.test_recv_send.<locals>._recvfrom_intor4  r5  zsome.addressr§  c                 S   s   d S r   r   )rÁ  r   r   r   Ú<lambda>í  rä  z.ThreadedTests.test_recv_send.<locals>.<lambda>r0  r2  r1  r3  ZPREFIX_r^  zsending with {})rè  zpWhile sending with <<{name:s}>> bad data <<{outdata:r}>> ({nout:d}) received; expected <<{indata:r}>> ({nin:d})
r  )r   r   Znoutr  Zninz>Failed to send with method <<{name:s}>>; expected to succeed.
r   zFMethod <<{name:s}>> failed with unexpected exception message: {exp:s}
)r   ÚexpzrWhile receiving with <<{name:s}>> bad data <<{outdata:r}>> ({nout:d}) received; expected <<{indata:r}>> ({nin:d})
zAFailed to receive with method <<{name:s}>>; expected to succeed.
rF  r¥  r.  r  )*r   rk   ri   rl   rm   r  rç   r   r™   rN   r£   rÂ   rO   rH  rI  rË  r4  rQ   r5  r§  r0  r2  rn  rç  r»   r@   rÄ  rÙ   r~   rK   r  rÓ   ÚctypesZc_ubyteZfrom_buffer_copyrÑ   r6  r7  r8  r9  r:  rÜ   )r½   rÊ  rl  rm  Zsend_methodsZrecv_methodsZdata_prefixZ	meth_nameZ	send_methr%  r]   Zret_val_methr  r«  rè  r   r`  Z	recv_methrÕ   ÚbufferZubyteZ	bytesliker   rk  r   Útest_recv_sendË  sÖ    ûûý

üÿ
ûÿ	ÿÿþÿ
ûÿ	ÿÿþÿ"



ÿ
zThreadedTests.test_recv_sendc                 C   sÆ   t tƒ}| ¡  |  |jd d ¡ t t|jf¡}|  |j	¡ t
|dd}|  |j	¡ | d¡ |  | d¡d¡ |  | d¡d¡ |  | ¡ d¡ | d¡ |  | d¡d¡ |  | tƒ ¡d¡ d S )NF)Zsuppress_ragged_eofsrF  r   rä  )r  rç   rƒ  rß   r„  rÂ   rd  rI  rË  rÜ   r£   r4  r»   r0  r@   re  r1  rÓ   )r½   rÊ  rÅ   r   r   r   Útest_recv_zeroT  s    

zThreadedTests.test_recv_zeroc              	      s²   t ttjtjtddd}|‚ tt ¡ dtttjtjd‰ˆ t	|j
f¡ ˆ d¡ tdƒ‰ ‡ ‡fdd„}|  tjtjf|¡ ˆ d¡ ˆ ¡  W d   ƒ n1 s¤0    Y  d S )NTFrg  rh  i    c                      s   ˆ  ˆ ¡ q d S r   )r4  r   ©r¬  rÅ   r   r   Úfill_buffer|  s    z8ThreadedTests.test_nonblocking_send.<locals>.fill_buffer)r  rç   r   r™   rN   r£   rÂ   rO   rH  rI  rË  re  rÓ   rÑ   r  rf  rÜ   )r½   rÊ  ru  r   rt  r   Útest_nonblocking_sendh  s4    ûû
ÿÿ
z#ThreadedTests.test_nonblocking_sendc                    s"  t   t j¡‰d}t ˆ¡}t ¡ ‰d‰ ‡ ‡‡fdd„}tj|d}| ¡  ˆ ¡  z´zBt   t j¡}| 	d¡ | 
||f¡ |  t jdt|¡ W | ¡  n
| ¡  0 zBt   t j¡}t|ƒ}| 	d¡ |  t jd|j
||f¡ W | ¡  n
| ¡  0 W d‰ | ¡  ˆ ¡  nd‰ | ¡  ˆ ¡  0 d S )	Nr  Fc                     sb   ˆ  ¡  ˆ ¡  g } ˆ sLt ˆgg g d¡\}}}ˆ|v r|  ˆ ¡ d ¡ q| D ]}| ¡  qPd S )Ngš™™™™™¹?r   )rú  r–  rŒ  rÍ  r-  rÜ   )Zconnsr
  Úwr`  rŸ   ©ZfinishrÊ  Ústartedr   r   ÚserveŽ  s    z3ThreadedTests.test_handshake_timeout.<locals>.serverM  gš™™™™™É?z	timed outT)rÂ   r&  r   rÇ  rÇ  rõ  rÈ  rô  rö  r>  rH  rÀ   r@  r£   rÜ   r   )r½   rl  rË  rz  r   r|  r   rx  r   Útest_handshake_timeout†  s@    


ÿ


ÿ
þz$ThreadedTests.test_handshake_timeoutc                    s  t  t j¡}t j|_| t¡ | t¡ t	 	t	j
¡‰d}t ˆ¡}|jˆdd‰|  ˆj¡ t ¡ ‰ d ‰d ‰‡ ‡‡‡fdd„}tj|d}| ¡  ˆ  ¡  | t	 	¡ ¡}| ||f¡ | d¡ | ¡  | ¡ }| ¡  | ¡  ˆ ¡  ˆ ¡  |  ˆt j¡ |  ˆ|¡ d S )Nr  TrC  c                      s0   ˆ  ¡  ˆ  ¡  ˆ ¡ \‰‰ˆ ˆ d¡¡ d S )Nr‰   )rú  r–  r-  r4  r0  r   ©ZevtZpeerZremoterÊ  r   r   rz  Ç  s    z/ThreadedTests.test_server_accept.<locals>.serverM  rF  )r   rY   rM   r²   r›   rœ   rª   r   r¤   rÂ   r&  r   rÇ  rž   r  rD  rÇ  rõ  rÈ  rô  rö  rH  r4  r0  rz  rÜ   r   r  rÃ   r»   )r½   r¢   rl  rË  rz  r   r}  Zclient_addrr   r|  r   Útest_server_accept·  s6    



z ThreadedTests.test_server_acceptc              	   C   s‚   t  t j¡}| t ¡ ¡T}|  t¡}| ¡  W d   ƒ n1 sD0    Y  |  |j	j
t
j¡ W d   ƒ n1 st0    Y  d S r   )r   rY   rM   rž   rÂ   rÑ   r/  r‡  r»   rK  rL  ÚENOTCONN©r½   r¢   rŸ   rN  r   r   r   Útest_getpeercert_enotconnà  s
    &z'ThreadedTests.test_getpeercert_enotconnc              	   C   s‚   t  t j¡}| t ¡ ¡T}|  t¡}| ¡  W d   ƒ n1 sD0    Y  |  |j	j
t
j¡ W d   ƒ n1 st0    Y  d S r   )r   rY   rM   rž   rÂ   rÑ   r/  rg  r»   rK  rL  r~  r  r   r   r   Útest_do_handshake_enotconnç  s
    &z(ThreadedTests.test_do_handshake_enotconnc              
   C   sÜ   t ƒ \}}}| jtjO  _| d¡ | d¡ t|d|}|jt ¡ |dJ}|  t	¡  | 
t|jf¡ W d   ƒ n1 s€0    Y  W d   ƒ n1 sž0    Y  W d   ƒ n1 s¼0    Y  |  d|jd ¡ d S )NZAES128ÚAES256r`  rs  zno shared cipherr   )r®   rè  r   r¸   rF   r  rž   rÂ   rÑ   r/  rH  rI  rË  r³   rÔ  r3  r   r   r   Útest_no_shared_ciphersî  s    


ÿjz$ThreadedTests.test_no_shared_ciphersc              	   C   s  t  t j¡}d|_t j|_ttt jddÔ}| 	t
 
¡ ¡ˆ}|  | ¡ d ¡ |  |jd ¡ | t|jf¡ trˆtdƒrˆ|  | ¡ d¡ n,t jdkr¤|  | ¡ d¡ n|  | ¡ d¡ W d   ƒ n1 sÈ0    Y  |  |jd ¡ |  | ¡ d ¡ W d   ƒ n1 s0    Y  d S )NF)r    rÕ  ró  úTLSv1.3)r
   r   r¡  r[  )r   r[  )r   rY   rO   rš   r™   r›   r  rç   rN   rž   rÂ   rÇ   r/   r£  rH  rI  rË  r^  rP   r»   rx   r³   ©r½   r¢   rÊ  rÅ   r   r   r   Útest_version_basicü  s&    þ
.z ThreadedTests.test_version_basicc              	   C   sÆ   t  t j¡}| t¡ | jt jt jB t jB O  _t	|dv}| 
t ¡ ¡H}| t|jf¡ |  | ¡ d h d£¡ |  | ¡ d¡ W d   ƒ n1 sš0    Y  W d   ƒ n1 s¸0    Y  d S )Nr`  r   >   ZTLS_AES_256_GCM_SHA384ZTLS_AES_128_GCM_SHA256ZTLS_CHACHA20_POLY1305_SHA256r„  )r   rY   rM   r   rç   rè  r·   r¹   rº   r  rž   rÂ   rH  rI  rË  r³   r¯  r»   r/   r…  r   r   r   Útest_tls1_3  s    
ÿzThreadedTests.test_tls1_3c              	   C   s´   t ƒ \}}}tjj|_tjj|_tjj|_tjj|_t|db}|jt	 	¡ |d0}| 
t|jf¡ |  | ¡ d¡ W d   ƒ n1 sˆ0    Y  W d   ƒ n1 s¦0    Y  d S )Nr`  rs  r[  )r®   r   r   r   rD   rX   rU   r  rž   rÂ   rH  rI  rË  r»   r/   r3  r   r   r   Útest_min_max_version_tlsv1_2%  s    




ÿz*ThreadedTests.test_min_max_version_tlsv1_2c              	   C   s¾   t ƒ \}}}tjj|_tjj|_tjj|_tjj|_t||ƒ t	|db}|j
t ¡ |d0}| t|jf¡ |  | ¡ d¡ W d   ƒ n1 s’0    Y  W d   ƒ n1 s°0    Y  d S )Nr`  rs  rX  )r®   r   r   r   rD   rX   rU   r   rI   r  rž   rÂ   rH  rI  rË  r»   r/   r3  r   r   r   Útest_min_max_version_tlsv1_16  s    





ÿz*ThreadedTests.test_min_max_version_tlsv1_1c              
   C   sì   t ƒ \}}}tjj|_tjj|_tjj|_tjj|_t||ƒ t|d}|j	t
 
¡ |d^}|  tj¡ }| t|jf¡ W d   ƒ n1 s0    Y  |  dt|jƒ¡ W d   ƒ n1 sÀ0    Y  W d   ƒ n1 sÞ0    Y  d S )Nr`  rs  Zalert)r®   r   r   rX   rU   rD   r   rI   r  rž   rÂ   rÑ   rÒ   rH  rI  rË  r³   rK   rK  rD  r   r   r   Útest_min_max_version_mismatchG  s    





ÿ.z+ThreadedTests.test_min_max_version_mismatchc              	   C   s´   t ƒ \}}}tjj|_tjj|_tjj|_t||ƒ t|db}|jt	 	¡ |d0}| 
t|jf¡ |  | ¡ d¡ W d   ƒ n1 sˆ0    Y  W d   ƒ n1 s¦0    Y  d S )Nr`  rs  r   )r®   r   r   r   rD   rU   rI   r  rž   rÂ   rH  rI  rË  r»   r/   r3  r   r   r   Útest_min_max_version_sslv3Z  s    




ÿz(ThreadedTests.test_min_max_version_sslv3z"test requires ECDH-enabled OpenSSLc              	   C   sº   t  t j¡}| t¡ | jt jO  _t jdk r:| d¡ t	|db}| 
t ¡ ¡4}| t|jf¡ |  d| ¡ d ¡ W d   ƒ n1 sŽ0    Y  W d   ƒ n1 s¬0    Y  d S )N)r
   r   r   zECCdraft:ECDHr`  ZECDHr   )r   rY   rM   r   rç   rè  r¸   rx   rF   r  rž   rÂ   rH  rI  rË  r³   r¯  r…  r   r   r   Útest_default_ecdh_curvei  s    


z%ThreadedTests.test_default_ecdh_curver~  r  c           	   	   C   sú  t jrtj d¡ tƒ \}}}t|ddd}|² |jt ¡ |d¦}| 	t
|jf¡ | d¡}t jrztj d |¡¡ |  |¡ | ¡ dkr¢|  t|ƒd	¡ n|  t|ƒd
¡ | d¡ | ¡  ¡ }|  |t|ƒ d¡¡ W d   ƒ n1 sò0    Y  |jt ¡ |d¶}| 	t
|jf¡ | d¡}t jrDtj d |¡¡ |  ||¡ |  |¡ | ¡ dkrz|  t|ƒd	¡ n|  t|ƒd
¡ | d¡ | ¡  ¡ }|  |t|ƒ d¡¡ W d   ƒ n1 sÌ0    Y  W d   ƒ n1 sì0    Y  d S )Nrä   TFr  rs  r~  z! got channel binding data: {0!r}
r„  é0   é   s   CB tls-unique
rÛ  z(got another channel binding data: {0!r}
)r   rk   ri   rl   rm   r®   r  rž   rÂ   rH  rI  rË  r{  rç  r°  r/   r»   rQ   r@   rä  r‚  rn  rà   )	r½   r¬   r­   r«   rÊ  rÅ   Zcb_dataZpeer_data_reprZnew_cb_datar   r   r   r  }  sf    þþ
ÿ

ÿ"þ
ÿÿ

ÿz-ThreadedTests.test_tls_unique_channel_bindingc                 C   sR   t ƒ \}}}t||dd|d}tjr:tj d |d ¡¡ |  |d h d£¡ d S )NT©rÕ  rå  r  z got compression: {!r}
r  >   ZZLIBZRLEN)	r®   r!  r   rk   ri   rl   rm   rç  r³   ©r½   r¬   r­   r«   rH  r   r   r   Útest_compression¹  s    þzThreadedTests.test_compressionr8   z*ssl.OP_NO_COMPRESSION needed for this testc                 C   sR   t ƒ \}}}| jtjO  _| jtjO  _t||dd|d}|  |d d ¡ d S )NTr  r  )r®   rè  r   r8   r!  rÇ   r  r   r   r   Útest_compression_disabledÂ  s    þz'ThreadedTests.test_compression_disabledr'  c                 C   s–   t ƒ \}}}| jtjO  _| t¡ | d¡ | jtjO  _t||dd|d}|d d }| d¡}d|vr’d|vr’d	|vr’|  	d
|d  ¡ d S )NZkEDHTr  r¯  r   r5  ZADHZEDHZDHEzNon-DH cipher: )
r®   rè  r   r¸   r)  r*  rF   r!  r8  rÙ   )r½   r¬   r­   r«   rH  r¯  Úpartsr   r   r   Útest_dh_paramsÍ  s    

þ
zThreadedTests.test_dh_paramszneeds secp384r1 curve supportz TODO: Test doesn't work on 1.1.1c                 C   s  t ƒ \}}}| d¡ | d¡ | jtjtjB O  _t||dd|d}t ƒ \}}}| d¡ | d¡ | jtjtjB O  _t||dd|d}t ƒ \}}}| d¡ | d¡ | d¡ | jtjtjB O  _zt||dd|d}W n tjyú   Y n0 t	r|  
d¡ d S )Nr{   zECDHE:!eNULL:!aNULLTr  r3  zmismatch curve did not fail)r®   r}   rF   rè  r   r·   r¹   r!  rÒ   ÚIS_OPENSSL_1_1_0rÙ   r  r   r   r   Útest_ecdh_curveÞ  s<    

þ

þ


þ
zThreadedTests.test_ecdh_curvec                 C   s2   t ƒ \}}}t||dd|d}|  |d d ¡ d S )NTr  r  ©r®   r!  rÇ   r  r   r   r   Útest_selected_alpn_protocol  s    þz)ThreadedTests.test_selected_alpn_protocolzALPN support requiredc                 C   s@   t ƒ \}}}| ddg¡ t||dd|d}|  |d d ¡ d S )NrÎ   ÚbarTr  r  )r®   rî  r!  rÇ   r  r   r   r   Ú/test_selected_alpn_protocol_if_server_uses_alpn  s    þz=ThreadedTests.test_selected_alpn_protocol_if_server_uses_alpnz!ALPN support needed for this testc                 C   s8  g d¢}ddgdfddgdfdgdfddgd fg}|D ]ü\}}t ƒ \}}}| |¡ | |¡ zt||dd|d}W n* tjyž }	 z|	}W Y d }	~	n
d }	~	0 0 |d u rÆtrÆtjd	k rÆ|  |tj¡ q6d
t|ƒt|ƒt|ƒf }
|d }|  	|||
|df ¡ t
|d ƒr|d d nd}|  	|||
|df ¡ q6d S )N)rÎ   r™  Ú	milkshakerÎ   r™  r›  zhttp/3.0zhttp/4.0Tr  )r
   r
   r   r†  úKfailed trying %s (s) and %s (c).
was expecting %s, but got %%s from the %%sr  r}  r  r¥  ÚnothingrÊ  )r®   rî  r!  r   rÒ   r•  rx   r  rK   r»   rQ   )r½   Úserver_protocolsÚprotocol_testsÚclient_protocolsr¬  r¬   r­   r«   rH  r`  rè  Úclient_resultÚserver_resultr   r   r   Útest_alpn_protocols  sN    


ü

ü
ÿÿþ
ÿ
ÿÿ
ÿz!ThreadedTests.test_alpn_protocolsc                 C   s2   t ƒ \}}}t||dd|d}|  |d d ¡ d S )NTr  r  r—  r  r   r   r   Útest_selected_npn_protocol?  s    þz(ThreadedTests.test_selected_npn_protocolz NPN support needed for this testc                 C   sâ   ddg}ddgdfddgdfddgdfddgdfg}|D ]¤\}}t ƒ \}}}| |¡ | |¡ t||dd|d}dt|ƒt|ƒt|ƒf }	|d	 }
|  |
||	|
d
f ¡ t|d ƒrÂ|d d nd}|  |||	|df ¡ q8d S )Nzhttp/1.1zspdy/2rÀ  ÚabcÚdefTr  rœ  r  r}  r  r¥  r  rÊ  )r®   rí  r!  rK   r»   rQ   )r½   rž  rŸ  r   r¬  r¬   r­   r«   rH  rè  r¡  r¢  r   r   r   Útest_npn_protocolsG  s4    



ü

þÿþ
ÿÿz ThreadedTests.test_npn_protocolsc                 C   sL   t  t j¡}| t¡ t  t j¡}| t¡ t  t j¡}| t¡ |||fS r   )	r   rY   rN   r   r¤   r¦   rO   rœ   rª   )r½   r­   Úother_contextr¬   r   r   r   Úsni_contextsa  s    


zThreadedTests.sni_contextsc                 C   s"   |d }|   d|ff|d ¡ d S )Nr  r%   r-   )r³   )r½   rH  r   rY  r   r   r   Úcheck_common_namej  s    zThreadedTests.check_common_namec                    sÊ   g ‰ |   ¡ \}‰}d|_‡ ‡fdd„}| |¡ t||ddd}|  ˆ d|fg¡ |  |d¡ g ‰ t||dd d}|  ˆ d |fg¡ |  |t¡ g ‰ | d ¡ t||ddd}|  |t¡ |  ˆ g ¡ d S )	NFc                    s    ˆ   ||f¡ |d urˆ| _d S r   )rÍ  r¢   ©rK  Zserver_nameZinitial_context©Zcallsr¨  r   r   Úservername_cbu  s    z6ThreadedTests.test_sni_callback.<locals>.servername_cbTÚsupermessage©rÕ  r  r4   Znotfunny)r©  rš   r9  r!  r»   rª  r¥   )r½   r­   r¬   r­  rH  r   r¬  r   r:  n  s4    
þþ
þzThreadedTests.test_sni_callbackc                 C   sp   |   ¡ \}}}dd„ }| |¡ |  tj¡ }t||ddd}W d   ƒ n1 sR0    Y  |  |jjd¡ d S )Nc                 S   s   t jS r   )r   ZALERT_DESCRIPTION_ACCESS_DENIEDr«  r   r   r   Úcb_returning_alertœ  s    zAThreadedTests.test_sni_callback_alert.<locals>.cb_returning_alertFr®  r¯  ZTLSV1_ALERT_ACCESS_DENIED)	r©  r9  rÑ   r   rÒ   r!  r»   rK  rb  )r½   r­   r¨  r¬   r°  rN  rH  r   r   r   Útest_sni_callback_alert—  s    
þ$z%ThreadedTests.test_sni_callback_alertc              	   C   s¨   |   ¡ \}}}dd„ }| |¡ t ¡ l}|  tj¡ }t||ddd}W d   ƒ n1 s\0    Y  |  |j	j
d¡ |  |jjt¡ W d   ƒ n1 sš0    Y  d S )Nc                 S   s   dd  d S )Nr
   r   r   r«  r   r   r   Ú
cb_raisingª  s    z;ThreadedTests.test_sni_callback_raising.<locals>.cb_raisingFr®  r¯  ZSSLV3_ALERT_HANDSHAKE_FAILURE)r©  r9  r   Úcatch_unraisable_exceptionrÑ   r   rÒ   r!  r»   rK  rb  Ú
unraisableÚexc_typeÚZeroDivisionError)r½   r­   r¨  r¬   r²  ÚcatchrN  rH  r   r   r   Útest_sni_callback_raising¥  s    

þ$
ÿz'ThreadedTests.test_sni_callback_raisingc              	   C   s¨   |   ¡ \}}}dd„ }| |¡ t ¡ l}|  tj¡ }t||ddd}W d   ƒ n1 s\0    Y  |  |j	j
d¡ |  |jjt¡ W d   ƒ n1 sš0    Y  d S )Nc                 S   s   dS )NrÎ   r   r«  r   r   r   Úcb_wrong_return_type¾  s    zOThreadedTests.test_sni_callback_wrong_return_type.<locals>.cb_wrong_return_typeFr®  r¯  ZTLSV1_ALERT_INTERNAL_ERROR)r©  r9  r   r³  rÑ   r   rÒ   r!  r»   rK  rb  r´  rµ  rÁ   )r½   r­   r¨  r¬   r¹  r·  rN  rH  r   r   r   Ú#test_sni_callback_wrong_return_type¸  s    

þ$z1ThreadedTests.test_sni_callback_wrong_return_typec           	         s†   t ƒ \}}}| d¡ | d¡ g d¢}t|||d}|d d }|  t|ƒd¡ |D ]*\‰ }}t‡ fdd„|D ƒƒsV|  ˆ ¡ qVd S )	NzAES128:AES256r‚  )r‚  zAES-256ZTLS_CHACHA20ZTLS_AES©r  r  r   c                 3   s   | ]}|ˆ v V  qd S r   r   )râ  Zalgr   r   r   rã  Û  rä  z4ThreadedTests.test_shared_ciphers.<locals>.<genexpr>)r®   rF   r!  ÚassertGreaterrQ   ÚanyrÙ   )	r½   r¬   r­   r«   Zexpected_algsrH  r•   Ztls_versionÚbitsr   r   r   Útest_shared_ciphersÌ  s    

ÿz!ThreadedTests.test_shared_ciphersc                 C   sŠ   t ƒ \}}}t|dd}|Z |jt ¡ |d}| t|jf¡ | ¡  |  t	|j
d¡ |  t	|jd¡ W d   ƒ n1 s|0    Y  d S )NFr,  rs  rµ  s   hello)r®   r  rž   rÂ   rH  rI  rË  rÜ   rÑ   r~   r@   rm   r3  r   r   r   Ú,test_read_write_after_close_raises_valuerrorÞ  s    
ÿz:ThreadedTests.test_read_write_after_close_raises_valuerrorc              
   C   s0  d}t tjdƒ}| |¡ W d   ƒ n1 s00    Y  |  tjtj¡ t tj¡}tj	|_
| t¡ | t¡ t|dd}|˜ | t ¡ ¡h}| t|jf¡ t tjdƒ,}| |¡ |  | d¡|¡ W d   ƒ n1 sâ0    Y  W d   ƒ n1 s0    Y  W d   ƒ n1 s"0    Y  d S )Ns   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxÚwbFr,  r_  rµ  )r?   r   ÚTESTFNrm   rß   Úunlinkr   rY   rM   r²   r›   rœ   rª   r   r¤   r  rž   rÂ   rH  rI  rË  Úsendfiler»   r0  )r½   Z	TEST_DATArB   r¢   rÊ  rÅ   Úfiler   r   r   Útest_sendfileë  s    (


zThreadedTests.test_sendfilec           
      C   s@  t ƒ \}}}| jtjO  _t|||d}|d }|  |j¡ |  |jd¡ |  |j	d¡ |  |j
¡ tjdkr~|  |jd¡ |  |d ¡ | ¡ }|  |d d¡ |  |d d¡ t||||d	}| ¡ }|  |d d
¡ |  |d d¡ |  |d ¡ |d }|  |j|j¡ |  ||¡ |  ||¡ |  |j|j¡ |  |j	|j	¡ t|||d}|  |d ¡ |d }|  |j|j¡ |  ||¡ | ¡ }|  |d d¡ |  |d d¡ t||||d	}|  |d ¡ |d }	|  |	j|j¡ |  |	|¡ |  |	j|j¡ |  |	j	|j	¡ | ¡ }|  |d d¡ |  |d d
¡ d S )Nr»  r  r   r°   r  r-  r
   r.  )r  r  r¡  r   r‰   )r®   rè  r   r¸   r!  r  Úidr¼  r   r@  Z
has_ticketrx   Zticket_lifetime_hintrì  r0  r»   ZassertIsNotr  rà   )
r½   r¬   r­   r«   rH  r  Z	sess_statZsession2Zsession3Zsession4r   r   r   Útest_sessionü  sf    ÿ
ÿÿÿzThreadedTests.test_sessionc           
   
   C   s¨  t ƒ \}}}t ƒ \}}}| jtjO  _| jtjO  _t|dd}|H |jt ¡ |dŽ}|  |jd ¡ |  |j	d ¡ | 
t|jf¡ |j}|  |¡ |  t¡}	t|_W d   ƒ n1 sÂ0    Y  |  t|	jƒd¡ W d   ƒ n1 sò0    Y  |jt ¡ |dd}| 
t|jf¡ |  t¡}	||_W d   ƒ n1 sH0    Y  |  t|	jƒd¡ W d   ƒ n1 sz0    Y  |jt ¡ |dT}||_| 
t|jf¡ |  |jj|j¡ |  |j|¡ |  |j	d¡ W d   ƒ n1 sò0    Y  |jt ¡ |dd}|  t¡&}	||_| 
t|jf¡ W d   ƒ n1 sH0    Y  |  t|	jƒd¡ W d   ƒ n1 sz0    Y  W d   ƒ n1 sš0    Y  d S )NFr,  rs  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  rH  rI  rË  r  rÑ   rÁ   r%  rK   rK  r~   rÇ  )
r½   r¬   r­   r«   Zclient_context2r~  rÊ  rÅ   r  r`  r   r   r   Útest_session_handling6  s^    
ÿ
$0
ÿ&ÿ$
ÿ.
ÿ0ÿz#ThreadedTests.test_session_handlingN)MrÏ  rÐ  rÑ  r+  r/  r\   rÒ  rz   r1  rO  r   rð  rò  r:  r;  r@  rE  re   rG  rO  rP  rT  rU  rV  rW  rZ  r\  r^  re  rf  rr  rs  rv  r{  r}  r€  r  rƒ  r†  r‡  rZ  rˆ  r‰  rŠ  r‹  r|   rŒ  rÓ  r  r‘  rE   r’  rY  r\  r”  ÚHAVE_SECP_CURVESr^  r–  r˜  ZHAS_ALPNrš  r£  r¤  ZHAS_NPNr§  r©  rª  r]  r:  r±  r¸  rº  r¿  rÀ  rÆ  rÈ  rÉ  r   r   r   r   r)  ,  sÂ   2$ÿ
(!ÿ
8%
)
*



9 
1)

ÿ
:	ÿ
	



%
	
'
	
(


:r)  ró  zTest needs TLS 1.3c                   @   sT   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚTestPostHandshakeAuthc                 C   sÀ   t jt jt jg}|D ]¦}t  |¡}|  |jd¡ d|_|  |jd¡ t j|_|  |jt j¡ |  |jd¡ d|_|  |jt j¡ |  |jd¡ t j	|_d|_|  |jt j	¡ |  |jd¡ qd S rÃ  )
r   rM   rN   rO   rY   r»   Úpost_handshake_authr²   r›   r±   )r½   Z	protocolsrR   rH   r   r   r   Útest_pha_setterk  s"    ÿ
z%TestPostHandshakeAuth.test_pha_setterc              	   C   s:  t ƒ \}}}d|_tj|_d|_| t¡ t|dd}|ê |jt	 	¡ |d¶}| 
t|jf¡ | d¡ |  | d¡d¡ | d¡ |  | d¡d	¡ | d¡ |  | d¡d
¡ | d¡ |  | d¡d	¡ | d¡ | d¡ d¡}|  d|¡ W d   ƒ n1 s0    Y  W d   ƒ n1 s,0    Y  d S )NTFr,  rs  rÞ  rµ  rà  rÝ  rÙ  rß  rá  i   rÛ  r0   )r®   rÌ  r   r²   r›   r   r¤   r  rž   rÂ   rH  rI  rË  rm   r»   r0  ro  r³   )r½   r¬   r­   r«   rÊ  rÅ   Z	cert_textr   r   r   Útest_pha_requiredƒ  s.    

ÿ




z'TestPostHandshakeAuth.test_pha_requiredc                 C   s  t ƒ \}}}d|_tj|_d|_t ¡ à}t|dd}|° |jt	 	¡ |d~}| 
t|jf¡ | d¡ |  | d¡d¡ | d¡ |  tjd	¡ | d¡ W d   ƒ n1 s´0    Y  W d   ƒ n1 sÒ0    Y  W d   ƒ n1 sð0    Y  W d   ƒ n1 s0    Y  d S )
NTFr,  rs  rÝ  rµ  rÙ  rÞ  râ  )r®   rÌ  r   r²   r›   r   Zcatch_threading_exceptionr  rž   rÂ   rH  rI  rË  rm   r»   r0  rÀ   rÒ   )r½   r¬   r­   r«   rN  rÊ  rÅ   r   r   r   Útest_pha_required_nocertœ  s(    

ÿ

þz.TestPostHandshakeAuth.test_pha_required_nocertc              	   C   s  t jrtj d¡ tƒ \}}}d|_tj|_	d|_| 
t¡ tj|_	t|dd}|¦ |jt ¡ |dt}| t|jf¡ | d¡ |  | d¡d¡ | d	¡ |  | d¡d
¡ | d¡ |  | d¡d¡ W d   ƒ n1 sâ0    Y  W d   ƒ n1 s0    Y  d S )Nrä   TFr,  rs  rÞ  rµ  rà  rÝ  rÙ  rß  )r   rk   ri   rl   rm   r®   rÌ  r   r²   r›   r   r¤   r±   r  rž   rÂ   rH  rI  rË  r»   r0  r3  r   r   r   Útest_pha_optionalµ  s*    

ÿ


z'TestPostHandshakeAuth.test_pha_optionalc              	   C   sü   t jrtj d¡ tƒ \}}}d|_tj|_	d|_t
|dd}|¦ |jt ¡ |dt}| t|jf¡ | d¡ |  | d¡d¡ | d	¡ |  | d¡d
¡ | d¡ |  | d¡d¡ W d   ƒ n1 sÐ0    Y  W d   ƒ n1 sî0    Y  d S )Nrä   TFr,  rs  rÞ  rµ  rà  rÝ  rÙ  )r   rk   ri   rl   rm   r®   rÌ  r   r±   r›   r  rž   rÂ   rH  rI  rË  r»   r0  r3  r   r   r   Útest_pha_optional_nocertÍ  s&    
ÿ


z.TestPostHandshakeAuth.test_pha_optional_nocertc              
   C   sì   t ƒ \}}}d|_tj|_| t¡ t|dd}|¤ |jt	 	¡ |dr}| 
t|jf¡ |  tjd¡ | ¡  W d   ƒ n1 s†0    Y  | d¡ |  d| d¡¡ W d   ƒ n1 sÀ0    Y  W d   ƒ n1 sÞ0    Y  d S )	NTFr,  rs  z
not serverrÝ  s   extension not receivedrµ  )r®   rÌ  r   r²   r›   r   r¤   r  rž   rÂ   rH  rI  rË  rÀ   rÒ   ræ  rm   r³   r0  r3  r   r   r   Útest_pha_no_pha_clientã  s    

ÿ&
z,TestPostHandshakeAuth.test_pha_no_pha_clientc              	   C   sî   t ƒ \}}}tj|_d|_| t¡ t|dd}|¦ |jt	 	¡ |dt}| 
t|jf¡ | d¡ |  | d¡d¡ | d¡ |  | d¡d	¡ | d¡ |  | d¡d¡ W d   ƒ n1 sÂ0    Y  W d   ƒ n1 sà0    Y  d S )
NTFr,  rs  rÞ  rµ  rß  rÝ  rÙ  )r®   r   r²   r›   rÌ  r   r¤   r  rž   rÂ   rH  rI  rË  rm   r»   r0  r3  r   r   r   Útest_pha_no_pha_serveró  s"    

ÿ


z,TestPostHandshakeAuth.test_pha_no_pha_serverc              	   C   sÀ   t ƒ \}}}tj|_tjj|_d|_| t	¡ t
|dd}|n |jt ¡ |d<}| t|jf¡ | d¡ |  d| d¡¡ W d   ƒ n1 s”0    Y  W d   ƒ n1 s²0    Y  d S )NTFr,  rs  rÝ  s   WRONG_SSL_VERSIONrµ  )r®   r   r²   r›   r   rX   rU   rÌ  r   r¤   r  rž   rÂ   rH  rI  rË  rm   r³   r0  r3  r   r   r   Útest_pha_not_tls13  s    


ÿ
z(TestPostHandshakeAuth.test_pha_not_tls13c              	   C   s:  t }t tj¡}d|_| t¡ d|_tj|_	t tj
¡}| t¡ | t¡ d|_tj|_	t|dd}|¸ |jt ¡ |d„}| t|jf¡ | d¡ |  | d¡d¡ | d¡ |  | d¡d	¡ | d¡ |  | d¡d
¡ |  | ¡ i ¡ W d   ƒ n1 s0    Y  W d   ƒ n1 s,0    Y  d S )NTFr,  rs  rÞ  rµ  rà  rÝ  rÙ  rß  )r¥   r   rY   rO   rÌ  r   r¤   rš   r™   r›   rN   rœ   rª   r²   r  rž   rÂ   rH  rI  rË  rm   r»   r0  r‡  )r½   r«   r¬   r­   rÊ  rÅ   r   r   r   Útest_bpo37428_pha_cert_none  s2    



ÿ


z1TestPostHandshakeAuth.test_bpo37428_pha_cert_noneN)rÏ  rÐ  rÑ  rÍ  rÎ  rÏ  rÐ  rÑ  rÒ  rÓ  rÔ  rÕ  r   r   r   r   rË  i  s   rË  Úkeylog_filenamez0test requires OpenSSL 1.1.1 with keylog callbackc                   @   sŠ   e Zd Zejfdd„Zee e	d¡dd„ ƒƒZ
ee e	d¡dd„ ƒƒZee ejjd¡e e	d¡d	d
„ ƒƒƒZdd„ Zdd„ Zdd„ ZdS )ÚTestSSLDebugc                 C   s8   t |ƒ}tt|ƒƒW  d   ƒ S 1 s*0    Y  d S r   )r?   rQ   r—  )r½   ZfnamerB   r   r   r   Úkeylog_lines>  s    
zTestSSLDebug.keylog_linesr'  c                 C   s  |   tjtj¡ t tj¡}|  |jd ¡ |  	t
j tj¡¡ tj|_|  |jtj¡ |  t
j tj¡¡ |  |  ¡ d¡ d |_|  |jd ¡ |  ttf¡( t
j t
j tj¡¡|_W d   ƒ n1 sÊ0    Y  |  t¡ d|_W d   ƒ n1 sú0    Y  d S )Nr
   )rß   r   rÃ  rÂ  r   rY   rO   r»   rÖ  rì  r   r   Úisfiler  rØ  rÑ   ÚIsADirectoryErrorÚPermissionErrorr   ÚabspathrÁ   rÞ  r   r   r   Útest_keylog_defaultsB  s     ÿ$z!TestSSLDebug.test_keylog_defaultsc              	   C   sÞ  |   tjtj¡ tƒ \}}}tj|_t|dd}|R |jt ¡ |d }| 	t
|jf¡ W d   ƒ n1 sn0    Y  W d   ƒ n1 sŒ0    Y  |  |  ¡ d¡ d |_tj|_t|dd}|R |jt ¡ |d }| 	t
|jf¡ W d   ƒ n1 sþ0    Y  W d   ƒ n1 s0    Y  |  |  ¡ d¡ tj|_tj|_t|dd}|T |jt ¡ |d }| 	t
|jf¡ W d   ƒ n1 s”0    Y  W d   ƒ n1 s´0    Y  |  |  ¡ d¡ d |_d |_d S )NFr,  rs  r†  é   é   )rß   r   rÃ  rÂ  r®   rÖ  r  rž   rÂ   rH  rI  rË  r»   rØ  r  r3  r   r   r   Útest_keylog_filenameZ  sB    
ÿL
ÿN
ÿPz!TestSSLDebug.test_keylog_filenamez.test is not compatible with ignore_environmentc                 C   s®   |   tjtj¡ tjj tj	¡z tjtj	d< |  
tj	d tj¡ t tj¡}|  
|jd ¡ t ¡ }|  
|jtj¡ t ¡ }|  
|jtj¡ W d   ƒ n1 s 0    Y  d S )NZSSLKEYLOGFILE)rß   r   rÃ  rÂ  r\   Zmockr#  Údictr   Úenvironr»   r   rY   rO   rÖ  rK  rM  rÞ  r   r   r   Útest_keylog_env~  s    zTestSSLDebug.test_keylog_envc                 C   sl   t ƒ \}}}dd„ }|  |jd ¡ ||_|  |j|¡ |  t¡ tƒ |_W d   ƒ n1 s^0    Y  d S )Nc                 S   s   d S r   r   ©r  Ú	directionr/   Zcontent_typeZmsg_typerÕ   r   r   r   Úmsg_cb”  s    z.TestSSLDebug.test_msg_callback.<locals>.msg_cb)r®   rÇ   Ú_msg_callbackrÑ   rÁ   r%  )r½   r¬   r­   r«   ræ  r   r   r   Útest_msg_callback‘  s    zTestSSLDebug.test_msg_callbackc              	      sÞ   t ƒ \}}}| jtjO  _g ‰ ‡ ‡fdd„}||_t|dd}|R |jt ¡ |d }| t	|j
f¡ W d   ƒ n1 s~0    Y  W d   ƒ n1 sœ0    Y  ˆ dtjtjtjfˆ ¡ ˆ dtjtjtjfˆ ¡ d S )Nc                    s@   ˆ  | tj¡ ˆ  |t¡ ˆ |ddh¡ ˆ  ||||f¡ d S )Nr@   rm   )r  r   rÃ   r˜  r³   rÍ  rä  ©rè  r½   r   r   ræ  £  s    z4TestSSLDebug.test_msg_callback_tls12.<locals>.msg_cbFr,  rs  r@   rm   )r®   rè  r   r¸   rç  r  rž   rÂ   rH  rI  rË  r³   r   rX   r   Z	HANDSHAKEr   ZSERVER_KEY_EXCHANGEZCHANGE_CIPHER_SPEC)r½   r¬   r­   r«   ræ  rÊ  rÅ   r   ré  r   Útest_msg_callback_tls12  s0    
ÿL
ÿý
ÿýz$TestSSLDebug.test_msg_callback_tls12c              	      sî   t ƒ \}}}t ƒ d ‰ dd„ }‡ fdd„}||_||_t|dd}|” |jt ¡ |d }| t|jf¡ W d   ƒ n1 s€0    Y  |jt ¡ |d }| t|jf¡ W d   ƒ n1 sÂ0    Y  W d   ƒ n1 sà0    Y  d S )	Nr
   c                 S   s   d S r   r   rä  r   r   r   ræ  À  s    z@TestSSLDebug.test_msg_callback_deadlock_bpo43577.<locals>.msg_cbc                    s
   ˆ | _ d S r   r`  r6  ©Zserver_context2r   r   Úsni_cbÃ  s    z@TestSSLDebug.test_msg_callback_deadlock_bpo43577.<locals>.sni_cbFr,  rs  )	r®   rç  Zsni_callbackr  rž   rÂ   rH  rI  rË  )r½   r¬   r­   r«   ræ  rì  rÊ  rÅ   r   rë  r   Ú#test_msg_callback_deadlock_bpo43577¼  s$    

ÿ.
ÿz0TestSSLDebug.test_msg_callback_deadlock_bpo43577N)rÏ  rÐ  rÑ  r   rÂ  rØ  Úrequires_keylogr\   rY  r\  rÝ  rà  ri   ÚflagsÚignore_environmentrã  rè  rê  rí  r   r   r   r   r×  <  s    

"
ÿ
r×  c                  C   s  t jr¶tjtjdœ} |  ¡ D ]*\}}|ƒ }|r|d rd||f } qTqtt ¡ ƒ}tdtj	tj
f ƒ td| ƒ tdtj ƒ tdtj ƒ ztdtj ƒ W n ty´   Y n0 ttttttttttttfD ]}tj |¡sÒt  d	| ¡‚qÒt  ¡ }t j!t j"g|¢R Ž  d S )
N)ZMacZWindowsr   z%s %rztest_ssl: testing with %r %rz          under %sz          HAS_SNI = %rz          OP_ALL = 0x%8xz          OP_NO_TLSv1_1 = 0x%8xzCan't read certificate file %r)#r   rk   rÔ  Zmac_verZ	win32_verÚitemsr‚  Úprintr   r  rx   r´   rç  r¹   rñ  rç   r  r  r  r  r  r¤   r¦   rª   r  ÚBADKEYr  r   r   ÚexistsZ
TestFailedZthreading_setupr\   ZaddModuleCleanupZthreading_cleanup)Zplatsr   r_   ZplatÚfilenameÚthread_infor   r   r   ÚsetUpModuleÓ  s:    þ
ÿür÷  Ú__main__)N)r´  TFNN)Nr   r   )’ri   r\   Zunittest.mockrÀ  r   Ztest.supportr   rÂ   rŒ  r   rŒ   r<  r   rL  rë   Zurllib.requestra  rÇ  rg   rþ  r'  rÔ  Z	sysconfigra   rp  ÚImportErrorÚimport_moduler   r   r   r   rE   ZPy_DEBUGr\  Úsortedr*  r×  rI  r  r  r[  rx   r•  r^  rW   Zget_config_varr   r#  rÉ   ÚverrL   rñ  r   rç   Úfsencoder  r  r  r  r  r  r  r  rŠ  r  r#  r  rè   r0  r¤   r¥   ré   r¦   r§   r7  r6  rª   r  r?  r¨   r©   rº  r  r  rJ  ró  rê   r  rò   r*  r+  r8   r9   r:   r;   r<   r=   rC   rI   rS   Ú	lru_cacherP   re   rÒ  rY   rZ  ro   ru   ry   rz   r   rÊ  r‡   r’   r´   r]  rM   r™   r£   r®   ZTestCaser¯   rÕ  r_  rk  r{  r€  Zrequires_resourcer·  rž  r   Ztest.ssl_serversrÂ  rÈ  r  rý  r!  r(  r)  rË  Z
HAS_KEYLOGrî  r×  r÷  rÏ  Úmainr   r   r   r   Ú<module>   sz  











óñ

	
	
(
þþ           '6?0  B
  v   þ
3 ÿ
I            I Oÿ #
