§
    JŠtjda  ã                   óÐ   — d dl Z d dlZd dl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lmZmZ d dlmZ d dlmZmZ 	  G d„ de j        ¦  «        Zed	k    r e j        ¦   «          dS dS )
é    N)ÚMockÚpatchÚ	MagicMock)ÚSSLErrorÚSSLEOFErrorÚSSLWantReadErrorÚSSLWantWriteErrorÚHAVE_SSL)Ú_ssl_socketÚ_wrap_sni_socket)ÚWebSocketException)ÚrecvÚsendc                   ó¼   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚSSLEdgeCasesTestc                 óB   — t           s|                      d¦  «         d S d S )NzSSL not available)r
   ÚskipTest)Úselfs    úa/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/websocket/tests/test_ssl_edge_cases.pyÚsetUpzSSLEdgeCasesTest.setUp'   s-   € Ýð 	/Ø�MŠMÐ-Ñ.Ô.Ð.Ð.Ð.ð	/ð 	/ó    c                 ó„  — t          ¦   «         }t          d¦  «        5 }t          ¦   «         }||_        t          j        d¦  «        |j        _        dt          j        i}|  	                    t          j        ¦  «        5  t          ||d¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )z$Test SSL handshake failure scenariosússl.SSLContextzSSL handshake timeoutÚ	cert_reqsúexample.comN)r   r   Úreturn_valueÚsocketÚtimeoutÚwrap_socketÚside_effectÚsslÚCERT_REQUIREDÚassertRaisesr   ©r   Ú	mock_sockÚmock_ssl_contextÚmock_contextÚsslopts        r   Útest_ssl_handshake_failurez+SSLEdgeCasesTest.test_ssl_handshake_failure+   s6  € å‘F”Fˆ	õ Ð#Ñ$Ô$ð 
	>Ð(8Ý™6œ6ˆLØ,8ÐÔ)Ý39´>Ø'ñ4ô 4ˆLÔ$Ô0ð "¥3Ô#4Ð5ˆFà×"Ò"¥6¤>Ñ2Ô2ð >ð >Ý˜I v¨}Ñ=Ô=Ð=ð>ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >ð
	>ð 
	>ð 
	>ñ 
	>ô 
	>ð 
	>ð 
	>ð 
	>ð 
	>ð 
	>ð 
	>ð 
	>øøøð 
	>ð 
	>ð 
	>ð 
	>ð 
	>ð 
	>ó6   žA!B5Á?BÂB5ÂB!	Â!B5Â$B!	Â%B5Â5B9Â<B9c                 ó†  — t          ¦   «         }t          d¦  «        5 }t          ¦   «         }||_        t          j        d¦  «        |j        _        t          j        ddœ}|                      t          j        ¦  «        5  t          ||d¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )z;Test various SSL certificate verification failure scenariosr   zCertificate verification failedT©r   Úcheck_hostnamezbadssl.exampleN©
r   r   r   r!   ÚSSLCertVerificationErrorr   r    r"   r#   r   r$   s        r   Ú*test_ssl_certificate_verification_failuresz;SSLEdgeCasesTest.test_ssl_certificate_verification_failures<   s`  € å‘F”Fˆ	õ Ð#Ñ$Ô$ð 
	AÐ(8Ý™6œ6ˆLØ,8ÐÔ)Ý36Ô3OØ1ñ4ô 4ˆLÔ$Ô0õ $'Ô#4ÈÐMÐMˆFà×"Ò"¥3Ô#?Ñ@Ô@ð Að AÝ˜I vÐ/?Ñ@Ô@Ð@ðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að Að
	Að 
	Að 
	Añ 
	Aô 
	Að 
	Að 
	Að 
	Að 
	Að 
	Að 
	Að 
	Aøøøð 
	Að 
	Að 
	Að 
	Að 
	Að 
	Aó6   žA"B6Â BÂB6ÂB"	Â"B6Â%B"	Â&B6Â6B:Â=B:c                 ó(  — t          ¦   «         }t          d¦  «        5 }t          ¦   «         }t          ¦   «         |j        _        ||_        d|i}t	          ||d¦  «         |j                             ¦   «          ddd¦  «         dS # 1 swxY w Y   dS )z6Test SSL context configuration with various edge casesr   Úcontextr   N)r   r   r   r   r   Úassert_called_once)r   r%   r&   Úexisting_contextr(   s        r   Ú)test_ssl_context_configuration_edge_casesz:SSLEdgeCasesTest.test_ssl_context_configuration_edge_casesM   s×   € å‘F”Fˆ	õ Ð#Ñ$Ô$ð 	>Ð(8Ý#™vœvÐÝ8<¹¼ÐÔ(Ô5Ø,<ÐÔ)àÐ!1Ð2ˆFõ ˜	 6¨=Ñ9Ô9Ð9ð Ô(×;Ò;Ñ=Ô=Ð=ð	>ð 	>ð 	>ñ 	>ô 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>øøøð 	>ð 	>ð 	>ð 	>ð 	>ð 	>s   žABÂBÂBc           	      ó.  — t          ¦   «         }t          j        dddi¦  «        5  t          dd¬¦  «        5  t          dd¬¦  «        5  t          d¦  «        5 }t          ¦   «         }||_        t          ¦   «         |j        _        i }t          ||d	¦  «         |j                             ¦   «          d
