o
    �õ±jé  ã                   @   s‚   d dl Z d dlZd dlmZ d dlmZ d dlmZmZm	Z	m
Z
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dS )
é    N)ÚasyauthSecret)ÚKerberosCredential)ÚMESSAGE_TYPEÚPKU2U_TOKEN_TYPEÚgenerate_verifyÚgenerate_initiator_metadataÚgenerate_init_negoÚgenerate_ap_reqÚnegoexts_parse_bytes)Ú
get_gssapi)ÚPKINIT)Ú	UniTargetc                   @   sP   e Zd Zdefdd„Zdd„ Zdd„ Zdd	d
„Zdd„ Zddd„Z	ddd„Z
dS )ÚSPNEGOEXClientNativeÚ
credentialc                 C   sX   || _ d | _| j  ¡ | _d | _d| _t d¡| _d| _	d| _
d| _d | _d | _d| _d S )NFé   r   ó    )r   ÚtargetÚ
get_pkinitÚpkinitÚgssapiÚis_azureÚosÚurandomÚ_convidÚ_msgctrÚ_krb_finished_dataÚ_msgsÚsession_key_dataÚxxxxxÚiteractions)Úselfr   © r!   ú›/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asyauth/protocols/spnegoex/client/native.pyÚ__init__   s   
zSPNEGOEXClientNative.__init__c                 C   s   | j jS ©N)Úsession_keyÚcontents©r    r!   r!   r"   Úget_session_key&   s   z$SPNEGOEXClientNative.get_session_keyc                 C   s"   t | j| j| jj| jj ¡ d�ƒS )N)r   )r   r   r   r   Úget_metadatar   r   Úget_hostname_or_ipr'   r!   r!   r"   Ú__get_metadata)   s   "z#SPNEGOEXClientNative.__get_metadataÚinitc                 Ã   ó   �| j  ||¡S r$   )r   Ú
GSS_GetMIC)r    ÚdataÚ
message_noÚ	directionr!   r!   r"   Úsign,   ó   €zSPNEGOEXClientNative.signc                 Ã   r-   r$   )r   ÚGSS_Wrap)r    r/   r0   r!   r!   r"   Úencrypt/   r3   zSPNEGOEXClientNative.encryptNc                 Ã   s   �| j j||||d�S )N)r1   Ú	auth_data)r   Ú
GSS_Unwrap)r    r/   r0   r1   r6   r!   r!   r"   Údecrypt2   s   €zSPNEGOEXClientNative.decryptc           !      Ë   sr  �| j dkr~|  ¡  |  j d7  _ | jdu r%| jj| jj ¡ g d¢d�}n| jjjd u r0t	dƒ‚| jjg d¢d�}t
| j| jƒ}|  jd7  _|  ¡ }|  jd7  _t| j| j|tjƒ\}}	|  j|	7  _|  jd7  _|| | }
|  j|
7  _|
dd fS | j dk�r8ddlm}m}m}m} |  j d7  _ |  j|7  _t|ƒ}|  jt|ƒ7  _|tj jjj}|  j|tj j7  _| j  |¡\}}}|| _!i | _"|j#| j"d	< t$ %d
¡| j"d< || j"d	  }||j&| j"d ƒ}|d }| j '|||| j"| j¡}t| j| j|tj(ƒ\}}|  jd7  _| )|d| j| ¡}t*| j| j|dƒ}|  jd7  _|| }|  j|7  _|dd fS | j dk�r·ddlm}m}m}m} ddl+m,} |  j d7  _ |  j|7  _t|ƒ}|  jt|ƒ7  _|tj jjj}|t-|d d ƒ ƒ }|d d }||j&| j!j.ƒ}| /|d|¡}| 0|¡j} |t-| d d	 ƒ ƒ }||j&| d d ƒ| _1t2| j1ƒ| _3dS d S )Nr   é   T)ÚforwardableÚ	renewableÚ	proxiableÚcanonicalize)r   Úkdcoptsz$DC IP must be set for kerberos auth!)r>   )ÚEnctypeÚ_checksum_tableÚ_enctype_tableÚKeyÚkeytypeé    Úkeyvaluer   é   é   )ÚEncAPRepPartzenc-partÚetypeÚcipheré   Úsubkey)NFN)4r   Úsetupr   r   Úbuild_asreqr   r   r*   Údc_ipÚ	Exceptionr   r   r   Ú#_SPNEGOEXClientNative__get_metadatar	   r   Ú
KRB_AS_REQr   r   Ú minikerberos.protocol.encryptionr?   r@   rA   rB   r
   Úlenr   Ú	CHALLENGEÚExchangeÚinner_tokenÚnativeÚexchange_data_rawÚdecrypt_asrepr   r   ÚAES256r   r   ÚenctypeÚbuild_apreqÚ
KRB_AP_REQÚchecksumr   Ú"minikerberos.protocol.asn1_structsrH   Úintr&   r8   Úloadr%   r   r   )!r    ÚauthDataÚflagsÚspnÚkwargsÚasreqÚnegodataÚmetadataÚap_reqÚ	token_rawÚmsgr?   r@   rA   rB   ÚmsgsÚas_repÚencasrepr%   rJ   Úsubkey_cipherÚ
subkey_keyÚsubkey_checksumÚ
ap_req_msgÚ_Úchecksum_finalÚ
verify_msgÚret_msgrH   Úap_repÚcipher_textÚtempÚenc_partr!   r!   r"   Úauthenticate5   s|   €



çz!SPNEGOEXClientNative.authenticate)r,   )r,   N)NN)Ú__name__Ú
__module__Ú__qualname__r   r#   r(   rQ   r2   r5   r8   r|   r!   r!   r!   r"   r      s    

r   )r   Úbase64Úasyauth.common.constantsr   Ú#asyauth.common.credentials.kerberosr   Ú,asyauth.protocols.spnegoex.protocol.messagesr   r   r   r   r   r	   r
   Ú$asyauth.protocols.kerberos.gssapismbr   Úminikerberos.pkinitr   Úasysocks.unicomm.common.targetr   r   r!   r!   r!   r"   Ú<module>   s   	$