B
    à%Q[M  ã               @   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 yddlmZ eƒ ZW n ek
rŽ   d	ZY nX 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Ä   | rrt ƒ  ¡ dkrdy.tƒ  d¡\}}}t|ƒ}t|ƒ}t|ƒ}W qp tk
r`   d}d}d}Y qpX q~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 )
NZwindowsÚ.r    r   i(
  r   z<Bz<Hr   )r   Úlowerr   ÚsplitÚintÚ	Exceptionr   )ÚdebugZmajor_releaseZminor_releaseÚbuild© r+   úSC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6i93dh7p\ldap3\ldap3\utils\ntlm.pyÚpack_windows_version�   s&    :r-   c             C   s¢   t | ƒdkrtdƒ‚ttkrdt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 d S )
Nr"   z"version field must be 8 bytes longz<Br   r   z<Hr   r!   r   )ÚlenÚ
ValueErrorÚstrÚbytesr   r'   )Zversion_messager+   r+   r,   Úunpack_windows_versionŸ   s    

r2   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_flagsZexported_session_keyÚnegotiated_flagsÚ	user_nameÚuser_domainZno_lm_response_ntlm_v1Zclient_blockedZclient_block_exceptionsZ!client_require_128_bit_encryptionZmax_life_timeZclient_signing_keyZclient_sealing_keyZsequence_numberZserver_sealing_keyZserver_signing_keyZ	integrityZreplay_detectZsequence_detectZconfidentialityZdatagramÚidentityZclient_supplied_target_nameZclient_channel_binding_unhashedZ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Údomainr6   Úpasswordr+   r+   r,   Ú__init__°   sZ    zNtlmClient.__init__c             C   s4   | j s
dS |tkr(| j d|> @ r$dS dS tdƒ‚d S )NFr   Tzinvalid flag)r4   Ú
FLAG_TYPESr/   )rN   Úflagr+   r+   r,   Úget_client_flagß   s
    zNtlmClient.get_client_flagc             C   s0   | j s
dS |tkrtdƒ‚| j d|> @ r,dS dS )NFzinvalid flagr   T)r5   rR   r/   )rN   rS   r+   r+   r,   Úget_negotiated_flagè   s
    zNtlmClient.get_negotiated_flagc             C   s0   | j s
dS |tkrtdƒ‚| j d|> @ r,dS dS )NFzinvalid AV flagr   T)rD   ÚAV_FLAG_TYPESr/   )rN   rS   r+   r+   r,   Úget_server_av_flagñ   s
    zNtlmClient.get_server_av_flagc             C   sH   t |ƒtkr|g}x0|D ](}|tkr8|  jd|> O  _qtdƒ‚qW d S )Nr   zinvalid flag)Útyper'   rR   r4   r/   )rN   ÚflagsrS   r+   r+   r,   Úset_client_flagú   s    
zNtlmClient.set_client_flagc             C   s
   d| _ d S )Nr   )r4   )rN   r+   r+   r,   Úreset_client_flags  s    zNtlmClient.reset_client_flagsc             C   sJ   t |ƒtkr|g}x2|D ]*}|tkr:|  jd|>  M  _qtdƒ‚qW d S )Nr   zinvalid flag)rX   r'   rR   r4   r/   )rN   rY   rS   r+   r+   r,   Ú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¡rl|tdƒ7 }n|tdƒ7 }|S )z+
        Microsoft MS-NLMP 2.2.1.1
        z<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_NEGOTIATEr4   Ú
pack_fieldrT   ÚFLAG_NEGOTIATE_VERSIONr-   )rN   Úmessager+   r+   r,   Úcreate_negotiate_message  s"    
z#NtlmClient.create_negotiate_messagec       	      C   sZ  t |ƒdk rdS |dd… tkr$dS ttd|dd… ƒd ƒtkrFdS |  |dd… ¡\}}}td|dd… ƒd | _|  t¡r„d	nt	| _
|dd
… | _|  |dd… ¡\}}}t|dd… ƒ| _|  t¡rê|rê|||| …  | j
¡| _|  t¡�rV|�rV|||| … | _|  | j¡| _�x6| jD �]*\}}|tk�rJ| d	¡| _�q&|tk�rb| d	¡| _nî|tk�rz| d	¡| _nÖ|tk�r’| d	¡| _n¾|tk�rª| d	¡| _n¦|tk�rì|   t!¡�rÆd| _"|   t#¡�rØd| _$|   t%¡�rPd| _&nd|t'k�rt(td|ƒd ƒ| _)nD|t*k�r|| _+n2|t,k�r6| d	¡| _-n|t.k�rH|| _/nt0dƒ‚�q&W dS )z+
        Microsoft MS-NLMP 2.2.1.2
        é8   Fr   r"   z<Ir   r   é   z	utf-16-leé    r^   é0   Tz<Qzunknown AV typeN)1r.   rg   r'   r   Ú NTLM_MESSAGE_TYPE_NTLM_CHALLENGEÚunpack_fieldr5   rU   re   Úoem_encodingrK   r:   r2   r=   r_   Údecoder;   ÚFLAG_NEGOTIATE_TARGET_INFOrM   Úunpack_av_infor<   ÚAV_NETBIOS_COMPUTER_NAMEr>   ÚAV_NETBIOS_DOMAIN_NAMEr?   ÚAV_DNS_COMPUTER_NAMEr@   ÚAV_DNS_DOMAIN_NAMErA   ÚAV_DNS_TREE_NAMErB   ÚAV_FLAGSrW   ÚAV_FLAG_CONSTRAINEDrH   ÚAV_FLAG_INTEGRITYrI   ÚAV_FLAG_TARGET_SPN_UNTRUSTEDrJ   ÚAV_TIMESTAMPr   rE   ÚAV_SINGLE_HOST_DATArF   ÚAV_TARGET_NAMErC   ÚAV_CHANNEL_BINDINGSrG   r/   )	rN   rk   Ztarget_name_lenÚ_Ztarget_name_offsetZtarget_info_lenZtarget_info_offsetÚ	attributeÚvaluer+   r+   r,   Úparse_challenge_message'  s\    










z"NtlmClient.parse_challenge_messagec       	      C   sä  | j s| jsdS |  t¡r(|  t¡s(dS | jr4| js>| jr>dS t}|t	dt
ƒ7 }d}| jr`d}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
        Fz<IéX   ó    Tz<Qr   )r4   r5   rT   ra   rU   r>   r?   rI   rg   r   Ú#NTLM_MESSAGE_TYPE_NTLM_AUTHENTICATEr<   ri   r.   Úcompute_nt_responser7   ÚencoderK   r6   Ú'FLAG_NEGOTIATE_OEM_WORKSTATION_SUPPLIEDrj   r   r-   )	rN   rk   ÚposZlm_challenge_responseÚnt_challenge_responseZdomain_namer6   ZworkstationZencrypted_random_session_keyr+   r+   r,   Úcreate_authenticate_message_  sZ    
