o
    j%                     @   s   d dl Z d dlZd dlZd dlZd dlZ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 d dlmZ d dlmZ d dlmZ d dlmZ edZe Zed	Zee ee eej G d
d dZdd Zdd Z e!dkr~e   dS dS )    N)x509)default_backend)hashes)rsa)serialization)NameOIDzasysocks.certmanagerz3%(asctime)s %(name)-12s %(levelname)-8s %(message)sc                   @   sl   e Zd ZdddZdd Zdd	d
ZdddZdddZdddZdddZ	e
d ddZe
d!ddZdS )"CertManagerNc                 C   s6   || _ || _|| _|| _|| _|| _d | _|   d S N)ca_cert_fileca_certca_keyca_key_fileca_key_file_pw	cache_dircasetup)selfr   r   r   r
   r   r    r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asysocks/certmanager.py__init__   s   zCertManager.__init__c                 C   sb  d }d }| j d u rtjt d}tj|dd || _ | jd u r/| jd u r/tj| j d| _| j	d u rB| j
d u rBtj| j d| _	| jd urhzt| jd}| }W d    n1 s]w   Y  W n   Y | j	d urzt| j	d}| }W d    n1 sw   Y  W n   Y |d u s|d u r|   d S t|t | _tj|| jt d| _
d S )N	certstoreT)exist_ok
cacert.pem	cakey.pemrbbackend)r   ospathjointempfile
gettempdirmakedirsr
   r   r   r   openreadintialize_certstorer   load_pem_x509_certificater   r   load_pem_private_keyr   )r   ca_cert_dataca_key_datar   fr   r   r   r   *   s<   




zCertManager.setupasysocks     c                 C   s   t j|||||d\}}}|d ur|d}	d}
ttj| j|	d}|| W d    n1 s2w   Y  ttj| j|
d}|| W d    n1 sRw   Y  t	|t
 | _tj|| jt
 d| _d S )N)cnonoukey_expkey_sizer   r   wbr   )r   generate_car#   r   r   r   r   writer   r&   r   r   r   r'   r   r   )r   r.   r/   r0   r1   r2   r   r   errcnameknamer*   r   r   r   r%   O   s   zCertManager.intialize_certstorec           	      C   s  t |t }|d urd|j|f  }}nd|jt|j  	 f }d|df }d|df }t
tj| j|d}|| W d    n1 sMw   Y  t
tj| j|d}|| W d    n1 smw   Y  tj| j|tj| j|fS )Nz%s_%sz	%s_%s.pemcertkeyr3   )r   r&   r   serial_numberhashlibsha1subjectrfc4514_stringencode	hexdigestr#   r   r   r   r   r5   )	r   new_certnew_keyhostnamer9   bnamer7   r8   r*   r   r   r   store_to_cachea   s   " zCertManager.store_to_cacheTc                 C   sh  d }d }|d urt |t }|j}ttj| jdD ]?}	tj	|	}
|d ur@|

t|r@|
dr8|	}q|
dr?|	}q|d ur\|
d| dkr\|
drU|	}q|
dr\|	}q|d u se|d u rgdS |du r{tj| j|tj| j|fS t|d}| }W d    n1 sw   Y  t|d}| }W d    ||fS 1 sw   Y  ||fS )	Nz*.pemz_key.pemz	_cert.pemz_%s_)NNTr)r   load_der_x509_certificater   r;   globr   r   r   r   basename
startswithstrendswithfindr#   r$   )r   rD   cert_der_dataserialr>   ret_file_pathcert_filenamekey_filenamer9   filenamerK   r*   certdatakeydatar   r   r   load_from_caches   s@   



 


zCertManager.load_from_cachec           
   
   C   s   zV|du rt |t }nt |t }tjddt d}t j|j| jj|	 |j
