Ë
    #ïàj)q  ã                   óŠ  — d 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mZ ddlmZmZmZmZ ddlmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% ddl&m'Z'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z.m/Z/ dd	l0m1Z1  e2 ejf                  d
«      «      Z4e!xr d ejj                  d«      v Z6ejn                  jq                  d«      Z9ejt                  jw                  ejt                  jx                  «      jq                  d«      Z=e	j|                  dd dk\  Z?e	j|                  dd dk  Z@e@r6ej‚                  j…                  d«      ej‚                  j…                  d«      gZCejˆ                  ejt                  jŠ                  ejŒ                  ejt                  jŽ                  ej�                  ejt                  jŽ                  ejt                  j’                  z   iZJej‚                  j—                   e/d«       d¬«      ZL G d„ de1«      ZMd„ ZN ejž                  d¬«      d„ «       ZPejž                  d„ «       ZQejž                  d„ «       ZRejž                  d„ «       ZSejž                  d„ «       ZTejž                  d „ «       ZUejž                  d!„ «       ZVejž                  d"„ «       ZWd#„ ZXejž                  d$„ «       ZYej‚                  jµ                  d%d&«      d'„ «       Z[ej‚                  jµ                  d%d&«      ej‚                  jµ                  d(d)«      ej‚                  jµ                  d*ejˆ                  ejŒ                  ej�                  f«      ej‚                  j¹                  exr ed+d,¬-«      d.„ «       «       «       «       Z]ej‚                  jµ                  d% ej¼                  d/ej‚                  j¹                  exr e?d0d,¬-«      ¬1«      d2f«      ej‚                  jµ                  d3ejˆ                  d,fejˆ                  d4fejŒ                  d,fejŒ                  d4fej�                  d4ff«      d5„ «       «       Z_ej‚                  jµ                  d6e+e,f«      d7„ «       Z`ej‚                  jµ                  d%d&«      ej‚                  jµ                  d6e+ ej¼                  e,eL¬1«      f«      ej‚                  jÃ                  d8d¬9«      d:„ «       «       «       Zbej‚                  jµ                  d%d&«      ej‚                  jµ                  d;d<d=¬>«      ej‚                  jµ                  d?d<d@¬>«      dA„ «       «       «       Zcej‚                  jµ                  d%dB«      dC„ «       Zdej‚                  jµ                  dDd2dE ejÊ                  «       fd2dF ejÊ                  «       fd2dG ejÌ                  egdH¬I«      ffdJ¬>«      dK„ «       Zhy)LzTests for TLS support.é    N)Údefault_backend)ÚBestAvailableEncryptionÚEncodingÚPrivateFormatÚload_pem_private_keyé   )ÚIS_ABOVE_OPENSSL10ÚIS_ABOVE_OPENSSL31ÚIS_CIÚIS_LINUXÚIS_MACOSÚIS_PYPYÚ
IS_SOLARISÚ
IS_WINDOWSÚSYS_PLATFORMÚbtonÚntobÚntou)ÚGatewayÚ
HTTPServerÚget_ssl_adapter_class)ÚANY_INTERFACE_IPV4ÚANY_INTERFACE_IPV6ÚEPHEMERAL_PORTÚ_get_conn_dataÚ_probe_ipv6_sock)Ú
Gateway_10ÚGITHUB_WORKFLOWs(   Microsoft Windows Server 2016 Datacenter)Ú
systeminfoÚLibreSSLs   OpenSSL 1.0.)é   é
   )r!   é   zˆignore:Passing pyOpenSSL PKey objects is deprecated\. You should use a cryptography private key instead\.:DeprecationWarning:OpenSSL.SSLz�ignore:Passing pyOpenSSL X509 objects is deprecated\. You should use a cryptography\.x509\.Certificate instead\.:DeprecationWarning:OpenSSL.SSLz::1zYIPv6 is disabled (for example, under Travis CI which runs under GCE supporting only IPv4))Úreasonc                   ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚHelloWorldGatewayz0Gateway responding with Hello World to root URI.c                 óà  •— | j                   }t        |j                  «      }|dk(  r)d|_        |j	                  «        |j                  d«       y|dk(  rˆd|_        |j	                  «        | j                  «       }|j                  d«       |j                  d«       t        |«       |j                  t        j                  |«      j                  d«      «       yt        t        | �;  «       S )	z$Respond with dummy content via HTTP.ú/s   200 OKs   Hello world!Nú/envzwsgi.errorsz
