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  zd}| 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rt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    