o
    �õ±jñ  ã                   @   sJ   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 G dd„ dƒZdS )é    N)Útls)Ú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 )ÚMBEDTLSWrapperc                 C   sX   d | _ d | _d | _d | _d | _d | _d | _d| _d | _d | _	d | _
d | _d | _d | _d S )Né
   )ÚcommsÚtransport_inÚtransport_outÚssl_ctxÚssl_objÚ	transportÚhandshake_done_evtÚhandshake_timeoutÚ_MBEDTLSWrapper__ssl_in_qÚstop_evtÚserver_certificateÚ_MBEDTLSWrapper__enc_taskÚ_MBEDTLSWrapper__dec_taskÚ_MBEDTLSWrapper__process_task©Úself© r   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asysocks/utils/mbedtlswrapper.pyÚ__init__   s   
zMBEDTLSWrapper.__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MBEDTLSWrapper.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 MBEDTLSWrapper.get_server_pubkeyc                 C   s   | j d ur| j S d S )N)r   r   r   r   r   Úget_server_cert6   s   
ÿzMBEDTLSWrapper.get_server_certc              
   Ã   sÒ   �zMt  ¡ | _t  ¡ | _t  ¡ | _| j d ¡| _|  	¡ I d H \}}|d ur'|‚| jj
dd�| _t| jƒ t  |  ¡ ¡| _t  |  ¡ ¡| _t  |  ¡ ¡| _W dS  tyh } zt ¡  d |fW  Y d }~S d }~ww )NT)Úbinary_form©TN)ÚasyncioÚEventr   r   ÚQueuer   r	   Úwrap_buffersr
   Ú_MBEDTLSWrapper__do_handshakeÚgetpeercertr   ÚprintÚcreate_taskÚ _MBEDTLSWrapper__encrypt_ssl_recr   Ú _MBEDTLSWrapper__decrypt_ssl_recr   Ú _MBEDTLSWrapper__read_ssl_recordr   r   Ú	tracebackÚ	print_exc)r   Ú_Úerrr   r   r   r   Úsetup:   s(   €



€þzMBEDTLSWrapper.setupc              
   Ã   s(  �zd	 zS| j j ¡ I d H }|dkr| j j d ¡I d H  W W d S | j |¡ 	 z| j d¡}|dkr3W n"| j |¡I d H  | j t	|ƒ¡ W n t
yS } z|‚d }~ww q&W n t
yd } z|‚d }~ww q tjyp   Y d S  t
y“ } zt ¡  td| ƒ t d| ¡ W Y d }~d S d }~ww )NTr   é @  z__encrypt_ssl_rec %s)r   Úin_queueÚgetÚputr
   ÚwriteÚpeek_outgoingr   Úconsume_outgoingÚlenr   r*   ÚCancelledErrorr5   r6   r0   ÚloggingÚdebug)r   Úraw_dataÚenc_datar   r   r   r   Ú__encrypt_ssl_recN   sF   €€ÿù€ÿï€ýz MBEDTLSWrapper.__encrypt_ssl_recc              
   Ã   s0  �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 	d¡}|dkr<W n||7 }W 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 ¡  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   r:   z__decrypt_ssl_rec %s)r   Úis_setr   r<   r   Ú	out_queuer=   r
   Úreceive_from_networkÚreadr   r*   rB   r5   r6   rC   rD   )r   Ússl_dataÚ	data_buffÚ	data_readr   r   r   r   Ú__decrypt_ssl_reck   s<   €

€ÿ
ú	í€þz MBEDTLSWrapper.__decrypt_ssl_recc              
   Ã   sP  �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 ¡  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   rH   rA   ÚintÚ
from_bytesr   r=   r   r<   r*   rB   r   r5   r6   rC   rD   )r   ÚbufferÚlengthÚdatar8   r   r   r   r   Ú__read_ssl_record‹   s:   €
ï €ýz MBEDTLSWrapper.__read_ssl_recordc              
   Ã   s¾  �z¼d}| j  ¡ s¶| jjjtjjur¶|d7 }|dkrtdƒ‚t	dƒ z&| j 
¡  | j d¡}t|ƒdkr6W q| j |¡I d H  | j t|ƒ¡ W n_ tjyw   t	d| ƒ | j d¡}t|ƒdkrdY q| j |¡I d H  | j t|ƒ¡ Y q tjy¤   t	d| ƒ | j ¡ I d H \}}|d ur”|‚|d	krœtd
ƒ‚| j |¡ Y q   ‚ | j  ¡ s¶| jjjtjjus| j ¡  W dS  tyÞ } zt ¡  t d| ¡ d |fW  Y d }~S d }~ww )Nr   é   iè  zHandshake broke :(zDST Performing handshake!i   zWantReadError %szWantWriteError %sr   zServer closed the connection!r)   z__do_handshake %s)r   rH   r
   ÚcontextÚ_stater   ÚHandshakeStepÚHANDSHAKE_OVERr   r0   Údo_handshaker?   rA   r   r=   r@   ÚWantReadErrorÚWantWriteErrorr   r<   rJ   r   Úsetr5   r6   rC   rD   )r   ÚctrrY   Úserver_hellor8   r   r   r   r   Ú__do_handshake±   sV   €
à
"€ýzMBEDTLSWrapper.__do_handshakec              
   Ã   s”   �z.t ƒ }||_||_| |_| j|_t tjdd�¡|_| 	¡ I d H \}}|d ur+|‚|d fW S  t
yI } zt ¡  d |fW  Y d }~S d }~ww )NF)Úvalidate_certificates)r   r   r   r   r   r   ÚClientContextÚTLSConfigurationr	   r9   r   r5   r6   )r   r   r   Útunnelr7   r8   r   r   r   r   Úfrom_commsettingsÞ   s&   €
ÿ
€þz MBEDTLSWrapper.from_commsettingsN)Ú__name__Ú
__module__Ú__qualname__r   r   r&   r'   r9   r2   r3   r4   r.   Ústaticmethodrk   r   r   r   r   r      s    	 &-r   )	r*   Úplatformr5   rC   Úmbedtlsr   Úasn1crypto.x509r   r   r   r   r   r   Ú<module>   s    