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r…d d |	fW S t |
¡j}t|d
 d | jƒ}t|ƒ| _|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
j d|jdd�I d H \}}}}	|	d urüd 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