o
    �õ±jR  ã                   @   sš   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
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mZ G dd„ dƒZdS )é    N)Úlogger)Ú
get_gssapi)ÚInitialContextToken)ÚISC_REQ)ÚKeyÚ_enctype_table)ÚAP_REPÚAP_REQ)r   )ÚGSSWrapToken)ÚWSNETDirectAuthc                   @   s^   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zdd
d„Zdd„ Zdd„ Z	dd„ Z
ddefdd„ZdS )ÚKerberosClientWSNETDirectc                 C   sP   t  d¡ ¡ | _|| _d| _d | _d | _d | _d | _	d | _
d | _d | _d | _d S )Né   r   )ÚosÚurandomÚhexÚ_authidÚ
credentialÚ
iterationsÚksspiÚclientÚtargetÚgssapiÚetypeÚsession_keyÚ
seq_numberÚflags)Úselfr   © r   ú /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asyauth/protocols/kerberos/client/wsnetdirect.pyÚ__init__   s   
z"KerberosClientWSNETDirect.__init__c                 C   s   | j S )z±
		Returns the initial sequence number. It is 0 by default, but can be adjusted during authentication, 
		by passing the 'seq_number' parameter in the 'authenticate' function
		)r   ©r   r   r   r   Úget_seq_number   s   z(KerberosClientWSNETDirect.get_seq_numberc                 C   ó   t j| jv S )z3
		Checks if integrity protection was negotiated
		)r   Ú	INTEGRITYr   r    r   r   r   Úsigning_needed$   ó   z(KerberosClientWSNETDirect.signing_neededc                 C   r"   )z3
		Checks if confidentiality flag was negotiated
		)r   ÚCONFIDENTIALITYr   r    r   r   r   Úencryption_needed*   r%   z+KerberosClientWSNETDirect.encryption_neededÚinitc                 Ã   s   �| j j|||d�S )z
		Signs a message. 
		)Ú	direction)r   Ú
GSS_GetMIC)r   ÚdataÚ
message_nor)   r   r   r   Úsign0   s   €zKerberosClientWSNETDirect.signc                 Ï   s*   �| j j||g|¢R i |¤Ž\}}||fS )z
		Encrypts a message. 
		)r   ÚGSS_Wrap)r   r+   r,   ÚargsÚkwargsÚeeeer   r   r   Úencrypt6   s   € z!KerberosClientWSNETDirect.encryptc                 Ï   s   �| j j||g|¢R i |¤ŽS )z9
		Decrypts message. Also performs integrity checking.
		)r   Ú
GSS_Unwrap)r   r+   r,   r/   r0   r   r   r   Údecrypt=   s   €z!KerberosClientWSNETDirect.decryptc                 C   s   | j jS )N)r   Úcontentsr    r   r   r   Úget_session_keyC   s   z)KerberosClientWSNETDirect.get_session_keyNr   c              
   Ë   s°  �t  d| j|f ¡ t  d| j|f ¡ t  d| j|f ¡ t  d| j|f ¡ �z•| jd u rIt| jj ¡ ƒ| _| j ¡ I d H \}}|d urI|‚|d u rYt	j