d
d
¦  «         n# 1 swxY w Y   d
d
d
¦  «         n# 1 swxY w Y   d
d
d
¦  «         n# 1 swxY w Y   d
d
d
¦  «         n# 1 swxY w Y   t          j        dddi¦  «        5  t          dd¬¦  «        5  t          dd¬¦  «        5  t          d¦  «        5 }t          ¦   «         }||_        t          ¦   «         |j        _        i }t          ||d	¦  «         |j                             d
d¬¦  «         d
d
d
¦  «         n# 1 swxY w Y   d
d
d
¦  «         n# 1 swxY w Y   d
d
d
¦  «         n# 1 swxY w Y   d
d
d
¦  «         d
S # 1 swxY w Y   d
S )z.Test CA bundle environment variable edge casesú
os.environÚWEBSOCKET_CLIENT_CA_BUNDLEz/nonexistent/ca-bundle.crtzos.path.isfileF)r   zos.path.isdirr   r   Nz/etc/ssl/certsT)ÚcafileÚcapath)	r   r   Údictr   r   r   Úload_verify_locationsÚassert_not_calledÚassert_called_withr$   s        r   Ú)test_ssl_ca_bundle_environment_edge_casesz:SSLEdgeCasesTest.test_ssl_ca_bundle_environment_edge_cases_   sZ  € å‘F”Fˆ	õ ŒZØÐ7Ð9UÐVñ
ô 
ð 	Oð 	Oõ Ð'°eÐ<Ñ<Ô<ð Oð OÝ˜?¸Ð?Ñ?Ô?ð 
Oð 
OÝÐ/Ñ0Ô0ð 	OÐ4DÝ'+¡v¤v˜Ø8DÐ(Ô5Ý@DÁÄ˜Ô0Ô=à!#˜Ý# I¨v°}ÑEÔEÐEð %Ô:×LÒLÑNÔNÐNð	Oð 	Oð 	Oñ 	Oô 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oøøøð 	Oð 	Oð 	Oð 	Oð
Oð 
Oð 
Oñ 
Oô 
Oð 
Oð 
Oð 
Oð 
Oð 
Oð 
Oøøøð 
Oð 
Oð 
Oð 
OðOð Oð Oñ Oô Oð Oð Oð Oð Oð Oð Oøøøð Oð Oð Oð Oð	Oð 	Oð 	Oñ 	Oô 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oøøøð 	Oð 	Oð 	Oð 	Oõ" ŒZ˜Ð'CÐEUÐ&VÑWÔWð 	ð 	ÝÐ'°eÐ<Ñ<Ô<ð ð Ý˜?¸Ð>Ñ>Ô>ð ð ÝÐ/Ñ0Ô0ð Ð4DÝ'+¡v¤v˜Ø8DÐ(Ô5Ý@DÁÄ˜Ô0Ô=à!#˜Ý# I¨v°}ÑEÔEÐEð %Ô:×MÒMØ#'Ð0@ð Nñ ô ð ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	sü   ¦D¸C.Á
CÁAC 	Â4CÃ CÃCÃCÃCÃC.ÃCÃC.ÃCÃC.Ã"DÃ.C2	Ã2DÃ5C2	Ã6DÄD	ÄD	Ä'H
Ä9G2ÅGÅAG	Æ8GÇGÇGÇGÇGÇG2ÇGÇG2Ç"GÇ#G2Ç&H
Ç2G6	Ç6H
Ç9G6	Ç:H
È
HÈHc                 ó–  — t          ¦   «         }t          d¦  «        5 }t          ¦   «         }||_        t          j        d¦  «        |j        _        t          ¦   «         |j        _        ddi}|                      t          ¦  «        5  t          ||d¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )z(Test SSL cipher configuration edge casesr   zNo cipher can be selectedÚciphersÚINVALID_CIPHERr   N)r   r   r   r!   r   Úset_ciphersr    r   r#   r   r   r$   s        r   Ú(test_ssl_cipher_configuration_edge_casesz9SSLEdgeCasesTest.test_ssl_cipher_configuration_edge_cases…   sB  € å‘F”Fˆ	õ Ð#Ñ$Ô$ð 	>Ð(8Ý™6œ6ˆLØ,8ÐÔ)Ý36´<Ø+ñ4ô 4ˆLÔ$Ô0õ 59±F´FˆLÔ$Ô1àÐ!1Ð2ˆFà×"Ò"Õ#5Ñ6Ô6ð >ð >Ý˜I v¨}Ñ=Ô=Ð=ð>ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >ð	>ð 	>ð 	>ñ 	>ô 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>øøøð 	>ð 	>ð 	>ð 	>ð 	>ð 	>s6   žA*B>ÂB&ÂB>Â&B*	Â*B>Â-B*	Â.B>Â>CÃCc                 óŒ  — t          ¦   «         }t          d¦  «        5 }t          ¦   «         }||_        t          d¦  «        |j        _        t          ¦   «         |j        _        ddi}|                      t          ¦  «        5  t          ||d¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )z(Test ECDH curve configuration edge casesr   zunknown curve nameÚ
ecdh_curveÚinvalid_curver   N)
r   r   r   Ú
ValueErrorÚset_ecdh_curver    r   r#   r   r   r$   s        r   Útest_ssl_ecdh_curve_edge_casesz/SSLEdgeCasesTest.test_ssl_ecdh_curve_edge_cases—   s9  € å‘F”Fˆ	õ Ð#Ñ$Ô$ð 		>Ð(8Ý™6œ6ˆLØ,8ÐÔ)Ý6@ÐAUÑ6VÔ6VˆLÔ'Ô3Ý48±F´FˆLÔ$Ô1à" OÐ4ˆFà×"Ò"Õ#5Ñ6Ô6ð >ð >Ý˜I v¨}Ñ=Ô=Ð=ð>ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >ð		>ð 		>ð 		>ñ 		>ô 		>ð 		>ð 		>ð 		>ð 		>ð 		>ð 		>ð 		>øøøð 		>ð 		>ð 		>ð 		>ð 		>ð 		>ó6   žA%B9ÂB!ÂB9Â!B%	Â%B9Â(B%	Â)B9Â9B=Ã B=c                 óŒ  — t          ¦   «         }t          d¦  «        5 }t          ¦   «         }||_        t          d¦  «        |j        _        t          ¦   «         |j        _        ddi}|                      t          ¦  «        5  t          ||d¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )z0Test client certificate configuration edge casesr   zNo such fileÚcertfilez/nonexistent/client.crtr   N)
r   r   r   ÚFileNotFoundErrorÚload_cert_chainr    r   r#   r   r   r$   s        r   Ú&test_ssl_client_certificate_edge_casesz7SSLEdgeCasesTest.test_ssl_client_certificate_edge_cases§   s9  € å‘F”Fˆ	õ Ð#Ñ$Ô$ð 		>Ð(8Ý™6œ6ˆLØ,8ÐÔ)Ý7HÈÑ7XÔ7XˆLÔ(Ô4Ý48±F´FˆLÔ$Ô1à Ð";Ð<ˆFà×"Ò"Õ#5Ñ6Ô6ð >ð >Ý˜I v¨}Ñ=Ô=Ð=ð>ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >ð		>ð 		>ð 		>ñ 		>ô 		>ð 		>ð 		>ð 		>ð 		>ð 		>ð 		>ð 		>øøøð 		>ð 		>ð 		>ð 		>ð 		>ð 		>rL   c                 óà  ‡— t          ¦   «         }dgŠˆfd„}||j        _        d|j        _        t          d¦  «        5 }t          ¦   «         }||_        dg|j        _        t          |d¦  «        }|                      |d¦  «         |                      ‰d         d¦  «         |j         	                    ¦   «          |j         	                    ¦   «          d	d	d	¦  «         d	S # 1 swxY w Y   d	S )
z)Test SSL want read/write retry edge casesr   c                 óz   •— ‰dxx         dz  cc<   ‰d         dk    rt          d¦  «        ‚‰d         dk    rdS dS )Nr   é   úThe operation did not completeé   ó   data after retriesr   ©r   )ÚbufsizeÚread_attemptss    €r   Ú	mock_recvzMSSLEdgeCasesTest.test_ssl_want_read_write_retry_edge_cases.<locals>.mock_recv¾   sY   ø€ Ø˜!ÐÐÔ Ñ!ÐÐÑØ˜QÔ 1Ò$Ð$Ý&Ð'GÑHÔHÐHØ˜qÔ! QÒ&Ð&Ø,Ð,à�sr   ç      >@úselectors.DefaultSelectorTéd   rW   rV   N)
r   r   r    Ú
gettimeoutr   r   ÚselectÚassertEqualÚregisterÚassert_called)r   r%   r[   Úmock_selector_classÚmock_selectorÚresultrZ   s         @r   Ú)test_ssl_want_read_write_retry_edge_casesz:SSLEdgeCasesTest.test_ssl_want_read_write_retry_edge_cases·   s@  ø€ å‘F”Fˆ	ð ˜ˆð	ð 	ð 	ð 	ð 	ð &/ˆ	ŒÔ"Ø,0ˆ	ÔÔ)åÐ.Ñ/Ô/ð 	1Ð3FÝ ™FœFˆMØ/<ÐÔ,Ø15°ˆMÔ Ô-å˜) SÑ)Ô)ˆFà×Ò˜VÐ%:Ñ;Ô;Ð;Ø×Ò˜]¨1Ô-¨qÑ1Ô1Ð1àÔ"×0Ò0Ñ2Ô2Ð2ØÔ ×.Ò.Ñ0Ô0Ð0ð	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1s   ¿BC#Ã#C'Ã*C'c                 ó|  ‡— t          ¦   «         }dgŠˆfd„}||j        _        d|j        _        t          d¦  «        5 }t          ¦   «         }||_        dg|j        _        t          |d¦  «        }|                      |d¦  «         |                      ‰d         d¦  «         d	d	d	¦  «         d	S # 1 swxY w Y   d	S )
z$Test SSL want write retry edge casesr   c                 ó”   •— ‰dxx         dz  cc<   ‰d         dk    rt          d¦  «        ‚‰d         dk    rt          | ¦  «        S dS )Nr   rT   rU   rV   )r	   Úlen)ÚdataÚwrite_attemptss    €r   Ú	mock_sendzHSSLEdgeCasesTest.test_ssl_want_write_retry_edge_cases.<locals>.mock_sendÞ   s_   ø€ Ø˜1ÐÐÔ Ñ"ÐÐÑØ˜aÔ  AÒ%Ð%Ý'Ð(HÑIÔIÐIØ Ô" aÒ'Ð'Ý˜4‘y”yÐ à�qr   r\   r]   Tó	   test dataé	   rV   N)r   r   r    r_   r   r   r`   ra   )r   r%   rm   rd   re   rf   rl   s         @r   Ú$test_ssl_want_write_retry_edge_casesz5SSLEdgeCasesTest.test_ssl_want_write_retry_edge_cases×   s  ø€ å‘F”Fˆ	ð ˜ˆð	ð 	ð 	ð 	ð 	ð &/ˆ	ŒÔ"Ø,0ˆ	ÔÔ)åÐ.Ñ/Ô/ð 	3Ð3FÝ ™FœFˆMØ/<ÐÔ,Ø15°ˆMÔ Ô-å˜) \Ñ2Ô2ˆFà×Ò˜V QÑ'Ô'Ð'Ø×Ò˜^¨AÔ.°Ñ2Ô2Ð2ð	3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3øøøð 	3ð 	3ð 	3ð 	3ð 	3ð 	3s   ¿A%B1Â1B5Â8B5c                 óô   — t          ¦   «         }t          d¦  «        |j        _        d|j        _        ddlm} |                      |¦  «        5  t          |d¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zTest SSL EOF error edge caseszSSL connection has been closedr\   r   ©Ú"WebSocketConnectionClosedExceptionrn   N)	r   r   r   r    r_   r   Úwebsocket._exceptionsrs   r#   ©r   r%   rs   s      r   Útest_ssl_eof_error_edge_casesz.SSLEdgeCasesTest.test_ssl_eof_error_edge_casesô   sÆ   € å‘F”Fˆ	õ &1Ð1QÑ%RÔ%Rˆ	ŒÔ"Ø,0ˆ	ÔÔ)àLÐLÐLÐLÐLÐLà×ÒÐAÑBÔBð 	*ð 	*Ý�˜LÑ)Ô)Ð)ð	*ð 	*ð 	*ñ 	*ô 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*øøøð 	*ð 	*ð 	*ð 	*ð 	*ð 	*s   ÁA-Á-A1Á4A1c                 ól  — ddl m} ddlm} t	          ¦   «         }d|j        _        t	          |¬¦  «        }t	          ¦   «         |_        ||j        _         ||d¦  «        }|                     |t	          ¦   «         ¦  «        }|  	                    ||g¦  «         |j         
                    ¦   «          dS )zTest SSL pending data scenariosr   )ÚSSLDispatcher)ÚWebSocketAppé   )Úspecg      @N)Úwebsocket._dispatcherrx   Úwebsocket._appry   r   Úpendingr   Úsockr`   ra   r4   )r   rx   ry   Úmock_ssl_sockÚmock_appÚ