wsgi.inputúutf-8)Úreqr   ÚuriÚstatusÚensure_headers_sentÚwriteÚget_environÚpopÚprintÚjsonÚdumpsÚencodeÚsuperr&   Úrespond)Úselfr+   Úreq_uriÚenvÚ	__class__s       €úD/srv/dav/.venv/lib/python3.12/site-packages/cheroot/test/test_ssl.pyr7   zHelloWorldGateway.respondl   s½   ø€ à�h‰hˆÜ�s—w‘w“-ˆØ�cŠ>Ø"ˆCŒJØ×#Ñ#Ô%Ø�I‰I�oÔ&ØØ�fÒØ"ˆCŒJØ×#Ñ#Ô%Ø×"Ñ"Ó$ˆCà�G‰G�MÔ"Ø�G‰G�LÔ!Ü�#ŒJØ�I‰I”d—j‘j “o×,Ñ,¨WÓ5Ô6ØÜÔ&¨Ñ5Ó7Ð7ó    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r7   Ú__classcell__)r;   s   @r<   r&   r&   i   s   ø„ Ù:÷8ð 8r=   r&   c                 ó$  — t        | t        ¬«      }||_        t        j                  |j
                  ¬«      j                  «        |j                  s"t        j                  d«       |j                  sŒ"|j                  |j                  «       |S )z7Create and start an HTTP server bound to ``bind_addr``.©Ú	bind_addrÚgateway)Útargetgš™™™™™¹?)r   r&   Ússl_adapterÚ	threadingÚThreadÚ
safe_startÚstartÚreadyÚtimeÚsleepÚaddfinalizerÚstop)rE   rH   ÚrequestÚ
httpservers       r<   Úmake_tls_http_serverrT   ‚   sr   € äØÜ!ô€Jð
 )€JÔä×Ñ˜J×1Ñ1Ô2×8Ñ8Ô:à×ÒÜ�
‰
�3Œð ×Óð ×Ñ˜Ÿ™Ô)àÐr=   Úsession)Úscopec                   ó   — y)z+Provide hardcoded password for private key.u   ÐºÑ€Ð¸Ñ—Ð²ÐºÐ°© rX   r=   r<   Úprivate_key_passwordrY   •   s   € ð r=   c                 ó8   — t        j                  t        | ¬«      S )z(Provision a server creator as a fixture.©rR   )Ú	functoolsÚpartialrT   r[   s    r<   Útls_http_serverr^   ›   s   € ô ×ÑÔ1¸7ÔCÐCr=   c                  ó*   — t        j                  «       S )z,Provide a certificate authority via fixture.)ÚtrustmeÚCArX   r=   r<   Úcarb   ¡   s   € ô �:‰:‹<Ðr=   c              #   ór   K  — | j                   j                  «       5 }|–— ddd«       y# 1 sw Y   yxY w­w)z=Provide a certificate authority certificate file via fixture.N)Úcert_pemÚtempfile)rb   Úca_cert_pems     r<   Útls_ca_certificate_pem_pathrg   §   s4   è ø€ ð 
�‰×	Ñ	Ó	ð  ;ØÒ÷÷ ñ üó   ‚7�+¢	7«4°7c                 ó\   — t        t        «      \  }}}| j                  t        |«      «      S )z'Provide a leaf certificate via fixture.)r   r   Ú
issue_certr   )rb   Ú	interfaceÚ_hostÚ_ports       r<   Útls_certificatern   ®   s)   € ô -Ô-?Ó@Ñ€Iˆu�eØ�=‰=œ˜i›Ó)Ð)r=   c              #   ór   K  — | j                   j                  «       5 }|–— ddd«       y# 1 sw Y   yxY w­w)z6Provide a certificate chain PEM file path via fixture.N)Úprivate_key_and_cert_chain_pemre   )rn   rd   s     r<   Útls_certificate_chain_pem_pathrq   µ   s5   è ø€ ð 
×	7Ñ	7×	@Ñ	@Ó	Bð ÀhØŠ÷÷ ñ ürh   c              #   ór   K  — | j                   j                  «       5 }|–— ddd«       y# 1 sw Y   yxY w­w)z<Provide a certificate private key PEM file path via fixture.N)Úprivate_key_pemre   )rn   Úcert_key_pems     r<   Ú$tls_certificate_private_key_pem_pathru   ¼   s6   è ø€ ð 
×	(Ñ	(×	1Ñ	1Ó	3ð °|ØÒ÷÷ ñ ürh   c           	      ó$  — | j                   j                  «       }t        |dt        «       ¬«      }|j	                  t
        j                  t        j                  t        |j                  d«      ¬«      ¬«      }|dz  }|j                  |«       |S )z/Return a certificate private key PEM file path.N)ÚpasswordÚbackendr*   )rw   )ÚencodingÚformatÚencryption_algorithmzencrypted-private-key.pem)rs   Úbytesr   r   Úprivate_bytesr   ÚPEMr   ÚPKCS8r   r5   Úwrite_bytes)rn   rY   Útmp_pathÚkey_as_bytesÚprivate_key_objectÚencrypted_key_as_bytesÚkey_files          r<   Ú+tls_certificate_passwd_private_key_pem_pathr†   Ã   sŽ   € ð #×2Ñ2×8Ñ8Ó:€LÜ-ØØÜÓ!ôÐð 0×=Ñ=Ü—‘Ü×"Ñ"Ü4Ø)×0Ñ0°Ó9ô