|j|jd}|| jt t }|jtjjd}|jtjjtjjt d}||d fW S  tyr }	 ztd d d |	fW  Y d }	~	S d }	~	ww )	NTr,   r-   public_exponentr2   r   )subject_nameissuer_name
public_keyr;   not_valid_beforenot_valid_afterencodingra   formatencryption_algorithmresign_certificate)r   rI   r   r&   r   generate_private_keyCertificateBuilderr>   r   r]   r;   r^   r_   signr   r   SHA256public_bytesr   EncodingPEMprivate_bytesPrivateFormatTraditionalOpenSSLNoEncryption	Exceptionlogger	exception)
r   r9   	is_binaryold_certcert_keybuildernew_cert_objrB   rC   er   r   r   re      s8   
zCertManager.resign_certificate  c              
      s  zh| j |d\}}|d urtd|  ||d fW S tj|||dI d H \}}|d ur.|| j |d\}}|d urGtd|  ||d fW S td|  | |\}}	}|d ur\|| ||	\}}||d fW S  ty }
 ztd d d |
fW  Y d }
~
S d }
~
ww )N)rD   zCache hit for %s)ssl_ctx)rP   zCache miss for %sget_cert_by_host)	rX   rr   debugr   fetch_remote_certre   rF   rq   rs   )r   rD   portr{   certfilekeyfiler9   r6   rB   rC   ry   r   r   r   r|      s0   
zCertManager.get_cert_by_hostc           	   
      s   d }zVz0|d u rt  }tj| ||| dI d H \}}|d}|j|d}|d fW W |d ur4|  S S  tyY } zt	d d |fW  Y d }~W |d urT|  S S d }~ww |d urc|  w w )N)hostr   sslserver_hostname
ssl_object)binary_formr~   )
r   create_default_contextasyncioopen_connectionget_extra_infogetpeercertcloserq   rr   rs   )	rD   r   r{   r   writer_ssl_objr9   ry   r   r   r   r~      s.   





zCertManager.fetch_remote_cert c              
   C   s  zt d d }d }tddd}tddd}tj||t d}	|	 }
t	 }|
tttj| ttj|ttj|g}|tttj| g}|tj | }|tj | }|tt }||
}|jtjdd ddd}|j|	t t d	}|jtj j!d
}|	j"tj j!tj#j$t% d}||d fW S  t&y } zt 'd d d |fW  Y d }~S d }~ww )Nz!Generating initial CA certificate   r   im  rY   T)r   path_length)critical)private_key	algorithmr   r`   rb   r4   )(rr   r}   datetime	timedeltar   rf   r   r]   r   rg   r[   NameNameAttributer   COMMON_NAMEORGANIZATION_NAMEORGANIZATIONAL_UNIT_NAMEr\   r^   todayr_   r;   intuuiduuid4add_extensionBasicConstraintsrh   r   ri   rj   r   rk   rl   rm   rn   ro   rp   rq   rs   )r.   r/   r0   r1   r2   r   r   one_dayone_yearr   r]   rw   certificatery   r   r   r   r4      s\   


zCertManager.generate_ca)NNNNNN)r+   r+   r+   r,   r-   r	   )NNNNT)T)rz   N)rz   NT)r+   r   r   r,   r-   )__name__
__module____qualname__r   r   r%   rF   rX   re   r|   staticmethodr~   r4   r   r   r   r   r      s    

%


&
(r   c                     sf   t dI d H \} }|d urt| d S t|  t  }	 |dI d H \}}}|d ur2t| d S q)Nz444.hu)r   r~   printr|   )r9   r6   cmr   r   r   r   r   amain'  s   r   c                   C   s   t d tt  d S )Nr   )rr   setLevelr   runr   r   r   r   r   main9  s   
r   __main__)"r   r   r   r   rJ   r    loggingr<   r   cryptographyr   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   )cryptography.hazmat.primitives.asymmetricr   r   cryptography.x509.oidr   	getLoggerrr   StreamHandlerhandler	Formatter	formattersetFormatter
addHandlerr   INFOr   r   r   r   r   r   r   r   <module>   s>   


  