dispatcherrf   s          r   Ú test_ssl_pending_data_edge_casesz1SSLEdgeCasesTest.test_ssl_pending_data_edge_cases  sÄ   € à7Ð7Ð7Ð7Ð7Ð7Ø/Ð/Ð/Ð/Ð/Ð/õ ™œˆØ-1ˆÔÔ*õ ˜\Ð*Ñ*Ô*ˆÝ™œˆŒØ*ˆŒÔà"�] 8¨SÑ1Ô1ˆ
ð ×"Ò" =µ$±&´&Ñ9Ô9ˆð 	×Ò˜ - Ñ1Ô1Ð1ØÔ×0Ò0Ñ2Ô2Ð2Ð2Ð2r   c                 ón  ‡— t          ¦   «         }dŠˆfd„}||j        _        d|j        _        t          d¦  «        5 }t          ¦   «         }||_        dg|j        _        t          |d¦  «        }|                      |d¦  «         |                      ‰d¦  «         d	d	d	¦  «         d	S # 1 swxY w Y   d	S )
z Test SSL renegotiation scenariosr   c                 ó<   •— ‰dz  Š‰dk    rt          d¦  «        ‚dS )NrT   zSSL renegotiation requiredó   data after renegotiationrX   )rY   Ú
call_counts    €r   r[   zESSLEdgeCasesTest.test_ssl_renegotiation_edge_cases.<locals>.mock_recv  s*   ø€ à˜!‰OˆJØ˜QŠˆÝ&Ð'CÑDÔDÐDØ.Ð.r   r\   r]   Tr^   r†   rV   N)r   r   r    r_   r   r   r`   ra   )r   r%   r[   rd   re   rf   r‡   s         @r   Ú!test_ssl_renegotiation_edge_casesz2SSLEdgeCasesTest.test_ssl_renegotiation_edge_cases  s  ø€ å‘F”Fˆ	ð ˆ
ð	/ð 	/ð 	/ð 	/ð 	/ð &/ˆ	ŒÔ"Ø,0ˆ	ÔÔ)åÐ.Ñ/Ô/ð 	,Ð3FÝ ™FœFˆMØ/<ÐÔ,Ø15°ˆMÔ Ô-å˜) SÑ)Ô)ˆFà×Ò˜VÐ%@ÑAÔAÐAØ×Ò˜Z¨Ñ+Ô+Ð+ð	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,øøøð 	,ð 	,ð 	,ð 	,ð 	,ð 	,s   ¾AB*Â*B.Â1B.c                 ó2  — t          ¦   «         }t          d¦  «        5 }t          ¦   «         }||_        t          ¦   «         |j        _        ddi}t	          ||d¦  «         |j                             |ddd¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z+Test SSL server hostname override scenariosr   Úserver_hostnamezoverride.example.comzoriginal.example.comT©Údo_handshake_on_connectÚsuppress_ragged_eofsrŠ   N©r   r   r   r   r   r?   r$   s        r   Ú!test_ssl_server_hostname_overridez2SSLEdgeCasesTest.test_ssl_server_hostname_override3  së   € å‘F”Fˆ	åÐ#Ñ$Ô$ð 	Ð(8Ý™6œ6ˆLØ,8ÐÔ)Ý48±F´FˆLÔ$Ô1ð (Ð)?Ð@ˆFÝ˜	 6Ð+AÑBÔBÐBð Ô$×7Ò7ØØ(,Ø%)Ø 6ð	 8ñ ô ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   žA!BÂBÂBc                 ór  — t          ¦   «         }t          d¦  «        5 }t          ¦   «         }||_        t          ¦   «         |j        _        t	          t
          d¦  «        r>dt
          j        i}t          ||d¦  «         |                     t
          j        ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z$Test SSL protocol version edge casesr   ÚPROTOCOL_TLSÚssl_versionr   N)	r   r   r   r   Úhasattrr!   r‘   r   r?   r$   s        r   Ú$test_ssl_protocol_version_edge_casesz5SSLEdgeCasesTest.test_ssl_protocol_version_edge_casesH  sý   € å‘F”Fˆ	õ Ð#Ñ$Ô$ð 
	FÐ(8Ý™6œ6ˆLØ,8ÐÔ)Ý48±F´FˆLÔ$Ô1õ •s˜NÑ+Ô+ð FØ'­Ô)9Ð:�Ý˜I v¨}Ñ=Ô=Ð=à ×3Ò3µCÔ4DÑEÔEÐEð
	Fð 
	Fð 
	Fñ 
	Fô 
	Fð 
	Fð 
	Fð 
	Fð 
	Fð 
	Fð 
	Fð 
	Føøøð 
	Fð 
	Fð 
	Fð 
	Fð 
	Fð 
	Fs   žBB,Â,B0Â3B0c                 ó†  — t          ¦   «         }t          j        dddi¦  «        5  t          d¦  «        5 }t          ¦   «         }||_        t          ¦   «         |j        _        i }t          ||d¦  «         |                      |j        d¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )z-Test SSL keylog file configuration edge casesr8   ÚSSLKEYLOGFILEz/tmp/ssl_keys.logr   r   N)r   r   r<   r   r   r   ra   Úkeylog_filenamer$   s        r   Útest_ssl_keylog_file_edge_casesz0SSLEdgeCasesTest.test_ssl_keylog_file_edge_casesY  sc  € å‘F”Fˆ	õ ŒZ˜ Ð8KÐ&LÑMÔMð 
	Tð 
	TÝÐ'Ñ(Ô(ð 	TÐ,<Ý#™vœv�Ø0<Ð Ô-Ý8<¹¼�Ô(Ô5à�Ý˜I v¨}Ñ=Ô=Ð=ð × Ò  Ô!=Ð?RÑSÔSÐSð	Tð 	Tð 	Tñ 	Tô 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tøøøð 	Tð 	Tð 	Tð 	Tð
	Tð 
	Tð 
	Tñ 
	Tô 
	Tð 
	Tð 
	Tð 
	Tð 
	Tð 
	Tð 
	Tð 
	Tøøøð 
	Tð 
	Tð 
	Tð 
	Tð 
	Tð 
	Ts5   ¦B6¶ABÂB6ÂB"	Â"B6Â%B"	Â&B6Â6B:Â=B:c                 ón  — t          ¦   «         }t          j        dt          j        dft          j        dt          j        dft          j        dt          j        dfg}|D ]Ö\  }}}}|                      ||¬¦  «        5  t          d¦  «        5 }t          ¦   «         }||_        t          ¦   «         |j        _        ||dœ}	t          ||	d¦  «         |  	                    |j
        |¦  «         |  	                    |j        |¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   Œ×dS )z1Test different SSL verification mode combinationsFTr,   r   r   N)r   r!   Ú	CERT_NONEr"   ÚsubTestr   r   r   r   ra   Úverify_moder-   )
