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rŽzt| j	dƒ�}| ¡ }W d   ƒ n1 sƒw   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 s�w   Y  t|dƒ�}| ¡ }W d   ƒ ||fS 1 s«w   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„  z¥t  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>   
ÿ

  
ÿ