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    