r   r%   Ú
test_casesr   r-   Úexpected_verifyÚexpected_checkr&   r'   r(   s
             r   Ú#test_ssl_context_verification_modesz4SSLEdgeCasesTest.test_ssl_context_verification_modesj  sÓ  € å‘F”Fˆ	õ Œ]˜E¥3¤=°%Ð8ÝÔ ¥sÔ'8¸%Ð@ÝÔ ¥cÔ&7¸Ð>ð	
ˆ
ð KUð 	Rð 	RÑFˆI�~ ¸Ø—’¨	À.�ÑQÔQð 
Rð 
RÝÐ+Ñ,Ô,ð 	RÐ0@Ý#'¡6¤6�LØ4@Ð$Ô1Ý<@¹F¼F�LÔ,Ô9à+4ÈÐWÐW�FÝ 	¨6°=ÑAÔAÐAà×$Ò$ \Ô%=¸ÑOÔOÐOØ×$Ò$ \Ô%@À.ÑQÔQÐQð	Rð 	Rð 	Rñ 	Rô 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Røøøð 	Rð 	Rð 	Rð 	Rð
Rð 
Rð 
Rñ 
Rô 
Rð 
Rð 
Rð 
Rð 
Rð 
Rð 
Røøøð 
Rð 
Rð 
Rð 
Røð	Rð 	Rs7   Á<D)ÂA:DÄD)ÄDÄD)ÄDÄD)Ä)D-	Ä0D-	c                 ó  — ddl m} t          ¦   «         }t          d¦  «        |j        _         |¦   «         }||_        d|_        	 |                     ¦   «          dS # t          $ r |  	                    d¦  «         Y dS w xY w)z#Test SSL socket shutdown edge casesr   )Ú	WebSocketzSSL shutdown failedTz/SSL shutdown error should be handled gracefullyN)
Úwebsocket._corer¢   r   r   Úshutdownr    r   Ú	connectedÚcloseÚfail)r   r¢   r€   Úwss       r   Ú#test_ssl_socket_shutdown_edge_casesz4SSLEdgeCasesTest.test_ssl_socket_shutdown_edge_cases‚  sœ   € à-Ð-Ð-Ð-Ð-Ð-å™œˆÝ-5Ð6KÑ-LÔ-LˆÔÔ*àˆY‰[Œ[ˆØˆŒØˆŒð	IØ�HŠH‰JŒJˆJˆJˆJøÝð 	Ið 	Ið 	IØ�IŠIÐGÑHÔHÐHÐHÐHÐHð	Iøøøs   ÁA ÁB Á?B c                 ó  — t          ¦   «         }t          d¦  «        |j        _        d|j        _        ddlm} |                      t          |f¦  «        5  t          |d¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z6Test SSL socket being closed during ongoing operationsz+SSL connection has been closed unexpectedlyr\   r   rr   r^   N)	r   r   r   r    r_   r   rt   rs   r#   ru   s      r   Ú&test_ssl_socket_close_during_operationz7SSLEdgeCasesTest.test_ssl_socket_close_during_operation“  sÓ   € å‘F”Fˆ	õ &.Ø9ñ&
ô &
ˆ	ŒÔ"ð -1ˆ	ÔÔ)àLÐLÐLÐLÐLÐLð ×Ò¥Ð*LÐMÑNÔNð 	!ð 	!Ý�˜CÑ Ô Ð ð	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!ð 	!ð 	!s   ÁA4Á4A8Á;A8c                 ó  — t          ¦   «         }t          d¦  «        5 }t          ¦   «         }||_        t          ¦   «         |j        _        ddi}	 t	          ||d¦  «         n# t
          $ r Y nw xY wddd¦  «         dS # 1 swxY w Y   dS )z-Test SSL compression configuration edge casesr   ÚcompressionFr   N)r   r   r   r   r   ÚAttributeErrorr$   s        r   Útest_ssl_compression_edge_casesz0SSLEdgeCasesTest.test_ssl_compression_edge_cases£  sã   € å‘F”Fˆ	åÐ#Ñ$Ô$ð 	Ð(8Ý™6œ6ˆLØ,8ÐÔ)Ý48±F´FˆLÔ$Ô1ð $ UÐ+ˆFðÝ˜I v¨}Ñ=Ô=Ð=Ð=øå!ð ð ð à�ðøøøð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s5   ž2B ÁA#Á"B Á#