t	jB t	jB t	jB }t	j|v �rÂ| jdkrÈt	j
t	jB t	jB t	jB t	jB t	jB }t  d| j ¡ | jjdd|d	|jd
d�I d H \}}	}
}t  d| j|f ¡ t  d| j|	f ¡ t  d| j|
f ¡ |d ur¶|‚t	|	ƒ| _|  jd7  _|
dd fW S | jdk�r¾t  d| j ¡ | jjdd|d	|j|d�I d H \}}	}}t  d| j|f ¡ t  d| j|	f ¡ t  d| j|f ¡ |d u�rd d |fW S t	|	ƒ| _t  d| j ¡ | j ¡ I d H \}}|d u�r5d d |fW S t  d| j| ¡ f ¡ t |¡j}t|d d |ƒ| _t	j| jv �r_t| jƒ| _nt| jƒ| _|d d dk�r©t  d| j ¡ | j ¡ I d H \}}|d u�r‹d d |fW S t  d| j ¡ t  |dd … ¡j!| _"t  d| j| j"f ¡ |  jd7  _| j #¡ I d H  |dd fW S t$dƒ‚t  d| j ¡ | jjdd|d	|jd
d�I d H \}}	}}|d u�réd d |fW S t	|	ƒ| _t  d| j|f ¡ t  d| j| jf ¡ t  d| j| ¡ f ¡ t% |¡}t&|jd ƒ}
t  d| j ¡ | j ¡ I d H \}}|d u�r4|‚t't(|
jd  d d ƒ ƒ }t|j)|ƒ| _t  d| j| ¡ f ¡ | j #¡ I d H  |
jd  d d dk�r¤t  d| j ¡ | j ¡ I d H \}}|d u�r†d d |fW S t  d| j ¡ t  |dd … ¡j!| _"t  d| j| j"f ¡ t	j| jv �r²t| jƒ| _nt| jƒ| _|
 *¡ dd fW S  t$�y× } zd d |fW  Y d }~S d }~ww )!Nz#[WSNETDirect][Kerberos][%s] spn: %sz%[WSNETDirect][Kerberos][%s] flags: %sz'[WSNETDirect][Kerberos][%s] cb_data: %sz([WSNETDirect][Kerberos][%s] authData: %sr   zF[WSNETDirect][Kerberos][%s] Initializing auth context, fetching ticketÚKERBEROSÚ é   ó    )Úauthdataz0[WSNETDirect][Kerberos][%s][Response] Status: %sz8[WSNETDirect][Kerberos][%s][Response] Response flags: %sz/[WSNETDirect][Kerberos][%s][Response] APREQ: %sé   TzA[WSNETDirect][Kerberos][%s] Calling remote end for mutual auth...z7[WSNETDirect][Kerberos][%s][Response] Response data: %szF[WSNETDirect][Kerberos][%s] Calling remote end to fetch Session Key...z4[WSNETDirect][Kerberos][%s][Response] SessionKey: %szenc-partr   é   zB[WSNETDirect][Kerberos][%s] Calling remote end to fetch SequenceNozS[WSNETDirect][Kerberos][%s][Response] Got wrapped token with SequenceNo, parsing...é   z8[WSNETDirect][Kerberos][%s][Response] Got SequenceNo: %sFzFSSPI Kerberos -RPC - auth encountered too many calls for authenticate.z?[WSNETDirect][Kerberos][%s][Response] Response contexttoken: %sÚinnerContextTokenÚticket)+r   Údebugr   r   r   r   ÚsubprotocolÚget_urlÚconnectr   r&   r#   ÚREPLAY_DETECTÚSEQUENCE_DETECTÚMUTUAL_AUTHr   ÚUSE_DCE_STYLEÚauthenticateÚvaluer   Úget_sessionkeyr   r   ÚloadÚnativer   r   Ú
gssapi_smbr   r   Úget_sequencenor
   Ú
from_bytesÚSND_SEQr   Ú
disconnectÚ	Exceptionr   r	   r   ÚintÚenctypeÚdump)r   ÚauthDatar   Úcb_dataÚspnr0   Ú_ÚerrÚstatusÚretflagsÚapreqr+   Úsession_key_dataÚaprepÚraw_seq_dataÚ	tokendataÚtokenÚcipherÚer   r   r   rI   F   sÖ   €
ÿþý
ÿþýüû(
(



(




€ÿz&KerberosClientWSNETDirect.authenticate)r(   )NNN)Ú__name__Ú
__module__Ú__qualname__r   r!   r$   r'   r-   r2   r4   r6   r   rI   r   r   r   r   r      s    
r   )r   Úasyauthr   Ú!asyauth.protocols.kerberos.gssapir   Ú$asyauth.protocols.kerberos.gssapismbrN   Úasyauth.common.winapi.tokenr   Úasyauth.common.winapi.constantsr   Ú minikerberos.protocol.encryptionr   r   Ú"minikerberos.protocol.asn1_structsr   r	   Úminikerberos.gssapi.gssapir
   Úwsnet.agent.direct.authr   r   r   r   r   r   Ú<module>   s    