o
    àý°jù  ã                   @   sà   d dl mZ d dlm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mZ d dlmZ d dlmZ d dlmZ d d	lmZ d
d„ Zdd„ Zddd„ZG dd„ dƒZdd„ Zdd„ Zdd„ ZdS )é    )Úpack)Úlong_to_bytesN)Úx509)ÚhashesÚserialization)Úrsa)Údefault_backend)ÚPEM)Úpkcs12c                  C   s>   t j  t jj¡} t j dddt jjd�}| | }t| ¡ d ƒS )NiA  é   )ÚyearÚmonthÚdayÚtzinfoi€–˜ )ÚdatetimeÚnowÚtimezoneÚutcÚintÚtotal_seconds)Údt_nowÚcsharp_epochÚdelta© r   ú¨/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/examples/ntlmrelayx/utils/shadow_credentials.pyÚgetTicksNow   s   r   c                   C   s
   t  ¡ jS )N)ÚuuidÚuuid4Úbytesr   r   r   r   ÚgetDeviceId   s   
r   é   c                 C   s¬   t jd|d d�}t t tjj| ¡g¡}tj tj	j
¡}t ¡  |¡ |¡ | ¡ ¡ t ¡ ¡ |tjdd� ¡ |tjdd� ¡jtjdd d�dd� |t ¡ ¡}||fS )	Ni  )Úpublic_exponentÚkey_sizeÚbackendr   )ÚdaysiB  T)ÚcaÚpath_length)Úcritical)r   Úgenerate_private_keyr   ÚNameÚNameAttributeÚNameOIDÚCOMMON_NAMEr   r   r   r   ÚCertificateBuilderÚsubject_nameÚissuer_nameÚ
public_keyÚserial_numberÚrandom_serial_numberÚnot_valid_beforeÚ	timedeltaÚnot_valid_afterÚadd_extensionÚBasicConstraintsÚsignr   ÚSHA256)ÚsubjectÚkSizeÚkeyr.   r   Úcertr   r   r   ÚcreateSelfSignedX509Certificate"   sB   ýÿÿÿÿÿÿÿóòr>   c                   @   s@   e Zd Zedd„ ƒZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )ÚKeyCredentialc                 C   sv   t d| jƒ}t|  ¡  ¡ jƒ}t dt|ƒƒ}t|  ¡  ¡ jƒ}t dt|ƒƒ}t ddƒd }d| | | | | | S )Nz<Ir   é   s   RSA1)r   r"   r   r0   Úpublic_numbersÚeÚlenÚn)r0   r;   ÚexponentÚexponentSizeÚmodulusÚmodulusSizeÚpaddingr   r   r   Úraw_public_keyC   s   zKeyCredential.raw_public_keyc                 C   sŒ   |   |¡| _d| jf| _dtddƒf| _dtddƒf| _d|f| _dtd	dd
ƒf| _dtd|ƒf| _d| _	t
 t | j¡ ¡ ¡ d¡| _d S )Né   é   z<Br   é   r   é   é   z<BBr@   é	   z<Qi   zutf-8)rJ   Ú_KeyCredential__publicKeyÚ_KeyCredential__rawKeyMaterialr   Ú_KeyCredential__usageÚ_KeyCredential__sourceÚ_KeyCredential__deviceIdÚ_KeyCredential__customKeyInfoÚ_KeyCredential__creationTimeÚ_KeyCredential__versionÚbase64Ú	b64encodeÚhashlibÚsha256ÚdigestÚdecodeÚ_KeyCredential__sha256)Úselfr<   ÚdeviceIdÚcurrentTimer   r   r   Ú__init__P   s   
"zKeyCredential.__init__c                 C   s   d  dd„ |D ƒ¡S )Nó    c                 S   s,   g | ]}t d t|d ƒ|d ƒ|d  ‘qS )z<HBr   r   )r   rC   )Ú.0Úfieldr   r   r   Ú
<listcomp>^   s   , z,KeyCredential.__packData.<locals>.<listcomp>)Újoin)r`   Úfieldsr   r   r   Ú
__packData]   s   zKeyCredential.__packDatac                 C   s   t  | jd ¡| _d| jfS )Nz===r   )rY   Ú	b64decoder_   Ú_KeyCredential__identifier)r`   r   r   r   Ú__getKeyIdentifier`   s   
z KeyCredential.__getKeyIdentifierc                 C   s   t  |¡ ¡ }d|fS )Nr@   )r[   r\   r]   )r`   ÚbinaryPropertiesÚcomputed_hashr   r   r   Ú__getKeyHashd   s   zKeyCredential.__getKeyHashc                 C   sR   t d| jƒ}|  | j| j| j| j| j| jg¡}|  |  	¡ |  
|¡g¡}|| | S )Nz<L)r   rX   Ú_KeyCredential__packDatarR   rS   rT   rU   rV   rW   Ú _KeyCredential__getKeyIdentifierÚ_KeyCredential__getKeyHash)r`   Úversionrn   Ú
binaryDatar   r   r   Ú
dumpBinaryh   s   û
ÿzKeyCredential.dumpBinaryN)
Ú__name__Ú
__module__Ú__qualname__ÚstaticmethodrJ   rc   rq   rr   rs   rv   r   r   r   r   r?   B   s    
r?   c                 C   s&   t  | ¡ d¡}dt| ƒd ||f S )NzUTF-8z
B:%d:%s:%sr@   )ÚbinasciiÚhexlifyr^   rC   )ru   ÚownerÚhexdatar   r   r   ÚtoDNWithBinary2Stringz   s   r   c              	   C   sš   t tj |¡ƒdkrtj tj |¡¡stjtj |¡dd� tjd|| d t 	| 
¡ ¡d�}t|d dƒ�}| |¡ W d   ƒ d S 1 sFw   Y  d S )Nr   T©Úexist_okrd   )Únamer<   r=   ÚcasÚencryption_algorithmz.pfxÚwb)rC   ÚosÚpathÚdirnameÚexistsÚmakedirsr
   Úserialize_key_and_certificatesr   ÚBestAvailableEncryptionÚencodeÚopenÚwrite)Úcertificater<   Úpath_to_fileÚpasswordÚpfx_dataÚfr   r   r   Ú	exportPFX~   s   û"ÿr•   c                 C   sÞ   t tj |¡ƒdkrtj tj |¡¡stjtj |¡dd� |  tjj	¡}t
|d dƒ�}| |¡ W d   ƒ n1 s=w   Y  |jtjj	tjjt ¡ d�}t
|d dƒ�}| |¡ W d   ƒ d S 1 shw   Y  d S )Nr   Tr€   z	_cert.pemr…   )ÚencodingÚformatr„   z	_priv.pem)rC   r†   r‡   rˆ   r‰   rŠ   Úpublic_bytesr   ÚEncodingr	   rŽ   r�   Úprivate_bytesÚPrivateFormatÚTraditionalOpenSSLÚNoEncryption)r�   r<   Úpath_to_filesÚcert_pemr”   Úprivpemr   r   r   Ú	exportPEM�   s   ÿý"ÿr¡   )r    )Ústructr   ÚCryptodome.Util.numberr   rY   r   r   Útimer[   r{   r†   Úcryptographyr   Úcryptography.hazmat.primitivesr   r   Ú)cryptography.hazmat.primitives.asymmetricr   Úcryptography.hazmat.backendsr   ÚCryptodome.IOr	   Ú,cryptography.hazmat.primitives.serializationr
   r   r   r>   r?   r   r•   r¡   r   r   r   r   Ú<module>   s,    
 8