o
    jN                     @   s  d Z ddlmZmZ ddlmZmZ 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mZ zddlmZ e ZW n eyF   d	ZY nw d
dlm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.eeeeeeee e!e"e#e$e%e&e'e(e)e*e+e,e-e.gZ/dZ0dZ1d
Z2dZ3d!Z4d Z5dZ6dZ7d"Z8dZ9d#Z:e0e1e2e3e4e5e6e7e8e9e:gZ;dZ<dZ=d
Z>e<e=e>gZ?d+d%d&Z@d'd( ZAG d)d* d*eBZCdS ),
    )packunpack)systemversion)gethostname)timeN)urandom)getpreferredencodingzutf-8   )format_ad_timestamps   NTLMSSP                                                 	                  
   Fc                 C   s   | r7t   dkr0zt d\}}}t|}t|}t|}W n ty/   d}d}d}Y nw d}d}d}nd}d}d}td|td| td| tdd tdd tdd tdd	 S )
Nwindows.r    r   i(
  r   <B<Hr   )r   lowerr   splitint	Exceptionr   )debugmajor_releaseminor_releasebuild r0   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/ldap3/utils/ntlm.pypack_windows_version   s>   r2   c                 C   s   t | dkr
tdttu r2td| d d td| d d td| dd d td| d	 d fS t| d t| d ttd| dd d t| d	 fS )
Nr"   z"version field must be 8 bytes longr&   r   r   r'   r   r!   r   )len
ValueErrorstrbytesr   r*   )version_messager0   r0   r1   unpack_windows_version   s   


r8   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zedd Zedd Zedd Zedd Zedd Zdd  Zd!d" Zd#S )$
NtlmClientc                 C   s  d| _ d | _d | _|| _|| _d | _d| _g | _d | _d | _	d | _
d | _d | _d | _d | _d| _d| _d| _d| _d| _d| _d | _d | _d | _|| _d | _d | _d | _d | _d | _d | _d | _d | _ d | _!d | _"d | _#d | _$d | _%d | _&d | _'d | _(d | _)d | _*d | _+d | _,d S )Nr   F)-client_config_flagsexported_session_keynegotiated_flags	user_nameuser_domainno_lm_response_ntlm_v1client_blockedclient_block_exceptions!client_require_128_bit_encryptionmax_life_timeclient_signing_keyclient_sealing_keysequence_numberserver_sealing_keyserver_signing_key	integrityreplay_detectsequence_detectconfidentialitydatagramidentityclient_supplied_target_nameclient_channel_binding_unhashedunverified_target_name	_passwordserver_challengeserver_target_nameserver_target_infoserver_versionserver_av_netbios_computer_nameserver_av_netbios_domain_nameserver_av_dns_computer_nameserver_av_dns_domain_nameserver_av_dns_forest_nameserver_av_target_nameserver_av_flagsserver_av_timestampserver_av_single_host_dataserver_av_channel_bindingsserver_av_flag_constrainedserver_av_flag_integrity#server_av_flag_target_spn_untrustedcurrent_encodingclient_challengeserver_target_info_raw)selfdomainr=   passwordr0   r0   r1   __init__   sZ   
zNtlmClient.__init__c                 C   s0   | j sdS |tv r| j d|> @ rdS dS td)NFr   Tinvalid flag)r:   
FLAG_TYPESr4   rg   flagr0   r0   r1   get_client_flag   s
   zNtlmClient.get_client_flagc                 C   0   | j sdS |tvrtd| j d|> @ rdS dS )NFrk   r   T)r<   rl   r4   rm   r0   r0   r1   get_negotiated_flag   
   zNtlmClient.get_negotiated_flagc                 C   rp   )NFzinvalid AV flagr   T)r]   AV_FLAG_TYPESr4   rm   r0   r0   r1   get_server_av_flag   rr   zNtlmClient.get_server_av_flagc                 C   sB   t |tkr	|g}|D ]}|tv r|  jd|> O  _qtdd S Nr   rk   typer*   rl   r:   r4   rg   flagsrn   r0   r0   r1   set_client_flag   s   zNtlmClient.set_client_flagc                 C   s
   d| _ d S )Nr   )r:   )rg   r0   r0   r1   reset_client_flags  s   
