o
    j,                     @   sT   d dl Z d dlmZ d dlT d dlmZ G dd dZdd Zed	kr(e  dS dS )
    N)asyauthProtocol)*)SPNEGOCredentialc                   @   s   e Zd ZdefddZdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zd3ddZdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2S )4SPNEGOClientNative
credentialc                 C   s4   || _ i | _i | _d | _d | _d | _d| _d| _d S )Nr   )r   authentication_contexts original_authentication_contexts$selected_authentication_context_nameselected_authentication_contextselected_mechtypeiteration_ctrinternal_seqselfr    r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asyauth/protocols/spnego/client/native.py__init__   s   
zSPNEGOClientNative.__init__c                 C   
   | j  S N)r   build_contextr   r   r   r   get_copy      
zSPNEGOClientNative.get_copyc                 C   s   | j S r   )r   r   r   r   r   get_internal_seq!   s   z#SPNEGOClientNative.get_internal_seqc                 C   s   t | j S )z\
		Returns a list of authentication context names available to the SPNEGO authentication.
		)listr   keysr   r   r   r   list_original_conexts$   s   z(SPNEGOClientNative.list_original_conextsc                 C   s   t | j| S )z
		Returns a copy of the original (not used) authentication context specified by name.
		You may use this ctx to perform future authentication, as it has the user credentials
		)copydeepcopyr   )r   ctx_namer   r   r   get_original_context*   s   z'SPNEGOClientNative.get_original_contextc                 C   sf   | j d u r	td| jjD ]#}| j dkr|jtjkr|  S | j dkr-|jtjkr-|  S tdd S )Nz#No authentication context selected!2NTLMSSP - Microsoft NTLM Security Support ProviderzMS KRB5 - Microsoft Kerberos 5z'Could not identify correct credentials!)r	   	Exceptionr   credentialsprotocolr   NTLMKERBEROSr   r   r   r   get_active_credential1   s   
z(SPNEGOClientNative.get_active_credentialc                 C   s0   | j d u r	tdt| j ddu r| j  S dS )Nz&Call this after selecting auth method!is_guestTF)r
   r"   hasattrr(   r   r   r   r   r(   <   s
   

zSPNEGOClientNative.is_guestc                 C   r   r   )r
   signing_neededr   r   r   r   r*   D   r   z!SPNEGOClientNative.signing_neededc                 C   r   r   )r
   encryption_neededr   r   r   r   r+   G   r   z$SPNEGOClientNative.encryption_neededc                 C   r   r   )r
   get_seq_numberr   r   r   r   r,   J   r   z!SPNEGOClientNative.get_seq_numberc                    s   |S r   r   )r   datar   r   r   unsignM   s   zSPNEGOClientNative.unsignc                    s   | j ||I d H S r   )r
   verify)r   r-   	signaturer   r   r   r/   Q   s   zSPNEGOClientNative.verifyinitFc                    s   | j j||||dI d H S )N)	directionreset_cipher)r
   sign)r   r-   
message_nor2   r3   r   r   r   r4   T   s   zSPNEGOClientNative.signc                    $   | j j||g|R i |I d H S r   )r
   encryptr   r-   r5   argskwargsr   r   r   r7   W      "zSPNEGOClientNative.encryptc                    r6   r   )r
   decryptr8   r   r   r   r<   Z   r;   zSPNEGOClientNative.decryptc                 C   s   || j |< | || j|< dS )a\  
		Add an authentication context to the given authentication context name.
		Valid names are:
			'NTLMSSP - Microsoft NTLM Security Support Provider'
			'MS KRB5 - Microsoft Kerberos 5'
			'KRB5 - Kerberos 5'
			'KRB5 - Kerberos 5 - User to User'
			'NEGOEX - SPNEGO Extended Negotiation Security Mechanism'
			
		Context MUST be already set up!
		N)r   _deep_copy_contextr   )r   namectxr   r   r   add_auth_context]   s   
z#SPNEGOClientNative.add_auth_contextc                 C   sR   t |dr"t |jdr"|jj}d|j_t|}||j_||j_dS t|}|S )zf
		Create a deep copy of the context, excluding the RSAPrivateKey object which is not serializable.
		ccredprivate_keyN)r)   rA   rB   r   r   )r   r?   rB   new_ctxr   r   r   r=   l   s   

z%SPNEGOClientNative._deep_copy_contextc                 C   s*   | j D ]}||v r|| j | f  S qdS )N)NN)r   )r   
mech_typesauth_type_namer   r   r    select_common_athentication_typez   s
   
