Uname: Linux web3.us.cloudlogin.co 5.10.226-xeon-hst #2 SMP Fri Sep 13 12:28:44 UTC 2024 x86_64
Software: Apache
PHP version: 8.1.31 [ PHP INFO ] PHP os: Linux
Server Ip: 162.210.96.117
Your Ip: 18.219.236.143
User: edustar (269686) | Group: tty (888)
Safe Mode: OFF
Disable Function:
NONE

name : test_ssl.cpython-310.pyc
o

ab�3�@shddlZddlZddlZddlmZddlmZddlmZddlmZddlm	Z	ddlm
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZzddlZWney}dZYnwddlZe���e�de �ddl!Z!Wd�n1s�wYe�"d	�Z#ddl$Z$dd
l#m%Z%m&Z&m'Z'm(Z(e)ed�Z*e*o�ejdkZ+e,e#j-�Z.ej/Z/e#j0d
kZ1e�2d�Z3iZ4dD]\Z5Z6z
e7e#e5�Z5e7e#j%e6�Z6Wn	e8y�Yq�we6e4e5<q�dd�Z9e9d�Z:e�;e:�Z<e9d�Z=e9d�Z>e�;e=�Z?e�;e>�Z@e9d�ZAe9d�ZBdZCe9d�ZDe�;eD�ZEe9dd�ZFe9dd�ZGddddddd d!�ZHe9d"�ZIe9d#�ZJd$ZKd%d&d'd(d)d*d+ddd d,�
ZLe9d-�ZMd.ZNe9d/�ZOd0ZPe9dd1�ZQe9d2�ZRe9d3�ZSe9d4�ZTd$ZUd5ZVe9d6�ZWe9d7�ZXe9d8�ZYe9d9�ZZe9d:�Z[e9d;�Z\e9d<�Z]e9d=�Z^e�;e^�Z_e7e#d>d�Z`e7e#d?d�Zae7e#d@d�Zbe7e#dAd�Zce7e#dBd�Zde7e#dCd�ZedDdE�Zfef��r�dFdG�ZgndHdG�ZgdIdJ�ZhejidKdL��ZjdMdN�ZkdOdP�ZldQdR�Zme
jne dS�Zoe#jpdddddT�dUdV�ZqeJfdWdX�dYdZ�ZrGd[d\�d\ejs�ZtGd]d^�d^ejs�ZuGd_d`�d`ejs�ZvGdadb�dbejs�ZwGdcdd�ddejs�ZxGdedf�dfejs�Zye�zdg�Gdhdi�diejs��Z{d�djdk�Z|dldm�Z}ddnl~mZGdodp�dpej��Z�Gdqdr�drej��Z�	s		d�dudv�Z�	d�dwdx�Z�Gdydz�dzejs�Z�e��ejd{�d|�Gd}d~�d~ejs��Z�e)e#j�d�Z�e��e�d��Z�Gd�d��d�ejs�Z�d�d��Z�e�d�k�r�e���dSdS)��N)�support)�
import_helper)�	os_helper)�
socket_helper)�threading_helper)�warnings_helper�ignore�ssl)�
TLSVersion�_TLSContentType�_TLSMessageType�
_TLSAlertType�gettotalrefcount�win32)�rr�PY_SSL_DEFAULT_CIPHERS))�PROTOCOL_SSLv23�SSLv3)�PROTOCOL_TLSv1�TLSv1)�PROTOCOL_TLSv1_1�TLSv1_1cGstjjtj�t�g|�R�S�N)�os�path�join�dirname�__file__��name�r �6/usr/local/python-3.10/lib/python3.10/test/test_ssl.py�	data_file?�r"zkeycert.pemzssl_cert.pemzssl_key.pemzkeycert.passwd.pemzssl_key.passwd.pemZsomepass�capathz
4e1295a3.0z
5ed36f99.0)�)�countryNameZXY�)�localityNamezCastle Anthrax�)�organizationNamezPython Software Foundation))�
commonName�	localhostzAug 26 14:23:15 2028 GMTzAug 29 14:23:15 2018 GMTZ98A7CF88C74A32ED))�DNSr,r��issuer�notAfter�	notBefore�serialNumber�subject�subjectAltName�versionzrevocation.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-serverzOct 28 14:23:16 2037 GMTzAug 29 14:23:16 2018 GMTZCB2D80995A69525C)
�OCSP�	caIssuers�crlDistributionPointsr/r0r1r2r3r4r5zkeycert4.pem�fakehostnamezkeycertecc.pemz
localhost-eccz
ceff1710.0zallsans.pemzidnsans.pemz	nosan.pemzself-signed.pythontest.net�nullcert.pem�badcert.pemzXXXnonexisting.pem�
badkey.pemz	nokia.pemznullbytecert.pemztalos-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_EOFcCsVz tddd��}d|��vWd�WS1swYWdSty*YdSw)Nz/etc/os-releasezutf-8)�encodingZubuntuF)�open�read�FileNotFoundError)�fr r r!�	is_ubuntu�s
(��rIcGs0|D]}t|d�r|jtjjkr|�d�qdS)z@"Lower security level to '1' and allow all ciphers for TLS 1.0/1�minimum_versionz@SECLEVEL=1:ALLN)�hasattrrJr	r
r�set_ciphers)�ctxs�ctxr r r!�seclevel_workaround�s��
��rOcG�dSrr )rMr r r!rO��cCsbt|t�r|�d�sJ�tt|d�}|durdS|tjtjtjhvr$dS|j}t	|t
d�d��S)z�Check if a TLS protocol is available and enabled

    :param protocol: enum ssl._SSLMethod member or name
    :return: bool
    Z	PROTOCOL_NFT)�
isinstance�str�
startswith�getattrr	�PROTOCOL_TLS�PROTOCOL_TLS_SERVER�PROTOCOL_TLS_CLIENTr�has_tls_version�len)�protocolrr r r!�has_tls_protocol�s
�r\cCs�|dkrdSt|t�rtjj|}ttd|j���sdStr&|tjjkr&dSt�	tj
�}t|d�r?|jtjj
kr?||jkr?dSt|d�rR|jtjjkrR||jkrRdSdS)z{Check if a TLS/SSL version is enabled

    :param version: TLS version name or ssl.TLSVersion member
    :return: bool
    �SSLv2FZHAS_rJ�maximum_versionT)rRrSr	r
�__members__rUr�IS_OPENSSL_3_0_0�TLSv1_2�
SSLContextrXrKrJ�MINIMUM_SUPPORTEDr^�MAXIMUM_SUPPORTED)r5rNr r r!rY�s0
������rYcs�fdd�}|S)z�Decorator to skip tests when a required TLS version is not available

    :param version: TLS version name or ssl.TLSVersion member
    :return:
    cst�����fdd��}|S)Ncs&t��st���d����|i|��S)Nz is not available.)rY�unittestZSkipTest)�args�kw)�funcr5r r!�wrapper�sz8requires_tls_version.<locals>.decorator.<locals>.wrapper)�	functools�wraps)rhri�r5)rhr!�	decorator�sz'requires_tls_version.<locals>.decoratorr )r5rmr rlr!�requires_tls_version�srncCs2d�tjt����}tjrtj�||�dSdS)N� )	r�	traceback�format_exception�sys�exc_infor�verbose�stdout�write)�prefixZ
exc_formatr r r!�handle_errors�rxcCs$tjrt��jdkrtjStjS�Nr)�time�daylight�	localtime�tm_isdst�altzone�timezoner r r r!�
utc_offsetsr�)�category)�	cert_reqs�ca_certs�ciphers�certfile�keyfilecKs�|�d�st|d<t�tj�}nt�tj�}|dur%|tjkr"d|_||_|dur.|�	|�|dus6|dur<|�
||�|durE|�|�|j|fi|��S)N�server_side�server_hostnameF)
�get�SIGNED_CERTFILE_HOSTNAMEr	rbrXrW�	CERT_NONE�check_hostname�verify_mode�load_verify_locations�load_cert_chainrL�wrap_socket)�sockr�r�r�r�r��kwargs�contextr r r!�test_wrap_sockets



r�T��server_chaincCsv|tkrt}n|tkrt}n|tkrt}nt|��t�tj	�}|�
t�t�tj�}|�
|�|r6|�
t�|||fS)zUCreate context

    client_context, server_context, hostname = testing_context()
    )�SIGNED_CERTFILEr��SIGNED_CERTFILE2�SIGNED_CERTFILE2_HOSTNAME�	NOSANFILE�NOSAN_HOSTNAME�
ValueErrorr	rbrXr��
SIGNING_CArWr�)Zserver_certr��hostname�client_context�server_contextr r r!�testing_context0s



r�c@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
ejdd��Zdd�Zdd�Zdd�Zedd ��Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zed)d*��Zd+d,�Zd-d.�Ze�d/ej vd0�d1d2��Z!d3d4�Z"d5d6�Z#e�e$j%d7kd8�d9d:��Z&e�e$j%d7kd8�d;d<��Z'd=d>�Z(d?d@�Z)dAdB�Z*dCdD�Z+dEdF�Z,e�e-�dG�dHdI��Z.dJdK�Z/e�0dLdM�dNdO��Z1dPdQ�Z2dRdS�Z3dTS)U�BasicSocketTestscCs�tjtjtjtjtjtjtj|�tj	d�|�tj
d�|�tjd�|�tjd�tj
tjtjtjtjtj|�tjtj�dS)NT)r	r��
CERT_OPTIONAL�
CERT_REQUIREDrAr?r@r>�assertEqual�HAS_SNI�HAS_ECDHZHAS_TLSv1_2ZHAS_TLSv1_3�OP_NO_SSLv2�OP_NO_SSLv3�OP_NO_TLSv1�
OP_NO_TLSv1_3�
OP_NO_TLSv1_1�
OP_NO_TLSv1_2rVr��selfr r r!�test_constantsKs$zBasicSocketTests.test_constantsc
Cs�tjtjtjtjtjtjg}|D]1}|j|d��!|�t	d��d|_
Wd�n1s-wYWd�n1s<wYqt�|tj�dS)N)�ssl_typezimmutable type)
�_sslZ_SSLContextZ
_SSLSocket�	MemoryBIOZCertificateZ
SSLSession�SSLError�subTest�assertRaisesRegex�	TypeError�valuerZcheck_disallow_instantiation)r�Z	ssl_typesr�r r r!�test_ssl_types_s �����zBasicSocketTests.test_ssl_typesc	Cst|�td��*t���
}t�|�Wd�n1swYWd�dSWd�dS1s3wYdS�Nzpublic constructor)r�r��socketr	�	SSLSocket�r��sr r r!�test_private_initns
��"�z"BasicSocketTests.test_private_initcCs2tj}|�t|�d�t�|�}|�|j|�dS)Nz_SSLMethod.PROTOCOL_TLS_CLIENT)r	rXr�rSrb�assertIsr[�r��protorNr r r!�test_str_for_enumsss
z#BasicSocketTests.test_str_for_enumscCs&t��}tjrtj�d||rdpdf�t���t�	d�\}}Wd�n1s+wY|�
t|�d�|�
||dk�|rPt�d�}|�
t|�d�n	|�
tjtjd�|�
ttjd�t���|�
ttj	d�Wd�n1sxwYt�dd�t�d	d�t�td
�d�dS)Nz
 RAND_status is %d (%s)
zsufficient randomnesszinsufficient randomness�����zthis is a random stringg�R@sthis is a random bytes objects!this is a random bytearray object)r	ZRAND_statusrrtrrrurvr�check_warningsZRAND_pseudo_bytesr�rZZ
RAND_bytes�assertRaisesr�r�ZRAND_add�	bytearray)r��v�dataZis_cryptographicr r r!�test_random{s.
��
�

�zBasicSocketTests.test_randomcCs�|�tj�t�t�|�tj�t�t�tj�t�}t	j
r*tj�
dt�|�d�|�|dd�|�|dd�|�|dd�|�|dd	�dS)
N�
r4))r-zprojects.developer.nokia.com)r-zprojects.forum.nokia.comr7)zhttp://ocsp.verisign.comr8)z0http://SVRIntl-G3-aia.verisign.com/SVRIntlG3.cerr9)z0http://SVRIntl-G3-crl.verisign.com/SVRIntlG3.crl)r�r	r��_test_decode_cert�CERTFILE�
CERTFILE_INFOr��SIGNED_CERTFILE_INFO�	NOKIACERTrrtrrrurv�pprint�pformat�r��pr r r!�test_parse_cert�s*
�
�
�
�
�z BasicSocketTests.test_parse_certcCsLtj�t�}tjrtj�dt	�
|�d�|�|dddddddd	��dS)
Nr�)�)r&ZUK))r+zcody-cazJun 14 18:00:58 2028 GMTzJun 18 18:00:58 2018 GMTZ02)r�))r+�#codenomicon-vm-2.test.lal.cisco.com))r-r�rr.)r	r�r��TALOS_INVALID_CRLDPrrtrrrurvr�r�r�r�r r r!�test_parse_cert_CVE_2019_5010�s��z.BasicSocketTests.test_parse_cert_CVE_2019_5010cCsxtj�t�}tjrtj�dt	�
|�d�d}|�|d|�|�|d|�tjdkr0d}nd}|�|d|�dS)	Nr�)�)r&ZUS))�stateOrProvinceNameZOregon))r(Z	Beavertonr)))�organizationalUnitNamezPython Core Development�)r+�null.python.orgexample.org))�emailAddresszpython-dev@python.orgr3r/)r�	�)�r-zaltnull.python.orgexample.com��emailz null@python.orguser@example.org��URIz)http://null.python.orghttp://example.org��
IP Addressz	192.0.2.1)r�z2001:DB8:0:0:0:0:0:1)r�r�r�r�)r�z	<invalid>r4)
r	r�r��NULLBYTECERTrrtrrrurvr�r�r�Z_OPENSSL_API_VERSION)r�r�r3Zsanr r r!�test_parse_cert_CVE_2013_4238�s
z.BasicSocketTests.test_parse_cert_CVE_2013_4238cCs tj�t�}|�|dd�dS)Nr4)
)r-Zallsans��	othername�
<unsupported>r�)r�zuser@example.org)r-zwww.example.org)ZDirName)r%r'r)))r+zdirname example)r�zhttps://www.python.org/�r��	127.0.0.1)r�z0: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_sanscCs�ttd��}|��}Wd�n1swYt�|�}t�|�}t�|�}|�||�|�tjd�s=|�	d|�|�
dtjd�sP|�	d|�dSdS)N�rr�z-DER-to-PEM didn't include correct header:
%r
z-DER-to-PEM didn't include correct footer:
%r
)rE�
CAFILE_CACERTrFr	�PEM_cert_to_DER_certZDER_cert_to_PEM_certr�rTZ
PEM_HEADER�fail�endswithZ
PEM_FOOTER)r�rH�pem�d1Zp2�d2r r r!�test_DER_to_PEM�s
�


