o
    ßý°j�N  ã                   @   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!¡rØd| _"|   t#¡ràd| _$|   t%¡rèd| _&q‘|t'krøt(td|ƒd ƒ| _)q‘|t*k�r|| _+q‘|t,k�r| d	¡| _-q‘|t.k�r|| _/q‘t0dƒ‚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¡rŽtƒ  | 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Ä    
ÿëöþ
