o
    �õ±j:  ã                   @   sš   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
 G dd„ dƒZdd	„ Zdd
d„Zdd„ Zdd„ ZedkrKd dlmZ eƒ  dS dS )é    N)ÚFields)ÚNegotiateFlags)ÚVersion)ÚAVPairsc                   @   sR   e Zd Zdd„ Zedd„ ƒZedd„ ƒZeddd	„ƒZd
d„ Zdd„ Z	dd„ Z
dS )ÚNTLMChallengec                 C   sF   d| _ d| _d | _d | _d | _d| _d | _d | _d | _d | _	d | _
d S )Ns   NTLMSSP é   s           )Ú	SignatureÚMessageTypeÚTargetNameFieldsr   ÚServerChallengeÚReservedÚTargetInfoFieldsr   ÚPayloadÚ
TargetNameÚ
TargetInfo©Úself© r   úœ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asyauth/protocols/ntlm/messages/challenge.pyÚ__init__   s   
zNTLMChallenge.__init__c                 C   s   t  t | ¡¡S ©N)r   Úfrom_bufferÚioÚBytesIO)Úbbuffr   r   r   Ú
from_bytes   s   zNTLMChallenge.from_bytesc                 C   s8  t ƒ }|  d¡|_tj|  d¡ddd�|_t | ¡|_t	tj|  d¡ddd�ƒ|_	|  d¡|_
|  d¡|_t | ¡|_|j	t	j@ rGt | ¡|_|  ¡ }|  ¡ |_|jjdkr~|  |jjtj¡ |  |jj¡}z| d¡|_W n ty}   | d¡|_Y nw |jjdkrš|  |jjtj¡ |  |jj¡}t |¡|_|S )	Né   é   ÚlittleF©Ú	byteorderÚsignedr   úutf-16lezutf-8)r   Úreadr   Úintr   r	   r   r   r
   r   r   r   r   ÚNEGOTIATE_VERSIONr   Útellr   ÚlengthÚseekÚoffsetr   ÚSEEK_SETÚdecoder   ÚUnicodeDecodeErrorr   r   )ÚbuffÚtÚcurrPosÚraw_datar   r   r   r      s2   
þzNTLMChallenge.from_bufferNc           	      C   sr  | du r	t  d¡} t| ƒdkrtdƒ‚tƒ }| |_||_|du r%tdƒ}n	t|tƒs.t|ƒ}|dur7|tj	O }||_d}|durD|d7 }|dur_| 
d¡}||_tt|ƒ|ƒ|_|t|ƒ7 }n	d|_td|ƒ|_|dur|| ¡ }||_tt|ƒ|ƒ|_ntƒ |_|j ¡ }tt|ƒ|ƒ|_d|_|durž| j| 
d¡7  _|dur­| j| ¡ 7  _|S | j|j ¡ 7  _|S )	a  
		Construct a new NTLMChallenge message.
		
		Args:
			challenge: 8-byte server challenge (defaults to random)
			targetName: Target name string (optional)
			targetInfo: AVPairs object for target info (optional) 
			version: Version object (optional)
			flags: NegotiateFlags object (required if version is provided)
		
		Returns:
			NTLMChallenge: Constructed challenge message
		Nr   z(Server challenge must be exactly 8 bytesr   é0   r"   Ú ó    )ÚosÚurandomÚlenÚ
ValueErrorr   r   r   r   Ú
isinstancer%   Úencoder   r   r
   Úto_bytesr   r   r   r   )	Ú	challengeÚ
targetNameÚ
targetInfoÚversionÚflagsr.   Úpayload_posÚtarget_name_dataÚtarget_info_datar   r   r   Ú	constructB   sN   





þzNTLMChallenge.constructc                 C   sš   | j  d¡}| j ¡ }| j}|| jjdddd�7 }|| j ¡ 7 }|| jjdddd�7 }|| j7 }|| j	7 }|| j
 ¡ 7 }| jrF|| j ¡ 7 }|| j7 }|S )Nr"   r   r   Fr   )r   r9   r   r:   r   r	   r
   r   r   r   r   r   r   )r   ÚtnÚtir-   r   r   r   r:   �   s   