A0Á-B Á/A0Á0B Â BÂBc                 ó8  — t          ¦   «         }t          d¦  «        5 }t          ¦   «         }||_        t          ¦   «         }||j        _        d|_        d|_        t          |i d¦  «        }|                      |¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z Test SSL session reuse scenariosr   Úmock_sessionTr   N)r   r   r   r   ÚsessionÚsession_reusedr   ÚassertIsNotNone)r   r%   r&   r'   r€   rf   s         r   Ú!test_ssl_session_reuse_edge_casesz2SSLEdgeCasesTest.test_ssl_session_reuse_edge_cases¶  sÛ   € å‘F”Fˆ	åÐ#Ñ$Ô$ð 	)Ð(8Ý™6œ6ˆLØ,8ÐÔ)Ý ™FœFˆMØ4AˆLÔ$Ô1ð %3ˆMÔ!Ø+/ˆMÔ(å  ¨B°Ñ>Ô>ˆFð × Ò  Ñ(Ô(Ð(ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)ð 	)ð 	)s   žA$BÂBÂBc                 ó$  — t          ¦   «         }t          d¦  «        5 }t          ¦   «         }||_        t          ¦   «         |j        _        dddgi}t	          ||d¦  «        }|                      |¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zATest SSL ALPN (Application Layer Protocol Negotiation) edge casesr   Úalpn_protocolszhttp/1.1Úh2r   N)r   r   r   r   r   r´   )r   r%   r&   r'   r(   rf   s         r   Ú!test_ssl_alpn_protocol_edge_casesz2SSLEdgeCasesTest.test_ssl_alpn_protocol_edge_casesÉ  sÕ   € å‘F”Fˆ	åÐ#Ñ$Ô$ð 	)Ð(8Ý™6œ6ˆLØ,8ÐÔ)Ý48±F´FˆLÔ$Ô1ð '¨°TÐ(:Ð;ˆFõ ! ¨F°MÑBÔBˆFØ× Ò  Ñ(Ô(Ð(ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)ð 	)ð 	)s   žABÂB	ÂB	c                 ó.  — t          ¦   «         }t          d¦  «        5 }t          ¦   «         }||_        t          ¦   «         |j        _        d}t	          |i |¦  «         |j                             |dd|¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z0Test SSL SNI (Server Name Indication) edge casesr   z2001:db8::1Tr‹   NrŽ   )r   r%   r&   r'   Úipv6_hostnames        r   Útest_ssl_sni_edge_casesz(SSLEdgeCasesTest.test_ssl_sni_edge_casesÛ  sæ   € å‘F”Fˆ	õ Ð#Ñ$Ô$ð 	Ð(8Ý™6œ6ˆLØ,8ÐÔ)Ý48±F´FˆLÔ$Ô1ð *ˆMÝ˜	 2 }Ñ5Ô5Ð5ð Ô$×7Ò7ØØ(,Ø%)Ø -ð	 8ñ ô ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   žAB
Â
BÂBc                 óö   ‡— t          ¦   «         Šd„ }|‰j        _        d‰j        _        ddlm}  |ˆfd„d¬¦  «        }|                     d¦  «        }|                      t          |¦  «        d¦  «         d	S )
z'Test SSL buffer size related edge casesc                 óR   — | dk    rt          d¦  «        ‚dt          | d¦  «        z  S )Né @  z"[SSL: BAD_LENGTH] buffer too largeó   Arz   )r   Úmin)rY   s    r   r[   zCSSLEdgeCasesTest.test_ssl_buffer_size_edge_cases.<locals>.mock_recvõ  s/   € à˜ŠˆÝÐCÑDÔDÐDØ�#˜g tÑ,Ô,Ñ,Ð,r   r\   r   )Úframe_bufferc                 ó$   •— t          ‰| ¦  «        S )N)r   )Úsizer%   s    €r   ú<lambda>zBSSLEdgeCasesTest.test_ssl_buffer_size_edge_cases.<locals>.<lambda>  s   ø€ ¥t¨I°tÑ'<Ô'<€ r   T)Úskip_utf8_validationr¿   N)
r   r   r    r_   r   Úwebsocket._abnfrÂ   Úrecv_strictÚassertGreaterrj   )r   r[   rÂ   Úfbrf   r%   s        @r   Útest_ssl_buffer_size_edge_casesz0SSLEdgeCasesTest.test_ssl_buffer_size_edge_casesñ  sš   ø€ å‘F”Fˆ	ð	-ð 	-ð 	-ð &/ˆ	ŒÔ"Ø,0ˆ	ÔÔ)à0Ð0Ð0Ð0Ð0Ð0ð ˆ\Ð<Ð<Ð<Ð<ÐSWÐXÑXÔXˆð —’ Ñ&Ô&ˆà×Ò�3˜v™;œ;¨Ñ*Ô*Ð*Ð*Ð*r   c                 ó„  — t          ¦   «         }t          d¦  «        5 }t          ¦   «         }||_        t          j        d¦  «        |j        _        dt          j        i}|                      t          j        ¦  «        5  t          ||d¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )z&Test SSL protocol downgrade protectionr   ÚSSLV3_ALERT_HANDSHAKE_FAILUREr’   r   N)
r   r   r   r!   r   r   r    ÚPROTOCOL_TLS_CLIENTr#   r   r$   s        r   Ú&test_ssl_protocol_downgrade_protectionz7SSLEdgeCasesTest.test_ssl_protocol_downgrade_protection  s6  € å‘F”Fˆ	åÐ#Ñ$Ô$ð 	>Ð(8Ý™6œ6ˆLØ,8ÐÔ)Ý36´<Ø/ñ4ô 4ˆLÔ$Ô0ð $¥SÔ%<Ð=ˆFð ×"Ò"¥3¤<Ñ0Ô0ð >ð >Ý˜I v¨}Ñ=Ô=Ð=ð>ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >ð	>ð 	>ð 	>ñ 	>ô 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>øøøð 	>ð 	>ð 	>ð 	>ð 	>ð 	>r*   c                 ó†  — t          ¦   «         }t          d¦  «        5 }t          ¦   «         }||_        t          j        d¦  «        |j        _        t          j        ddœ}|                      t          j        ¦  «        5  t          ||d¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )z0Test SSL certificate chain validation edge casesr   z2certificate verify failed: certificate has expiredTr,   zexpired.badssl.comNr.   r$   s        r   Ú%test_ssl_certificate_chain_validationz6SSLEdgeCasesTest.test_ssl_certificate_chain_validation  s`  € å‘F”Fˆ	åÐ#Ñ$Ô$ð 	EÐ(8Ý™6œ6ˆLØ,8ÐÔ)õ 47Ô3OØDñ4ô 4ˆLÔ$Ô0õ $'Ô#4ÈÐMÐMˆFà×"Ò"¥3Ô#?Ñ@Ô@ð Eð EÝ˜I vÐ/CÑDÔDÐDðEð Eð Eñ Eô Eð Eð Eð Eð Eð Eð Eøøøð Eð Eð Eð Eð	Eð 	Eð 	Eñ 	Eô 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eøøøð 	Eð 	Eð 	Eð 	Eð 	Eð 	Er1   c                 óp  — t          ¦   «         }t          d¦  «        5 }t          ¦   «         }||_        t          j        d¦  «        |j        _        ddi}|                      t          j        ¦  «        5  t          ||d¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )z(Test SSL weak cipher rejection scenariosr   zno shared cipherrB   zRC4-MD5r   N)	r   r   r   r!   r   r   r    r#   r   r$   s        r   Útest_ssl_weak_cipher_rejectionz/SSLEdgeCasesTest.test_ssl_weak_cipher_rejection+  s-  € å‘F”Fˆ	åÐ#Ñ$Ô$ð 		>Ð(8Ý™6œ6ˆLØ,8ÐÔ)Ý36´<Ð@RÑ3SÔ3SˆLÔ$Ô0à Ð+ˆFð ×"Ò"¥3¤<Ñ0Ô0ð >ð >Ý˜I v¨}Ñ=Ô=Ð=ð>ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >ð		>ð 		>ð 		>ñ 		>ô 		>ð 		>ð 		>ð 		>ð 		>ð 		>ð 		>ð 		>øøøð 		>ð 		>ð 		>ð 		>ð 		>ð 		>s6   žAB+Á5BÂB+ÂB	ÂB+ÂB	ÂB+Â+B/Â2B/c           
      ó¼  — t          ¦   «         }g d¢}|D �]E\  }}|                      ||¬¦  «        5  t          d¦  «        5 }t          ¦   «         }||_        ||k    r�d|v r}t	          j        d|› d|› d�¦  «        |j        _        t          j        dd	œ}|  	                    t          j        ¦  «        5  t          |||¦  «         d