�z BasicSocketTests.test_DER_to_PEMcCsFtj}tj}tj}|�|t�|�|t�|�|t�|�|d�|�	|d�|\}}}}}|�|d�|�	|d�|�|d�|�	|d�|�|d�|�	|d�|�|d�|�
|d�|�|d�|�
|d�d	|d
��}	|dkr�d|d
�d
|d
�d
|d
��}
nd|d
�d
|d
�d
|d
��}
|�|�|
|	f�||t
|�f�dS)Nii@r��r��?�z	LibreSSL �drzOpenSSL �.)r	ZOPENSSL_VERSION_NUMBER�OPENSSL_VERSION_INFO�OPENSSL_VERSION�assertIsInstance�int�tuplerS�assertGreaterEqual�
assertLessZassertLessEqual�
assertTruerT�hex)r��n�tr��major�minorZfix�patch�statusZlibressl_verZopenssl_verr r r!�test_openssl_versions6�z%BasicSocketTests.test_openssl_versioncCs`t�tj�}t|�}t�|�}t�dtf��	~Wd�n1s"wY|�|�d�dS)N�)	r��AF_INETr��weakref�refrr��ResourceWarningr�)r�r��ss�wrr r r!�
test_refcycle(s
�zBasicSocketTests.test_refcyclec	Cs�t�tj�}t|��e}|�t|jd�|�t|jtd��|�t|jd�|�t|j	td�d�|�t|j
d�|�t|jdd�|�t|j
�|�t|jdgddd�|�t|jd�|�t|jtd�g�Wd�dS1srwYdS)Nr��x)z0.0.0.0rr r�d)r�rr�r��OSError�recv�	recv_intor��recvfrom�
recvfrom_into�send�sendto�NotImplementedError�dup�sendmsg�recvmsg�recvmsg_into�r�r�rr r r!�test_wrapped_unconnected3s"


�
�"�z)BasicSocketTests.test_wrapped_unconnectedc	Cs\dD])}t�tj�}|�|�t|��}|�||���Wd�n1s&wYqdS)N)Ng�@)r�r�
settimeoutr�r��
gettimeout)r��timeoutr�rr r r!�test_timeoutEs

���zBasicSocketTests.test_timeoutc	
Cs�tjtjtjtjg}tjtjtjtjg}tj	j
tj	jtj	jg}|D]C}|j
|d��3t�tj�}|�t��}|j|O_Wd�n1sGwY|�dt|j��Wd�n1s_wYq!|D]@}|j
|d��0|�t��
}t�|�Wd�n1s�wY|�d|j�d�t|j��Wd�n1s�wYqg|D]C}|j
|d��3t�tj�}|�t��}||_Wd�n1s�wY|�d|�d�t|j��Wd�n1s�wYq�dS)N)�optionz4ssl.OP_NO_SSL*/ssl.OP_NO_TLS* options are deprecated)r[zssl.z is deprecatedrl)r	r�r�r�r�rr�PROTOCOL_TLSv1_2rVr
rrrr�rbrX�assertWarns�DeprecationWarning�optionsr�rS�warningrrJ)	r�r4�	protocolsZversionsr0rN�cmr[r5r r r!�test_openssl111_deprecationsNsd�������	�����
����z-BasicSocketTests.test_openssl111_deprecationsc	Cs�t��}|jtdtj|td�|jtdtj|dd�|jtdtj|ddd�tj|dtd��}|�td|jtd	f�Wd�n1sDwY|�t	��#}t���}tj|t
d
�Wd�n1sewYWd�n1stwY|�|jj
t
j�|�t	��$}t���}tj|tt
d�Wd�n1s�wYWd�n1s�wY|�|jj
t
j�|�t	��$}t���}tj|t
t
d�Wd�n1s�wYWd�n1s�wY|�|jj
t
j�dS)Nzcertfile must be specified�r�z5certfile must be specified for server-side operationsT�r�r�r�r�z!can't connect in server-side modei��r��r�r�)r�r�r�r	r�r��connect�HOSTr�r�NONEXISTINGCERTr��	exception�errno�ENOENT)r�r�r�r7r r r!�test_errors_sslwrap~sV��
�
��
���
����
����z$BasicSocketTests.test_errors_sslwrapcCsntj�tj�t�ptj|�}t��}|�|j�|�	t
j��t||d�Wd�dS1s0wYdS)z;Check that trying to use the given client certificate failsr<N)
rrrrr�curdirr��
addCleanup�closer�r	r�r��r�r�r�r r r!�
bad_cert_test�s��"�zBasicSocketTests.bad_cert_testcC�|�d�dS)z Wrapping with an empty cert filer;N�rIr�r r r!�test_empty_cert��z BasicSocketTests.test_empty_certcCrJ)z:Wrapping with a badly formatted certificate (syntax error)r<NrKr�r r r!�test_malformed_cert�rMz$BasicSocketTests.test_malformed_certcCrJ)z2Wrapping with a badly formatted key (syntax error)r=NrKr�r r r!�test_malformed_key�rMz#BasicSocketTests.test_malformed_keyc	sJdd�}�fdd�}ddi}||d�||d�||d	�||d
�||d�||d�dd
i}||d�||d�||d�||d�||d�ddi}||d�||d�||d�||d�||d�ddi}||d�||d�||d�ddi}||d�||d�||d�||d�ddi}||d�||d�||d�d�d ��d!�}dd"|fffi}|||�dd#i}|||�dd$i}|||�d%�d ��d!�}dd"|fffi}||d&�d ��d!��||d'�d ��d!��||d(�d ��d!��||d)�d ��d!��d*d+d,d-�}||d.�||d/�||d0�||d1�d2d3d4�}||d5�||d6�||d7�dd8d9�}||d:�||d;�||d<�||d=�||d>�||d?�||d@�tj�r�ddAd9�}||dB�||dC�||dD�||dE�||dF�||d@�d2dGd4�}||d5�dHdIdJd-�}||d5�dHdGdJd-�}||dK���ttjdd���ttjid�ddLi}��tj	dM��t�|dN�Wd�n	1�s�wYddOi}��tj	dP��t�|dQ�Wd�n	1�s�wYddRi}��tj	dS��t�|dT�Wd�n	1�swYddUi}��tj	dV��t�|dW�Wd�n	1�s9wYddXi}��tj	dY��t�|dZ�Wd�n	1�s[wYd[D]}��t��
t�
|�Wd�n	1�szwY�qbd\D]}��t�
|���q�tj�r�d]D]
}��t�
|���q�dSdS)^NcSst�||�dSr)r	�match_hostname��certr�r r r!�ok�sz0BasicSocketTests.test_match_hostname.<locals>.okcs��tjtj||�dSr)r�r	�CertificateErrorrPrQr�r r!r��s�z2BasicSocketTests.test_match_hostname.<locals>.failr3)))r+�example.comrUzExAmple.cOmzwww.example.comz.example.comzexample.orgZexampleXcom)))r+z*.a.comz	foo.a.comz
bar.foo.a.comza.comzXa.comz.a.com)))r+zf*.comzfoo.comzf.comzbar.comzbar.foo.com)r�r�znull.python.org)))r+z	*.*.a.com)))r+za.*.comz	a.foo.comza..comupüthon.python.org�idna�asciir+)))r+z
x*.python.org)))r+zxn--p*.python.orguwww*.pythön.orguwww.pythön.orguwww1.pythön.orguftp.pythön.orgupythön.orgzJun 26 21:41:46 2011 GMT)))r+�linuxfrz.org))r-�linuxfr.org)r-�linuxfr.comr�)r0r3r4rYrZr�rXzDec 18 23:59:59 2011 GMT)r��)r��
California�)r(z
Mountain View�)r*z
Google Inc�)r+�mail.google.com)r0r3r`z	gmail.comr\)�r-rU)r��10.11.12.13)r��14.15.16.17r�)r3r4rbrcz127.1z14.15.16.17 z14.15.16.17 extra dataz14.15.16.18zexample.net)ra)r�z2001:0:0:0:0:0:0:CAFE
)r�z2003:0:0:0:0:0:0:BABA
z
2001::cafez
2003::babaz2003::baba z2003::baba extra dataz
2003::bebe)r�r[r]r^zDec 18 23:59:59 2099 GMT)r�r[r]r_))r�Zblablaz
google.com)))r+za*b.example.comz5partial wildcards in leftmost label are not supportedzaxxb.example.com)))r+zwww.*.example.comz2wildcard can only be present in the leftmost labelzwww.sub.example.com)))r+za*b*.example.comztoo many wildcardszaxxbxxc.example.com)))r+�*z7sole wildcard without additional labels are not support�host)))r+z*.comz%hostname 'com' doesn't match '\*.com'Zcom)�1rz1.2.3z	256.0.0.1z127.0.0.1/24)r�z192.168.0.1)z::1z2001:db8:85a3::8a2e:370:7334)�encode�decoder�IPV6_ENABLEDr�r�r	rPr�rTZ_inet_patonr
)r�rSr�rRrV�invalidZipaddrr r�r!�test_match_hostname�s 




























�



�


�






�





�
�
�
�������������z$BasicSocketTests.test_match_hostnamecCsPt�tj�}t���}|jt|j|ddd�Wd�dS1s!wYdS)NTz
some.hostname�r�)r	rbrWr�r�r�r�)r�rNr�r r r!�test_server_sideys
�"�z!BasicSocketTests.test_server_sidec	Cs�t�d�}t�tj�}|�|���t|dd��"}|�t��
|�d�Wd�n1s.wYWd�n1s=wY|�	�dS)N�r�rF��do_handshake_on_connectzunknown-type)
r��
create_serverrr>�getsocknamer�r�r��get_channel_bindingrG)r�r��crr r r!�test_unknown_channel_binding�s
���z-BasicSocketTests.test_unknown_channel_binding�
tls-unique�*'tls-unique' channel binding not availablecCs�t�tj�}t|��}|�|�d��Wd�n1swYt�tj�}t|dtd��}|�|�d��Wd�dS1sCwYdS)NrvTr;)r�rr��assertIsNonersr�r)r r r!�test_tls_unique_channel_binding�s
�"�z0BasicSocketTests.test_tls_unique_channel_bindingcCsjtt�tj��}t|�}|�t��}d}t��Wd�n1s"wY|�|t	|j
jd��dSry)r�r�r�reprr2rr�
gc_collect�assertInrSr5rf)r�rr�r7r r r!�test_dealloc_warn�s
�z"BasicSocketTests.test_dealloc_warncCs�t��}|�t|�d�|�|tj�t���#}t|d<t	|d<t��}|�|j
t	�|�|jt�Wd�dS1s=wYdS)N��SSL_CERT_DIR�
SSL_CERT_FILE)r	Zget_default_verify_pathsr�rZrZDefaultVerifyPathsr�EnvironmentVarGuard�CAPATHr��cafiler$)r��paths�envr r r!�test_get_default_verify_paths�s
"�z.BasicSocketTests.test_get_default_verify_pathsr�Windows specificc	Cs�|�t�d��|�t�d��|�ttj�|�ttjd�t�}dD]H}t�|�}|�|t�|D]8}|�|t	�|�
t|�d�|\}}}|�|t�|�
|ddh�|�|tttf�t|ttf�rk|�|�q3q$d}|�
||�dS)	N�CA�ROOTr)r�r�r�x509_asn�
pkcs_7_asn�1.3.6.1.5.5.7.3.1)r
r	Zenum_certificatesr�r��WindowsError�setr�listrr�rZ�bytesr|�	frozenset�boolrR�update)	r�Z
trust_oidsZ	storename�store�elementrR�encZtrust�
serverAuthr r r!�test_enum_certificates�s*


��
z'BasicSocketTests.test_enum_certificatescCs�|�t�d��|�ttj�|�ttjd�t�d�}|�|t�|D]"}|�|t�|�	t
|�d�|�|dt�|�|dddh�q$dS)Nr�r�rr�r�r�)
r
r	Z	enum_crlsr�r�r�rr�rr�rZr�r|)r�Zcrlsr�r r r!�test_enum_crls�s
�zBasicSocketTests.test_enum_crlsc	Cs�d}t�d�}|�||�|�|jd�|�|jd�|�|jd�|�|jd�|�|tj�|�t	tjd�tj�
d�}|�||�|�|tj�|�t	tjj
d�|�t	d��tj�
d�Wd�n1skwYtd	�D]4}ztj�
|�}Wn	t	y�Yqtw|�|jt
�|�|jt�|�|jt�|�|jttd�f�qttj�d�}|�||�|�|tj�|�tj�d�|�|�tj�d�|�|�t	d
��tj�d�Wd�dS1s�wYdS)N)�r��TLS Web Server Authenticationr�r�r�r�r����zunknown NID 100000i����zunknown object 'serverauth'Z
serverauth)r	�_ASN1Objectr��nid�	shortnameZlongname�oidrr�r�Zfromnidr��rangerrS�typeZfromname)r��expected�val�i�objr r r!�test_asn1object�sH
���"�z BasicSocketTests.test_asn1objectcCs�t�d�}|�tjjtj�|�tjj|�|�tjjjd�|�tjjjd�|�tjjjd�t�d�}|�tjj	tj�|�tjj	|�|�tjj	jd�|�tjj	jd�|�tjj	jd�dS)Nr�r�r�z1.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_enumcCs�t�tjtj�}|�|j�|�t��}t|tj	d�Wd�n1s%wY|�
t|j�d�t�
tj�}|�t��
}|�|�Wd�n1sNwY|�
t|j�d�dS)N�r�z!only stream sockets are supported)r�r�
SOCK_DGRAMrFrGr�r$r�r	r�r�rSrArbrXr�)r�r�ZcxrNr r r!�test_unsupported_dtls
s��z&BasicSocketTests.test_unsupported_dtlscCs|�t�|�|�dSr)r�r	�cert_time_to_seconds)r��
timestringZ	timestampr r r!�cert_time_okszBasicSocketTests.cert_time_okcCs:|�t��t�|�Wd�dS1swYdSr)r�r�r	r�)r�r�r r r!�cert_time_fails"�zBasicSocketTests.cert_time_failz)local time needs to be different from UTCcCs|�dd�|�dd�dS)NzMay  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_timezonesz3BasicSocketTests.test_cert_time_to_seconds_timezonecCs�d}d}|�||�|�tj|d�|�|�d|�|�d|�|�d�|�d�|�d�|�d	�|�d
�|�d�|�d�d
}|�d|�|�d|�|�dd�|�dd�|�dd�|�d�|�dd�dS)Nr�r�)Z	cert_timezJan 05 09:34:43 2018 GMTzJaN  5 09:34:43 2018 GmTzJan  5 09:34 2018 GMTzJan  5 09:34:43 2018zJan  5 09:34:43 2018 UTCzJan 35 09:34:43 2018 GMTzJon  5 09:34:43 2018 GMTzJan  5 24:00:00 2018 GMTzJan  5 09:60:43 2018 GMTg�W�AzDec 31 23:59:60 2008 GMTzJan  1 00:00:00 2009 GMTzJan  5 09:34:59 2018 GMTi�FOZzJan  5 09:34:60 2018 GMTi�FOZzJan  5 09:34:61 2018 GMTi�FOZzJan  5 09:34:62 2018 GMTzDec 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_ALLrcCs@dd�}|���dkr|�d�|�dd�|�|�d�dS)NcSst�dd�S)Nz%b)	r�r�rr��r~rrr)rz�strftimer r r r!�local_february_nameK�zNBasicSocketTests.test_cert_time_to_seconds_locale.<locals>.local_february_nameZfebz>locale-specific month name needs to be different from C localezFeb  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_localeGs

z1BasicSocketTests.test_cert_time_to_seconds_localecCsvt�tj�}|�|j�t�|�}tt�tj�tjd�}|�|j�|�	t
|f�}tjtj
tjtjf}|�||�dS)Nr�)r�rrFrGr�	bind_portr�r	r��
connect_exr?rBZECONNREFUSEDZEHOSTUNREACHZ	ETIMEDOUT�EWOULDBLOCKr|)r��server�portr��rc�errorsr r r!�test_connect_ex_errorVs
��z&BasicSocketTests.test_connect_ex_errorc	Cs�t�\}}}t|d�}|�D|jt��|d��"}|�t|jf�|�|�d�d�|�|�	d�d�Wd�n1s<wYWd�dSWd�dS1sTwYdS)N�r�rlr�)
r��ThreadedEchoServerr�r�r>r?r�r�rr"�r�r�r�r�r�r�r r r!�test_read_write_zerofs

���"�z%BasicSocketTests.test_read_write_zeroN)4�__name__�
__module__�__qualname__r�r�r�r�r�r�r�r�r�r�rrZcpython_onlyrr*r/r8�ignore_deprecationrDrIrLrNrOrkrmrure�
skipUnlessr	�CHANNEL_BINDING_TYPESryr}r�rr�platformr�r�r�r�r�r�r�r�r�r�Zrun_with_localer�r�r�r r r r!r�Ish#

	0


G
�



'�

#
r�c@s|eZdZdd�Zdd�Ze�edkd�dd��Zd	d
�Z	dd�Z
d
d�Zdd�Ze
dd��Ze�eejd�d�dd��Zdd�Zdd�Zdd�Zdd�Ze�ed�d d!��Zd"d#�Zd$d%�Ze�ejd&�d'd(��Zd)d*�Zd+d,�Zd-d.�Z d/d0�Z!d1d2�Z"e�e#j$d3kd4�d5d6��Z%e�e#j$d3kd7�e�ee#d8�d9�d:d;���Z&d<d=�Z'd>d?�Z(d@dA�Z)dBdC�Z*dDdE�Z+dFdG�Z,dHdI�Z-dJS)K�ContextTestsc	Cs�tD]"}t���
t�|�}Wd�n1swY|�|j|�qt���t��}Wd�n1s8wY|�|jtj�|�t	tjd�|�t	tjd�dS)Nr��*)
�	PROTOCOLSrr�r	rbr�r[rVr�r�)r�r[rNr r r!�test_constructorts
�

�zContextTests.test_constructorcCs^t�tj�}|�d�|�d�|�tjd��|�d�Wd�dS1s(wYdS)N�ALL�DEFAULT�No cipher can be selected�^$:,;?*'dorothyx)r	rbrXrLr�r��r�rNr r r!�test_cipherss

"�zContextTests.test_ciphersr�z+Test applies only to Python default cipherscCsft�tj�}|��}|D]$}|d}|�d|�|�d|�|�d|�|�d|�|�d|�qdS)NrZPSKZSRPZMD5ZRC4Z3DES)r	rbrX�get_ciphersZassertNotIn)r�rNr�Zsuiterr r r!�test_python_ciphers�s�z ContextTests.test_python_cipherscCsHt�tj�}|�d�tdd�|��D��}|�d|�|�d|�dS)NZAESGCMcss�|]}|dVqdS)rNr )�.0rr r r!�	<genexpr>���z0ContextTests.test_get_ciphers.<locals>.<genexpr>zAES256-GCM-SHA384zAES128-GCM-SHA256)r	rbrXrLr�r�r|)r�rN�namesr r r!�test_get_ciphers�s

zContextTests.test_get_cipherscCs�t�tj�}tjtjBtjB}|ttBtBt	Bt
BtBO}|�||j
�t���|j
tjO_
Wd�n1s;wY|�|tjB|j
�t���|j
tj@|_
Wd�n1sawY|�||j
�d|_
|�d|j
tj@�dSry)r	rbrX�OP_ALLr�r�r>rAr?r@rBrCr�r4rr�r�)r�rN�defaultr r r!�test_options�s,����
�
�zContextTests.test_optionscCs@t���t�tj�}Wd�n1swY|�|jtj�tj|_|�|jtj�tj	|_|�|jtj	�tj|_|�|jtj�|�
t��d|_Wd�n1sYwY|�
t��d|_Wd�n1sqwYt�tj
�}|�|jtj�|�|j�t�tj�}|�|jtj	�|�|j�dS�Nr�)rr�r	rbrVr�r�r�r�r�r�r�r�rW�assertFalser�rXr
r�r r r!�test_verify_mode_protocol�s,
���z&ContextTests.test_verify_mode_protocolcCs�t�tj�}|�|j�tjr,d|_|�|j�d|_|�|j�d|_|�|j�dS|�t��d|_Wd�dS1s@wYdS�NTF)	r	rbrXr
�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_namecCs�t�tj�}tjjtjjtjjh}tjjtjjh}|�	|j
|�|�	|j|�tjj|_
tjj|_|�
|j
tjj�|�
|jtjj�tjj|_
tjj|_|�
|j
tjj�|�
|jtjj�tjj|_|�
|jtjj�tjj|_|�	|jtjjtjjh�tjj|_
|�	|j
tjjtjjh�|�t��d|_
Wd�n1s�wYt�tj�}|�	|j
|�|�
|jtjj�|�t��
tjj|_
Wd�n1s�wY|�t��tjj|_Wd�dS1s�wYdSr�)r	rbrWr
rcrrard�TLSv1_3r|rJr^rr�rr�r�r)r�rNZ
minimum_rangeZ
maximum_ranger r r!�test_min_max_version�sx�
���


�
�


�
�

�
�
���
��"�z!ContextTests.test_min_max_version�security_levelzrequires OpenSSL >= 1.1.0cCs&t�tj�}hd�}|�|j|�dS)N>rr�r�rr�r�)r	rbrXr|r�)r�rNZsecurity_level_ranger r r!�test_security_level#sz ContextTests.test_security_levelcCs�t�tj�}ttdd�}|�|jtj|B�tj|_|�|jtj�tj|_|�|jtj�tj|_|�|jtj�tj	|_|�|jtj	�tjtj
B|_|�|jtjtj
B�|�t��d|_Wd�dS1slwYdS)N�VERIFY_X509_TRUSTED_FIRSTr)
r	rbrWrUr��verify_flags�VERIFY_DEFAULT�VERIFY_CRL_CHECK_LEAFZVERIFY_CRL_CHECK_CHAINZVERIFY_ALLOW_PROXY_CERTSZVERIFY_X509_STRICTr�r�)r�rN�tfr r r!�test_verify_flags6s$
�"�zContextTests.test_verify_flagscCs�t�tj�}|jtdd�|jttd�|jt|jtd�|�t��
}|�t�Wd�n1s2wY|�	|j
jtj�|�
tjd��
|�t�Wd�n1sWwY|�
tjd��
|�t�Wd�n1sswYt�tj�}|�tt�|jttd�|jttd�|�
tjd��
|�t�Wd�n1s�wY|�
tjd��
|�t�Wd�n1s�wY|�
tjd��|jttd�Wd�n1s�wYt�tj�}|�
tjd��|�tt�Wd�n	1�swY|jttd�|jtt��d�|jttt���d�|�ttt�|�ttt���|�tttt����|�
td��|jtdd�Wd�n	1�s[wY|�tj��|jtdd�Wd�n	1�sywY|�
td	��|jtd
dd�Wd�n	1�s�wYdd
�}dd�}dd�}dd�}dd�}dd�}dd�}	Gdd�d�}
|jt|d�|jt|d�|jt|d�|jt|
�d�|jt|
�jd�|�tj��|jt|d�Wd�n	1�swY|�
td	��|jt|d�Wd�n	1�swY|�
td��|jt|d�Wd�n	1�s<wY|�
td��|jt|	d�Wd�n	1�sZwY|jt|	d�dS)Nr9�PEM libr=zkey values mismatch)�passwordzshould be a stringT�badpasszcannot be longer�ai�cS�tSr��KEY_PASSWORDr r r r!�getpass_unicodeyrQz:ContextTests.test_load_cert_chain.<locals>.getpass_unicodecSst��Sr)rrgr r r r!�
getpass_bytes{�z8ContextTests.test_load_cert_chain.<locals>.getpass_bytescSstt���Sr)r�rrgr r r r!�getpass_bytearray}r�z<ContextTests.test_load_cert_chain.<locals>.getpass_bytearraycS�dS)Nr�r r r r r!�getpass_badpassrQz:ContextTests.test_load_cert_chain.<locals>.getpass_badpasscSsddS)Nrir r r r r!�getpass_huge�rz7ContextTests.test_load_cert_chain.<locals>.getpass_hugecSr)Nr�r r r r r!�getpass_bad_type�rQz;ContextTests.test_load_cert_chain.<locals>.getpass_bad_typecSstd��)N�
getpass error)�	Exceptionr r r r!�getpass_exception�rz<ContextTests.test_load_cert_chain.<locals>.getpass_exceptionc@�eZdZdd�Zdd�ZdS)z:ContextTests.test_load_cert_chain.<locals>.GetPassCallablecSrrrr�r r r!�__call__�rQzCContextTests.test_load_cert_chain.<locals>.GetPassCallable.__call__cSrrrr�r r r!�getpass�rQzBContextTests.test_load_cert_chain.<locals>.GetPassCallable.getpassN)r�r�r�rrr r r r!�GetPassCallable�srzmust return a stringr)r	rbrWr�r�r�r�rr@r�rArBrCr�r��BADCERT�	EMPTYCERT�ONLYCERT�ONLYKEY�BYTES_ONLYCERT�
BYTES_ONLYKEYr��CERTFILE_PROTECTEDrrgr��ONLYKEY_PROTECTEDr�rr
)r�rNr7rrrr	r
rrrr r r!�test_load_cert_chainJs��������
�
���������z!ContextTests.test_load_cert_chaincCst�tj�}|�t�|jtdd�|�t�|jtdd�|�t|j�|�t|jddd�|�t��
}|�t	�Wd�n1sDwY|�
|jjtj
�|�tjd��
|�t�Wd�n1siwY|�tt�|jttd�|�t|jdd�dS)N)r�r$r��r$T)r	rbrWr�r��BYTES_CERTFILEr�r�rr@r�rArBrCr�r�rr��BYTES_CAPATH�r�rNr7r r r!�test_load_verify_locations�s"

��z'ContextTests.test_load_verify_locationscCs�tt��}|��}Wd�n1swYt�|�}tt��}|��}Wd�n1s0wYt�|�}t�tj�}|�|�	�dd�|j
|d�|�|�	�dd�|j
|d�|�|�	�dd�|j
|d�|�|�	�dd�t�tj�}d�||f�}|j
|d�|�|�	�dd�t�tj�}d|d|d	|d
g}|j
d�|�d�|�|�	�dd�t�tj�}|j
|d�|j
|d�|�|�	�dd�|j
|d�|�|�	�dd�t�tj�}d�||f�}|j
|d�|�|�	�dd�t�tj�}|jt
|j
td�|�tjd��|j
d
d�Wd�n	1�s*wY|�tjd��|j
dd�Wd�dS1�sIwYdS)N�x509_car��cadatar�r�r��head�otherZagain�tailr�z4no start line: cadata does not contain a certificate�brokenz6not enough data: cadata does not contain a certificatesbroken)rEr�rFr	r��CAFILE_NEURONIOrbrXr��cert_store_statsr�rr�r��objectr�r�)r�rHZ
cacert_pemZ
cacert_derZneuronio_pemZneuronio_derrNZcombinedr r r!�test_load_verify_cadata�sd

�


�

����$�z$ContextTests.test_load_verify_cadata�)Avoid mixing debug/release CRT on WindowscCs�t�tj�}|�t�tjdkr|�t�|�t	|j�|�t	|jd�|�t
��
}|�t�Wd�n1s9wY|�|j
jtj�|�tj��}|�t�Wd�dS1s^wYdS)N�nt)r	rbrW�load_dh_params�DHFILErr�BYTES_DHFILEr�r�rGr@r�rArBrCr�r�rr r r!�test_load_dh_params�s


�"�z ContextTests.test_load_dh_paramscCsHtjtjhD]}t�|�}|�|��dddddddddddd��qdS)Nr)Znumberr>Zconnect_goodZconnect_renegotiate�acceptZaccept_goodZaccept_renegotiate�hits�missesZtimeoutsZ
cache_full)r	rXrWrbr��
session_statsr�r r r!�test_session_stats�s 


��zContextTests.test_session_statscCst�tj�}|��dSr)r	rbrXZset_default_verify_pathsr�r r r!�test_set_default_verify_pathssz*ContextTests.test_set_default_verify_pathsz#ECDH disabled on this OpenSSL buildcCsbt�tj�}|�d�|�d�|�t|j�|�t|jd�|�t|jd�|�t|jd�dS)N�
prime256v1s
prime256v1�foo�foo)r	rbrW�set_ecdh_curver�r�r�r�r r r!�test_set_ecdh_curves

z ContextTests.test_set_ecdh_curvecCsjt�tj�}|�t|j�|�t|jd�|�t|jd�|�t|j|�dd�}|�d�|�|�dS)Nr�rcSrPrr �r��
servernamerNr r r!�
dummycallback'rQz5ContextTests.test_sni_callback.<locals>.dummycallback)r	rbrWr�r��set_servername_callback)r�rNr?r r r!�test_sni_callbacks
zContextTests.test_sni_callbackcCsJt�tj�}|fdd�}|�|�t�|�}~~t��|�|�d�dS)NcSrPrr )r�r>rN�cycler r r!r?0rQz>ContextTests.test_sni_callback_refcycle.<locals>.dummycallback)	r	rbrWr@rr�gc�collectr�)r�rNr?rr r r!�test_sni_callback_refcycle,s

z'ContextTests.test_sni_callback_refcyclecCs�t�tj�}|�|��dddd��|�t�|�|��dddd��|�t�|�|��dddd��|�t�|�|��dddd��dS)Nr)r!�crl�x509r�r�)	r	rbrXr�r)r�r�r�r�r�r r r!�test_cert_store_stats8s 

�


�


�


�z"ContextTests.test_cert_store_statscCs�t�tj�}|�|��g�|�t�|�|��g�|�t�|�|��dddddddd�g�tt��}|�	�}Wd�n1sDwYt�
|�}|�|�d�|g�dS)	N)))r*zRoot CA))r�zhttp://www.cacert.org))r+zCA Cert Signing Authority))r�zsupport@cacert.orgzMar 29 12:29:49 2033 GMTzMar 30 12:29:49 2003 GMTZ00)z!https://www.cacert.org/revoke.crlr)r/r0r1r2r9r3r5T)r	rbrXr��get_ca_certsr�r�r�rErFr�)r�rNrHr��derr r r!�test_get_ca_certsFs(


��

�
zContextTests.test_get_ca_certscCs�t�tj�}|��t�tj�}|�tjj�|��t�tj�}|�tjj�t�tj�}|�t|jd�|�t|jd�dS)Nr�)	r	rbrX�load_default_certsr�r�r�r�r�r�r r r!�test_load_default_certsbsz$ContextTests.test_load_default_certsrznot-Windows specificcCsjt�tj�}t���!}t|d<t|d<|��|�|�	�dddd��Wd�dS1s.wYdS)Nrr�rr�)rFrGr!)
r	rbrXrr�r�r�rLr�r))r�rNr�r r r!�test_load_default_certs_envqs
"�z(ContextTests.test_load_default_certs_envr�rz3Debug build does not share environment between CRTscCs�t�tj�}|��|��}t�tj�}t���%}t|d<t|d<|��|dd7<|�	|��|�Wd�dS1s@wYdS)Nrr�rGr�)
r	rbrXrLr)rr�r�r�r�)r�rN�statsr�r r r!�#test_load_default_certs_env_windowszs
"�z0ContextTests.test_load_default_certs_env_windowscCs�|�|jtj@tj�tdkr|�|jt@t�tdkr%|�|jt@t�tdkr2|�|jt@t�tdkrA|�|jt@t�dSdSry)r�r4r	r�r>r?r@rAr�r r r!�_assert_context_options�s$�����z$ContextTests._assert_context_optionscCs�t��}|�|jtj�|�|jtj�|�|j�|�	|�t
t��}|��}Wd�n1s2wYtjtt
|d�}|�|jtj�|�|jtj�|�	|�t�tjj�}|�|jtj�|�|jtj�|�	|�dS)N)r�r$r#)r	�create_default_contextr�r[rXr�r�r
r�rQrEr�rFr�r�r�rWr�)r�rNrHr#r r r!�test_create_default_context�s$