zNTLMChallenge.to_bytesc                 C   sb   d}|dt | jƒ 7 }|dt | jƒ 7 }|dt | jƒ 7 }|dt | jƒ 7 }|dt | jƒ 7 }|S )Nz== NTLMChallenge ==
zSignature      : %s
zMessageType    : %s
zServerChallenge: %s
zTargetName     : %s
zTargetInfo     : %s
)Úreprr   r	   r   r   r   )r   r.   r   r   r   Ú__repr__    s   zNTLMChallenge.__repr__c                 C   s   t  |  ¡ ¡ d¡S )NÚascii)Úbase64Ú	b64encoder:   r+   r   r   r   r   ÚtoBase64©   s   zNTLMChallenge.toBase64)NNNNN)Ú__name__Ú
__module__Ú__qualname__r   Ústaticmethodr   r   rC   r:   rG   rK   r   r   r   r   r      s    

"L	r   c                   C   s   t ƒ  tƒ  tƒ  d S r   )Útest_reconstrutÚtest_constructÚtest_templater   r   r   r   Útest­   s   
rS   c                 C   sž   zddl m} W n ty   dd„ }Y nw tdƒ | s"t d¡}n| }t |¡}tt|ƒƒ | 	¡ }tdƒ t||ƒƒ tdƒ t||ƒƒ ||ksMJ ‚d S )	Nr   ©Úhexdumpc                 S   s   |   ¡ S r   )Úhex)Údatar   r   r   rU   ¶   s   z test_reconstrut.<locals>.hexdumpz=== reconstruct===Ád  4e544c4d53535000020000000800080038000000158289e2a7314a557bdb11bf000000000000000072007200400000000a0063450000000f540045005300540002000800540045005300540001001200570049004e003200300031003900410044000400120074006500730074002e0063006f007200700003002600570049004e003200300031003900410044002e0074006500730074002e0063006f007200700007000800aec600bfc5fdd40100000000z====== reconstructed ====z====== original ====)
Úasyauth.utils.hexdumprU   ÚImportErrorÚprintÚbytesÚfromhexr   r   rF   r:   )rW   rU   Úchallenge_test_datar;   Úchallenge_test_data_verifyr   r   r   rP   ²   s"   ÿ
rP   c                   C   s   d S r   r   r   r   r   r   rR   Ç   s   rR   c                  C   sú   t dƒ t ¡ } t dƒ d}tj|d�}|j|ksJ ‚t dƒ tjdd�}|jdks,J ‚t dƒ d	d
lm}m} |ƒ }d||j< tj|d�}|j	|j dksPJ ‚t dƒ tj|d|d�}| 
¡ }	t |	¡}
|
j|kslJ ‚|
jdkssJ ‚t dƒ t dƒ d S )Nz=== test_construct ===zBasic construct test passeds   )r;   zCustom challenge test passedÚDOMAIN)r<   zTarget name test passedr   )r   Ú
AVPAIRType)r=   zTarget info test passedÚTEST)r;   r<   r=   zRoundtrip test passedzAll construct tests passed!)r[   r   rC   r   r   Ú(asyauth.protocols.ntlm.structures.avpairr   ra   ÚMsvAvNbDomainNamer   r:   r   )Ú
challenge1Úcustom_challengeÚ
challenge2Ú
challenge3r   ra   Útarget_infoÚ
challenge4Ú
challenge5rW   Ú
challenge6r   r   r   rQ   Í   s6   
ý
rQ   Ú__main__rT   r   )r4   r   rI   Ú(asyauth.protocols.ntlm.structures.fieldsr   Ú1asyauth.protocols.ntlm.structures.negotiate_flagsr   Ú)asyauth.protocols.ntlm.structures.versionr   rc   r   r   rS   rP   rR   rQ   rL   rY   rU   r   r   r   r   Ú<module>   s"     #
(
ý