d
d
¦  «         n# 1 swxY w Y   nMt          ¦   «         |j        _        t          j        dd	œ}t          |||¦  «        }|                      |¦  «         d
d
d
¦  «         n# 1 swxY w Y   d
d
d
¦  «         n# 1 swxY w Y   �ŒGd
S )z)Test SSL hostname verification edge cases))ú*.example.comzsubdomain.example.com)rÕ   zsub.subdomain.example.com)r   zwww.example.com)ÚcertÚhostnamer   zsub.subdomainz
hostname 'z' doesn't match 'ú'Tr,   N)r   r›   r   r   r!   r/   r   r    r"   r#   r   r´   )	r   r%   r�   Úcert_hostnameÚconnect_hostnamer&   r'   r(   rf   s	            r   Ú)test_ssl_hostname_verification_edge_casesz:SSLEdgeCasesTest.test_ssl_hostname_verification_edge_cases:  sg  € å‘F”Fˆ	ð
ð 
ð 
ˆ
ð 0:ð 	5ñ 	5Ñ+ˆMÐ+Ø—’ =Ð;K�ÑLÔLð 5ð 5ÝÐ+Ñ,Ô,ð 5Ð0@Ý#'¡6¤6�LØ4@Ð$Ô1ð &Ð)9Ò9Ð9Ø+Ð/?Ð?Ð?õ @CÔ?[Ø\Ð)9Ð\Ð\ÈMÐ\Ð\Ð\ñ@ô @˜Ô0Ô<õ
 *-Ô):Ø.2ð"ð "˜ð
 "×.Ò.­sÔ/KÑLÔLð Mð MÝ'¨	°6Ð;KÑLÔLÐLðMð Mð Mñ Mô Mð Mð Mð Mð Mð Mð Møøøð Mð Mð Mð Møõ AEÁÄ˜Ô0Ô=å),Ô):Ø.2ð"ð "˜õ "-¨Y¸Ð@PÑ!QÔ!Q˜Ø×,Ò,¨VÑ4Ô4Ð4ð;5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5ð5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5ùð	5ð 	5s[   ²EÁA3D8Â5C	ÃD8ÃCÃD8ÃCÃAD8Ä,EÄ8D<Ä<EÄ?D<Å EÅE	ÅE	c                 ó¨  — t          ¦   «         }	 ddl}t          |d¦  «        r�t          d¦  «        5 }t          ¦   «         }||_        t          ¦   «         |j        _        t          |i d¦  «         |j                             ¦   «          ddd¦  «         dS # 1 swxY w Y   dS dS # t          t          f$ r |  
                    d¦  «         Y dS w xY w)zTest SSL memory BIO edge casesr   NÚ	MemoryBIOr   r   zSSL MemoryBIO not available)r   r!   r“   r   r   r   r   r4   ÚImportErrorr®   r   )r   r%   r!   r&   r'   s        r   Útest_ssl_memory_bio_edge_casesz/SSLEdgeCasesTest.test_ssl_memory_bio_edge_casesf  sF  € å‘F”Fˆ	ð	9ØˆJˆJˆJå�s˜KÑ(Ô(ð 