ð >ó Ðð Ð5Ñ5€HØ×ÑÐ/Ô0à€Or=   c                 ó   — t        |j                  t        «      ry| j                  |j                  t	        |j
                  «      dj                  t        j                  |j                  |j
                  |j                  «      «      f«       y)z@Append uncaught exception ``args`` in threads to ``exceptions``.NÚ )
Ú
issubclassÚexc_typeÚ
SystemExitÚappendÚstrÚ	exc_valueÚjoinÚ	tracebackÚformat_exceptionÚexc_traceback)Ú
exceptionsÚargss     r<   Ú_thread_except_hookr•   ß   sj   € ä�$—-‘-¤Ô,Øà×Ñà�M‰MÜ�—‘ÓØ�G‰GÜ×*Ñ*Ø—M‘MØ—N‘NØ×&Ñ&óóð
	
õr=   c               #   óÈ   K  — g } t        t        dd«      }|�#t        j                  t        | «      t        _        	 | –— |�|t        _        yy# |�|t        _        w w xY w­w)z±Provide a list of uncaught exceptions from threads via a fixture.

    Only catches exceptions on Python 3.8+.
    The list contains: ``(type, str(value), str(traceback))``
    Ú
excepthookN)ÚgetattrrI   r\   r]   r•   r—   )r“   Ú	orig_hooks     r<   Úthread_exceptionsrš   ó   sk   è ø€ ð €Jäœ	 <°Ó6€IØÐÜ(×0Ñ0ÜØó 
Œ	Ôð-ØÒàÐ Ø#,ŒIÕ ð !øˆ9Ð Ø#,ŒIÕ ð !üs   ‚9A"¼A Á A"ÁAÁA"Úadapter_type)ÚbuiltinÚ	pyopensslc                 óˆ  — t        t        «      \  }}}	t        |¬«      }
 |
||«      }|dk(  r|j                  «       |_        |j                  |j                  «        |||	f|«      }t        |j                  «      \  }}}	t        j                  d|›d|	›d�| |¬«      }|j                  dk(  sJ ‚|j                  dk(  sJ ‚y	)
z;Test ability to connect to server via HTTPS using adapters.©Únamer�   úhttps://ú:r(   ©ÚtimeoutÚverifyéÈ   úHello world!N)r   r   r   Úget_contextÚcontextÚconfigure_certrE   ÚrequestsÚgetÚstatus_codeÚtext)Úhttp_request_timeoutr^   r›   rn   rq   ru   rg   rk   rl   ÚportÚtls_adapter_clsÚtls_adapterÚtlshttpserverÚresps                 r<   Útest_ssl_adaptersrµ   	  sÜ   € ô" ,Ô,>Ó?Ñ€Iˆu�dÜ+°Ô>€OÙ!Ø&Ø,ó€Kð �{Ò"Ø)×5Ñ5Ó7ˆÔà×"Ñ" ;×#6Ñ#6Ô7á# Y°Ð$5°{ÓC€Mô
 ,Ø×ÑóÑ€Iˆu�dô �<‰<Ø
�9�-˜q  ¨Ð*Ø$Ø*ô€Dð ×Ñ˜sÒ"Ð"Ð"Ø�9‰9˜Ò&Ð&Ñ&r=   )Úis_trusted_certÚtls_client_identity))TÚ	localhost)Tú	127.0.0.1)Tz*.localhost)TÚnot_localhost)Fr¸   Útls_verify_modez)Fails under PyPy in CI for unknown reasonF)r$   Ústrictc           	      óX  ‡— |t         j                  k7  xr |	 }t        t        «      \  }}}|	r|nt	        j
                  «       }|j                  j                  dt        |
