o
    �õ±j,  ã                   @   s¢   d dl mZ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 d d	lmZ d d
lmZ G dd„ dƒZdS )é    )Ú
get_gssapiÚGSSWrapToken)ÚAP_REP)ÚKey)ÚISC_REQ)r   Ú_enctype_table)r   ÚAP_REQ)r   )r   )ÚInitialContextToken)Ú	WSNETAuthc                   @   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 )ÚKerberosClientWSNETc                 C   s<   d| _ || _tƒ | _d | _d | _d | _d | _d | _d | _	d S )Nr   )
Ú
iterationsÚsettingsr
   ÚksspiÚclientÚtargetÚgssapiÚetypeÚsession_keyÚ
seq_number)Úselfr   © r   úš/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asyauth/protocols/kerberos/client/wsnet.pyÚ__init__   s   
zKerberosClientWSNET.__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"KerberosClientWSNET.get_seq_numberc                 C   ó   t j| jv S )z3
		Checks if integrity protection was negotiated
		)r   Ú	INTEGRITYÚflagsr   r   r   r   Úsigning_needed$   ó   z"KerberosClientWSNET.signing_neededc                 C   r   )z3
		Checks if confidentiality flag was negotiated
		)r   ÚCONFIDENTIALITYr   r   r   r   r   Úencryption_needed*   r   z%KerberosClientWSNET.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KerberosClientWSNET.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KerberosClientWSNET.encryptc                 Ï   s   �| j j||g|¢R i |¤ŽS )z9
		Decrypts message. Also performs integrity checking.
		)r   Ú
GSS_Unwrap)r   r%   r&   r)   r*   r   r   r   Údecrypt=   s   €zKerberosClientWSNET.decryptc                 C   s   | j jS )N)r   Úcontentsr   r   r   r   Úget_session_keyC   s   z#KerberosClientWSNET.get_session_keyNr   c              
   Ë   sp  ��z�|d u rt 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 }| jj	dd|d|j
dd�I d H \}}}}	|	d urI|	‚t |ƒ| _|  jd7  _|dd fW S | jdkrö| jj	dd|d|j
|d�I d H \}}}
}	|	d ur~d d |	fW S t |ƒ| _| j ¡ I d H \}}	|	d ur—d d |	fW S t |
¡j}t|d	 d
 |ƒ| _t j| jv r´t| jƒ| _nt| jƒ| _|d	 d
 dkrá| j ¡ I d H \}}	|	d urÖd d |	fW S t |dd … ¡j| _|  jd7  _| j ¡ I d H  |
dd fW S tdƒ‚| jj	dd|d|j
dd�I d H \}}}}	|	d u�rd d |	fW S t |ƒ| _t |¡}t|jd ƒ}| j ¡ I d H \}}	|	d u�r;|	‚tt|jd d	 d
 ƒ ƒ }t|j |ƒ| _| j ¡ I d H  |jd d	 d
 dk�r„| j ¡ I d H \}}	|	d u�ryd d |	fW S t |dd … ¡j| _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 )Nr   ÚKERBEROSÚ é   ó    )Úauthdataé   Tzenc-partr   é   é   FzFSSPI Kerberos -RPC - auth encountered too many calls for authenticate.ÚinnerContextTokenÚticket)"r   r    r   ÚREPLAY_DETECTÚSEQUENCE_DETECTÚMUTUAL_AUTHr   ÚUSE_DCE_STYLEr   ÚauthenticateÚvaluer   Úget_sessionkeyr   ÚloadÚnativer   r   Ú
gssapi_smbr   r   Úget_sequencenor   Ú
from_bytesÚSND_SEQr   Ú
disconnectÚ	Exceptionr	   r   r   ÚintÚenctypeÚdump)r   ÚauthDatar   Úcb_dataÚspnr*   ÚstatusÚretflagsÚapreqÚerrr%   Úsession_key_dataÚaprepÚraw_seq_dataÚ	tokendataÚtokenÚcipherÚer   r   r   r?   F   s˜   €ÿþý

ÿþýüû(

(
(




€ÿz KerberosClientWSNET.authenticate)r"   )NNN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r!   r'   r,   r.   r0   r   r?   r   r   r   r   r      s    
r   N)Úminikerberos.gssapi.gssapir   r   Ú"minikerberos.protocol.asn1_structsr   Ú minikerberos.protocol.encryptionr   Úasyauth.common.winapi.constantsr   r   r   Ú$asyauth.protocols.kerberos.gssapismbrD   Úasyauth.common.winapi.tokenr	   Úwsnet.pyodide.clientauthr
   r   r   r   r   r   Ú<module>   s   