��
z(ContextTests.test_create_default_contextcCsLt��}|�|jtj�|�|jtj�|�|j�|�	|�t
���t�tj�}Wd�n1s4wY|�|jtj�|�|jtj�|�	|�t
���tjtj
tjdd�}Wd�n1sgwY|�|jtj
�|�|jtj�|�|j�|�	|�tjtjjd�}|�|jtj�|�|jtj�|�	|�dS)NT)r�r�)Zpurpose)r	�_create_stdlib_contextr�r[rXr�r�r�r�rQrr�rr1r�r
r�r�rWr�r r r!�test__create_stdlib_context�s4

�

��
z(ContextTests.test__create_stdlib_contextcCs�t���t�tj�}Wd�n1swY|�|j�|�|jtj	�d|_|�
|j�|�|jtj�d|_tj|_|�|j�|�|jtj�d|_tj	|_d|_|�|j�|�|jtj	�d|_|�
|j�|�|jtj�d|_tj|_d|_|�|j�|�|jtj�d|_|�
|j�|�|jtj�|�
t��tj	|_Wd�n1s�wYd|_|�|j�tj	|_|�|jtj	�dSr�)rr�r	rbrVr�r�r�r�r�r
r�r�r�r�r�r r r!�test_check_hostname�sF
�
�z ContextTests.test_check_hostnamecCsTt�tj�}|�|j�|�|jtj�t�tj�}|�	|j�|�|jtj
�dSr)r	rbrXr
r�r�r�r�rWr�r�r�r r r!�test_context_client_server�sz'ContextTests.test_context_client_servercCs�Gdd�dtj�}Gdd�dtj�}t�tj�}||_||_|jt��dd��}|�	||�Wd�n1s8wY|j
t��t��dd�}|�	||�dS)Nc@�eZdZdS)z;ContextTests.test_context_custom_class.<locals>.MySSLSocketN�r�r�r�r r r r!�MySSLSocket�rZc@rX)z;ContextTests.test_context_custom_class.<locals>.MySSLObjectNrYr r r r!�MySSLObjectr[r\Tr:)r	r��	SSLObjectrbrWZsslsocket_classZsslobject_classr�r�r�wrap_bior�)r�rZr\rNr�r�r r r!�test_context_custom_classs�z&ContextTests.test_context_custom_classcCs�t�tj�}|�|jd�d|_|�|jd�d|_|�|jd�|�t��d|_Wd�n1s4wY|�t��d|_Wd�n1sLwYt�tj�}|�|jd�|�t��d|_Wd�dS1srwYdS)Nr�r�rr�)	r	rbrWr�Znum_ticketsr�r�r�rXr�r r r!�test_num_tickests"��"�zContextTests.test_num_tickestN).r�r�r�r�r�rer�rr�r�r�r�r�r�r�rKr	rbr�r�rr r+�skipIf�Py_DEBUG_WIN32r1r6r7r�r<rArErHrKrMrrr�rNrPrQrSrUrVrWr_r`r r r r!r�rsZ
�

N
�
S
?


	

,r�c@s8eZdZdd�Ze�ed�dd��Zdd�Zdd	�Z	d
S)�
SSLErrorTestscCsXt�dd�}|�t|�d�|�|jd�t�dd�}|�t|�d�|�|jd�dS)Nr�r9)r	r�r�rSrBZSSLZeroReturnError)r��er r r!�test_str'szSSLErrorTests.test_strr,cCs�t�tj�}|�tj��
}|�t�Wd�n1swY|�|jj	d�|�|jj
d�t|j�}|�|�
d�|�dS)NZPEMZ
NO_START_LINEz"[PEM: NO_START_LINE] no start line)r	rbrXr�r�r.r�r�rAZlibrary�reasonrSr
rT)r�rNr7r�r r r!�test_lib_reason1s�
zSSLErrorTests.test_lib_reasonc
Cst�tj�}d|_tj|_t�d��f}t�|�	��}|�
d�|j|ddd��9}|�tj
��}|��Wd�n1s=wYt|j�}|�|�d�|�|�|jjtj�Wd�n1scwYWd�dSWd�dS1s{wYdS)NFrnroz%The operation did not complete (read))r	rbrXr�r�r�r�rq�create_connectionrr�setblockingr�r��SSLWantReadError�do_handshakerSrAr
rTr�rB�SSL_ERROR_WANT_READ)r�rNr�rtr7r r r!�
test_subclass<s"

�
��"�zSSLErrorTests.test_subclasscCs�t��}|�t��|jt��t��dd�Wd�n1s wY|�t��|jt��t��dd�Wd�n1sAwY|�t��|jt��t��dd�Wd�dS1scwYdS)Nrrlz.example.orgzexample.orgevil.com)r	rRr�r�r^r�r�r�r r r!�test_bad_server_hostnameNs �����"�z&SSLErrorTests.test_bad_server_hostnameN)
r�r�r�rererarbrgrmrnr r r r!rc%s



rcc@s4eZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�MemoryBIOTestscCs�t��}|�d�|�|��d�|�|��d�|�d�|�d�|�|��d�|�|��d�|�d�|�|�d�d�|�|�d�d	�|�|�d�d�dS)
Nr:r��barsfoobar�bazr�sbar��z)r	r�rvr�rF�r��bior r r!�test_read_write]s



zMemoryBIOTests.test_read_writecCs�t��}|�|j�|�|��d�|�|j�|�d�|�|j�|��|�|j�|�|�d�d�|�|j�|�|�d�d�|�|j�|�|��d�|�|j�dS)Nr�r:r�sfor��o)	r	r�r��eofr�rFrv�	write_eofr
rsr r r!�test_eofks
zMemoryBIOTests.test_eofcCs�t��}|�|jd�|�d�|�|jd�td�D]}|�d�|�|jd|d�qtd�D]}|�d�|�|j|d�q2|��|�|jd�dS)Nrr:rr�r)r	r�r��pendingrvr�rF)r�rtr�r r r!�test_pending{s


zMemoryBIOTests.test_pendingcCsbt��}|�d�|�|��d�|�td��|�|��d�|�td��|�|��d�dS)Nr:rprq)r	r�rvr�rFr��
memoryviewrsr r r!�test_buffer_types�s
z MemoryBIOTests.test_buffer_typescCsLt��}|�t|jd�|�t|jd�|�t|jd�|�t|jd�dS)Nr9Tr�)r	r�r�r�rvrsr r r!�test_error_types�s
zMemoryBIOTests.test_error_typesN)r�r�r�ruryr{r}r~r r r r!ro[s	roc@r)�SSLObjectTestscCsFt��}|�td��t�||�Wd�dS1swYdSr�)r	r�r�r�r]rsr r r!r��s"�z SSLObjectTests.test_private_initc	Cs:t�\}}}t��}t��}t��}t��}|j|||d�}|j||dd�}	td�D]8}
z|��Wn
tjy<Ynw|jrG|�|�	��z|	��Wn
tjyWYnw|jrb|�|�	��q*|��|	��|�
tj��|��Wd�n1s�wY|�|�	��|	��|�|�	��|��dS)NrlTr:r�)r�r	r�r^r�rkrjrzrvrFr��unwrap)r��
client_ctx�
server_ctxr�Zc_inZc_outZs_inZs_out�clientr��_r r r!�test_unwrap�s@���
�zSSLObjectTests.test_unwrapN)r�r�r�r�r�r r r r!r�src@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Ze
�ejdkd�dd��Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.S)/�SimpleBackgroundTestsz?Tests that connect to a simple server running in the backgroundcCsPt�tj�|_|j�t�t|jd�}t|jf|_	|�
�|�|jddd�dS)Nr�)
r	rbrWr�r�r�r�r?r��server_addr�	__enter__rF�__exit__)r�r�r r r!�setUp�szSimpleBackgroundTests.setUpcCs�tt�tj�tjd��}|�|j�|�i|���|�	|j
�Wd�n1s*wYtt�tj�tjtd��}|�|j�|�
|���|�	|j
�Wd�dS1sZwYdS)Nr��r�r�)r�r�rr	r�r>r�r��getpeercertr�r�r�r�r
r�r r r!�test_connect�s"���"�z"SimpleBackgroundTests.test_connectcCs<tt�tj�tjd�}|�|j�|�tjd|j	|j
�dS)Nr��certificate verify failed)r�r�rr	r�rFrGr�r�r>r�r�r r r!�test_connect_fail�s�
�z'SimpleBackgroundTests.test_connect_failcCsJtt�tj�tjtd�}|�|j�|�d|�	|j
��|�|���dS)Nr�r)
r�r�rr	r�r�rFrGr�r�r�r
r�r�r r r!�test_connect_ex�s�z%SimpleBackgroundTests.test_connect_exc	Cs�tt�tj�tjtdd�}|�|j�|�d�|�	|j
�}|�|dtj
tjf�t�g|ggd�	z|��Wq`tjyLt�|gggd�Yntjy^t�g|ggd�Ynwq3|�|���dS)NF)r�r�rprr+)r�r�rr	r�r�rFrGrir�r�r|rBZEINPROGRESSr��selectrkrj�SSLWantWriteErrorr
r��r�r�r�r r r!�test_non_blocking_connect_ex�s*�
��	z2SimpleBackgroundTests.test_non_blocking_connect_excCst�tj�}d|_tj|_|�t�tj���}|�	|j
�|�i|���Wd�n1s/wY|jt�tj�dd��}|�	|j
�Wd�n1sPwYtj
|_|�t�|�t�tj���}|�	|j
�|��}|�|�Wd�dS1s�wYdS)NFZdummyrl)r	rbrXr�r�r�r�r�rr>r�r�r�r�r�r�r
�r�rNr�rRr r r!�test_connect_with_contexts(���
"�z/SimpleBackgroundTests.test_connect_with_contextcCsHt�tj�}|jt�tj�td�}|�|j�|�	tj
d|j|j�dS)Nrlr�)
r	rbrXr�r�rr�rFrGr�r�r>r�)r�rNr�r r r!�test_connect_with_context_fail%s
�
�z4SimpleBackgroundTests.test_connect_with_context_failcCs�t�tj�}|jtd�|jt�tj�td��}|�	|j
�|��}|�|�Wd�n1s1wYt�tj�}|jt
d�|jt�tj�td��}|�	|j
�|��}|�|�Wd�dS1shwYdS)Nrrl)r	rbrXr�r�r�r�rr�r>r�r�r
rr�r r r!�test_connect_capath2s(���"�z)SimpleBackgroundTests.test_connect_capathcCstt��}|��}Wd�n1swYt�|�}t�tj�}|j|d�|jt	�	t	j
�td��}|�|j
�|��}|�|�Wd�n1sNwYt�tj�}|j|d�|jt	�	t	j
�td��}|�|j
�|��}|�|�Wd�dS1s�wYdS)Nr"rl)rEr�rFr	r�rbrXr�r�r�rr�r>r�r�r
)r�rHr�rJrNr�rRr r r!�test_connect_cadataIs0

�
���"�z)SimpleBackgroundTests.test_connect_cadatar-z*Can't use a socket as a file under WindowscCs�tt�tj��}|�|j�|��}|��}|��t�	|d�|��t
��|�t
��}t�	|d�Wd�n1s>wY|�|jjtj�dSry)r�r�rr>r��fileno�makefilerGrrFrCrDr�rr�rArB�EBADF)r�r�fdrHrdr r r!�test_makefile_close^s�z)SimpleBackgroundTests.test_makefile_closecCs�t�tj�}|�|j�|�d�t|tjdd�}|�|j	�d}	z
|d7}|�
�WqQtjy>t�|ggg�Yntj
yOt�g|gg�Ynwq"tjr^tj�d|�dSdS)NF�r�rprTr�z9
Needed %d calls to do_handshake() to establish session.
)r�rr>r�rir�r	r�rFrGrkrjr�r�rrtrrrurv)r�r��countr r r!�test_non_blocking_handshakeqs.
���	�z1SimpleBackgroundTests.test_non_blocking_handshakecCst|g|j�Rdti�dS)NrR)�_test_get_server_certificater�r�r�r r r!�test_get_server_certificate�r#z1SimpleBackgroundTests.test_get_server_certificatecs�|j\}}g��fdd�}|j�|�t�||f�}|s%|�d||f�tj||ftd�}|s9|�d||f�tjrGt	j
�d|||f�|��||g�dS)Ncs��|�dSr)�append��ssl_sockZserver_nameZinitial_context�Zserver_namesr r!�
servername_cb��zLSimpleBackgroundTests.test_get_server_certificate_sni.<locals>.servername_cb�No server certificate on %s:%s!�r��&
Verified certificate for %s:%s is
%s
)
r�r�r@r	�get_server_certificater�r�rrtrrrurvr�)r�rer�r�r�r r�r!�test_get_server_certificate_sni�s
z5SimpleBackgroundTests.test_get_server_certificate_snicCst|g|j�R�dSr)�!_test_get_server_certificate_failr�r�r r r!� test_get_server_certificate_fail�sz6SimpleBackgroundTests.test_get_server_certificate_failcCsXdd�}|j�|�|�tj��tj|jtdd�Wd�dS1s%wYdS)NcSst�d�dS)N皙�����?)rz�sleepr�r r r!r��r�zPSimpleBackgroundTests.test_get_server_certificate_timeout.<locals>.servername_cb皙�����?)r�r.)	r�r@r�r�r.r	r�r�r�)r�r�r r r!�#test_get_server_certificate_timeout�s
�"�z9SimpleBackgroundTests.test_get_server_certificate_timeoutc	Cstt�tj�tjdd��}|�|j�Wd�n1swYtt�tj�tjdd��}|�|j�Wd�n1s?wY|�tjd��5t�tj��}t|tjdd�}|�|j�Wd�n1skwYWd�dSWd�dS1s�wYdS)Nr�)r�r�r�r�r�)	r�r�rr	r�r>r�r�r�)r�r�r�r r r!r��s,�������"�z"SimpleBackgroundTests.test_cipherscCs�t�tj�}|jtd�|�|��g�|jt�tj	�dd��}|�
|j�|��}|�
|�Wd�n1s9wY|�t|���d�dS)Nrr,rlr�)r	rbrXr�r�r�rIr�r�rr>r�r�r
rZr�r r r!�test_get_ca_certs_capath�s��z.SimpleBackgroundTests.test_get_ca_certs_capathcCs�t�tj�}|jtd�t�tj�}|jtd�t�tj�}|j|dd��0}|�|j	�|�
|j|�|�
|jj|�||_|�
|j|�|�
|jj|�Wd�dS1sXwYdS)Nrr,rl)
r	rbrXr�r�r�rr�r>r�r�r��_sslobj)r�Zctx1Zctx2r�rr r r!�test_context_setget�s"�z)SimpleBackgroundTests.test_context_setgetc
Os�|�dtj�}t��|}d}		t��|kr|�d�d}
|	d7}	z||�}Wn tjyG}z|jtj	tj
fvr:�|j}
WYd}~nd}~ww|��}
|�|
�|
durVqm|
tj	krl|�
d�}
|
rh|�|
�n|��qtjr{tj�d|	|jf�|S)Nr.rTr�i�z"Needed %d calls to complete %s().
)r�rZ
SHORT_TIMEOUTrz�	monotonicr�r	r�rBrlZSSL_ERROR_WANT_WRITErF�sendallrrvrxrtrrrur�)r�r��incoming�outgoingrhrfr�r.�deadliner�rB�retrd�bufr r r!�ssl_io_loop�sB
���


��z!SimpleBackgroundTests.ssl_io_loopcCs~t�tj�}|�|j�|�|j�t��}t��}t�tj	�}|�
|j�|�|j
tj�|�t�|�||dt�}|�|jj|�|�|���|�|���|�|���|�t|j�dtjvrl|�|�d��|� ||||j!�|�
|���|�|���|�|���|�
|���dtjvr�|�
|�d��z|� ||||j"�Wn
tj#y�Ynw|�tj$|j%d�dS)NFrvr:)&r�rrFrGr>r�r	r�rbrXr
r�r�r�r�r�r�r^r�r�r��ownerrx�cipherr5�assertIsNotNone�shared_ciphersr�r�r�r�rsr�rkr�ZSSLSyscallErrorr�rv)r�r�r�r�rN�sslobjr r r!�test_bio_handshake�s@

�

�z(SimpleBackgroundTests.test_bio_handshakecCs�t�tj�}|�|j�|�|j�t��}t��}t�tj	�}d|_
tj|_|�
||d�}|�||||j�d}|�||||j|�|�||||jd�}|�|d�|�||||j�dS)NF�FOO
�sfoo
)r�rrFrGr>r�r	r�rbrXr�r�r�r^r�rkrvrFr�r�)r�r�r�r�rNr�Zreqr�r r r!�test_bio_read_write_data	sz.SimpleBackgroundTests.test_bio_read_write_dataN)r�r�r��__doc__r�r�r�r�r�r�r�r�r�rerarrr�r�r�r�r�r�r�r�r�r�r�r�r r r r!r��s0
	

	%"r�Znetworkc@s*eZdZdd�Ze�ejd�dd��ZdS)�NetworkedTestscCs�t�t��Ett�tj�tjdd�}|�|j	�|�
d�|�tdf�}|dkr.|�d�n
|t
jkr8|�d�|�|t
jt
jf�Wd�dS1sMwYdS)NFr�gH�����z>�rz!REMOTE_HOST responded too quicklyzNetwork unreachable.)r�transient_internet�REMOTE_HOSTr�r�rr	r�rFrGr,r�r�rBZENETUNREACHr|�EAGAINr�r�r r r!�test_timeout_connect_ex1	s�


"�z&NetworkedTests.test_timeout_connect_exz
Needs IPv6cCsHt�d��t|dd�t|dd�Wd�dS1swYdS)Nzipv6.google.comr�)rr�r�r�r�r r r!� test_get_server_certificate_ipv6A	s"�z/NetworkedTests.test_get_server_certificate_ipv6N)	r�r�r�r�rer�rrir�r r r r!r�.	sr�cCspt�||f�}|s|�d||f�tj||f|d�}|s&|�d||f�tjr6tj�d|||f�dSdS)Nr�r�r�)r	r�r�rrtrrrurv)�testrer�rRr�r r r!r�H	s�r�c
Cs|ztj||ftd�}Wn&tjy1}ztjr&tj�d|�WYd}~dSWYd}~dSd}~ww|�	d|||f�dS)Nr�z%s
z$Got server certificate %s for %s:%s!)
r	r�r�r�rrtrrrurvr�)r�rer�r��xr r r!r�S	s���r�)�make_https_serverc@sdeZdZGdd�dej�Z					ddd�Zdd	�Zd
d�Zddd
�Z	dd�Z
dd�Zdd�ZdS)r�c@s@eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)z$ThreadedEchoServer.ConnectionHandlerz�A mildly complicated class, because we want it to work both
        with and without the SSL wrapper around the socket connection, so
        that we can test the STARTTLS functionality.cCs@||_d|_||_||_|j�d�d|_tj�|�d|_	dS�NFT)
r��runningr��addrri�sslconn�	threading�Thread�__init__�daemon)r�r�Zconnsockr�r r r!r�h	s
z-ThreadedEchoServer.ConnectionHandler.__init__c
Cs�z|jjj|jdd�|_|jj�|j���Wnytt	t
fyL}z&|jj�t|��|jj
r:tdt|j�d�d|_|��WYd}~dSd}~wtjtfy�}z6|jj�t|��|jj
rntdt|j�d�|jtjkr�tjdkr�d|_|j��|��WYd}~dSd}~ww|jj�|j���|jjjtjkr�|j��}tj r�|jj
r�tj!�"dt#�$|�d�|j�d�}tj r�|jj
r�|dur�tj!�"d	�ntj!�"d
t%|��d��|j�&�}tj r�|jj
r�tj!�"dt|�d�dS)
NTr:z'
 server:  bad connection attempt from z:
F�darwinz client cert is r�z client did not provide a cert
z cert binary is zb
z" server: connection cipher is now )'r�r�r�r�r��selected_alpn_protocolsr��selected_alpn_protocol�ConnectionResetError�BrokenPipeError�ConnectionAbortedError�conn_errorsrS�chattyrxrzr�r�rGr	r�rrBZ
EPROTOTYPErrr��stopr�r�r�r�rrtrurvr�r�rZr�)r�rdrRZcert_binaryr�r r r!�	wrap_connr	sL��
��

z.ThreadedEchoServer.ConnectionHandler.wrap_conncCs|jr|j��S|j�d�S)Nr�)r�rFr�rr�r r r!rF�	s
z)ThreadedEchoServer.ConnectionHandler.readcCs|jr	|j�|�S|j�|�Sr)r�rvr�r")r�r�r r r!rv�	sz*ThreadedEchoServer.ConnectionHandler.writecCs"|jr
|j��dS|j��dSr)r�rGr�r�r r r!rG�	sz*ThreadedEchoServer.ConnectionHandler.closecCs�d|_|jjs
|��s
dS|j�r�z�|��}|��}|s;d|_z|j��|_Wn	t	y1Ynwd|_|�
��n^|dkrStjrL|jj
rLtj�d�|�
�WdS|jjrv|dkrvtjrh|jj
rhtj�d�|�d�|��stWdS�n#|jjr�|jr�|dkr�tjr�|jj
r�tj�d	�|�d�|j��|_d|_tjr�|jj
r�tj�d
�n�|dkr�tjr�|jj
r�tj�d�|j�d
�}|�t|��d�d�n�|dk�rtjr�|jj
r�tj�d�z|j��Wn!tj�y}z|�t|��d�d�WYd}~�q�d}~ww|�d�n�|dk�r)|j��du�r#|�d��q�|�d�np|dk�r@|j��}|�t|��d�d�nY|dk�rY|jj��}|�t|��dd�d�n@|dk�rr|jj��}|�t|��dd�d�n'tj�r�|jj
�r�|j�r�d�p�d}tj�d|||��|f�|�|���WnMt	�y�}z@|jj�r�tj�r�t|t ��r�t!d|j"���nt#d�z|�d�Wn
t	�y�Ynw|�
�d|_|j�$�WYd}~nd}~ww|jsdSdS) NTFsoverz" 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...
rv�us-ascii�
�PHAz( server: initiating post handshake auth
�HASCERT�TRUE
�FALSE
�GETCERTs
VERIFIEDCHAINr��bigsUNVERIFIEDCHAINZ	encryptedZunencryptedz/ server: read %r (%s), sending back %r (%s)...
z Connection reset by peer: zTest server failure:
sERROR
)%r�r��starttls_serverr�rF�stripr�r�r�rrGrrt�connectionchattyrrrurvrsrzrg�verify_client_post_handshaker	r�r�r��get_verified_chainrZ�to_bytes�get_unverified_chainr�r�rR�ConnectionError�printr�rxr�)r��msg�strippedr�rdrRZcertsZctyper r r!�run�	s���
��
�
&��




���
�����z(ThreadedEchoServer.ConnectionHandler.runN)
r�r�r�r�r�r�rFrvrGr�r r r r!�ConnectionHandlerb	s
>r�NTFcCs�|
r|
|_n8t�|dur|ntj�|_|dur|ntj|j_|r&|j�|�|r.|j�|�|r6|j�|�|	r>|j�	|	�||_
||_||_t
�
�|_t�|j�|_d|_d|_g|_g|_g|_tj�|�d|_dSr�)r�r	rbrWr�r�r�r��set_alpn_protocolsrLr�r�r�r�r�rr�r��flag�activer�r�r�r�r�r�r�)r�Zcertificate�ssl_version�certreqs�cacertsr�r�r�Zalpn_protocolsr�r�r r r!r�'
s<���

zThreadedEchoServer.__init__cC�|�t���|j��|Sr��startr��Eventr��waitr�r r r!r�I
�
zThreadedEchoServer.__enter__cGs|��|��dSr)r�r�r�rfr r r!r�N
szThreadedEchoServer.__exit__cC�||_tj�|�dSr�r�r�r�r�r�r�r r r!rR
�zThreadedEchoServer.startc
Cs8|j�d�|j�d�d|_|jr|j��|jr�z*|j��\}}tjr4|j	r4t
j�dt
|�d�|�|||�}|��|��WnNtyc}ztjrYt
j�d|�d��WYd}~n4d}~wtyo|��Yn$ty�}ztjr�|j	r�t
j�dt
|�d�WYd}~nd}~ww|js|��dS)Ng�?r�Tz server:  new connection from r�z connection timeout z connection handling failed: )r�r,�listenrr�r�r2rrtr�rrrurvrzr�rr�TimeoutError�KeyboardInterruptr��
BaseExceptionrG)r�ZnewconnZconnaddr�handlerrdr r r!r�V
s@
�������zThreadedEchoServer.runcCs"|jdur|j��d|_dSdSr)r�rGr�r r r!rGr
s


�zThreadedEchoServer.closecCs
d|_dS�NF)rr�r r r!r�w
�
zThreadedEchoServer.stop)
NNNNTFFNNNr)
r�r�r�r�r�r�r�r�r�rr�rGr�r r r r!r�`	sF
�"
r�c@sXeZdZGdd�dej�Zdd�Zdd�Zdd�Zd	d
�Z	ddd
�Z
dd�Zdd�ZdS)�AsyncoreEchoServerc@s6eZdZGdd�dej�Zdd�Zdd�Zdd�Zd	S)
zAsyncoreEchoServer.EchoServerc@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)z/AsyncoreEchoServer.EchoServer.ConnectionHandlercCs4t|d|dd�|_tj�||j�d|_|��dS)NTF)r�r�rp)r�r��asyncore�dispatcher_with_sendr��_ssl_accepting�_do_ssl_handshake)r��connr�r r r!r��
s�z8AsyncoreEchoServer.EchoServer.ConnectionHandler.__init__cCs6t|jtj�r|j��dkr|��|j��dksdS)NrT)rRr�r	r�rzZhandle_read_eventr�r r r!�readable�
s
�z8AsyncoreEchoServer.EchoServer.ConnectionHandler.readablec
Cs�z|j��WnGtjtjfyYdStjy"|��YStjy*�tyN}z|j	dt
jkrC|��WYd}~SWYd}~dSd}~wwd|_dS)NrF)
r�rkr	rjr�ZSSLEOFError�handle_closer�rrfrBZECONNABORTEDr)r��errr r r!r�
s���
zAAsyncoreEchoServer.EchoServer.ConnectionHandler._do_ssl_handshakecCsX|jr	|��dS|�d�}tjrtj�dt|��|s#|�	�dS|�
|���dS)Nr�z server:  read %s from client
)rrrrrtrrrurvrzrGr"r�)r�r�r r r!�handle_read�
s
z;AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_readcCs(|��tjrtj�d|j�dSdS)Nz server:  closed connection %s
)rGrrtrrrurvr�r�r r r!r�
s�z<AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_closecC��rr r�r r r!rx�
�z<AsyncoreEchoServer.EchoServer.ConnectionHandler.handle_errorN)	r�r�r�r�rrrrrxr r r r!r��
sr�cCs@||_t�tjtj�}t�|d�|_tj�	||�|�
d�dS)Nrr�)r�r�r�SOCK_STREAMrr�r�r�
dispatcherr�rrHr r r!r��
s
z&AsyncoreEchoServer.EchoServer.__init__cCs(tjrtj�d|�|�||j�dS)Nz$ server:  new connection from %s:%s
)rrtrrrurvr�r�)r�Zsock_objr�r r r!�handle_accepted�
sz-AsyncoreEchoServer.EchoServer.handle_acceptedcCr rr r�r r r!rx�
r!z*AsyncoreEchoServer.EchoServer.handle_errorN)	r�r�r�rrr�r�r$rxr r r r!�
EchoServer~
s
3r%cCs8d|_d|_|�|�|_|jj|_tj�|�d|_dSr�)	r�rr%r�r�r�r�r�r�)r�r�r r r!r��
s

zAsyncoreEchoServer.__init__cCsd|jj|jfS)Nz<%s %s>)�	__class__r�r�r�r r r!�__str__�
szAsyncoreEchoServer.__str__cCrrrr�r r r!r��
r	zAsyncoreEchoServer.__enter__cGsVtjr	tj�d�|��tjrtj�d�|��tjr#tj�d�tjdd�dS)Nz cleanup: stopping server.
z! cleanup: joining server thread.
z cleanup: successfully joined.
T)Z
ignore_all)	rrtrrrurvr�rrZ	close_allr
r r r!r��
szAsyncoreEchoServer.__exit__NcCrrrr
r r r!r�
rzAsyncoreEchoServer.startcCsBd|_|jr|j��|jrzt�d�WnY|jsdSdS)NTr�)rr�r�rZloopr�r r r!r��
s
�zAsyncoreEchoServer.runcCsd|_|j��dSr)rr�rGr�r r r!r��
szAsyncoreEchoServer.stopr)
r�r�r�rr#r%r�r'r�r�rr�r�r r r r!rz
sD

rr�FcCs�i}t||dd�}|��|jt��||d���}	|	�t|jf�|t|�t|�fD]C}
|r7tj	r7t
j�d|�|	�|
�|	�
�}|rMtj	rMt
j�d|�||��krktd|dd�t|�|dd���t|�f��q(|	�d	�|r|tj	r|t
j�d
�|�|	��|	��|	��|	��|	��|	j|	jd��|	��Wd�n1s�wY|j|d<|j|d
<Wd�|S1s�wY|S)zW
    Launch a server, connect a client to it and try various reads
    and writes.
    F�r�r�r�)r��session� client:  sending %r...
� client:  read %r
�4bad data <<%r>> (%d) received; expected <<%r>> (%d)
N��over
� client:  closing connection.
)�compressionr��peercert�client_alpn_protocolr5�session_reusedr)�server_alpn_protocols�server_shared_ciphers)r�r�r�r>r?r�r�r|rrtrrrurvrFr��AssertionErrorrZr�r0r�r�r�r5r3r)rGr�r�)r�r��indatar�r��sni_namer)rOr�r��arg�outdatar r r!�server_params_test�
sh�
��
����
�
	�
 
�#�#r;c
Cs|durtj}tjdtjdtjdi|}tjr.|rdpd}tj�|t�	|�t�	|�|f�t
��� t�|�}|j
|O_
t�|�}	|	j
|O_
Wd�n1sUwYt�|d�}
|
dur�t|	d�r�|tjkr�|	j|
kr�t
���|
|	_Wd�n1s�wY|jtjkr�|�d�t|	|�||	fD]}||_|�t�|�t�q�z
t||	d	d	d
�}Wn)tjy�|rÂYdSty�}
z|s�|
jtjkrւWYd}
~
dSd}
~
ww|s�t dt�	|�t�	|�f��|du�r||d
k�r
t d||d
f��dSdS)a<
    Try to SSL-connect using *client_protocol* to *server_protocol*.
    If *expect_success* is true, assert that the connection succeeds,
    if it's false, assert that the connection fails.
    Also, if *expect_success* is a string, assert that it is the protocol
    version actually used by the connection.
    Nr�r�r�z %s->%s %s
z
 {%s->%s} %s
rJr�F)r�r�z5Client protocol %s succeeded with server protocol %s!Tr5z%version mismatch: expected %r, got %r)!r	r�r�r�rrtrrrurvZget_protocol_namerr�rbr4�PROTOCOL_TO_TLS_VERSIONr�rKrVrJr[rLrOr�r�r�r�r�r;r�rrB�
ECONNRESETr6)Zserver_protocolZclient_protocol�expect_successZ	certsreqs�server_options�client_optionsZcerttypeZ	formatstrr�r�Zmin_versionrNrOrdr r r!�try_protocol_combo s�	����


����
	�



��������

�
��rAc@s~eZdZdd�Zdd�Zdd�Zdd�Ze�e	j
d	�d
d��Zdd
�Zdd�Z
dd�Zdd�Zed�dd��Zdd�Zdd�Zed�dd��Zdd�Zed �d!d"��Zed#�d$d%��Zed&�d'd(��Zed)�d*d+��Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Z d:d;�Z!d<d=�Z"d>d?�Z#d@dA�Z$dBdC�Z%ed�dDdE��Z&ed)�ed#�e'dFdG����Z(ed&�e'dHdI���Z)ed)�ed#�e'dJdK����Z*ed �dLdM��Z+dNdO�Z,e�dPe	j-vdQ�dRdS��Z.dTdU�Z/e�e0e	dV�dW�dXdY��Z1e�2e3dZ�d[d\��Z4d]d^�Z5d_d`�Z6dadb�Z7dcdd�Z8dedf�Z9dgdh�Z:didj�Z;dkdl�Z<dmdn�Z=dodp�Z>dqdr�Z?dsdt�Z@dudv�ZAdwdx�ZBdydz�ZCd{d|�ZDd}S)~�
ThreadedTestsc	Cs�tjr	tj�d�t�\}}}|jtjtj	d��t
||dd|d�Wd�n1s,wYd|_|jtj	tjd��0|�tj
��}t
||dd|d�Wd�n1sXwY|�dt|j��Wd�n1spwY|jtj	tj	d��/|�tj
��}t
||ddd�Wd�n1s�wY|�dt|j��Wd�n1s�wY|jtjtjd��0|�tj
��}t
||ddd�Wd�n1s�wY|�dt|j��Wd�dS1s�wYdS)	z2Basic test of an SSL client connecting to a serverr�)r�r�T)r�r�r�r�r8NFz@Cannot create a client socket with a PROTOCOL_TLS_SERVER context)r�r�r�r�)rrtrrrurvr�r�r	rXrWr;r�r�r�r|rSrA)r�r�r�r�rdr r r!�	test_echops`����������
���"�zThreadedTests.test_echoc

Cs�tjr	tj�d�t�\}}}t|dd�}|��|jt��d|d���}|�	t
|jf�|�t
��|��Wd�n1s?wY|��|��}|�|d�|��}tjrptj�t�|�d�tj�dt|�d�d|vr~|�d	t�|��d
|dvr�|�d�|�d|�|�d
|�t�|d�}t�|d
�}	|�||	�Wd�n1s�wYWd�dSWd�dS1s�wYdS)Nr�F�r�r�)rpr��Can't get peer certificate.zConnection cipher is z.
r3z$No subject field in certificate: %s.r)zkMissing or invalid 'organizationName' field in certificate subject; should be 'Python Software Foundation'.r1r0)rrtrrrurvr�r�r�r�r>r?r�r�r�r�rkr
r�r�r�rSr�r|r	r�r	)
r�r�r�r�r�r�rRr��beforeZafterr r r!�test_getpeercert�sP
�
������"�zThreadedTests.test_getpeercertc
Cstjr	tj�d�t�\}}}ttdd�}|�|j	tj
|B�t|dd�}|�3|jt
�
�|d��}|�t|jf�|��}|�|d�Wd�n1sNwYWd�n1s]wY|j	tjO_	t|dd�}|�@|jt
�
�|d��'}|�tjd��|�t|jf�Wd�n1s�wYWd�n1s�wYWd�n1s�wY|�t�t|dd�}|�<|jt
�
�|d��}|�t|jf�|��}|�|d�Wd�n1s�wYWd�dSWd�dS1�swYdS)	Nr�r�rTrDrlrEr�)rrtrrrurvr�rUr	r�r�r�r�r�r�r>r?r�r�r
r�r�r�r��CRLFILE)r�r�r�r�r�r�r�rRr r r!�test_crl_check�s^
����
�������

���$�zThreadedTests.test_crl_checkc
Cs�tjr	tj�d�t�\}}}t|dd�}|�3|jt��|d��}|�	t
|jf�|��}|�
|d�Wd�n1s>wYWd�n1sMwYt|dd�}|�@|jt��dd��'}|�tjd��|�	t
|jf�Wd�n1swYWd�n1s�wYWd�n1s�wYt|dd�}|�@t���#}|�td��
|�|�Wd�n1s�wYWd�n1s�wYWd�dSWd�dS1s�wYdS)	Nr�TrDrlrErjz:Hostname mismatch, certificate is not valid for 'invalid'.z'check_hostname requires server_hostname)rrtrrrurvr�r�r�r�r>r?r�r�r
r�r	rTr�)r�r�r�r�r�r�rRr r r!rV�sX
����
�������	
�����"�z!ThreadedTests.test_check_hostnamez)test requires hostname_checks_common_namec
CsVt�\}}}|jsJ�d|_t|dd�}|�)|jt��|d��}|�t|jf�Wd�n1s3wYWd�n1sBwYtt�\}}}d|_t|dd�}|�H|jt��|d��&}|�	t
j��|�t|jf�Wd�n1s}wYWd�n1s�wYWd�dSWd�dS1s�wYdS)NFTrDrl)r�r�r�r�r�r>r?r�r�r�r	�SSLCertVerificationErrorr�r r r!r�	s:

����
�����"�z.ThreadedTests.test_hostname_checks_common_namec	Cs�t�tj�}|�t�|�d�t}t�tj�}|�t	�t
|dd�}|�O|jt��|d��-}|�
t|jf�|��}|�|d�|��d�d�}|�|dd�d	�Wd�n1s_wYWd�dSWd�dS1swwYdS�
NzECDHE:ECDSA:!NULL:!aRSATrDrlrEr�-r�)ZECDHEZECDSA)r	rbrXr�r�rL�SIGNED_CERTFILE_ECC_HOSTNAMErWr��SIGNED_CERTFILE_ECCr�r�r�r>r?r�r�r
r��split�r�r�r�r�r�r�rRr�r r r!�
test_ecc_cert!s*



���"�zThreadedTests.test_ecc_certc	Cst�tj�}|�t�tjj|_|�d�t	}t�tj
�}|�t�|�t
�t|dd�}|�O|jt��|d��-}|�t|jf�|��}|�|d�|��d�d�}|�|dd�d	�Wd�n1siwYWd�dSWd�dS1s�wYdSrK)r	rbrXr�r�r
rar^rLrMrWr�rNr�r�r�r�r>r?r�r�r
r�rOrPr r r!�test_dual_rsa_ecc6s.





���"�zThreadedTests.test_dual_rsa_eccc	
Cs�tjr	tj�d�t�tj�}|�t	�t�tj
�}tj|_d|_
|�t�gd�}|D]U\}}t|dd�}|�A|jt��|d��(}|�|j|�|�t|jf�|��}|�|j|�|�|d�Wd�n1smwYWd�n1s|wYq,t|dd�}|�H|jt��dd��&}|�tj��|�t|jf�Wd�n1s�wYWd�n1s�wYWd�dSWd�dS1s�wYdS)Nr�T))ukönig.idn.pythontest.net�xn--knig-5qa.idn.pythontest.net)rSrS)sxn--knig-5qa.idn.pythontest.netrS)u(königsgäßchen.idna2003.pythontest.net�.xn--knigsgsschen-lcb0w.idna2003.pythontest.net)rTrT)s.xn--knigsgsschen-lcb0w.idna2003.pythontest.netrT)�.xn--knigsgchen-b4a3dun.idna2008.pythontest.netrU)s.xn--knigsgchen-b4a3dun.idna2008.pythontest.netrUrDrlrEzpython.example.org)rrtrrrurvr	rbrWr��IDNSANSFILErXr�r�r�r�r�r�r�r�r�r�r>r?r�r�r
r�rT)	r�r�r�Z
idn_hostnamesr�Zexpected_hostnamer�r�rRr r r!�test_check_hostname_idnPsN


�����

�����"�z%ThreadedTests.test_check_hostname_idncCsDt�\}}}|�t�tj|_tjj|_t	|ddd�}|�{|j
t��|d��Y}z
|�t
|jf�WnAtjyP}ztjrFtj�d|�WYd}~n-d}~wtys}z|jtjkr^�tjritj�d|�WYd}~n
d}~ww|�d�Wd�n1s�wYWd�dSWd�dS1s�wYdS)z�Connecting when the server rejects the client's certificate

        Launch a server with CERT_REQUIRED, and check that trying to
        connect to it with a wrong client certificate fails.
        Tr(rl�
SSLError is %r
N�
socket.error is %r
�'Use of invalid cert should have failed!)r�r�r�r	r�r�r
rar^r�r�r�r>r?r�r�rrtrrrurvrrBr=r��r�r�r�r�r�r�rdr r r!�test_wrong_cert_tls12�s:

�
�����
�P�z#ThreadedTests.test_wrong_cert_tls12r�cCsxt�\}}}|�t�tj|_tjj|_tjj|_t	|ddd�}|��|j
t��|dd��m}|�t
|jf�z|�d�|�d�|�d�|�d�WnAtjyj}ztjr`tj�d|�WYd}~n-d}~wty�}z|jtjkrx�tjr�tj�d	|�WYd}~n
d}~ww|�d
�Wd�n1s�wYWd�dSWd�dS1s�wYdS)NTr(F�r��suppress_ragged_eofs�datar�sshould have failed alreadyrXrYrZ)r�r�r�r	r�r�r
r�rJr�r�r�r>r?r�rvrFr�rrtrrrurrBr=r�r[r r r!�test_wrong_cert_tls13�sF


�
��


���
�P�z#ThreadedTests.test_wrong_cert_tls13cszt���t���t���t��t�����fdd�}����fdd�}tj|d�}|��z
|�W|��dS|��w)ztA brutal shutdown of an SSL server should raise an OSError
        in the client when attempting handshake.
        cs8���������\}}|��������dSr)rr�r2rG)Znewsockr�)�
listener_gone�listener_readyr�r r!�listener�sz2ThreadedTests.test_rude_shutdown.<locals>.listenerc	s����t���1}|�t�f����zt|�}Wn	ty#Ynw��d�Wd�dSWd�dS1s<wYdS)Nz2connecting to closed SSL socket should have failed)rr�r>r?r�rr�)rtr�)rarbr�r�r r!�	connector�s
��"�z3ThreadedTests.test_rude_shutdown.<locals>.connector��targetN)	r�rr�rr�r?r�rr)r�rcrdr
r )rarbr�r�r�r!�test_rude_shutdown�sz ThreadedTests.test_rude_shutdowncCs6tjr	tj�d�t�tj�}|�t	�t�tj
�}t|dd�}|�o|jt
�
�td��M}z
|�t|jf�Wn:tjyq}z-d}|�|tj�|�|jd�|�|j|�|�|t|��|�dt|��WYd}~nd}~wwWd�n1s|wYWd�dSWd�dS1s�wYdS)Nr�TrDrlz&unable to get local issuer certificater-r�)rrtrrrurvr	rbrWr�r�rXr�r�r�r�r>r?r�r�rrJr�Zverify_codeZverify_messager|rz)r�r�r�r�r�rdr�r r r!�test_ssl_cert_verify_error�s6

������"�z(ThreadedTests.test_ssl_cert_verify_errorr]cCs�tjr	tj�d�ttjtjd�ttjtjdtj�ttjtjdtj	�ttjtj
d�td�r9ttjtjd�ttjtj
d�ttjtj
dtjd�ttjtj
dtjd�dS)z9Connecting to an SSLv2 server with various client optionsr�TFr�r@N)rrtrrrurvrAr	�PROTOCOL_SSLv2r�r�rVrY�PROTOCOL_SSLv3rr�r�r�r r r!�test_protocol_sslv2
s�
�z!ThreadedTests.test_protocol_sslv2c
Cs�tjr	tj�d�td�r7z
ttjtj	d�Wnt
y6}ztjr,tj�dt|��WYd}~nd}~wwtd�rCttjtjd�ttjtjd�td�rWttjtj
d�td�rettjtjdtj�ttjtjdtj�td�r}ttjtj
dtj�td�r�ttjtjdtj�ttjtjdtj�td�r�ttjtj
dtj�td�r�ttjtjdtjd	�ttjtjdtjtjBd	�td�r�ttjtj
dtjd	�dSdS)
z:Connecting to an SSLv23 server with various client optionsr�r]Tz; SSL2 client to SSL23 server test unexpectedly failed:
 %s
NrFr)r?)rrtrrrurvrYrAr	rVrjrrSrkrr�r�r�r�r�)r�r�r r r!�test_PROTOCOL_TLS!
sR�����
�
��zThreadedTests.test_PROTOCOL_TLSrcCs�tjr	tj�d�ttjtjd�ttjtjdtj�ttjtjdtj	�t
d�r1ttjtjd�ttjtjdtj
d�ttjtjd�dS)z9Connecting to an SSLv3 server with various client optionsr�rr]FriN)rrtrrrurvrAr	rkr�r�rYrjrVr�rr�r r r!�test_protocol_sslv3K
s�z!ThreadedTests.test_protocol_sslv3rcCs�tjr	tj�d�ttjtjd�ttjtjdtj�ttjtjdtj	�t
d�r1ttjtjd�t
d�r=ttjtjd�ttjtj
dtjd�dS)z8Connecting to a TLSv1 server with various client optionsr�rr]FrriN)rrtrrrurvrAr	rr�r�rYrjrkrVr�r�r r r!�test_protocol_tlsv1Y
s
�z!ThreadedTests.test_protocol_tlsv1rcCs�tjr	tj�d�ttjtjd�td�rttjtj	d�td�r)ttjtj
d�ttjtjdtjd�ttjtjd�ttjtj
d�ttj
tjd�dS)zjConnecting to a TLSv1.1 server with various client options.
           Testing against older TLS versions.r��TLSv1.1r]FrriN)rrtrrrurvrAr	rrYrjrkrVr�r1r�r r r!�test_protocol_tlsv1_1h
s�z#ThreadedTests.test_protocol_tlsv1_1racCs�tjr	tj�d�ttjtjdtjtj	Btjtj	Bd�t
d�r(ttjtjd�t
d�r4ttjtjd�ttjtj
dtjd�ttj
tjd�ttjtjd�ttjtjd�ttjtjd�ttjtjd�dS)	zjConnecting to a TLSv1.2 server with various client options.
           Testing against older TLS versions.r��TLSv1.2)r?r@r]FrriN)rrtrrrurvrAr	r1r�r�rYrjrkrVr�rrr�r r r!�test_protocol_tlsv1_2z
s$

��z#ThreadedTests.test_protocol_tlsv1_2c	Cs�d}ttdddd�}d}|��t��}|�d�|�t|jf�tjr)t	j
�d�|D]j}tjr8t	j
�d|�|rD|�|�|��}n
|�
|�|�d�}|����}|dkro|�d	�rotjrht	j
�d
|�t|�}d}q+|dkr�|�d	�r�tjr�t	j
�d|�|��}d}q+tjr�t	j
�d
|�q+tjr�t	j
�d�|r�|�d�n|�
d�|r�|��n|��Wd�dSWd�dS1s�wYdS)z6Switching from clear text to encrypted and back again.)smsg 1sMSG 2r�sMSG 3smsg 4r�smsg 5smsg 6T)r�r�r�Fr�r*r�r�sokz/ client:  read %r from server, starting TLS...
r�z- client:  read %r from server, ending TLS...
z client:  read %r from server
r/r.N)r�r�r�rir>r?r�rrtrrrurvrFr"rr�r�rTr�r�rG)	r�Zmsgsr��wrappedr�r7rr:r�r r r!�
test_starttls�
st�
�



������


�,"�zThreadedTests.test_starttlscCs�t|td�}tjrtj�d�ttd��}|�	�}Wd�n1s#wYd}d|j
tj�
t�df}tjtd�}tjj||d	�}z+|���d
�}|rkt|�dkrk|�	t|��}tjrktj�dt|�|f�W|��n|��w|�||�dS)
z8Using socketserver to create and manage SSL connections.r<r��rbNrzhttps://localhost:%d/%sr�)r�r�zcontent-lengthrz/ client: read %d bytes from remote server '%s'
)r�r�rrtrrrurvrEr�rFr�rrrOr	rRr��urllibZrequest�urlopen�infor�rrZrGr�)r�r�rHr�r��urlr�Zdlenr r r!�test_socketserver�
s2
��
���zThreadedTests.test_socketserverc	Cs&tjr	tj�d�d}tt�}|�xtt���}|�	d|j
f�tjr+tj�d|�|�|�|��}tjr?tj�d|�||��kr^|�
d|dd�t|�|dd���t|�f�|�d	�tjrltj�d
�|��tjr�tj�d�Wd�dSWd�dS1s�wYdS)z'Check the example asyncore integration.r�r�r�r*r+r,Nr-r.r/z client:  connection closed.
)rrtrrrurvrr�r�r�r>r�rFr�r�rZrG)r�r7r�r�r:r r r!�test_asyncore_server�
s@�
���
�"�z"ThreadedTests.test_asyncore_servercs�tjr	tj�d�tttjtj	tddd�}|���t
t��dtttjd����t
|jf��fdd�}�fdd	�}d
�jdgtfd�jddgtfd
�jdgdd�fg}d�jdgfd�jddgfd|dgfd|dgfg}d}|D]x\}}}	}
}||�d�}z<||g|
�R�}
d�|�}|j|
||�|d����}||��kr�|�dj||dd�t|�|dd�t|�d��Wqpty�}z"|	r�|�dj|d��t|��|�s�|�dj||d��WYd}~qpd}~ww|D]m\}}}	}
||�d�}z+��|�||
�}||��k�r"|�d j||dd�t|�|dd�t|�d��Wq�t�yX}z(|	�r8|�d!j|d��t|��|��sJ|�dj||d�����WYd}~q�d}~wwd"}��|�tt|��}|���d#|�t|��|�||�tdu�r�tj t|�}|�!|�}��|�|����|�|�"t#�j$�|�"t#�j%d"g�|�"t#�j&d$�|�"t#�j'td$�g���d%�|�"t�jd#�|�"t�jd#���(�Wd�dS1�s�wYdS)&z Test recv(), send() and friends.r�TF�rrrr�r��r�r�r�r�cstd�}��|�}|d|�S�Nsd)r�r)�br��r�r r!�
_recv_intos
z0ThreadedTests.test_recv_send.<locals>._recv_intocs"td�}��|�\}}|d|�Sr)r�r!)r�r�r�r�r r!�_recvfrom_intosz4ThreadedTests.test_recv_send.<locals>._recvfrom_intor"r#zsome.addressr�cSrPrr )r�r r r!�<lambda>!sz.ThreadedTests.test_recv_send.<locals>.<lambda>rr rr!ZPREFIX_rWzsending with {})r�zpWhile sending with <<{name:s}>> bad data <<{outdata:r}>> ({nout:d}) received; expected <<{indata:r}>> ({nin:d})
Nr-)rr:Znoutr7Zninz>Failed to send with method <<{name:s}>>; expected to succeed.
rzFMethod <<{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.
r_r�rr.))rrtrrrurvr�r�r	r�rWr�r�r>r?r�r"rZr#r�rr rg�formatr�rFr�r�r�rSrTr��ctypesZc_ubyteZfrom_buffer_copyr�r$r%r&r'r(rG)r�r�r�r�Zsend_methodsZrecv_methodsZdata_prefixZ	meth_nameZ	send_methr>rfZret_val_methr7r�r�r:rdZ	recv_methr��bufferZubyteZ	bytesliker r�r!�test_recv_sends����

��
���	������
���	������



�

$�zThreadedTests.test_recv_sendcCs�tt�}|��|�|jdd�t�t|jf�}|�|j	�t
|dd�}|�|j	�|�d�|�|�
d�d�|�|�d�d�|�|��d�|�d�|�|�
d�d�|�|�t��d�dS)NF)r^r_rr�)r�r�r�rFr�r�rhr?r�rGr�r"r�rrFrirr�)r�r�r�r r r!�test_recv_zero�s

zThreadedTests.test_recv_zerocs�tttjtjtddd�}|�@tt��dtttjd����t|j	f���
d�td����fdd�}|�tj
tjf|���
d����Wd�dS1sQwYdS)NTFr}r~i cs	����qr)r"r �r�r�r r!�fill_buffer�s
�z8ThreadedTests.test_nonblocking_send.<locals>.fill_buffer)r�r�r	r�rWr�r�r>r?r�rir�r�r�rjrG)r�r�r�r r�r!�test_nonblocking_send�s4��
��

"�z#ThreadedTests.test_nonblocking_sendcst�tj��d}t���}t���d����fdd�}tj|d�}|�����zYz t�tj�}|�	d�|�
||f�|�tdt
|�W|��n|��wz t�tj�}t
|�}|�	d�|�td|j
||f�W|��n|��wWd�|�����dSd�|�����w)	Nr�Fcsd������g}�s't��gggd�\}}}�|vr%|����d��r|D]}|��q)dS)Nr�r)rr�r�r�r2rG)Zconnsr��wrdr��Zfinishr��startedr r!�serve�s�
�z3ThreadedTests.test_handshake_timeout.<locals>.serverer�z	timed outT)r�rrr�r�rr�rrr,r>r�rr�rGr)r�rer�r�r
rtr r�r!�test_handshake_timeout�s@


�

��
z$ThreadedTests.test_handshake_timeoutc
s�t�\}}}t�tj��d}t���}|j�dd��|��j�t�	��d�d�����fdd�}tj
|d�}|�����|jt��|d�}|�
||f�|�d�|��|��}	|��|��������|��tj�|��|	�dS)	Nr�Tr:cs0���������\������d��dS)Nr�)rr�r2r"rr �ZevtZpeerZremoter�r r!r��sz/ThreadedTests.test_server_accept.<locals>.servererlr_)r�r�rrr�r�r
r�r�rr�rrr>r"rrrrGrrr	r�r�)
r�r�r�r�rer�r�r
r�Zclient_addrr r�r!�test_server_accept�s4
�
z ThreadedTests.test_server_acceptc	C�t�tj�}d|_|�t����+}|�t��}|��Wd�n1s%wY|�	|j
jtj�Wd�dS1s>wYdSr)
r	rbrXr�r�r�r�rr�r�rArB�ENOTCONN�r�r�r�r7r r r!�test_getpeercert_enotconn�
�"�z'ThreadedTests.test_getpeercert_enotconnc	Cr�r)
r	rbrXr�r�r�r�rrkr�rArBr�r�r r r!�test_do_handshake_enotconnr�z(ThreadedTests.test_do_handshake_enotconnc
Cs�t�\}}}tjj|_|�d�|�d�t|d��>}|jt��|d��%}|�	t
��|�t|j
f�Wd�n1s=wYWd�n1sLwYWd�n1s[wY|�d|jd�dS)NZAES128�AES256r�rlzno shared cipherr)r�r	r
rar^rLr�r�r�r�rr>r?r�r|r�r�r r r!�test_no_shared_ciphers"s"



������z$ThreadedTests.test_no_shared_ciphersc	Cs�t�tj�}d|_tj|_tttjdd��N}|�	t
�
���'}|�|��d�|�|j
d�|�t|jf�|�|��d�Wd�n1sGwY|�|j
d�|�|��d�Wd�dS1sfwYdS)zt
        Basic tests for SSLSocket.version().
        More tests are done in the test_protocol_*() methods.
        F)rr�N�TLSv1.3)r	rbrXr�r�r�r�r�rWr�r�r�r5r�r>r?r�r�)r�r�r�r�r r r!�test_version_basic0s"��"�z ThreadedTests.test_version_basicc	Cs�t�\}}}tjj|_t|d��F}|jt��|d��$}|�t	|j
f�|�|��dhd��|�
|��d�Wd�n1sAwYWd�dSWd�dS1sYwYdS)Nr�rlr>ZTLS_AES_256_GCM_SHA384ZTLS_CHACHA20_POLY1305_SHA256ZTLS_AES_128_GCM_SHA256r�)r�r	r
r�rJr�r�r�r>r?r�r|r�r�r5r�r r r!�test_tls1_3Cs

���"�zThreadedTests.test_tls1_3c	Cs�t�\}}}tjj|_tjj|_tjj|_tjj|_t|d��:}|jt	�	�|d��}|�
t|jf�|�
|��d�Wd�n1sDwYWd�dSWd�dS1s\wYdS)Nr�rlrr)r�r	r
rrJrar^r�r�r�r>r?r�r�r5r�r r r!�test_min_max_version_tlsv1_2Rs 




���"�z*ThreadedTests.test_min_max_version_tlsv1_2c	Cs�t�\}}}tjj|_tjj|_tjj|_tjj|_t||�t	|d��:}|j
t��|d��}|�t
|jf�|�|��d�Wd�n1sIwYWd�dSWd�dS1sawYdS)Nr�rlrp)r�r	r
rrJrar^rrOr�r�r�r>r?r�r�r5r�r r r!�test_min_max_version_tlsv1_1ds"





���"�z*ThreadedTests.test_min_max_version_tlsv1_1c
Cs�t�\}}}tjj|_tjj|_tjj|_tjj|_t||�t|d��Q}|j	t
�
�|d��/}|�tj��}|�
t|jf�Wd�n1sHwY|�dt|j��Wd�n1s`wYWd�dSWd�dS1sxwYdS)Nr�rlZalert)r�r	r
rar^rJrrOr�r�r�r�r�r>r?r�r|rSrAr[r r r!�test_min_max_version_mismatchus&





����"�z+ThreadedTests.test_min_max_version_mismatchc	Cs�t�\}}}tjj|_tjj|_tjj|_t||�t|d��:}|jt	�	�|d��}|�
t|jf�|�
|��d�Wd�n1sDwYWd�dSWd�dS1s\wYdS)Nr�rlr)r�r	r
rrJr^rOr�r�r�r>r?r�r�r5r�r r r!�test_min_max_version_sslv3�s 




���"�z(ThreadedTests.test_min_max_version_sslv3c	Cs�t�\}}}tjj|_t|d��<}|jt��|d��}|�t	|j
f�|�d|��d�Wd�n1s7wYWd�dSWd�dS1sOwYdS)Nr�rlZECDHr)
r�r	r
rar^r�r�r�r>r?r�r|r�r�r r r!�test_default_ecdh_curve�s

���"�z%ThreadedTests.test_default_ecdh_curvervrwc		Cstjr	tj�d�t�\}}}t|ddd�}|��|jt��|d��S}|�	t
|jf�|�d�}tjr<tj�d�
|��|�|�|��dkrP|�t|�d	�n|�t|�d
�|�d�|����}|�|t|��d��Wd
�n1sxwY|jt��|d��Y}|�	t
|jf�|�d�}tjr�tj�d�
|��|�||�|�|�|��dkr�|�t|�d	�n|�t|�d
�|�d�|����}|�|t|��d��Wd
�n1s�wYWd
�d
SWd
�d
S1s�wYd
S)z Test tls-unique channel binding.r�TFr(rlrvz! got channel binding data: {0!r}
r��0�sCB tls-unique
r�Nz(got another channel binding data: {0!r}
)rrtrrrurvr�r�r�r�r>r?r�rsr�r�r5r�rZrFr�rzrg�assertNotEqual)	r�r�r�r�r�r�Zcb_dataZpeer_data_reprZnew_cb_datar r r!ry�sp��
�

���
��

���"�z-ThreadedTests.test_tls_unique_channel_bindingcCsRt�\}}}t||dd|d�}tjrtj�d�|d��|�|dhd��dS)NT�r�r�r8z got compression: {!r}
r0>ZRLENZZLIB)	r�r;rrtrrrurvr�r|�r�r�r�r�rOr r r!�test_compression�s�zThreadedTests.test_compressionr>z*ssl.OP_NO_COMPRESSION needed for this testcCsRt�\}}}|jtjO_|jtjO_t||dd|d�}|�|dd�dS)NTr�r0)r�r4r	r>r;r�r�r r r!�test_compression_disabled�s�z'ThreadedTests.test_compression_disabledr,cCs�t�\}}}tjj|_|�t�|�d�tjj|_t||dd|d�}|dd}|�	d�}d|vrEd|vrGd	|vrI|�
d
|d�dSdSdSdS)NZkEDHTr�r�rrLZADHZEDHZDHEzNon-DH cipher: )r�r	r
rar^r.r/rLr;rOr�)r�r�r�r�rOr��partsr r r!�test_dh_params�s



�
�zThreadedTests.test_dh_paramscCs�t�\}}}|�d�|�d�tjj|_t||dd|d�}t�\}}}|�d�|�d�tjj|_t||dd|d�}t�\}}}|�d�|�d�|�d�tjj|_|�tj	��t||dd|d�Wd�dS1sqwYdS)NZ	secp384r1zECDHE:!eNULL:!aNULLTr�r8)
r�r;rLr	r
rarJr;r�r�r�r r r!�test_ecdh_curves6


�


�



�"�zThreadedTests.test_ecdh_curvecCs2t�\}}}t||dd|d�}|�|dd�dS)NTr�r2)r�r;r�r�r r r!�test_selected_alpn_protocol's�z)ThreadedTests.test_selected_alpn_protocolcCs@t�\}}}|�ddg�t||dd|d�}|�|dd�dS)Nr9�barTr�r2)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_alpnc
Csgd�}ddgdfddgdfdgdfddgdfg}|D]j\}}t�\}}}|�|�|�|�zt||dd|d�}WntjyO}	z|	}WYd}	~	nd}	~	wwd	t|�t|�t|�f}
|d
}|�|||
|df�t|d�rx|dd
nd}|�|||
|df�qdS)N)r9r��	milkshaker9r�r�zhttp/3.0zhttp/4.0Tr�zKfailed trying %s (s) and %s (c).
was expecting %s, but got %%s from the %%sr2r�r4r�Znothingr�)r�r�r;r	r�rSr�rZ)
r�Zserver_protocolsZprotocol_testsZclient_protocolsr�r�r�r�rOrdr�Z
client_resultZ
server_resultr r r!�test_alpn_protocols8sL


�


�����
�
��
��z!ThreadedTests.test_alpn_protocolscCstjrJ�dSr)r	ZHAS_NPNr�r r r!�test_npn_protocolsZr�z ThreadedTests.test_npn_protocolscCsLt�tj�}|�t�t�tj�}|�t�t�tj�}|�t�|||fSr)	r	rbrWr�r�r�rXr�r�)r�r��
other_contextr�r r r!�sni_contexts]s



zThreadedTests.sni_contextscCs"|d}|�d|ff|d�dS)Nr1r+r3)r|)r�rOrrRr r r!�check_common_namefszThreadedTests.check_common_namecs�g�|��\}�}d|_��fdd�}|�|�t||ddd�}|��d|fg�|�|d�g�t||ddd�}|��d|fg�|�|t�g�|�d�t||ddd�}|�|t�|��g�dS)	NFcs$��||f�|dur�|_dSdSr)r�r�r��Zcallsr�r r!r�ps
�z6ThreadedTests.test_sni_callback.<locals>.servername_cbT�supermessage�r�r8r:Znotfunny)r�r�r@r;r�r�r�)r�r�r�r�rOr r�r!rAjs4
��
�zThreadedTests.test_sni_callbackcCsp|��\}}}dd�}|�|�|�tj��}t||ddd�}Wd�n1s)wY|�|jjd�dS)NcSstjSr)r	ZALERT_DESCRIPTION_ACCESS_DENIEDr�r r r!�cb_returning_alert�szAThreadedTests.test_sni_callback_alert.<locals>.cb_returning_alertFr�r�ZTLSV1_ALERT_ACCESS_DENIED)	r�r@r�r	r�r;r�rArf)r�r�r�r�r�r7rOr r r!�test_sni_callback_alert�s
��z%ThreadedTests.test_sni_callback_alertc	C�|��\}}}dd�}|�|�t���7}|�tj��}t||ddd�}Wd�n1s.wY|�|j	j
d�|�|jjt
�Wd�dS1sNwYdS)NcSsdddS)Nr�rr r�r r r!�
cb_raising�r�z;ThreadedTests.test_sni_callback_raising.<locals>.cb_raisingFr�r�ZSSLV3_ALERT_HANDSHAKE_FAILURE)r�r@r�catch_unraisable_exceptionr�r	r�r;r�rArf�
unraisable�exc_type�ZeroDivisionError)r�r�r�r�r��catchr7rOr r r!�test_sni_callback_raising�s

��
�"�z'ThreadedTests.test_sni_callback_raisingc	Cr�)NcSr)Nr9r r�r r r!�cb_wrong_return_type�rQzOThreadedTests.test_sni_callback_wrong_return_type.<locals>.cb_wrong_return_typeFr�r�ZTLSV1_ALERT_INTERNAL_ERROR)r�r@rr�r�r	r�r;r�rArfr�r�r�)r�r�r�r�r�r�r7rOr r r!�#test_sni_callback_wrong_return_type�s

��"�z1ThreadedTests.test_sni_callback_wrong_return_typec	s�t�\}}}|�d�|�d�gd�}t|||d�}|dd}|�t|�d�|D]\�}}t�fdd�|D��s@|���q+dS)	Nz
AES128:AES256r�)r�zAES-256ZTLS_CHACHA20ZTLS_AES�r8r5rc3s�|]}|�vVqdSrr )r�Zalgrr r!r��r�z4ThreadedTests.test_shared_ciphers.<locals>.<genexpr>)r�rLr;�
assertGreaterrZ�anyr�)	r�r�r�r�Z
expected_algsrOr�Ztls_version�bitsr rr!�test_shared_ciphers�s

�
��z!ThreadedTests.test_shared_cipherscCs�t�\}}}t|dd�}|�.|jt��|d�}|�t|jf�|��|�t	|j
d�|�t	|jd�Wd�dS1s?wYdS)NFrDrlr�shello)r�r�r�r�r>r?r�rGr�r�rFrvr�r r r!�,test_read_write_after_close_raises_valuerror�s
�"�z:ThreadedTests.test_read_write_after_close_raises_valuerrorc	
Cs&d}ttjd��
}|�|�Wd�n1swY|�tjtj�t�\}}}t|dd�}|�V|jt	�	�|d��4}|�
t|jf�ttjd��}|�
|�|�|�d�|�Wd�n1sewYWd�n1stwYWd�dSWd�dS1s�wYdS)Nsxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx�wbFrDrlrvr�)rEr�TESTFNrvrF�unlinkr�r�r�r�r>r?r��sendfiler�r)	r�Z	TEST_DATArHr�r�r�r�r��filer r r!�
test_sendfile�s,�
�
����"�zThreadedTests.test_sendfilec
Cs0t�\}}}tjj|_t|||d�}|d}|�|j�|�|j	d�|�|j
d�|�|j�|�|jd�|�
|d�|��}|�|dd�|�|dd�t||||d�}|��}|�|dd	�|�|dd�|�|d�|d}|�|j|j�|�||�|�||�|�|j	|j	�|�|j
|j
�t|||d�}|�
|d�|d}|�|j|j�|�||�|��}|�|dd
�|�|dd�t||||d�}|�|d�|d}	|�|	j|j�|�|	|�|�|	j	|j	�|�|	j
|j
�|��}|�|dd�|�|dd	�dS)Nr�r)rr3r2r�r3)r)r8r�rr�)r�r	r
rar^r;r
�idr�rzr.Z
has_ticketZticket_lifetime_hintr�r5r�ZassertIsNotrr�)
r�r�r�r�rOr)Z	sess_statZsession2Zsession3Zsession4r r r!�test_session�sd
����zThreadedTests.test_sessionc

Cs�t�\}}}t�\}}}tjj|_tjj|_t|dd�}|��*|jt��|d��G}|�|j	d�|�|j
d�|�t|j
f�|j	}|�|�|�t��}	t|_	Wd�n1s[wY|�t|	j�d�Wd�n1sswY|jt��|d��1}|�t|j
f�|�t��}	||_	Wd�n1s�wY|�t|	j�d�Wd�n1s�wY|jt��|d��*}||_	|�t|j
f�|�|j	j|j�|�|j	|�|�|j
d�Wd�n1s�wY|jt��|d��2}|�t��}	||_	|�t|j
f�Wd�n	1�swY|�t|	j�d�Wd�n1�s4wYWd�dSWd�dS1�sMwYdS)NFrDrlzValue is not a SSLSession.z#Cannot set session after handshake.Tz)Session refers to a different SSLContext.)r�r	r
rar^r�r�r�r�r)r3r>r?r�r
r�r�r*rSrAr�r�)
r�r�r�r�Zclient_context2r�r�r�r)rdr r r!�test_session_handling+sr


�
��
����
	��

��� �� $�z#ThreadedTests.test_session_handlingN)Er�r�r�rCrGrIrVrer�r	r�r�rQrRrWr\rnr`rgrhrlrmrnrorqrsrur{r|r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�ryr�rKr�rarbr�r�r�r�r�r�r�r�rAr�r�r�r�r�r�r�r�r r r r!rBns�,$(!�
8%
!)
*



9	1(


�
:	�

	
	"	(

9rBr�zTest needs TLS 1.3c@sdeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dS)�TestPostHandshakeAuthcCs�tjtjg}|D]S}t�|�}|�|jd�d|_|�|jd�tj|_|�|jtj�|�|jd�d|_|�|jtj�|�|jd�tj|_d|_|�|jtj�|�|jd�qdSr�)	r	rWrXrbr��post_handshake_authr�r�r�)r�r6r[rNr r r!�test_pha_setter`s$�
�z%TestPostHandshakeAuth.test_pha_setterc	CsHt�\}}}d|_tj|_d|_|�t�t|dd�}|�}|jt	�	�|d��[}|�
t|jf�|�
d�|�|�d�d�|�
d�|�|�d�d	�|�
d�|�|�d�d
�|�
d�|�|�d�d	�|�
d�|�d��d
�}|�d|�Wd�n1s�wYWd�dSWd�dS1s�wYdS)NTFrDrlr�r�r�r�r�r�r�ir�r6)r�r�r	r�r�r�r�r�r�r�r>r?r�rvr�rrhr|)r�r�r�r�r�r�Z	cert_textr r r!�test_pha_requiredxs6

�




��"�z'TestPostHandshakeAuth.test_pha_requiredc
Cs t�\}}}d|_tj|_d|_dd�}||_||_t|dd�}|�d|jt��|dd��A}|�	t
|jf�|�d�|�
tjd��|�d	�}|�|d
�|�d�|�d	�Wd�n1sbwYWd�n1sqwYWd�dSWd�dS1s�wYdS)NTcSs@tjr|tjkr||||||f}tj�d|�d��dSdSdS)NzTLS: r�)rrtrZALERTrrrurv)r�	directionr5�content_type�msg_typer�ryr r r!�msg_cb�s�z>TestPostHandshakeAuth.test_pha_required_nocert.<locals>.msg_cbrDFr]r�z#(certificate required|EOF occurred)r�r�r�)r�r�r	r�r��
_msg_callbackr�r�r�r>r?r�rvr�r�rr�)r�r�r�r�r�r�r�r�r r r!�test_pha_required_nocert�s<
�
�

����"�z.TestPostHandshakeAuth.test_pha_required_nocertc	Cs tjr	tj�d�t�\}}}d|_tj|_	d|_|�
t�tj|_	t
|dd�}|�\|jt��|d��:}|�t|jf�|�d�|�|�d�d�|�d	�|�|�d�d
�|�d�|�|�d�d�Wd�n1sqwYWd�dSWd�dS1s�wYdS)Nr�TFrDrlr�r�r�r�r�r�)rrtrrrurvr�r�r	r�r�r�r�r�r�r�r�r>r?r�r�rr�r r r!�test_pha_optional�s2

�


��"�z'TestPostHandshakeAuth.test_pha_optionalc	Cstjr	tj�d�t�\}}}d|_tj|_	d|_t
|dd�}|�\|jt��|d��:}|�
t|jf�|�d�|�|�d�d�|�d	�|�|�d�d
�|�d�|�|�d�d�Wd�n1shwYWd�dSWd�dS1s�wYdS)Nr�TFrDrlr�r�r�r�r�)rrtrrrurvr�r�r	r�r�r�r�r�r>r?r�r�rr�r r r!�test_pha_optional_nocert�s.
�


��"�z.TestPostHandshakeAuth.test_pha_optional_nocertc
Cs�t�\}}}d|_tj|_|�t�t|dd�}|�[|jt	�	�|d��9}|�
t|jf�|�
tjd��|��Wd�n1sCwY|�d�|�d|�d��Wd�n1s`wYWd�dSWd�dS1sxwYdS)	NTFrDrlz
not serverr�sextension not receivedr�)r�r�r	r�r�r�r�r�r�r�r>r?r�r�r�r�rvr|rr�r r r!�test_pha_no_pha_client�s(

�
�
��"�z,TestPostHandshakeAuth.test_pha_no_pha_clientc	Cst�\}}}tj|_d|_|�t�t|dd�}|�\|jt	�	�|d��:}|�
t|jf�|�
d�|�|�d�d�|�
d�|�|�d�d	�|�
d�|�|�d�d�Wd�n1sawYWd�dSWd�dS1sywYdS)
NTFrDrlr�r�r�r�r�)r�r	r�r�r�r�r�r�r�r�r>r?r�rvr�rr�r r r!�test_pha_no_pha_server�s*