«      ¬«      5  |j                  t        |
«      «      }~ddd«       j                  j                  «       5 }t        |¬«      } |||«      }|dk(  r:|j                  «       |_        |j                  j!                  t"        |   d„ «       n||j                  _        |j'                  |j                  «       |j)                  |j                  «        |||f|«      }t        |j*                  «      \  }}}t-        j.                  t0        j2                  d|›d|›d	�| ||¬
«      }|s� |«       }|j4                  dk(  }|s:t6        r4|dk(  r/|t         j8                  k(  r|
dk(  r|	rt;        j<                  d«       |sJ ‚|j>                  dk(  sJ ‚|jA                  «        	 ddd«       ytB        xr |dk(  xr |t         j                  k7  }|rt;        j<                  d«       t0        jD                  jF                  f}tH        stJ        r|t0        jD                  jL                  fz  }t;        jN                  |«      5 } |«       jA                  «        ddd«       	 jP                  jR                  d   jT                  jR                  d   jR                  d   Št[        ‰t\        «      rtY        |jP                  «      Št^        rdndf}tB        rt`        r|dk(  rd}|t         j8                  t         jb                  hv r"|	s |
dk(  r|tH        rdntJ        rtd        rdndz  }tf        r|dz  }tJ        rtH        rtf        r|dz  }ti        ˆfd„|D «       «      sJ ‚	 ddd«       y# 1 sw Y   �ŒNxY w# 1 sw Y   �ŒxY w# tV        $ r' tH        stJ        rtY        jP                  «      Šn‚ Y �Œw xY w# 1 sw Y   yxY w)z8Verify that client TLS certificate auth works correctly.úidna.core.ulabel©Úreturn_valueNrŸ   r�   c                 ó   — |S ©NrX   ©ÚconnÚcertÚerrnoÚdepthÚpreverify_oks        r<   ú<lambda>z&test_tls_client_auth.<locals>.<lambda>€  ó   € ¸|€ r=   r¡   r¢   r(   ©r¤   r¥   rÅ   r¦   rœ   r¸   z4OpenSSL 1.0 has problems with verifying client certsr§   zTest sometimes failsr   zsslv3 alert bad certificateútlsv1 alert unknown ca)rÌ   )z3bad handshake: SysCallError(10054, 'WSAECONNRESET')z<('Connection aborted.', OSError("(10054, 'WSAECONNRESET')"))z=('Connection aborted.', OSError("(10054, 'WSAECONNRESET')",))z;('Connection aborted.', error("(10054, 'WSAECONNRESET')",))zˆ('Connection aborted.', ConnectionResetError(10054, 'An existing connection was forcibly closed by the remote host', None, 10054, None))zf('Connection aborted.', error(10054, 'An existing connection was forcibly closed by the remote host')))z7('Connection aborted.', OSError("(104, 'ECONNRESET')"))z8('Connection aborted.', OSError("(104, 'ECONNRESET')",))z6('Connection aborted.', error("(104, 'ECONNRESET')",))zN('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))z?('Connection aborted.', error(104, 'Connection reset by peer')))z;('Connection aborted.', BrokenPipeError(32, 'Broken pipe')))zGSSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:)z\('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrÂ   rX   )Ú.0ÚeÚerr_texts     €r<   ú	<genexpr>z'test_tls_client_auth.<locals>.<genexpr>  s   øè ø€ Ò> Q�1˜”=Ñ>ùs   ƒ)5ÚsslÚ	CERT_NONEr   r   r`   ra   Úmock_moduleÚpatchr   rj   r   rp   re   r   r¨   r©   Ú
set_verifyÚ_stdlib_to_openssl_verifyÚverify_modeÚconfigure_trustrª   rE   r\   r]   r«   r¬   r­   ÚIS_PYOPENSSL_SSL_VERSION_1_0ÚCERT_REQUIREDÚpytestÚxfailr®   Úcloser   r“   ÚSSLErrorr   ÚIS_GITHUB_ACTIONS_WORKFLOWÚConnectionErrorÚraisesÚvaluer”   r$   ÚAttributeErrorr�   Ú
isinstanceÚintÚIS_LIBRESSL_BACKENDr   ÚCERT_OPTIONALr   Ú
PY310_PLUSÚany)r¯   Úmockerr^   r›   rb   rn   rq   ru   rg   r¶   r·   r»   Útest_cert_rejectionrk   rl   r°   Úclient_cert_root_caÚclient_certÚcl_pemr±   r²   r³   Úmake_https_requestr´   Úis_req_successfulÚ	issue_237Úexpected_ssl_errorsÚssl_errÚexpected_substringsrÐ   s                                @r<   Útest_tls_client_authrö   8  s%  ø€ ð` 	œ3Ÿ=™=Ñ(Ò@°Ð-@ð ô ,Ô,>Ó?Ñ€Iˆu�dá /™"´W·Z±Z³\ÐØ	×	Ñ	×	!Ñ	!ØÜÐ-Ó.ð 
"ó 
ñ  ð *×4Ñ4ÜÐ$Ó%ó
ˆð  ÷ ð 
×	3Ñ	3×	<Ñ	<Ó	>ð Q?À&Ü/°\ÔBˆÙ%Ø*Ø0ó
ˆð ˜;Ò&Ø"-×"9Ñ"9Ó";ˆKÔØ×Ñ×*Ñ*Ü)¨/Ñ:ÙKõð
 />ˆK×ÑÔ+à
×Ñ˜;×.Ñ.Ô/Ø×&Ñ& {×':Ñ':Ô;á'¨°DÐ(9¸;ÓGˆä!/°×0GÑ0GÓ!HÑˆ	�5˜$ä&×.Ñ.Ü�L‰LØ�y�m 1 T H¨AÐ.à(à.àô	
Ðñ #Ù%Ó'ˆDØ $× 0Ñ 0°CÑ 7Ðá%Ý0Ø  IÒ-Ø#¤s×'8Ñ'8Ò8Ø'¨;Ò6Ù#ä—‘ØJôñ %Ð$Ð$Ø—9‘9 Ò.Ð.Ð.Ø�J‰JŒLØ÷eQ?ð Q?ôn ò 1Ø 	Ñ)ò1à¤3§=¡=Ñ0ð 	ñ
 Ü�L‰LÐ/Ô0ä'×2Ñ2×;Ñ;Ð=ÐÝÕ3Ø¤H×$7Ñ$7×$GÑ$GÐ#IÑIÐÜ�]‰]Ð.Ó/ð 	)°7ÙÓ ×&Ñ&Ô(÷	)ð	Ø—}‘}×)Ñ)¨!Ñ,×3Ñ3×8Ñ8¸Ñ;×@Ñ@ÀÑCˆHô �h¤Ô$Ü˜7Ÿ=™=Ó)ˆHõ #ñ *à)ð
Ðõ
 � L°KÒ$?Ø"=Ðàä×!Ñ!Ü×!Ñ!ðññ
 $Ø# {Ò2àõ$ ñ#õ: /µ8ñ
ðñ?#ÐõJ àð $ñ Ðõ &­*½Øð $ñ Ðô Ó>Ð*=Ô>Ô>Ð>Ñ>÷cQ?ð Q?÷ ñ  ú÷T	)ñ 	)ûô
 ò 	ÝÕ7Ü˜wŸ}™}Ó-‘àò ð	ú÷MQ?ð Q?ús]   Á+OÂ)E)P ÈBP Ê.O ËP Ë=O-Ì
B?P ÏOÏ O*	Ï%P Ï-,PÐP ÐPÐP Ð P)rœ   zGUnclosed TLS resource warnings happen on macOS under Python 3.10 (#508))Úmarksr�   )r»   Úuse_client_certTc                 ón  — t        t        «      \  }}}|j                  j                  dt	        d«      ¬«      5  |j                  t        d«      «      }ddd«       j                  j                  «       5 }t        |¬«      } ||	|
«      }|dk(  r:|j                  «       |_        |j                  j                  t        |   d„ «       n||j                  _        |j                  |j                  «       |j!                  |j                  «        |||f|«      }t        |j"                  «      \  }}}t%        j&                  d|z   d	z   t)        |«      z   d
z   |||r|nd¬«      }t+        j,                  |j.                  j1                  d«      «      }|d   dk(  sJ ‚|d   dk(  sJ ‚dD ]  }||v rŒJ ‚ |dk(  r
	 ddd«       ydD ]  }||v rŒJ ‚ |t2        j4                  k(  s|s
|d   dk(  sEJ ‚|d   dk(  sJ ‚t7        |«      5 }|d   |j9                  «       v sJ ‚	 ddd«       dD ]  }||v rŒJ ‚ ddd«       t:        ry|D ]q  }t=        |j>                  t@        «      sŒt)        |jB                  «      }d|v r&tE        jF                  djI                  d|f«      «       tE        jJ                  |«       Œs | D ]!  \  }}}tM        |tN        jP                  ¬«       Œ# | r.J djI                  | d   d   jR                  | d   d   f«      «       ‚y# 1 sw Y   �Œ¿xY w# 1 sw Y   ŒÿxY w# 1 sw Y   ŒöxY w)z7Test the SSL environment generated by the SSL adapters.r¾   r¹   r¿   NrŸ   r�   c                 ó   — |S rÂ   rX   rÃ   s        r<   rÉ   ztest_ssl_env.<locals>.<lambda>F  rÊ   r=   r¡   r¢   r)   rË   r*   zwsgi.url_schemeÚhttpsÚHTTPSÚon)ÚSSL_VERSION_INTERFACEÚSSL_VERSION_LIBRARY)ÚSSL_PROTOCOLÚ
SSL_CIPHERÚSSL_CLIENT_VERIFYÚNONEÚSUCCESSÚSSL_CLIENT_CERT)ÚSSL_CLIENT_M_VERSIONÚSSL_CLIENT_M_SERIALÚSSL_CLIENT_I_DNÚSSL_CLIENT_S_DNzsocket.socketú
zASometimes this test fails due to a socket.socket ResourceWarning:)Úfilez: r   é   )*r   r   rÔ   rÕ   r   rj   r   rp   re   r   r¨   r©   rÖ   r×   rØ   rÙ   rª   rE   r«   r¬   r�   r3   ÚloadsÚcontentÚdecoderÒ   rÓ   ÚopenÚreadr   r‰   ÚcategoryÚResourceWarningÚmessagerÜ   rÝ   r�   Úfailr2   ÚsysÚstderrr>   )rš   Úrecwarnrë   r¯   r^   r›   rb   r»   rn   rq   ru   rg   rø   rk   rl   r°   rî   rï   r±   r²   Útlswsgiserverr´   r:   ÚkeyÚfÚwarnÚmsgÚ_Útraces                                r<   Útest_ssl_envr   
  s†  € ôT ,Ô,>Ó?Ñ€Iˆu�dà	×	Ñ	×	!Ñ	!ØÜ˜+Ó&ð 
"ó 
ñ 7ð —m‘m¤D¨Ó$5Ó6ˆ÷	7ð 
×	3Ñ	3×	<Ñ	<Ó	>ð ="À&Ü/°\ÔBˆÙ%Ø*Ø0ó
ˆð ˜;Ò&Ø"-×"9Ñ"9Ó";ˆKÔØ×Ñ×*Ñ*Ü)¨/Ñ:ÙKõð
 />ˆK×ÑÔ+à
×Ñ˜;×.Ñ.Ô/Ø×&Ñ& {×':Ñ':Ô;á'¨°DÐ(9¸;ÓGˆä!/°×0GÑ0GÓ!HÑˆ	�5˜$ä�|‰|Ø˜Ñ" SÑ(¬3¨t«9Ñ4°vÑ=Ø(Ø.Ù*‘°ô	
ˆô �j‰j˜Ÿ™×,Ñ,¨WÓ5Ó6ˆð Ð$Ñ%¨Ò0Ð0Ð0Ø�7‰|˜tÒ#Ð#Ð#ð Bò 	ˆCØ˜#’:Ð�:ð	ð ˜;Ò&Ø÷S="ð ="ðV 0ò 	ˆCØ˜#’:Ð�:ð	ð œcŸm™mÒ+±?ØÐ*Ñ+¨vÒ5Ð5Ð5àÐ*Ñ+¨yÒ8Ð8Ð8ä�f“ð : ØÐ,Ñ-°·±³Ñ9Ð9Ñ9÷:ðò "�ð ˜c’zÐ!�zð"÷o="õB ð 	Øò ˆÜ˜$Ÿ-™-¬Ô9Øô �$—,‘,ÓˆØ˜cÑ!Ü�L‰LØ—	‘	ð;àðóôô 	�‰�CÕð'ð. )ò &‰ˆˆ1ˆeÜˆeœ#Ÿ*™*Ö%ð&á ð  $§)¡)à˜aÑ  Ñ#×,Ñ,Ø˜aÑ  Ñ#ð	
ó#ó Ð Ð ÷I7ñ 7ú÷t:ð :ú÷i="ð ="úsH   ºLÁ7D=L+Æ5	L+Ç	L+Ç7L+ÈLÈ!L+È3L+ÌLÌL(	Ì$L+Ì+L4Úip_addrc                 óš  — | j                  |t        f«      }t        |j                  «      \  }}}t	        j
                  t        j                  «      5 }t        j                  j                  |› d|› �«      j                  dd«       ddd«       t        rdn	t        rdnd}|j                  j                  d   v sJ ‚y# 1 sw Y   Œ9xY w)	z:Ensure that connecting over HTTPS to HTTP port is handled.r¢   ÚGETr(   Nzrecord layer failurezwrong version numberzunknown protocoléÿÿÿÿ)Úsendr   r   rE   rÜ   râ   rÒ   rß   ÚhttpÚclientÚHTTPSConnectionrR   r
   r	   rã   r”   )Úhttp_serverr!  rS   rk   rl   r°   rô   Úexpected_substrings           r<   Útest_https_over_http_errorr+  ¢  s¾   € ð ×!Ñ! 7¬NÐ";Ó<€JÜ+¨J×,@Ñ,@ÓAÑ€Iˆu�dÜ	�‰”s—|‘|Ó	$ð ¨Ü�‰×#Ñ#Øˆk˜˜4˜&Ð!ó	
ç
‰'�%˜Ô
÷õ ñ 	õ ñ $àð ð  §¡×!3Ñ!3°BÑ!7Ñ7Ð7Ñ7÷ð ús   Á5CÃC
r!   )ÚrerunsÚreruns_delayc                 óJ  — t         xr |dk(  }|rt        j                  d«       t        rd\  }	}
nEt         rd\  }	}
n9t        rd\  }	}
n-t
        rd\  }	}
n!d\  }	}
t        j                  t        › d�«       t        |¬	«      } |||«      }|d
k(  r|j                  «       |_
        |j                  |j                  «       t        |«      \  }}} |||f|«      }t        |j                  «      \  }}}|}|t        u r dj                  di t!        «       ¤Ž}|d
k(  }|rAt#        j$                  d|›d|›d�| ¬«      }|j&                  dk(  sJ ‚|j(                  dk(  sJ ‚yt        j*                  t"        j,                  j.                  «      5 }t#        j$                  d|›d|›d�| ¬«       ddd«       j0                  j2                  d   j2                  d   }t5        |«      }|j6                  |	k(  sJ  dj                  di t!        «       ¤Ž«       ‚|
|v sJ ‚y# 1 sw Y   ŒoxY w)z:Ensure that connecting over HTTP to HTTPS port is handled.rœ   zTest fails in Travis-CI)éh   úConnection reset by peer)é6   r0  )Nz-Remote end closed connection without response)iF'  z=An existing connection was forcibly closed by the remote host)NNz is unsupportedrŸ   r�   z[{fqdn}]zhttp://r¢   r(   )r¤   i�  zUThe client sent a plain HTTP request, but this server only speaks HTTPS on this port.Nr   r$  z,The underlying error is {underlying_error!r}rX   )r   rÜ   rÝ   r   r   r   Úskipr   r   r¨   r©   rª   r   rE   r   rz   Úlocalsr«   r¬   r­   r®   râ   r“   rá   rã   r”   r�   rÆ   )r¯   r^   r›   rb   r!  rn   rq   ru   Ú	issue_225Úexpected_error_codeÚexpected_error_textr±   r²   rk   rl   r°   r³   ÚfqdnÚ(expect_fallback_response_over_plain_httpr´   rô   Úunderlying_errorrÐ   s                          r<   Útest_http_over_https_errorr:  »  s`  € ô: Ò6˜\¨YÑ6€IÙÜ�‰Ð.Ô/åð4
Ñ0ÐÑ0õ 
ð4
Ñ0ÐÑ0õ 
ð4
Ñ0ÐÑ0õ 
ð4
Ñ0ÐÑ0ð
 4>Ñ0ÐÐ0Ü�‰”|�n OÐ4Ô5ä+°Ô>€OÙ!Ø&Ø,ó€Kð �{Ò"Ø)×5Ñ5Ó7ˆÔà×"Ñ" ;×#6Ñ#6Ô7ä+¨GÓ4Ñ€Iˆu�dÙ# Y°Ð$5°{ÓC€Mä+Ø×ÑóÑ€Iˆu�dð €DØÔ$Ñ$Ø ˆz× Ñ Ñ,¤6£8Ñ,ˆà/;¸{Ñ/JÐ,Ù/Ü�|‰|Ø�d�X˜Q˜t˜h aÐ(Ø(ô
ˆð ×Ñ 3Ò&Ð&Ð&Ø�y‰yð>ò
ð 	
ð 
ð 	ä	�‰”x×*Ñ*×:Ñ:Ó	;ð 
¸wÜ�‰Ø�d�X˜Q˜t˜h aÐ(Ø(õ	
÷
ð —}‘}×)Ñ)¨!Ñ,×1Ñ1°"Ñ5ÐÜÐ#Ó$€HØ×!Ñ!Ð%8Ò8ð Ø=Ð6×=Ñ=ÑIÄÃÑIóÐ8ð  (Ñ*Ð*Ñ*÷
ð 
ús   ÆHÈH"Úencrypted_key)TF)zencrypted-keyzunencrypted-key)ÚidsÚpassword_as_bytes)zwith-bytes-passwordzwith-str-passwordc
                 ó>  — |r|n|}