zNtlmClient.reset_client_flagsc                 C   sD   t |tkr	|g}|D ]}|tv r|  jd|>  M  _qtdd S ru   rv   rx   r0   r0   r1   unset_client_flag  s   zNtlmClient.unset_client_flagc              
   C   s~   |    | tttttttt	g t
}|tdt7 }|td| j7 }|| dd7 }| tr7|td7 }|S |td7 }|S )z+
        Microsoft MS-NLMP 2.2.1.1
        <I (   TF)r{   rz   FLAG_REQUEST_TARGETFLAG_NEGOTIATE_56FLAG_NEGOTIATE_128FLAG_NEGOTIATE_NTLMFLAG_NEGOTIATE_ALWAYS_SIGNFLAG_NEGOTIATE_OEMFLAG_NEGOTIATE_UNICODE'FLAG_NEGOTIATE_EXTENDED_SESSIONSECURITYNTLM_SIGNATUREr    NTLM_MESSAGE_TYPE_NTLM_NEGOTIATEr:   
pack_fieldro   FLAG_NEGOTIATE_VERSIONr2   )rg   messager0   r0   r1   create_negotiate_message  s&   	
z#NtlmClient.create_negotiate_messagec           	      C   s@  t |dk rdS |dd tkrdS ttd|dd d tkr#dS | |dd \}}}td|dd d | _| trBd	nt	| _
|dd
 | _| |dd \}}}t|dd | _| tru|ru||||  | j
| _| tr|r||||  | _| | j| _| jD ]\}}|tkr|d	| _q|tkr|d	| _q|tkr|d	| _q|tkr|d	| _q|tkr|d	| _q|tkr|  t!rd| _"|  t#rd| _$|  t%rd| _&q|t'krt(td|d | _)q|t*kr|| _+q|t,kr|d	| _-q|t.kr|| _/qt0ddS dS dS )z+
        Microsoft MS-NLMP 2.2.1.2
        8   Fr   r"   r}   r   r      	utf-16-le    r   0   T<Qunknown AV typeN)1r3   r   r*   r    NTLM_MESSAGE_TYPE_NTLM_CHALLENGEunpack_fieldr<   rq   r   oem_encodingrd   rS   r8   rV   r   decoderT   FLAG_NEGOTIATE_TARGET_INFOrf   unpack_av_inforU   AV_NETBIOS_COMPUTER_NAMErW   AV_NETBIOS_DOMAIN_NAMErX   AV_DNS_COMPUTER_NAMErY   AV_DNS_DOMAIN_NAMErZ   AV_DNS_TREE_NAMEr[   AV_FLAGSrt   AV_FLAG_CONSTRAINEDra   AV_FLAG_INTEGRITYrb   AV_FLAG_TARGET_SPN_UNTRUSTEDrc   AV_TIMESTAMPr   r^   AV_SINGLE_HOST_DATAr_   AV_TARGET_NAMEr\   AV_CHANNEL_BINDINGSr`   r4   )	rg   r   target_name_len_target_name_offsettarget_info_lentarget_info_offset	attributevaluer0   r0   r1   parse_challenge_message'  sj   





z"NtlmClient.parse_challenge_messagec           	      C   s  | j s| jsdS | tr| tsdS | jr| js| jrdS t}|t	dt
7 }d}| jr0d}nd}|| ||7 }|t|7 }|  }|| ||7 }|t|7 }| j| j}|| ||7 }|t|7 }| j| j}|| ||7 }|t|7 }| ts| trt | j}nd}|| ||7 }|t|7 }d}|| ||7 }|t|7 }|t	d| j7 }| tr|td7 }n|t 7 }|t	dd7 }|t	dd7 }||7 }||7 }||7 }||7 }||7 }||7 }|S )z+
        Microsoft MS-NLMP 2.2.1.3
        Fr}   X       Tr   r   )r:   r<   ro   r   rq   rW   rX   rb   r   r   #NTLM_MESSAGE_TYPE_NTLM_AUTHENTICATErU   r   r3   compute_nt_responser>   encoderd   r=   'FLAG_NEGOTIATE_OEM_WORKSTATION_SUPPLIEDr   r   r2   )	rg   r   poslm_challenge_responsent_challenge_responsedomain_namer=   workstationencrypted_random_session_keyr0   r0   r1   create_authenticate_message_  s\   

