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rt	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rt 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rt d| j  | j I d H \}}|d urd 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rd 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rt d| j  | j I d H \}}|d urd d |fW S t d| j  t |dd  j!| _"t d| j| j"f  t	j| jv rt| 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    