|	r|j                  d«      n|}t        |¬«      } |||
|¬«      }t         |t        t        f|«      j
                  «      \  }}}t        j                  d|›d|›d�| |¬«      }|j                  dk(  sJ ‚|j                  d	k(  sJ ‚y
)zECheck server decrypts private TLS keys with password as bytes or str.r*   rŸ   ©ÚcertificateÚprivate_keyrY   r¡   r¢   r(   r£   r¦   r§   N)
r5   r   r   r   r   rE   r«   r¬   r­   r®   )r¯   rY   r^   rg   rq   r†   ru   r›   r;  r=  r…   Úkey_passr±   r²   rk   rl   r°   r´   s                     r<   Ú+test_ssl_adapters_with_private_key_passwordrC  $  sÍ   € ñ6 ñ 	4à1ð ñ ð 	×#Ñ# GÔ,à!ð ô ,°Ô>€OÙ!Ø2ØØ%ô€Kô ,ÙÜ¤Ð0Øó	
÷ ‰)ó	Ñ€Iˆu�dô �<‰<Ø
�9�-˜q  ¨Ð*Ø$Ø*ô€Dð ×Ñ˜sÒ"Ð"Ð"Ø�9‰9˜Ò&Ð&Ñ&r=   )rœ   c                 ó¦   — t        |¬«      }t        j                  t        j                  d¬«      5   || |d¬«       ddd«       y# 1 sw Y   yxY w)zZCheck that builtin ssl-adapter initialization fails when wrong private key password given.rŸ   z^\[SSL\] PEM.+©ÚmatchÁ   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxr?  N)r   rÜ   râ   rÒ   rß   )rq   r†   r›   r±   s       r<   Ú,test_builtin_adapter_with_false_key_passwordrH  `  sG   € ô ,°Ô>€OÜ	�‰”s—|‘|Ð+<Ô	=ñ 
ÙØ6ØCØ!*õ	
÷
÷ 
ñ 
ús   ²AÁA)r›   Úfalse_passwordÚexpected_warnz#837550fd-bcb9-4320-87e6-09de6456b09i#z a   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@z'^User-provided password is 2048 bytes.+rE  )zincorrect-passwordzinteger-passwordztoo-long-passwordc                 ó˜  — t        t        t        ft        ¬«      }t	        |¬«      } || ||¬«      }||_        |5  t        j                  t        j                  j                  d¬«      5  |j                  «        ddd«       ddd«       |j                  j                  rJ ‚|j                  rJ ‚y# 1 sw Y   Œ8xY w# 1 sw Y   Œ<xY w)zCCheck that server init fails when wrong private key password given.rD   rŸ   r?  z".+\'(bad decrypt|decode error)\'.+rE  N)r   r   r   r   r   rH   rÜ   râ   ÚOpenSSLÚSSLÚErrorÚpreparer«   Ú_threadsrM   )rq   r†   r›   rI  rJ  rS   r±   r²   s           r<   Ú,test_openssl_adapter_with_false_key_passwordrQ  s  sÃ   € ô8 Ü%¤~Ð6Üô€Jô
 ,°Ô>€OÙ!Ø2Ø?Ø+ô€Kð )€JÔà	ñ œŸ™Ü�‰×Ñð 4ôñ ð 	×ÑÔ÷÷ ð ×"Ñ"×+Ò+Ð+Ð+Ø×ÒÐÐÐ÷ð ú÷ ð ús#   ¼0C Á,B4Á=C Â4B=	Â9C Ã C	)irA   Ú