�


��"�z,TestPostHandshakeAuth.test_pha_no_pha_serverc	Cs�t�\}}}tj|_tjj|_d|_|�t	�t
|dd�}|�@|jt��|d��}|�
t|jf�|�d�|�d|�d��Wd�n1sJwYWd�dSWd�dS1sbwYdS)NTFrDrlr�sWRONG_SSL_VERSIONr�)r�r	r�r�r
rar^r�r�r�r�r�r�r>r?r�rvr|rr�r r r!�test_pha_not_tls13s$


�
��"�z(TestPostHandshakeAuth.test_pha_not_tls13c	CsHt}t�tj�}d|_|�t�d|_tj|_	t�tj
�}|�t�|�t�d|_tj
|_	t|dd�}|�d|jt��|d��B}|�t|jf�|�d�|�|�d�d�|�d�|�|�d�d	�|�d�|�|�d�d
�|�|��i�Wd�n1s�wYWd�dSWd�dS1s�wYdS)NTFrDrlr�r�r�r�r�r�)r�r	rbrXr�r�r�r�r�r�rWr�r�r�r�r�r�r>r?r�rvr�rr�)r�r�r�r�r�r�r r r!�test_bpo37428_pha_cert_nones:



�


��"�z1TestPostHandshakeAuth.test_bpo37428_pha_cert_nonec	Cs�tdd�\}}}t|dd�}|��|jt��|d���}|�t|jf�|j��}|�	t
|�d�|\}}|j��}	|�	t
|	�d�|�	||	d�|�	t|�t|	d��|�	t
|�t
|	d��|�||�|�t|�t|��|�t
|�t
|��|�|��|���|�dt
|��|�d	t
|��|�tj�}
|�tj�}|�|
t�|�d
|
�|�|t�|�	t�|
�|�Wd�n1s�wYWd�dSWd�dS1s�wYdS)NFr�rDrlr�r�rzCN=localhostzCN=our-ca-serverz-----BEGIN CERTIFICATE-----)r�r�r�r�r>r?r�r�r�r�rZr��hashrzr�Zget_infor|Zpublic_bytesr�ZENCODING_PEMZENCODING_DERrrSr�r	r�)r�r�r�r�r�r�Zvc�ee�caZuvcr�rJr r r!�test_internal_chain_client8sJ��


���"�z0TestPostHandshakeAuth.test_internal_chain_clientc	Cs�t�\}}}|�t�tj|_tjj|_t	|dd�}|�R|j
t��|d��0}|�t
|jf�|�d�|�d�}|�|d�|�d�|�d�}|�|d�Wd�n1sYwYWd�dSWd�dS1sqwYdS)NFrDrlsVERIFIEDCHAIN
r�s
sUNVERIFIEDCHAIN
)r�r�r�r	r�r�r
rar^r�r�r�r>r?r�rvrr�)r�r�r�r�r�r��resr r r!�test_internal_chain_server]s,

�



��"�z0TestPostHandshakeAuth.test_internal_chain_serverN)r�r�r�r�r�r�r�r�r�r�r�r�r�r�r r r r!r�^s%%r��keylog_filenamez0test requires OpenSSL 1.1.1 with keylog callbackc@s�eZdZejfdd�Zee�e	d�dd���Z
ee�e	d�dd���Zee�ej
jd�e�e	d�d	d
����Zdd�Zd
d�Zdd�ZdS)�TestSSLDebugcCs8t|��}tt|��Wd�S1swYdSr)rErZr�)r�ZfnamerHr r r!�keylog_linesxs

$�zTestSSLDebug.keylog_linesr,cCs
|�tjtj�t�tj�}|�|jd�|�	t
j�tj��tj|_|�|jtj�|�
t
j�tj��|�|��d�d|_|�|jd�|�ttf��t
j�t
j�tj��|_Wd�n1sewY|�t��d|_Wd�dS1s~wYdS)Nr�)rFrr�r�r	rbrXr�r�r�rr�isfiler
r�r��IsADirectoryError�PermissionErrorr�abspathr�r�r r r!�test_keylog_defaults|s$��"�z!TestSSLDebug.test_keylog_defaultsc	Cs�|�tjtj�t�\}}}tj|_t|dd�}|�)|jt��|d��}|�	t
|jf�Wd�n1s7wYWd�n1sFwY|�|�
�d�d|_tj|_t|dd�}|�)|jt��|d��}|�	t
|jf�Wd�n1swYWd�n1s�wY|�|�
�d�tj|_tj|_t|dd�}|�)|jt��|d��}|�	t
|jf�Wd�n1s�wYWd�n1s�wY|�|�
�d�d|_d|_dS)NFrDrlr~��)rFrr�r�r�r�r�r�r�r>r?r�r�r�rr�r r r!�test_keylog_filename�sT
����
����
����
z!TestSSLDebug.test_keylog_filenamez.test is not compatible with ignore_environmentcCs�|�tjtj�tjj�tj	��>tjtj	d<|�
tj	dtj�t�tj
�}|�
|jd�t��}|�
|jtj�t��}|�
|jtj�Wd�dS1sQwYdS)NZ
SSLKEYLOGFILE)rFrr�r�reZmockr�dictr�environr�r	rbrXr�rRrTr�r r r!�test_keylog_env�s"�zTestSSLDebug.test_keylog_envcCsnt�\}}}dd�}|�|jd�||_|�|j|�|�t��
t�|_Wd�dS1s0wYdS)NcSrPrr �rr�r5r�r�r�r r r!r��rQz.TestSSLDebug.test_msg_callback.<locals>.msg_cb)r�r�r�r�r�r*)r�r�r�r�r�r r r!�test_msg_callback�s
"�zTestSSLDebug.test_msg_callbackc	s�t�\}}}tjj|_g���fdd�}||_t|dd�}|�)|jt��|d��}|�	t
|jf�Wd�n1s<wYWd�n1sKwY��dtjt
jtjf����dtjt
jtjf��dS)Ncs@��|tj���|t���|ddh���||||f�dS)NrFrv)rr	r�r�r|r�r��r�r�r r!r��sz4TestSSLDebug.test_msg_callback_tls12.<locals>.msg_cbFrDrlrFrv)r�r	r
rar^r�r�r�r�r>r?r�r|rZ	HANDSHAKErZSERVER_KEY_EXCHANGEZCHANGE_CIPHER_SPEC)r�r�r�r�r�r�r�r r�r!�test_msg_callback_tls12�s6

����
��
��z$TestSSLDebug.test_msg_callback_tls12c	st�\}}}t�d�dd�}�fdd�}||_||_t|dd�}|�S|jt��|d��}|�t|jf�Wd�n1s@wY|jt��|d��}|�t|jf�Wd�n1sawYWd�dSWd�dS1sywYdS)	Nr�cSrPrr r�r r r!r��rQz@TestSSLDebug.test_msg_callback_deadlock_bpo43577.<locals>.msg_cbcs
�|_dSrr�r=�Zserver_context2r r!�sni_cb�rz@TestSSLDebug.test_msg_callback_deadlock_bpo43577.<locals>.sni_cbFrDrl)	r�r�Zsni_callbackr�r�r�r>r?r�)r�r�r�r�r�r�r�r�r r�r!�#test_msg_callback_deadlock_bpo43577�s.

��
���"�z0TestSSLDebug.test_msg_callback_deadlock_bpo43577N)r�r�r�rr�r��requires_keylogrerarbr�r�rr�flags�ignore_environmentr�r�r�rr r r r!r�vs"

"
�
r�cCstjr[tjtjd�}|��D]\}}|�}|r#|dr#d||f}q*qtt���}tdtj	tj
f�td|�tdtj�tdtj�z	tdtj
�Wn	tyZYnwttttttttttttfD]}tj�|�sxt�d	|��qit� �}t!j"tj#g|�R�dS)
N)ZMacZWindowsrz%s %rztest_ssl: testing with %r %rz          under %sz          HAS_SNI = %rz          OP_ALL = 0x%8xz          OP_NO_TLSv1_1 = 0x%8xzCan't read certificate file %r)$rrtr�Zmac_verZ	win32_ver�itemsrzr�r	rrr�r�r�r�r�rrrrrr�r�r�r�BADKEYrrr�existsZ
TestFailedrZthreading_setupreZaddModuleCleanupZthreading_cleanup)ZplatsrrhZplat�filename�thread_infor r r!�setUpModule
s@��
����r	�__main__r)r�TFNN)Nrr)�rrreZ
unittest.mockr�rZtest.supportrrrrrr�r�rzZdatetimerCrrBr�Zurllib.requestrwr�rprr�Z	sysconfigrjr��ImportError�warnings�catch_warnings�simplefilterr3r�
import_moduler	r�r
rrr
rKZPy_DEBUGrb�sortedZ_PROTOCOL_NAMESr�r?rr`Zget_config_varrr<r��verrUr�r"r��fsencoderrrrrrrrr�rr(r�r�rHr�r�r�r�r�rNrMr�r�rVr�r�r�rrr@rr�r�r�r/r0r>r?r@rArBrCrIrOr\�	lru_cacherYrnrxr�Zignore_warningsr�r�r�r�ZTestCaser�r�rcrorr�Zrequires_resourcer�r�r�Ztest.ssl_serversr�r�r�rr;rArBr�r�rbZ
HAS_KEYLOGrr�r	r��mainr r r r!�<module>s|�

�





�






��

	
	
(��/86?0f
v
�1
�N{�
#�
© 2025 GrazzMean