o
    àý°j•5  ã                   @   s  d dl mZ d dl mZ d dlmZ z
d dlmZmZ W n ey/   e 	d¡ e 	d¡ Y nw d dl
mZmZ d dlmZ d d	lZd d	lZd d
lmZ dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd	S )#é    )Údivision)Úprint_function)ÚLOG)ÚDESÚAESzDWarning: You don't have any crypto installed. You need pycryptodomexz+See https://pypi.org/project/pycryptodomex/)ÚpackÚunpack)Ú	StructureN)Úbc                 C   sÔ   t  | t j¡}| ttdƒƒ¡}td|d d… ƒd }td|dd … ƒd }|d> |d? B d@ }|d> d@ }|d? r>|dN }|d> |d? B d@ }|d> d@ }|d? rV|dN }ttd	||ƒƒ}	ttd	||ƒƒ}
|	|
fS )
Né   z>Qé   r   é   é?   l   ÿÿÿÿ é‡   z>QQ)r   ÚnewÚMODE_ECBÚencryptÚbytesÚ	bytearrayr   r   )ÚKÚAES_128ÚLÚLHighÚLLowÚK1HighÚK1LowÚK2HighÚK2LowÚK1ÚK2© r    ú‚/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/crypto.pyÚGenerate_Subkey&   s   r"   c                 C   s2   t ƒ }tt| ƒƒD ]}| | | || A ¡ q	|S )N)r   ÚrangeÚlenÚappend)ÚN1ÚN2ÚJÚir    r    r!   ÚXOR_128X   s   r*   c                 C   s    dt | ƒ }| d d|d   S )Nr   ó   €ó    r   )r$   )ÚNÚpadLenr    r    r!   ÚPAD`   s   r/   c                 C   s  d}t dƒ}t | tj¡}t |d |… ƒ}t| ƒ\}}t|ƒ| }|dkr*d}d}	n|| dkr3d}	n|d7 }d}	||d | d … }
|	du rMt|
|ƒ}ntt|
ƒ|ƒ}|}t|d ƒD ]}||| d … d d… }t||ƒ}t | 	t
|ƒ¡ƒ}q\t||ƒ}| 	t
|ƒ¡}|S )Nr   r   r   FT)r   r   r   r   r"   r$   r*   r/   r#   r   r   )r   ÚMÚlengthÚconst_BsizeÚ
const_Zeror   r   r   ÚnÚflagÚM_nÚM_lastÚXr)   ÚM_iÚYÚTr    r    r!   ÚAES_CMACd   s2   /

r<   c                 C   s2   |dkr| }n
t ttdƒƒ| |ƒ}t |||ƒ}|S )Nr   )r<   r   r   )ÚVKr0   ÚVKlenÚMlenr   ÚPRVr    r    r!   ÚAES_CMAC_PRF_128µ   s
   rA   c                 C   sž   d}d}|| }|dkrd}|t d|ƒd krtdƒ‚d}d}td|d ƒD ] }	td|	ƒ| d	 | td|ƒ }
t | |
tj¡ ¡ }|| }q&|d |d
 … S )Né   é    r   r   é   zError computing KDF_CounterModeó    z>Lr,   r   )	ÚpowÚ	Exceptionr#   r   Úhmacr   ÚhashlibÚsha256Údigest)ÚKIÚLabelÚContextr   ÚhÚrr4   Úresultr   r)   Úinputr    r    r!   ÚKDF_CounterModeÕ   s    
rS   c                   @   s   e Zd ZdZdS )ÚLSA_SECRET_XP))ÚLengthú<L=0)ÚVersionrV   )Ú_Secretz_-Secretzself["Length"])ÚSecretú:N)Ú__name__Ú
__module__Ú__qualname__Ú	structurer    r    r    r!   rT   ú   s    rT   c                 C   s¼  g }|  tt| dd… ƒd? ƒ¡ |  tt| dd… ƒd@ d> t| dd… ƒd? B ƒ¡ |  tt| dd… ƒd@ d> t| dd… ƒd? B ƒ¡ |  tt| dd… ƒd@ d> t| dd… ƒd? B ƒ¡ |  tt| dd… ƒd	@ d> t| dd… ƒd? B ƒ¡ |  tt| dd… ƒd
@ d> t| dd… ƒd? B ƒ¡ |  tt| dd… ƒd@ d> t| dd… ƒd? B ƒ¡ |  tt| dd… ƒd@ ƒ¡ tdƒD ]}tt|| ƒd> d@ ƒ||< qÆtd |¡ƒS )Nr   r   é   rD   é   é   é   é   é   é   r   é   r   éþ   Ú )r%   ÚchrÚordr#   r
   Újoin)ÚInputKeyÚ	OutputKeyr)   r    r    r!   ÚtransformKey  s   666666rn   c           
      C   sž   d}| }t dt|ƒdƒD ]:}|d d… }|d d… }t|ƒ}t |tj¡}|| |¡7 }|dd … }|dd … }t|ƒdk rF| t|ƒd … }qt|ƒ}	|	d S )NrE   r   r   rb   rY   )r#   r$   rn   r   r   r   ÚdecryptrT   )
ÚkeyÚvalueÚ	plainTextÚkey0r)   Ú
cipherTextÚ	tmpStrKeyÚtmpKeyÚCrypt1Úsecretr    r    r!   ÚdecryptSecret  s   €ry   c           
      C   sÚ   d}| }t dt|ƒdƒ| }tdt|ƒdƒD ]T}t|ƒdk r(|ddt|ƒ   }|d d… }|d d… }tt|ƒƒ t|ƒ t|ƒ}t |tj¡}	||	 	|¡7 }|dd … }|dd … }t|ƒdk rj| t|ƒd … }q|S )NrE   z<LLr   r   r   r,   rb   )
r   r$   r#   ÚprintÚtypern   r   r   r   r   )
rp   rq   rt   rs   Úvalue0r)   rr   ru   rv   rw   r    r    r!   ÚencryptSecret'  s&   €r}   c           
      C   óx   | d d… }| dd … }|d d… }t |ƒ}|dd… }t |ƒ}t |tj¡}t |tj¡}| |¡}| |¡}	||	 S ©Nr   rb   é   )rn   r   r   r   ro   ©
ÚencryptedHashrp   ÚBlock1ÚBlock2ÚKey1ÚKey2rw   ÚCrypt2Úplain1Úplain2r    r    r!   ÚSamDecryptNTLMHash>  ó   

rŠ   c           
      C   r~   r   )rn   r   r   r   r   r�   r    r    r!   ÚSamEncryptNTLMHashP  r‹   rŒ   )Ú
__future__r   r   Úimpacketr   ÚCryptodome.Cipherr   r   rG   ÚerrorÚstructr   r   Úimpacket.structurer	   rH   rI   Úsixr
   r"   r*   r/   r<   rA   rS   rT   rn   ry   r}   rŠ   rŒ   r    r    r    r!   Ú<module>   s2   
þ2Q %	