z3SPNEGOClientNative.select_common_athentication_typec                    sX   | j j|g|R i |I d H \}}}|d urd d |fS |s!dS i }||d< ||d fS )NNFNresponseToken)r
   authenticate)r   
token_datar9   r:   resultto_continueerrresponser   r   r   process_ctx_authenticate   s   &

z+SPNEGOClientNative.process_ctx_authenticatec                 C   s   t | jdr| j S d S )Nget_extra_info)r)   r
   rP   r   r   r   r   rP      s   
z!SPNEGOClientNative.get_extra_infoc                 C   r   r   )r
   get_session_keyr   r   r   r   rQ      r   z"SPNEGOClientNative.get_session_keyc                 C   sH   ddi}dd | j D t|d}tdt|i}ttd|d S )	NhintNamez$not_defined_in_RFC4178@please_ignorec                 S   s   g | ]}t |qS r   )MechType).0mtr   r   r   
<listcomp>   s    z9SPNEGOClientNative.get_mechtypes_list.<locals>.<listcomp>)	mechTypesnegHintsnegTokenInit1.3.6.1.5.5.2typevalue)r   NegHintsNegotiationTokenNegTokenInit2GSSAPIGSSTypedump)r   neghinttokinitnegtokenr   r   r   get_mechtypes_list   s   z%SPNEGOClientNative.get_mechtypes_listc                    s  | j du r|du rd}g }| jD ]}|}|t| qi }t||d< t| | _t|dkru|| _| j| | _	|| _ | j	j
dg|R i |I dH \}}	}
|
durZdd|
fS |s^dS t|d d dkrqt| |d< n||d< tdt|i}ttd	|d
 ddfS t|}|j}t|tstd|jd | _| j|jd  | _	|d | _ | j|d g|R i |I dH \}}	}
|
durdd|
fS t| |	dfS t|}|j}|d dkr|d du rdS |d du rdS | j|d g|R i |I dH \}}	}
|
durdd|
fS |sdS | j dr3| j| jdddI dH |d< |  jd7  _tdt|i }|d dkrFdS ||	dfS )z
		This function is called (multiple times) during negotiation phase of a protocol to determine hich auth mechanism to be used
		Token is a byte array that is an ASN1 NegotiationToken structure.
		NrW      rG   r   z1.2.840.48018.1.2.2	mechTokenrY   rZ   r[   TzServer sent init???supportedMechrH   negStatezaccept-completed)NTNr%   )r3   mechListMICnegTokenResp)r   r   appendrS   	MechTypesrc   negtypes_storelenr	   r
   rI   str	KRB5Tokento_bytesr_   r`   ra   rb   loadnative
isinstanceNegTokenRespr"   rW   rO   
startswithr4   r   )r   tokenr9   r:   selected_name	mechtypesmechnamerN   rK   rL   rM   rf   neg_token_raw	neg_tokenresr   r   r   rI      sl   

&



(

(


zSPNEGOClientNative.authenticateN)r1   F)__name__
__module____qualname__r   r   r   r   r   r    r'   r(   r*   r+   r,   r.   r/   r4   r7   r<   r@   r=   rF   rO   rP   rQ   rg   rI   r   r   r   r   r      s0    
r   c                  C   s   t d} t| }t|j t d}t|}t|j t d}t|}t|j td}t| ttd ttd d S )Nڀa03e303ca00e300c060a2b06010401823702020aa22a04284e544c4d5353500001000000978208e2000000000000000000000000000000000a00d73a0000000f  a181ce3081cba0030a0101a10c060a2b06010401823702020aa281b50481b24e544c4d53535000020000000800080038000000158289e2a7314a557bdb11bf000000000000000072007200400000000a0063450000000f540045005300540002000800540045005300540001001200570049004e003200300031003900410044000400120074006500730074002e0063006f007200700003002600570049004e003200300031003900410044002e0074006500730074002e0063006f007200700007000800aec600bfc5fdd40100000000:a11b3019a0030a0100a3120410010000006b65125a00bb9ab400000000r!   z1.3.6.1.4.1.311.2.2.10)	bytesfromhexr_   ru   printrv   rS   mapunmap)	test_datar   test_data_2test_data_3rU   r   r   r   test	  s   








r   __main__)	r   asyauth.common.constantsr   .asyauth.protocols.spnego.messages.asn1_structs!asyauth.common.credentials.spnegor   r   r   r   r   r   r   r   <module>   s    x
