o
    CDi&                  	   @   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mZ ddlm	Z	 zd dl
Z
e
d dd ZW n eefyD   ddlmZ Y nw z
d dl
Z
d	d
 ZW n ey`   d dlZdd
 ZY nw dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&d Z'd!Z(d"Z)d#Z*d$Z+d%Z,d&Z-d'Z.d(Z/d)Z0d*Z1eeB eB eB e!B e%B e)B e+B e/B e0B Z2d+d, Z3d=d/d0Z4d1d2 Z5d>d4d5Z6d6d7 Z7d8d9 Z8d?d;d<Z9dS )@    N   )RC4_encrypt)desmd4c                   C   s
   t dS )Nr   )hashlibnew r   r   A/var/www/Datamplify/venv/lib/python3.10/site-packages/smb/ntlm.pyMD4
      
 r
   )r
   c                 C   
   t | S N)r   md5sr   r   r	   MD5   r   r   c                 C   r   r   )r   r   r   r   r   r	   r      r                   @         i   i   i   i   i    i @  i   i   i   i   i   i   i    i  @ i   i   i   i   i   i   i    i   @l        c               	   C   s   t dddtddd} | S )z>
    References:
    ===========
    - [MS-NLMP]: 2.2.1.1
    z<8sII8s8s8s   NTLMSSP r              s    r   )structpack
NTLM_FLAGSr   r   r   r	   generateNegotiateMessageG   s   r   	WORKGROUP	LOCALHOSTc                 C   sB  d}t |}| }	}
| t@ r#ddd tdD d}
t||
}	t|}|}t|}|| }|d}t|}|| }d}|d	 d
krLd}|d7 }|d}t|}|| }|d}t|}|| }t|	}|| }| }|t M }t 	|dd|||||||||||||||||||}|| | | | | | |	 |
fS )z>
    References:
    ===========
    - [MS-NLMP]: 2.2.1.3
    z<8sIHHIHHIHHIHHIHHIHHII c                 S   s   g | ]}t tjtj qS r   )randomchoicestringdigitsascii_letters).0_r   r   r	   
<listcomp>b   s    z/generateAuthenticateMessage.<locals>.<listcomp>r   asciiUTF-16LE    r   r       r   r      )
r   calcsizeNTLM_NegotiateKeyExchangejoinrangeencoder   lenNTLM_NegotiateVersionr   )challenge_flagsnt_responselm_responserequest_session_keyuserdomainworkstationFORMATFORMAT_SIZEsession_keysession_signing_keylm_response_lengthlm_response_offsetnt_response_lengthnt_response_offsetdomain_unicodedomain_lengthdomain_offsetpaddinguser_unicodeuser_lengthuser_offsetworkstation_unicodeworkstation_lengthworkstation_offsetsession_key_lengthsession_key_offset
auth_flagsr   r   r   r	   generateAuthenticateMessageU   sL   





$
rS   c                 C   sn   d}t |}t |t| d| \}}}}}}}	}
}}}|dks$J |dks*J |	|t| |||  fS )za
    References:
    ===========
    - [MS-NLMP]: 2.2.1.2
    - [MS-NLMP]: 2.2.2.1 (AV_PAIR)
    z<8sIHHII8s8sHHINr   r   )r   r0   unpackbytes)	ntlm_datar>   r?   	signaturemessage_typetargetname_lentargetname_maxlentargetname_offsetflags	challenger)   targetinfo_lentargetinfo_maxlentargetinfo_offsetr   r   r	   decodeChallengeMessage   s   
ra   r"   c                 C   s   d}|st dd tddD }t|dksJ t }|| d | }t||	 | dd }	d| | d	 | }
t|	||
 d }||
 }t|	|| d | }t|	|d }|||fS )
Nr   c                 S      g | ]}t d qS r   r#   getrandbitsr(   ir   r   r	   r*          z/generateChallengeResponseV2.<locals>.<listcomp>r   r   r,   r   s         s       )
rU   r3   r5   r
   updater4   digesthmacr   upper)passwordr;   server_challengeserver_infor<   client_challengeclient_timestampd	ntlm_hashresponse_keytemp
ntproofstrnt_challenge_responselm_challenge_responser@   r   r   r	   generateChallengeResponseV2   s    
ry   c              	   C   s   | d d? d@ d> | d d@ d> | d d? d@ B d> | d d@ d> | d d? d	@ B d> | d d
@ d> | d d? d@ B d> | d d@ d> | d d? d
@ B d> | d d	@ d> | d d? d@ B d> | d d@ d> | d d
? d@ B d> | d d@ d> g}t |S )z?Expand the key from a 7-byte password key into a 8-byte DES keyr   r         r   ?   r/            r      )rU   )keyr   r   r   r	   expandDesKey   s   """"""	r   c                 C   s^   t t| dd }t t| dd }t t| dd d }|||| || S )zo
    References:
    ===========
    - http://ubiqx.org/cifs/SMB.html (2.8.3.4)
    - [MS-NLMP]: Section 6
    r   r      r   s        )r   r   encrypt)KDd1d2d3r   r   r	   DESL   s   r   Fc                 C   s  t |  d dd d}tt|dd }tt|dd }|d|d }t }|| d | }	|rf|sJt dd	 t	d
dD }t
|dksRJ |d }
t|	t||  d
d }n
t|	|}t||}
t }||	 | }||
|fS )a  
    Generate a NTLMv1 response

    @param password: User password string
    @param server_challange: A 8-byte challenge string sent from the server
    @param has_extended_security: A boolean value indicating whether NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY flag is enabled in the NTLM negFlag
    @param client_challenge: A 8-byte string representing client challenge. If None, it will be generated randomly if needed by the response generation
    @return: a tuple of ( NT challenge response string, LM challenge response string )

    References:
    ===========
    - http://ubiqx.org/cifs/SMB.html (2.8.3.3 and 2.8.3.4)
    - [MS-NLMP]: 3.3.1
    z              Nr   r+   r   s   KGS!@#$%r,   c                 S   rb   rc   rd   rf   r   r   r	   r*      rh   z/generateChallengeResponseV1.<locals>.<listcomp>r   r   s                   )rU   rl   r   r   r   r
   ri   r4   rj   r3   r5   r   r   )rm   rn   has_extended_securityrp   	_passwordr   r   lm_response_keyrr   nt_response_keyrx   rw   r@   r   r   r	   generateChallengeResponseV1   s&    



r   )r    r!   )r"   N)FN):typesrk   binasciir   r#   r%   	utils.rc4r   utils.pyDesr   r   r   r
   ImportError
ValueError	utils.md4r   r   NTLM_NegotiateUnicodeNTLM_NegotiateOEMNTLM_RequestTargetNTLM_Unknown9NTLM_NegotiateSignNTLM_NegotiateSealNTLM_NegotiateDatagramNTLM_NegotiateLanManagerKeyNTLM_Unknown8NTLM_NegotiateNTLMNTLM_NegotiateNTOnlyNTLM_AnonymousNTLM_NegotiateOemDomainSupplied$NTLM_NegotiateOemWorkstationSuppliedNTLM_Unknown6NTLM_NegotiateAlwaysSignNTLM_TargetTypeDomainNTLM_TargetTypeServerNTLM_TargetTypeShareNTLM_NegotiateExtendedSecurityNTLM_NegotiateIdentifyNTLM_Unknown5NTLM_RequestNonNTSessionKeyNTLM_NegotiateTargetInfoNTLM_Unknown4r6   NTLM_Unknown3NTLM_Unknown2NTLM_Unknown1NTLM_Negotiate128r1   NTLM_Negotiate56r   r   rS   ra   ry   r   r   r   r   r   r   r	   <module>   s   0

	
6