z&NtlmClient.create_authenticate_messagec             C   s   t dt| ƒt| ƒ|ƒS )Nz<HHI)r   r.   )r†   Úoffsetr+   r+   r,   ri   Ÿ  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 longz<Hr   r   r!   z<I)r.   r/   r   )Zfield_messager+   r+   r,   rr   £  s
    zNtlmClient.unpack_fieldc             C   s°   | r¦t ƒ }d}d}x˜|s¢td| ||d … ƒd }|tkrBtdƒ‚td| |d |d … ƒd }| |d |d | … }||d 7 }|tkr’d}q| ||f¡ qW nt ƒ S |S )NFr   z<Hr   zunknown AV typer!   T)Úlistr   ÚAV_TYPESr/   ÚAV_END_OF_LISTÚappend)ÚinfoÚavsÚdonerŽ   Úav_typeZav_lenÚav_valuer+   r+   r,   rv   «  s     zNtlmClient.unpack_av_infoc             C   sl   d}xF| D ]>\}}|dƒt kr q
|td|ƒ7 }|tdt|ƒƒ7 }||7 }q
W |tdt ƒ7 }|tddƒ7 }|S )Nr‰   r   z<H)r”   r   r.   )r—   r–   r™   rš   r+   r+   r,   Úpack_av_infoÁ  s    zNtlmClient.pack_av_infoc               C   s   t dttƒ ƒd d ƒS )Nz<Ql    !l
 i€–˜ )r   r'   r   r+   r+   r+   r,   Ú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
| ¡ ¡ }|| }|S )Nr‰   r"   z<Br   z<Hr   z<I)r6   r9   r	   rL   r   rœ   rM   Úntowf_v2ÚhmacÚnewr:   Údigest)rN   ÚtempZresponse_key_ntZnt_proof_strr�   r+   r+   r,   r‹   Ö  s"    


zNtlmClient.compute_nt_responsec             C   s‚   | j  d¡}t|ƒdkrHt|d ƒdkrHt|d ƒdkrHt |d ¡}nt d| j  d¡¡ ¡ }t	 || j
 ¡ | j  d¡¡ ¡ S )Nú:r   r   ro   r   ZMD4z	utf-16-le)r9   r&   r.   ÚbinasciiÚ	unhexlifyÚhashlibrŸ   rŒ   r    rž   r6   Úupperr7   )rN   Z	passpartsZpassword_digestr+   r+   r,   r�   ê  s
    ,zNtlmClient.ntowf_v2N)Ú__name__Ú
__module__Ú__qualname__rQ   rT   rU   rW   rZ   r[   r\   rl   r‡   r�   Ústaticmethodri   rr   rv   r›   rœ   r‹   r�   r+   r+   r+   r,   r3   ¯   s"   /					8@r3   )F)DÚ__doc__Ústructr   r   Úplatformr   r   Úsocketr   r   rž   r¥   r£   Úosr	   Úlocaler
   rs   r(   Zprotocol.formatters.formattersr   rg   rh   rq   rŠ   r`   ZFLAG_NEGOTIATE_KEY_EXCHra   rj   ru   ZFLAG_REQUEST_NOT_NT_SESSION_KEYZFLAG_NEGOTIATE_IDENTIFYrf   ZFLAG_TARGET_TYPE_SERVERZFLAG_TARGET_TYPE_DOMAINrc   r�   Z"FLAG_NEGOTIATE_OEM_DOMAIN_SUPPLIEDZFLAG_NEGOTIATE_ANONYMOUSrb   ZFLAG_NEGOTIATE_LM_KEYZFLAG_NEGOTIATE_DATAGRAMZFLAG_NEGOTIATE_SEALZFLAG_NEGOTIATE_SIGNr_   rd   re   rR   r”   rw   rx   ry   rz   r{   r|   r€   r�   r‚   rƒ   r“   r}   r~   r   rV   r-   r2   Úobjectr3   r+   r+   r+   r,   Ú<module>   sº   