BÝÐ+Ñ,Ô,ð 	BÐ0@Ý#'¡6¤6�LØ4@Ð$Ô1Ý<@¹F¼F�LÔ,Ô9õ   	¨2¨}Ñ=Ô=Ð=ð !Ô,×?Ò?ÑAÔAÐAð	Bð 	Bð 	Bñ 	Bô 	Bð 	Bð 	Bð 	Bð 	Bð 	Bð 	Bð 	Bøøøð 	Bð 	Bð 	Bð 	Bð 	Bð 	Bð
Bð 
Bøõ �^Ð,ð 	9ð 	9ð 	9Ø�MŠMÐ7Ñ8Ô8Ð8Ð8Ð8Ð8ð	9øøøs5   �#B' ³ABÂB' ÂBÂB' ÂBÂ B' Â'&CÃCN) Ú__name__Ú
__module__Ú__qualname__r   r)   r0   r6   r@   rE   rK   rQ   rg   rp   rv   rƒ   rˆ   r�   r”   r˜   r    r©   r«   r¯   rµ   r¹   r¼   rË   rÏ   rÑ   rÓ   rÛ   rß   © r   r   r   r   %   sÜ  € € € € € ð/ð /ð /ð>ð >ð >ð"Að Að Að">ð >ð >ð$$ð $ð $ðL>ð >ð >ð$>ð >ð >ð >ð >ð >ð 1ð 1ð 1ð@3ð 3ð 3ð:*ð *ð *ð3ð 3ð 3ð.,ð ,ð ,ð6ð ð ð*Fð Fð Fð"Tð Tð Tð"Rð Rð Rð0Ið Ið Ið"!ð !ð !ð ð ð ð&)ð )ð )ð&)ð )ð )ð$ð ð ð,+ð +ð +ð.>ð >ð >ð"Eð Eð Eð$>ð >ð >ð*5ð *5ð *5ðX9ð 9ð 9ð 9ð 9r   r   Ú__main__)Úunittestr   r!   Úunittest.mockr   r   r   Úwebsocket._ssl_compatr   r   r   r	   r
   Úwebsocket._httpr   r   rt   r   Úwebsocket._socketr   r   ÚTestCaser   rà   Úmainrã   r   r   ú<module>rì      s)  ðà €€€Ø €€€Ø 
€
€
€
Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0ðð ð ð ð ð ð ð ð ð ð ð ð ð ð :Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (ðð&U	9ð U	9ð U	9ð U	9ð U	9�xÔ(ñ U	9ô U	9ð U	9ðp ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   