o
    j                     @   s   d dl Z d dlZd dlmZ d dlmZmZ d dlmZm	Z	m
Z
 d dlmZmZmZ d dlmZ d dlmZ d dlmZ G d	d
 d
ZG dd dZdS )    N)	KRB5Token)
get_gssapiGSSWrapToken)AP_REQAP_REPTGS_REP)EnctypeKey_enctype_table)WSNETSSPIProxy)ObjectIdentifier)ISC_REQc                   @   sN   e Zd ZdddZedd Zedd Zedd	 Zed
d Zdd Z	dS )KRB5_MECH_INDEP_TOKENNc                 C   s   || _ || _|| _d S N)oiddatalength)selfr   r   remlen r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asyauth/protocols/kerberos/client/sspiproxy.py__init__   s   
zKRB5_MECH_INDEP_TOKEN.__init__c                 C   s   t t| S r   )r   from_bufferioBytesIO)r   r   r   r   
from_bytes   s   z KRB5_MECH_INDEP_TOKEN.from_bytesc                 C   s   |  d}|dkrtdt| }|  |}t|} |  }|  d t| }| | t	|  |d }t|   t
||dS )N      `zIncorrect token data!   )r   )read	Exceptionr   decode_length_bufferr   r   tellseekr   loadstr)buffstartremaining_length
token_datapos
oid_length	token_oidr   r   r   r      s   






z!KRB5_MECH_INDEP_TOKEN.from_bufferc                 C   s@   |  dd }|dkr|}|S |d }tj|  |ddd}|S )Nr   r         bigF	byteordersigned)r   intr   )r&   lfr   bcountr   r   r   r!   -   s   z*KRB5_MECH_INDEP_TOKEN.decode_length_bufferc                 C   sL   | dkr| j ddddS |  |  d d d}dt| j dddd| S )	Nr-   r   r/   Fr0         r.   )to_bytes
bit_lengthlen)r   lbr   r   r   encode_length7   s   z#KRB5_MECH_INDEP_TOKEN.encode_lengthc                 C   sD   t | j | j }dtt| | }|d t| j  | jfS )Nr   )r   r   dumpr   r   r<   r:   )r   tr   r   r   r8   @   s   zKRB5_MECH_INDEP_TOKEN.to_bytesr   )
__name__
__module____qualname__r   staticmethodr   r   r!   r<   r8   r   r   r   r   r      s    



	
r   c                   @   sR   e Zd Zdd Zdd Zdd Zdd ZdddZdd Zd
e	j
ddfddZd
S )KerberosClientSSPIProxyc                 C   sR   d| _ || _t|j |jj| _d | _d | _d | _	d | _
d | _d | _|   d S )Nr   )
iterations
credentialr   subprotocolget_urlagentidksspiclienttargetgssapietypesession_key
seq_numbersetup)r   rE   r   r   r   r   F   s   z KerberosClientSSPIProxy.__init__c                 C   s   d S r   r   r   r   r   r   rP   S   s   zKerberosClientSSPIProxy.setupc                 C      | j S r   )rO   rQ   r   r   r   get_seq_numberV      z&KerberosClientSSPIProxy.get_seq_numberc                    s   | j ||S r   )rL   GSS_Wrap)r   r   
message_nor   r   r   encryptY   s   zKerberosClientSSPIProxy.encryptinitNc                    s   | j j||||dS )N)	direction	auth_data)rL   
GSS_Unwrap)r   r   rV   rY   rZ   r   r   r   decrypt\   s   zKerberosClientSSPIProxy.decryptc                 C   rR   r   )rN   rQ   r   r   r   get_session_key_   rT   z'KerberosClientSSPIProxy.get_session_keyr   Fc              
      sh  z|dkr| j dkrItjtjB tjB tjB tjB tjB }| jj	ddd| j
j d|jddI d H \}}}}	|	d ur<|	|  j d	7  _ |dd fW S | j d	kr| jj	ddd| j
j d|j|dI d H \}}}
}	|	d urpd d |	fW S | j I d H \| _}	|	d urd d |	fW S t|
j}t|d
 d | j}t|| _|d
 d dkr| j I d H \}}	|	d urd 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
j d|jddI d H \}}}}	|	d urd d |	fW S | j I d H \| _}	|	d ur|	| j I d H  |dd fW S  ty3 } zd d |fW  Y d }~S d }~ww )NTr   KERBEROS z
termsrv/%s       )authdatar   zenc-partrM         FzFSSPI Kerberos -RPC - auth encountered too many calls for authenticate.)rD   r   CONFIDENTIALITY	INTEGRITYMUTUAL_AUTHREPLAY_DETECTSEQUENCE_DETECTUSE_DCE_STYLErI   authenticatesettingsrK   valueget_sessionkeyrN   r   r$   nativer	   r   rL   get_sequencenor   r   SND_SEQrO   
disconnectr    )r   authDataflagsrO   is_rpckwargsstatusctxattrapreqerrr   aprepsubkeyraw_seq_dataer   r   r   rk   b   sf   
0
0
0
z$KerberosClientSSPIProxy.authenticate)rX   N)r?   r@   rA   r   rP   rS   rW   r\   r]   r   
CONNECTIONrk   r   r   r   r   rC   E   s    
rC   )r   enum.asyauth.protocols.spnego.messages.asn1_structsr   minikerberos.gssapi.gssapir   r   "minikerberos.protocol.asn1_structsr   r   r    minikerberos.protocol.encryptionr   r	   r
   wsnet.operator.sspiproxyr   asn1crypto.corer   asyauth.common.winapi.constantsr   r   rC   r   r   r   r   <module>   s    9