z&NtlmClient.create_authenticate_messagec                 C   s   t dt| t| |S )Nz<HHI)r   r3   )r   offsetr0   r0   r1   r     s   zNtlmClient.pack_fieldc                 C   sT   t | dkr
tdtd| dd d td| dd d td| dd d fS )Nr"   zntlm field must be 8 bytes longr'   r   r   r!   r}   )r3   r4   r   )field_messager0   r0   r1   r     s   zNtlmClient.unpack_fieldc                 C   s   | rSt  }d}d}|sQtd| ||d  d }|tvr tdtd| |d |d  d }| |d |d |  }||d 7 }|tkrHd}n|||f |r|S t  S )NFr   r'   r   r   r!   T)listr   AV_TYPESr4   AV_END_OF_LISTappend)infoavsdoner   av_typeav_lenav_valuer0   r0   r1   r     s"   zNtlmClient.unpack_av_infoc                 C   sh   d}| D ]\}}|dt krq|td|7 }|tdt|7 }||7 }q|tdt 7 }|tdd7 }|S )Nr   r   r'   )r   r   r3   )r   r   r   r   r0   r0   r1   pack_av_info  s   
zNtlmClient.pack_av_infoc                   C   s   t dtt d d S )Nr   l    !l
 i )r   r*   r   r0   r0   r0   r1   pack_windows_timestamp  s   z!NtlmClient.pack_windows_timestampc                 C   s   | j s| jsdS td| _d}|tdd7 }|tdd7 }|tdd7 }|tdd7 }||  7 }|| j7 }|tdd7 }|| j7 }|tdd7 }|  }tj	|| j
| tjd }|| }|S )	Nr   r"   r&   r   r'   r   r}   	digestmod)r=   rR   r	   re   r   r   rf   ntowf_v2hmacnewrS   hashlibmd5digest)rg   tempresponse_key_ntnt_proof_strr   r0   r0   r1   r     s"   


zNtlmClient.compute_nt_responsec                 C   s   | j d}t|dkr$t|d dkr$t|d dkr$t|d }n>ztd| j d }W n/ t	ya } z#zddl
m} || j d }W n	 tyV   |w W Y d }~nd }~ww tj|| j | j dtjd	 S )
N:r   r   r   r   MD4r   )r   r   )rR   r)   r3   binascii	unhexlifyr   r   r   r   r4   Crypto.Hashr   ImportErrorr   r=   upperr>   r   )rg   	passpartspassword_digester   r0   r0   r1   r     s    ,(zNtlmClient.ntowf_v2N)__name__
__module____qualname__rj   ro   rq   rt   rz   r{   r|   r   r   r   staticmethodr   r   r   r   r   r   r   r0   r0   r0   r1   r9      s.    /					8@




r9   )F)D__doc__structr   r   platformr   r   socketr   r   r   r   r   osr	   localer
   r   r+   protocol.formatters.formattersr   r   r   r   r   r   FLAG_NEGOTIATE_KEY_EXCHr   r   r   FLAG_REQUEST_NOT_NT_SESSION_KEYFLAG_NEGOTIATE_IDENTIFYr   FLAG_TARGET_TYPE_SERVERFLAG_TARGET_TYPE_DOMAINr   r   "FLAG_NEGOTIATE_OEM_DOMAIN_SUPPLIEDFLAG_NEGOTIATE_ANONYMOUSr   FLAG_NEGOTIATE_LM_KEYFLAG_NEGOTIATE_DATAGRAMFLAG_NEGOTIATE_SEALFLAG_NEGOTIATE_SIGNr   r   r   rl   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rs   r2   r8   objectr9   r0   r0   r0   r1   <module>   s    

