o
    �õ±jÙ  ã                   @   s>   d dl Z d dlZd dlZd dlZd dlmZ G dd„ dƒZdS )é    N)ÚCertificatec                   @   s`   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zedd„ ƒZdS )Ú
SSLWrapperc                 C   sd   d | _ d | _d | _d | _d | _d | _d | _d | _d | _d| _	d | _
d | _d | _d | _d | _d | _d S )Né
   )ÚcommsÚtransport_inÚtransport_outÚssl_ctxÚ	transportÚssl_in_buffÚssl_out_buffÚssl_objÚhandshake_done_evtÚhandshake_timeoutÚ_SSLWrapper__ssl_in_qÚstop_evtÚserver_certificateÚ_SSLWrapper__enc_taskÚ_SSLWrapper__dec_taskÚ_SSLWrapper__process_task©Úself© r   úŒ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asysocks/utils/sslwrapper.pyÚ__init__   s    
zSSLWrapper.__init__c              
   Ã   s˜   �z7| j d ur| j  ¡  | jd ur| j ¡  | jd ur | j ¡  | jd ur6| j d¡ | j ¡ I d H  W d S W d S  tyK } zW Y d }~d S d }~ww )Nó    )	r   Úcancelr   r   r	   r   Ú
put_nowaitÚ
disconnectÚ	Exception)r   Úer   r   r   r      s    €






þ€ÿzSSLWrapper.disconnectc              
   Ã   sf   �z| j d u r
W d S t | j ¡}|d d d  ¡ dd … W S  ty2 } z|W  Y d }~S d }~ww )NÚtbs_certificateÚsubject_public_key_infoÚ
public_keyé   )r   r   ÚloadÚdumpr   )r   Úcertr   r   r   r   Úget_server_pubkey-   s   €
€ÿzSSLWrapper.get_server_pubkeyc                 C   s   | j d ur| j S d S )N)r   r   r   r   r   Úget_server_cert6   s   
ÿzSSLWrapper.get_server_certc              
   Ã   sà   �zXt  ¡ | _t  ¡ | _t  ¡ | _t ¡ | _t ¡ | _	| j
j| j| j	dd d�| _|  ¡ I d H \}}|d ur7|‚| jjdd�| _t  |  ¡ ¡| _t  |  ¡ ¡| _t  |  ¡ ¡| _W dS  tyo } z
d |fW  Y d }~S d }~ww )NF)Úserver_sideÚserver_hostnameT)Úbinary_form©TN)ÚasyncioÚEventr   r   ÚQueuer   ÚsslÚ	MemoryBIOr
   r   r   Úwrap_bior   Ú_SSLWrapper__do_handshakeÚgetpeercertr   Úcreate_taskÚ_SSLWrapper__encrypt_ssl_recr   Ú_SSLWrapper__decrypt_ssl_recr   Ú_SSLWrapper__read_ssl_recordr   r   )r   Ú_Úerrr   r   r   r   Úsetup:   s(   €




€ÿzSSLWrapper.setupc              
   Ã   s  �z[	 zJ| j j ¡ I d H }|dkr| j j d ¡I d H  W W d S | j |¡ 	 z| j ¡ }|dkr2W n| j |¡I d H  W n t	yJ } z|‚d }~ww q&W n t	y[ } z|‚d }~ww q t
jyg   Y d S  t	y€ } zt d| ¡ W Y d }~d S d }~ww )NTr   z__encrypt_ssl_rec %s)r   Úin_queueÚgetÚputr   Úwriter   Úreadr   r   r-   ÚCancelledErrorÚloggingÚdebug)r   Úraw_dataÚenc_datar   r   r   r   Ú__encrypt_ssl_recN   s@   €
€ÿú€ÿð€ÿzSSLWrapper.__encrypt_ssl_recc              
   Ã   s(  �zn| j  ¡ sm| j ¡ I dH }|dkr"| jj |df¡I dH  W dS | j |¡ d}| j  ¡ sUz	|| j	 
¡ 7 }W n tjyB   Y n tyO } z|‚d}~ww | j  ¡ r/|dkre| jj |df¡I dH  | j  ¡ rW dS W dS  tjyz   Y dS  ty“ } zt d| ¡ W Y d}~dS d}~ww )z{
		Decrypting the encrypted SSL records from the internal queue and putting them in the queue for the uppr layers to use
		Nr   z__decrypt_ssl_rec %s)r   Úis_setr   r=   r   Ú	out_queuer>   r
   r?   r   r@   r0   ÚSSLWantReadErrorr   r-   rA   rB   rC   )r   Ússl_dataÚ	data_buffr   r   r   r   Ú__decrypt_ssl_rech   s8   €

€ÿ
ûî€ÿzSSLWrapper.__decrypt_ssl_recc              
   Ã   sH  �zu	 d}d }| j  ¡ st|d u r"t|ƒdkr"tj|dd… ddd�}|d urHt|ƒ|d krH| j |d |d … ¡I d H  ||d d … }d }q| j ¡ I d H \}}|d urX|‚|dkrh| j d¡I d H  W d S ||7 }| j  ¡ rW d S W d S  t	j
y�   Y d S  ty£ } zt d| ¡ | j d¡I d H  W Y d }~d S d }~ww )	Nr   é   é   r#   ÚbigF)Ú	byteorderÚsignedz__read_ssl_record %s)r   rG   ÚlenÚintÚ
from_bytesr   r>   r   r=   r-   rA   r   rB   rC   )r   ÚbufferÚlengthÚdatar:   r   r   r   r   Ú__read_ssl_record†   s8   €
ï €þzSSLWrapper.__read_ssl_recordc              
   Ã   sø   �z]d}| j  ¡ sW|d7 }z| j ¡  W nA tjyR   	 | j ¡ }|dkr0| j 	|¡I d H  nnq| j
 ¡ I d H \}}|d urB|‚|dkrJtdƒ‚| j |¡ Y q   ‚ 	 | j ¡  W dS  ty{ } zt d| ¡ d |fW  Y d }~S d }~ww )Nr   é   Tr   zServer closed the connection!r,   z__do_handshake %s)r   rG   r   Údo_handshaker0   rI   r   r@   r   r>   r   r=   r   r
   r?   r   ÚsetrB   rC   )r   ÚctrÚclient_helloÚserver_hellor:   r   r   r   r   Ú__do_handshake«   s>   €

ú	
€þzSSLWrapper.__do_handshakec              
   Ã   s¨   �z<t ƒ }||_||_| |_| j|_| jd ur| j|_nt ¡ |_d|j_tj	|j_
| ¡ I d H \}}|d ur9|‚|d fW S  tyS } z
d |fW  Y d }~S d }~ww )NF)r   r   r   r   r   r   r0   Úcreate_default_contextÚcheck_hostnameÚ	CERT_NONEÚverify_moder;   r   )r   r   r   Útunnelr9   r:   r   r   r   r   Úfrom_commsettings×   s(   €




€ÿzSSLWrapper.from_commsettingsN)Ú__name__Ú
__module__Ú__qualname__r   r   r'   r(   r;   r6   r7   r8   r3   Ústaticmethodre   r   r   r   r   r   
   s    	%,r   )r-   Ú	tracebackrB   r0   Úasn1crypto.x509r   r   r   r   r   r   Ú<module>   s    