Ë
    `Qbjda  ã                   óÒ   — 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 j0                  «        yy)
é    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y)ÚSSLEdgeCasesTestc                 ó4   — t         s| j                  d«       y y )NzSSL not available)r
   ÚskipTest)Úselfs    úV/var/www/html/venv/lib/python3.12/site-packages/websocket/tests/test_ssl_edge_cases.pyÚsetUpzSSLEdgeCasesTest.setUp'   s   € ÝØ�M‰MÐ-Õ.ð ó    c                 óh  — t        «       }t        d«      5 }t        «       }||_        t        j                  d«      |j
                  _        dt        j                  i}| j                  t        j                  «      5  t        ||d«       ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)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+   s    € ä“Fˆ	ô Ð#Ó$ð 
	>Ð(8Ü›6ˆLØ,8ÐÔ)Ü39·>±>Ø'ó4ˆL×$Ñ$Ô0ð "¤3×#4Ñ#4Ð5ˆFà×"Ñ"¤6§>¡>Ó2ñ >Ü˜I v¨}Ô=÷>÷
	>ð 
	>÷>ð >ú÷
	>ð 
	>úó$   –A'B(Á=BÂB(ÂB%	Â!B(Â(B1c                 ój  — t        «       }t        d«      5 }t        «       }||_        t        j                  d«      |j
                  _        t        j                  ddœ}| j                  t        j                  «      5  t        ||d«       ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)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ˆ	ô Ð#Ó$ð 
	AÐ(8Ü›6ˆLØ,8ÐÔ)Ü36×3OÑ3OØ1ó4ˆL×$Ñ$Ô0ô $'×#4Ñ#4ÈÑMˆFà×"Ñ"¤3×#?Ñ#?Ó@ñ AÜ˜I vÐ/?Ô@÷A÷
	Að 
	A÷Að Aú÷
	Að 
	Aúó$   –A(B)Á>BÂB)ÂB&	Â"B)Â)B2c                 ó  — t        «       }t        d«      5 }t        «       }t        «       |j                  _        ||_        d|i}t	        ||d«       |j                  j                  «        ddd«       y# 1 sw Y   yxY w)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ˆ	ô Ð#Ó$ð 	>Ð(8Ü#›vÐÜ8<»Ð×(Ñ(Ô5Ø,<ÐÔ)àÐ!1Ð2ˆFô ˜	 6¨=Ô9ð ×(Ñ(×;Ñ;Ô=÷	>÷ 	>ñ 	>ús   –AA5Á5A>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                  j                  «        d
d
d
«       d
d
d
«       d
d
d
«       d
d
d
«       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                  j                  d
d¬«       d
d
d
«       d
d
d
«       d
d
d
«       d
d
d
«       y
# 1 sw Y   ŒÙxY w# 1 sw Y   ŒÝxY w# 1 sw Y   ŒáxY w# 1 sw Y   ŒåxY w# 1 sw Y   ŒRxY w# 1 sw Y   ŒVxY w# 1 sw Y   ŒZxY w# 1 sw Y   y
xY w)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_   sÓ  € ä“Fˆ	ô �Z‰ZØÐ7Ð9UÐVó
ñ 	Oô Ð'°eÔ<ñ OÜ˜?¸Ô?ñ 
OÜÐ/Ó0ð 	OÐ4DÜ'+£v˜Ø8DÐ(Ô5Ü@DÃ˜×0Ñ0Ô=à!#˜Ü# I¨v°}ÔEð %×:Ñ:×LÑLÔN÷	O÷
O÷O÷	Oô" �Z‰Z˜Ð'CÐEUÐ&VÓWñ 	ÜÐ'°eÔ<ñ Ü˜?¸Ô>ñ ÜÐ/Ó0ð Ð4DÜ'+£v˜Ø8DÐ(Ô5Ü@DÃ˜×0Ñ0Ô=à!#˜Ü# I¨v°}ÔEð %×:Ñ:×MÑMØ#'Ð0@ð Nô ÷÷÷÷	ð 	÷	Oð 	Oú÷
Oð 
Oú÷Oð Oú÷	Oð 	Oú÷(ð ú÷ð ú÷ð ú÷	ð 	ús§   £F±F¿FÁAE7	ÂFÂ'FÂ/FÃGÃ%F?Ã3F3Ã?AF'	ÅF3ÅF?Å&GÅ7F Å<FÆFÆFÆF	ÆFÆF$Æ'F0Æ,F3Æ3F<Æ8F?Æ?G	ÇGÇGc                 ój  — t        «       }t        d«      5 }t        «       }||_        t        j                  d«      |j
                  _        t        «       |j                  _        ddi}| j                  t        «      5  t        ||d«       ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)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…   s¨   € ä“Fˆ	ô Ð#Ó$ð 	>Ð(8Ü›6ˆLØ,8ÐÔ)Ü36·<±<Ø+ó4ˆL×$Ñ$Ô0ô 59³FˆL×$Ñ$Ô1àÐ!1Ð2ˆFà×"Ñ"Ô#5Ó6ñ >Ü˜I v¨}Ô=÷>÷	>ð 	>÷>ð >ú÷	>ð 	>úr1   c                 óV  — t        «       }t        d«      5 }t        «       }||_        t        d«      |j                  _        t        «       |j                  _        ddi}| j                  t        «      5  t        ||d«       ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)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—   sŸ   € ä“Fˆ	ô Ð#Ó$ð 		>Ð(8Ü›6ˆLØ,8ÐÔ)Ü6@ÐAUÓ6VˆL×'Ñ'Ô3Ü48³FˆL×$Ñ$Ô1à" OÐ4ˆFà×"Ñ"Ô#5Ó6ñ >Ü˜I v¨}Ô=÷>÷		>ð 		>÷>ð >ú÷		>ð 		>úó$   –ABÁ4BÂBÂB	ÂBÂB(c                 óV  — t        «       }t        d«      5 }t        «       }||_        t        d«      |j                  _        t        «       |j                  _        ddi}| j                  t        «      5  t        ||d«       ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)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§   sŸ   € ä“Fˆ	ô Ð#Ó$ð 		>Ð(8Ü›6ˆLØ,8ÐÔ)Ü7HÈÓ7XˆL×(Ñ(Ô4Ü48³FˆL×$Ñ$Ô1à Ð";Ð<ˆFà×"Ñ"Ô#5Ó6ñ >Ü˜I v¨}Ô=÷>÷		>ð 		>÷>ð >ú÷		>ð 		>úrL   c                 óÂ  ‡— t        «       }dgŠˆfd„}||j                  _        d|j                  _        t        d«      5 }t        «       }||_        dg|j                  _        t        |d«      }| j                  |d«       | j                  ‰d   d«       |j                  j                  «        |j                  j                  «        d	d	d	«       y	# 1 sw Y   y	xY w)
z)Test SSL want read/write retry edge casesr   c                 óX   •— ‰dxx   dz  cc<   ‰d   dk(  rt        d«      ‚‰d   dk(  ryy)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¾   s?   ø€ Ø˜!Ó Ñ!ÓØ˜QÑ 1Ò$Ü&Ð'GÓHÐHØ˜qÑ! QÒ&Ø,àr   ç      >@ú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ˆ	ð ˜ˆô	ð &/ˆ	�‰Ô"Ø,0ˆ	×ÑÔ)äÐ.Ó/ð 	1Ð3FÜ ›FˆMØ/<ÐÔ,Ø15°ˆM× Ñ Ô-ä˜) SÓ)ˆFà×Ñ˜VÐ%:Ô;Ø×Ñ˜]¨1Ñ-¨qÔ1à×"Ñ"×0Ñ0Ô2Ø× Ñ ×.Ñ.Ô0÷	1÷ 	1ñ 	1ús   ÁBCÃCc                 óZ  ‡— t        «       }dgŠˆfd„}||j                  _        d|j                  _        t        d«      5 }t        «       }||_        dg|j                  _        t        |d«      }| j                  |d«       | j                  ‰d   d«       d	d	d	«       y	# 1 sw Y   y	xY w)
z$Test SSL want write retry edge casesr   c                 ól   •— ‰dxx   dz  cc<   ‰d   dk(  rt        d«      ‚‰d   dk(  rt        | «      S y)Nr   rT   rU   rV   )r	   Úlen)ÚdataÚwrite_attemptss    €r   Ú	mock_sendzHSSLEdgeCasesTest.test_ssl_want_write_retry_edge_cases.<locals>.mock_sendÞ   sF   ø€ Ø˜1Ó Ñ"ÓØ˜aÑ  AÒ%Ü'Ð(HÓIÐIØ Ñ" aÒ'Ü˜4“yÐ àr   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ˆ	ð ˜ˆô	ð &/ˆ	�‰Ô"Ø,0ˆ	×ÑÔ)äÐ.Ó/ð 	3Ð3FÜ ›FˆMØ/<ÐÔ,Ø15°ˆM× Ñ Ô-ä˜) \Ó2ˆFà×Ñ˜V QÔ'Ø×Ñ˜^¨AÑ.°Ô2÷	3÷ 	3ñ 	3ús   ÁAB!Â!B*c                 óÞ   — t        «       }t        d«      |j                  _        d|j                  _        ddlm} | j                  |«      5  t        |d«       ddd«       y# 1 sw Y   yxY w)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ˆ	ô &1Ð1QÓ%Rˆ	�‰Ô"Ø,0ˆ	×ÑÔ)åLà×ÑÐAÓBñ 	*Ü�˜LÔ)÷	*÷ 	*ñ 	*ús   ÁA#Á#A,c                 óJ  — ddl m} ddlm} t	        «       }d|j
                  _        t	        |¬«      }t	        «       |_        ||j                  _         ||d«      }|j                  |t	        «       «      }| j                  ||g«       |j
                  j                  «        y)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Ý/ô ›ˆØ-1ˆ×ÑÔ*ô ˜\Ô*ˆÜ›ˆŒØ*ˆ�‰Ôá" 8¨SÓ1ˆ
ð ×"Ñ" =´$³&Ó9ˆð 	×Ñ˜ - Ô1Ø×Ñ×0Ñ0Õ2r   c                 óR  ‡— t        «       }dŠˆfd„}||j                  _        d|j                  _        t        d«      5 }t        «       }||_        dg|j                  _        t        |d«      }| j                  |d«       | j                  ‰d«       d	d	d	«       y	# 1 sw Y   y	xY w)
z Test SSL renegotiation scenariosr   c                 ó0   •— ‰dz  Š‰dk(  rt        d«      ‚y)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Ø.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ˆ	ð ˆ
ô	/ð &/ˆ	�‰Ô"Ø,0ˆ	×ÑÔ)äÐ.Ó/ð 	,Ð3FÜ ›FˆMØ/<ÐÔ,Ø15°ˆM× Ñ Ô-ä˜) SÓ)ˆFà×Ñ˜VÐ%@ÔAØ×Ñ˜Z¨Ô+÷	,÷ 	,ñ 	,ús   Á ABÂB&c                 ó  — t        «       }t        d«      5 }t        «       }||_        t        «       |j                  _        ddi}t	        ||d«       |j                  j                  |ddd¬«       ddd«       y# 1 sw Y   yxY w)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ˆ	äÐ#Ó$ð 	Ð(8Ü›6ˆLØ,8ÐÔ)Ü48³FˆL×$Ñ$Ô1ð (Ð)?Ð@ˆFÜ˜	 6Ð+AÔBð ×$Ñ$×7Ñ7ØØ(,Ø%)Ø 6ð	 8ô ÷	÷ 	ñ 	ús   –AA:Á:Bc                 óH  — t        «       }t        d«      5 }t        «       }||_        t        «       |j                  _        t	        t
        d«      r>dt
        j                  i}t        ||d«       |j                  t
        j                  «       ddd«       y# 1 sw Y   yxY w)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Ð(8Ü›6ˆLØ,8ÐÔ)Ü48³FˆL×$Ñ$Ô1ô ”s˜NÔ+Ø'¬×)9Ñ)9Ð:�Ü˜I v¨}Ô=à ×3Ñ3´C×4DÑ4DÔE÷
	F÷ 
	Fñ 
	Fús   –A9BÂB!c                 ó\  — t        «       }t        j                  dddi«      5  t        d«      5 }t        «       }||_        t        «       |j                  _        i }t        ||d«       | j                  |j                  d«       ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)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  s­   € ä“Fˆ	ô �Z‰Z˜ Ð8KÐ&LÓMñ 
	TÜÐ'Ó(ð 	TÐ,<Ü#›v�Ø0<Ð Ô-Ü8<»�×(Ñ(Ô5à�Ü˜I v¨}Ô=ð × Ñ  ×!=Ñ!=Ð?RÔS÷	T÷
	Tð 
	T÷	Tð 	Tú÷
	Tð 
	Tús#   £B"¯ABÂB"ÂB	ÂB"Â"B+c                 ór  — t        «       }t        j                  dt        j                  dft        j                  dt        j                  dft        j                  dt        j                  dfg}|D ]«  \  }}}}| j	                  ||¬«      5  t        d«      5 }t        «       }||_        t        «       |j                  _        ||dœ}	t        ||	d«       | j                  |j                  |«       | j                  |j                  |«       ddd«       ddd«       Œ­ y# 1 sw Y   ŒxY w# 1 sw Y   ŒÄxY w)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ˆ	ô �]‰]˜E¤3§=¡=°%Ð8Ü×Ñ ¤s×'8Ñ'8¸%Ð@Ü×Ñ ¤c×&7Ñ&7¸Ð>ð	
ˆ
ð KUò 	RÑFˆI�~ ¸Ø—‘¨	À.�ÓQñ 
RÜÐ+Ó,ð 	RÐ0@Ü#'£6�LØ4@Ð$Ô1Ü<@»F�L×,Ñ,Ô9à+4ÈÑW�FÜ 	¨6°=ÔAà×$Ñ$ \×%=Ñ%=¸ÔOØ×$Ñ$ \×%@Ñ%@À.ÔQ÷	R÷
Rð 
Rñ	R÷	Rð 	Rú÷
Rð 
Rús%   ÂD-ÂA5D!ÄD-Ä!D*Ä&D-Ä-D6	c                 óä   — ddl m} t        «       }t        d«      |j                  _         |«       }||_        d|_        	 |j                  «        y# t        $ r | j                  d«       Y y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‚  sb   € å-ä›ˆÜ-5Ð6KÓ-Lˆ×ÑÔ*á‹[ˆØˆŒØˆŒð	IØ�H‰H�JøÜò 	IØ�I‰IÐGÖHð	Iús   ÁA ÁA/Á.A/c                 óê   — t        «       }t        d«      |j                  _        d|j                  _        ddlm} | j                  t        |f«      5  t        |d«       ddd«       y# 1 sw Y   yxY w)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“  sg   € ä“Fˆ	ô &.Ø9ó&
ˆ	�‰Ô"ð -1ˆ	×ÑÔ)åLð ×Ñ¤Ð*LÐMÓNñ 	!Ü�˜CÔ ÷	!÷ 	!ñ 	!ús   ÁA)Á)A2c                 óî   — t        «       }t        d«      5 }t        «       }||_        t        «       |j                  _        ddi}	 t	        ||d«       ddd«       y# t
        $ r Y Œw xY w# 1 sw Y   yxY w)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ˆ	äÐ#Ó$ð 	Ð(8Ü›6ˆLØ,8ÐÔ)Ü48³FˆL×$Ñ$Ô1ð $ UÐ+ˆFðÜ˜I v¨}Ô=÷	ð 	øô "ò áðú÷	ð 	ús)   –/A+ÁAÁ	A(Á%A+Á'A(Á(A+Á+A4c                 ó  — t        «       }t        d«      5 }t        «       }||_        t        «       }||j                  _        d|_        d|_        t        |i d«      }| j                  |«       ddd«       y# 1 sw Y   yxY w)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ˆ	äÐ#Ó$ð 	)Ð(8Ü›6ˆLØ,8ÐÔ)Ü ›FˆMØ4AˆL×$Ñ$Ô1ð %3ˆMÔ!Ø+/ˆMÔ(ä  ¨B°Ó>ˆFð × Ñ  Ô(÷	)÷ 	)ñ 	)úó   –AA8Á8Bc                 óô   — t        «       }t        d«      5 }t        «       }||_        t        «       |j                  _        dddgi}t	        ||d«      }| j                  |«       ddd«       y# 1 sw Y   yxY w)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É  sy   € ä“Fˆ	äÐ#Ó$ð 	)Ð(8Ü›6ˆLØ,8ÐÔ)Ü48³FˆL×$Ñ$Ô1ð '¨°TÐ(:Ð;ˆFô ! ¨F°MÓBˆFØ× Ñ  Ô(÷	)÷ 	)ñ 	)ús   –AA.Á.A7c                 ó  — t        «       }t        d«      5 }t        «       }||_        t        «       |j                  _        d}t	        |i |«       |j                  j                  |dd|¬«       ddd«       y# 1 sw Y   yxY w)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ˆ	ô Ð#Ó$ð 	Ð(8Ü›6ˆLØ,8ÐÔ)Ü48³FˆL×$Ñ$Ô1ð *ˆMÜ˜	 2 }Ô5ð ×$Ñ$×7Ñ7ØØ(,Ø%)Ø -ð	 8ô ÷	÷ 	ñ 	úr¶   c                 óâ   ‡— t        «       Šd„ }|‰j                  _        d‰j                  _        ddlm}  |ˆfd„d¬«      }|j                  d«      }| j                  t        |«      d«       y	)
z'Test SSL buffer size related edge casesc                 ó@   — | dkD  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Øœ#˜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ñ  sb   ø€ ä“Fˆ	ò	-ð &/ˆ	�‰Ô"Ø,0ˆ	×ÑÔ)å0ñ Ó<ÐSWÔXˆð —‘ Ó&ˆà×Ñœ3˜v›;¨Õ*r   c                 óh  — t        «       }t        d«      5 }t        «       }||_        t        j                  d«      |j
                  _        dt        j                  i}| j                  t        j                  «      5  t        ||d«       ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)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  s    € ä“Fˆ	äÐ#Ó$ð 	>Ð(8Ü›6ˆLØ,8ÐÔ)Ü36·<±<Ø/ó4ˆL×$Ñ$Ô0ð $¤S×%<Ñ%<Ð=ˆFð ×"Ñ"¤3§<¡<Ó0ñ >Ü˜I v¨}Ô=÷>÷	>ð 	>÷>ð >ú÷	>ð 	>úr*   c                 ój  — t        «       }t        d«      5 }t        «       }||_        t        j                  d«      |j
                  _        t        j                  ddœ}| j                  t        j                  «      5  t        ||d«       ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)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ˆ	äÐ#Ó$ð 	EÐ(8Ü›6ˆLØ,8ÐÔ)ô 47×3OÑ3OØDó4ˆL×$Ñ$Ô0ô $'×#4Ñ#4ÈÑMˆFà×"Ñ"¤3×#?Ñ#?Ó@ñ EÜ˜I vÐ/CÔD÷E÷	Eð 	E÷Eð Eú÷	Eð 	Eúr1   c                 óL  — t        «       }t        d«      5 }t        «       }||_        t        j                  d«      |j
                  _        ddi}| j                  t        j                  «      5  t        ||d«       ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)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ˆ	äÐ#Ó$ð 		>Ð(8Ü›6ˆLØ,8ÐÔ)Ü36·<±<Ð@RÓ3SˆL×$Ñ$Ô0à Ð+ˆFð ×"Ñ"¤3§<¡<Ó0ñ >Ü˜I v¨}Ô=÷>÷		>ð 		>÷>ð >ú÷		>ð 		>ús$   –ABÁ/BÁ=BÂB	ÂBÂB#c           
      ó’  — t        «       }g d¢}|D �]  \  }}| j                  ||¬«      5  t        d«      5 }t        «       }||_        ||k7  rxd|v rtt	        j
                  d|› d|› d�«      |j                  _        t        j                  dd	œ}| j                  t        j
                  «      5  t        |||«       d
d
d
«       nJt        «       |j                  _        t        j                  dd	œ}t        |||«      }| j                  |«       d
d
d
«       d
d
d
«       �Œ y
# 1 sw Y   ŒxY w# 1 sw Y   Œ!xY w# 1 sw Y   �Œ5xY w)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:  sh  € ä“Fˆ	ò
ˆ
ð 0:ó 	5Ñ+ˆMÐ+Ø—‘ =Ð;K�ÓLñ 5ÜÐ+Ó,ð 5Ð0@Ü#'£6�LØ4@Ð$Ô1ð &Ð)9Ò9Ø+Ð/?Ñ?ô @C×?[Ñ?[Ø(Ð)9Ð(:Ð:KÈMÈ?ÐZ[Ð\ó@˜×0Ñ0Ô<ô
 *-×):Ñ):Ø.2ñ"˜ð
 "×.Ñ.¬s×/KÑ/KÓLñ MÜ'¨	°6Ð;KÔL÷Mð Mô AEÃ˜×0Ñ0Ô=ä),×):Ñ):Ø.2ñ"˜ô "-¨Y¸Ð@PÓ!Q˜Ø×,Ñ,¨VÔ4÷;5÷5ñ 5ñ	5÷(Mð Mú÷%5ð 5ú÷5ñ 5ús<   «D<·A8D0Â/D$	Â=AD0ÄD<Ä$D-Ä)D0Ä0D9Ä5D<Ä<E	c                 ój  — t        «       }	 ddl}t        |d«      rft        d«      5 }t        «       }||_        t        «       |j
                  _        t        |i d«       |j
                  j                  «        ddd«       yy# 1 sw Y   yxY w# t        t        f$ r | j                  d«       Y y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  s¯   € ä“Fˆ	ð	9Ûä�s˜KÔ(ÜÐ+Ó,ð 	BÐ0@Ü#'£6�LØ4@Ð$Ô1Ü<@»F�L×,Ñ,Ô9ô   	¨2¨}Ô=ð !×,Ñ,×?Ñ?ÔA÷	Bð 	Bð )÷	Bð 	Bûô œ^Ð,ò 	9Ø�M‰MÐ7Ö8ð	9ús/   ŒB §ABÁ9B ÂBÂB ÂB Â B2Â1B2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ò">ò$$òL>ò$>ò >ò 1ò@3ò:*ò3ò.,ò6ò*Fò"Tò"Rò0Iò"!ò ò&)ò&)ò$ò,+ò.>ò"Eò$>ò*5óX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÷õ ÷ :Ý 4ß (ðô&U	9�x×(Ñ(ô U	9ðp ˆzÒØ€H‡M�M…Oð r   