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 r‹d}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ƒsœtdƒ‚|jd | _| j|jd  | _	|d | _ | j|d g|¢R i |¤ŽI dH \}}	}
|
durÍdd|
fS t|ƒ ¡ |	dfS t |¡}|j}|d dkrì|d du rìdS |d du rôd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
ÿ