contextlibr\   Úhttp.clientr&  r3   ÚosrÒ   Ú
subprocessr  rI   rN   r�   rÜ   ÚOpenSSL.SSLrL  r«   r`   Úcryptography.hazmat.backendsr   Ú,cryptography.hazmat.primitives.serializationr   r   r   r   Ú_compatr	   r
   r   r   r   r   r   r   r   r   r   r   Úserverr   r   r   Útestingr   r   r   r   r   Úwsgir   ÚboolÚgetenvrà   Úcheck_outputÚ
IS_WIN2016ÚOPENSSL_VERSIONÚ
startswithrç   rM  ÚSSLeay_versionÚSSLEAY_VERSIONrÚ   Úversion_inforé   ÚPY38_OR_LOWERÚmarkÚfilterwarningsÚ
pytestmarkrÓ   ÚVERIFY_NONErè   ÚVERIFY_PEERrÛ   ÚVERIFY_FAIL_IF_NO_PEER_CERTr×   ÚskipifÚmissing_ipv6r&   rT   ÚfixturerY   r^   rb   rg   rn   rq   ru   r†   r•   rš   Úparametrizerµ   rÝ   rö   Úparamr   r+  Úflakyr:  rC  rH  ÚnullcontextÚwarnsÚUserWarningrQ  rX   r=   r<   ú<module>rv     sc  ðÙ ã Û Û Û Û 	Û 
Û Û 
Û Û Û ã ã Û Û Ý 8÷ó ÷÷ ÷ ó ÷ @Ñ ?÷õ õ ñ " ) "§)¡)Ð,=Ó">Ó?Ð àò à3Ø€z×ÑØóð	ð ð ×)Ñ)×4Ñ4°ZÓ@Ð Ø&Ÿ{™{×9Ñ9Ø‡K�K×Ñó ç�*ˆ_Óð ð ×Ñ˜b˜qÐ! WÑ,€
Ø× Ñ   !Ð$¨Ñ.€áð
 	�‰×"Ñ"ð-ó	
ð
 	�‰×"Ñ"ð-ó	
ð€Jð ‡M�M�7—;‘;×*Ñ*Ø×Ñ�w—{‘{×.Ñ.Ø×Ñ�w—{‘{×.Ñ.Ø‡k�k×-Ñ-ñ.ðÐ ð �{‰{×!Ñ!Ù˜ÓÐð1ð "ó €ô8˜
ô 8ò2ð& €‡��iÔ ñó !ðð
 ‡�ñDó ðDð
 ‡�ñó ðð
 ‡�ñó ðð ‡�ñ*ó ð*ð ‡�ñó ðð ‡�ñó ðð ‡�ñó ðò6ð( ‡�ñ-ó ð-ð* ‡�×ÑØðóñ%'óð%'ðP ‡�×ÑØðóð ‡�×ÑØ.ðó	ð ‡�×ÑØà�‰Ø×ÑØ×Ñðóð ‡�×ÑØÒ�Ø6Øð ó ñp?óóó	óð>p?ðf ‡�×ÑØàˆ�‰ØØ—+‘+×#Ñ#ØÒ'˜Zð+àð	 $ó ô	
ð 	ðóð ‡�×ÑØ*à	�‰˜ÐØ	�‰˜ÐØ	×	Ñ	˜EÐ"Ø	×	Ñ	˜DÐ!Ø	×	Ñ	˜DÐ!ðó	ñ{ó	óð4{ð| ‡�×ÑØàØðóñ8óð8ð$ ‡�×ÑØðóð ‡�×ÑØàØˆ�‰Ð'¨|Ô<ðóð ‡�×Ñ˜!¨!ÐÓ,ñV+ó -óóð V+ðr ‡�×Ñ˜Ð)AÓBØ‡�×ÑØØØ,ð ó ð
 ‡�×ÑØØØ4ð ó ñ-'óóó Cð-'ð` ‡�×ÑØØóñ
ó	ð
ð ‡�×ÑØ7ð Ø1Ø"ˆJ×"Ñ"Ó$ð	
ð
 
�fÐ4˜j×4Ñ4Ó6Ð7àØØˆF�L‰LØØ@ôð	
ðð  	Hð% ó ñ(  ó)ñ(  r=   