o
    �õ±j1  ã                   @   s  d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ dZG dd	„ d	e jƒZG d
d„ de jƒZG dd„ de jƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZdd„ Zdd„ Zedkr‚eƒ  dS dS )é    N)ÚEncryptionType)Ú
encryption)Úmd5)Úhmac)ÚRC4ó   `+	*†H†÷c                   @   s0   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )ÚGSSAPIFlagsi   i @  i    é   é   é   é   é   é    N)Ú__name__Ú
__module__Ú__qualname__ÚGSS_C_DCE_STYLEÚGSS_C_EXTENDED_ERROR_FLAGÚGSS_C_IDENTIFY_FLAGÚGSS_C_DELEG_FLAGÚGSS_C_MUTUAL_FLAGÚGSS_C_REPLAY_FLAGÚGSS_C_SEQUENCE_FLAGÚGSS_C_CONF_FLAGÚGSS_C_INTEG_FLAG© r   r   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/minikerberos/gssapi/gssapi.pyr      s    r   c                   @   s   e Zd ZdZdZdZdZdS )ÚKG_USAGEé   é   é   é   N)r   r   r   ÚACCEPTOR_SEALÚACCEPTOR_SIGNÚINITIATOR_SEALÚINITIATOR_SIGNr   r   r   r   r      s
    r   c                   @   s   e Zd ZdZdZdZdS )Ú
FlagsFieldr   r
   r   N)r   r   r   ÚSentByAcceptorÚSealedÚAcceptorSubkeyr   r   r   r   r&   "   s    r&   c                   @   ó4   e Zd Zdd„ Zedd„ ƒZedd„ ƒZdd„ Zd	S )
Ú
GSSMIC_RC4c                 C   s"   d| _ d| _d| _d | _d | _d S )Ns   ó    ó   ÿÿÿÿ©ÚTOK_IDÚSGN_ALGÚFillerÚSND_SEQÚ	SGN_CKSUM©Úselfr   r   r   Ú__init__)   ó
   
zGSSMIC_RC4.__init__c                 C   ó   t  t | ¡¡S ©N)r+   Úfrom_bufferÚioÚBytesIO©Údatar   r   r   Ú
from_bytes0   ó   zGSSMIC_RC4.from_bytesc                 C   sF   t ƒ }|  d¡|_|  d¡|_|  d¡|_|  d¡|_|  d¡|_|S )Nr
   r   r   )r+   Úreadr/   r0   r1   r2   r3   )ÚbuffÚmicr   r   r   r:   4   s   zGSSMIC_RC4.from_bufferc                 C   s<   | j }|| j7 }|| j7 }|| j7 }| jd ur|| j7 }|S r9   r.   ©r5   Útr   r   r   Úto_bytes?   s   




zGSSMIC_RC4.to_bytesN©r   r   r   r6   Ústaticmethodr?   r:   rF   r   r   r   r   r+   (   s    


r+   c                   @   r*   )
ÚGSSWRAP_RC4c                 C   s.   d| _ d| _d | _d| _d | _d | _d | _d S )Ns   r,   s   ÿÿ©r/   r0   ÚSEAL_ALGr1   r2   r3   Ú
Confounderr4   r   r   r   r6   J   ó   
zGSSWRAP_RC4.__init__c                 C   r8   r9   )rI   r:   r;   r<   r=   r   r   r   r?   S   r@   zGSSWRAP_RC4.from_bytesc                 C   s^   t ƒ }|  d¡|_|  d¡|_|  d¡|_|  d¡|_|  d¡|_|  d¡|_|  d¡|_|S )Nr
   r   )	rI   rA   r/   r0   rK   r1   r2   r3   rL   )rB   Úwrapr   r   r   r:   W   s   zGSSWRAP_RC4.from_bufferc                 C   sR   | j }|| j7 }|| j7 }|| j7 }|| j7 }| jr'|| j7 }| jr'|| j7 }|S r9   rJ   rD   r   r   r   rF   d   s   





zGSSWRAP_RC4.to_bytesNrG   r   r   r   r   rI   I   s    	

rI   c                   @   s2   e Zd Zdd„ Zddd„Zddd	„Zdd
d„ZdS )Ú
GSSAPI_RC4c                 C   s
   || _ d S r9   ©Úsession_key)r5   rQ   r   r   r   r6   t   s   
zGSSAPI_RC4.__init__Úinitc                 C   sT  d}dt |ƒd  d@ }t|gƒ| }||7 }tƒ }|dkr*|jdddd�d |_n|jdddd�d	 |_tj| jjd
d�}| 	d¡ | 
¡ }	d}
t|
jdddd�| ¡ d d…  ƒ 
¡ }tj|	d
d�}| 	|¡ | 
¡ d d… |_d}
tj| jjd
d�}| 	|
jdddd�¡ tj| 
¡ d
d�}| 	|j¡ | 
¡ }t|ƒ |j¡|_|| ¡  S )Ns   `#	*†H†÷r   é   rR   ÚbigF©Úsignedó       r-   r   ©Ú	digestmodó   signaturekey é   Úlittler   r   )ÚlenÚbytesr+   rF   r2   r   ÚnewrQ   ÚcontentsÚupdateÚdigestr   r3   r   Úencrypt)r5   r>   ÚsequenceNumberÚ	directionÚGSS_GETMIC_HEADERÚpadÚpadStrrC   Ú	Ksign_ctxÚKsignÚidÚtempÚ
chksum_ctxÚKseq_ctxÚKseqr   r   r   Ú
GSS_GetMICw   s0   
(
zGSSAPI_RC4.GSS_GetMICTNc                 C   s  d}dt |ƒd  d@ }t|gƒ| }||7 }tƒ }	d|	_|dkr-|jdddd	�d
 |	_n|jdddd	�d |	_t d¡|	_t	j
| jjdd�}
|
 d¡ |
 ¡ }d}t|jdddd	�|	 ¡ d d…  |	j | ƒ ¡ }t	j
|dd�}
|
 |¡ |
 ¡ d d… |	_d}| jjD ]}|t|dA gƒ7 }q†d}t	j
|dd�}
|
 |jdddd	�¡ t	j
|
 ¡ dd�}
|
 |jdddd	�¡ |
 ¡ }d}t	j
| jjdd�}
|
 |jdddd	�¡ t	j
|
 ¡ dd�}
|
 |	j¡ |
 ¡ }t|ƒ |	j¡|	_|d u�rlt |dt |ƒ d … ¡}d}t	j
| jjdd�}
|
 |jdddd	�¡ t	j
|
 ¡ dd�}
|
 |j¡ t|
 ¡ ƒ |j¡}d}t	j
|dd�}
|
 |jdddd	�¡ t	j
|
 ¡ dd�}
|
 |d d… ¡ |
 ¡ }t|ƒ}| |	j| ¡dd … }n|du �r‚t|ƒ}| |	j¡|	_| |¡}n|}||	 ¡  }||fS )Nr   r   é   s    rR   r   rT   FrU   rW   r-   r   rX   rZ   é   r\   ó    éð   r   T)r]   r^   rI   rK   rF   r2   ÚosÚurandomrL   r   r_   rQ   r`   ra   rb   r   r3   r   rc   r?   Údecrypt)r5   r>   Úseq_numre   rc   Ú	auth_dataÚGSS_WRAP_HEADERrg   rh   Útokenrl   rj   rk   Ú	Sgn_CksumÚklocalÚbÚKcryptro   rN   Úsnd_seqÚrc4Ú
cipherTextÚ	finalDatar   r   r   ÚGSS_Wrap�   sr   
2


zGSSAPI_RC4.GSS_Wrapc                 C   s   |   |||d|¡S )NF)r„   )r5   r>   rx   re   ry   r   r   r   Ú
GSS_Unwrapï   s   zGSSAPI_RC4.GSS_Unwrap)rR   )rR   TN©rR   N)r   r   r   r6   rp   r„   r…   r   r   r   r   rO   s   s
    

&RrO   c                   @   r*   )
ÚGSSMICc                 C   s"   d| _ d | _d| _d | _d | _d S )Ns   s   ÿÿÿÿÿ)r/   ÚFlagsr1   r2   r3   r4   r   r   r   r6   ô   r7   zGSSMIC.__init__c                 C   r8   r9   )r‡   r:   r;   r<   r=   r   r   r   r?   û   r@   zGSSMIC.from_bytesc                 C   s`   t ƒ }|  d¡|_ttj|  d¡ddd�ƒ|_|  d¡|_tj|  d¡ddd�|_|  ¡ |_	|S )Nr
   r	   rT   FrU   é   r   )
r‡   rA   r/   r&   Úintr?   rˆ   r1   r2   r3   ©rB   Úmr   r   r   r:   ÿ   s   
zGSSMIC.from_bufferc                 C   sT   | j }|| jjdddd�7 }|| j7 }|| jjdddd�7 }| jd ur(|| j7 }|S )Nr	   rT   FrU   r   )r/   rˆ   rF   r1   r2   r3   rD   r   r   r   rF   	  s   


zGSSMIC.to_bytesNrG   r   r   r   r   r‡   ó   s    

	r‡   c                   @   r*   )
ÚGSSWrapTokenc                 C   s.   d| _ d | _d| _d | _d | _d | _d | _d S )Ns   ó   ÿ)r/   rˆ   r1   ÚECÚRRCr2   ÚDatar4   r   r   r   r6     rM   zGSSWrapToken.__init__c                 C   r8   r9   )r�   r:   r;   r<   r=   r   r   r   r?     r@   zGSSWrapToken.from_bytesc                 C   s†   t ƒ }|  d¡|_ttj|  d¡ddd�ƒ|_|  d¡|_tj|  d¡ddd�|_tj|  d¡ddd�|_	tj|  d¡ddd�|_
|S )Nr
   r	   rT   FrU   r   )r�   rA   r/   r&   rŠ   r?   rˆ   r1   r�   r�   r2   r‹   r   r   r   r:   "  s   zGSSWrapToken.from_bufferc                 C   s€   | j }|| jjdddd�7 }|| j7 }|| jjdddd�7 }|| jjdddd�7 }|| jjdddd�7 }| jd ur>|| j7 }|S )Nr	   rT   FrU   r
   r   )r/   rˆ   rF   r1   r�   r�   r2   r‘   rD   r   r   r   rF   -  s   


zGSSWrapToken.to_bytesNrG   r   r   r   r   r�     s    	


r�   c                   @   s>   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zddd„ZdS )Ú
GSSAPI_AESc                 C   s   || _ || _|| _d | _d S r9   )rQ   Úchecksum_profileÚcipher_typeÚcipher)r5   rQ   r”   r“   r   r   r   r6   :  s   
zGSSAPI_AES.__init__c                 C   s4   |t |ƒ; }t |ƒ| }||d … |d |…  }|S r9   ©r]   )r5   r>   ÚnumBytesÚleftÚresultr   r   r   Úrotate@  s   zGSSAPI_AES.rotatec                 C   s(   |t |ƒ; }||d … |d |…  }|S r9   r–   )r5   r>   r—   r™   r   r   r   ÚunrotateF  s   zGSSAPI_AES.unrotatec                 C   st   dt |ƒd  d@ }t|gƒ| }||7 }tƒ }tj|_||_|  ¡ }| | j	t
jj|| ¡ d d…  ¡|_| ¡ S )Nr   rS   r   )r]   r^   r‡   r&   r)   rˆ   r2   r“   ÚchecksumrQ   r   r%   ÚvaluerF   )r5   r>   rx   rg   rh   rŒ   r“   r   r   r   rp   K  s   &zGSSAPI_AES.GSS_GetMICc           
      C   sÎ   |   ¡ }|jt|ƒ|j  d@ }d| }||7 }tƒ }tjtjB |_||_d|_	||_
| | jtjj|| ¡  d ¡}d|_	|  ||j	|j ¡}|d|j	 |j d … }| ¡ |d d|j	 |j …  }	||	fS )Nr[   rŽ   r   é   r   )r”   Ú	blocksizer]   r�   r&   r(   r)   rˆ   r�   r�   r2   rc   rQ   r   r$   r�   rF   rš   )
r5   r>   rx   r•   rg   rh   rE   Úcipher_textÚret1Úret2r   r   r   r„   X  s    zGSSAPI_AES.GSS_WraprR   Nc           
      C   sj   |   ¡ }t |dd … ¡}|dd … | }|  ||j|j ¡}| | jtj	j
|¡}	|	d |jd  … d fS )Nr   r    r   )r”   r�   r?   r›   r�   r�   rw   rQ   r   r"   r�   )
r5   r>   rx   re   ry   r•   rE   Úrotatedr    Ú
plain_textr   r   r   r…   m  s   zGSSAPI_AES.GSS_Unwrapr†   )	r   r   r   r6   rš   r›   rp   r„   r…   r   r   r   r   r’   9  s    r’   c                 C   sh   | j tjjkrt| tjtjƒS | j tjjkrt| tjtj	ƒS | j tjj
tjjfv r-t| ƒS td| j  ƒ‚)NzUnsupported etype %s)Úenctyper   ÚEnctypeÚAES256r’   Ú
_AES256CTSÚ_SHA1AES256ÚAES128Ú
_AES128CTSÚ_SHA1AES128r   ÚRC4_MD4rO   Ú	ExceptionrP   r   r   r   Ú
get_gssapix  s   r¯   c                  C   sÀ   t  d¡} t  d¡}t  d¡}t  d¡}t tjjt  d¡¡}t  d¡}d}t  d¡}t  d	¡}t|ƒ}	|	 ||¡\}
}|	j|
dd
| d� t	|
 
¡ ƒ t	| 
¡ ƒ |
|ksXJ ‚||ks^J ‚d S )NÚÀ810e00001a204de2d64fd111a3da0000f875ae0d1c4500003400000034000000008040050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffÚ 050406ff000c00000000000000000000Á  0880ed78d6196dde3f3fb23eeea650bc4ae025fa2a9c337c75c024d9d8f0186c75a4a9060e2a40a9ad024317bf5df6a86cb4a764a9ca36843f8fa4f99c03e2bde46f5a29aafc83dacdf9f0a5677446b5d910417142dc7b7ba7ded76cddc4acf9bf7ed44008cb9850e5701f2f9285dad6463ca8d0e365d4f1700f3d054e242ebcde2f3146ddd411a627af7486Á  08cb9850e5701f2f9285dad6463ca8d0e365d4f1700f3d054e242ebcde2f3146ddd411a627af74860880ed78d6196dde3f3fb23eeea650bc4ae025fa2a9c337c75c024d9d8f0186c75a4a9060e2a40a9ad024317bf5df6a86cb4a764a9ca36843f8fa4f99c03e2bde46f5a29aafc83dacdf9f0a5677446b5d910417142dc7b7ba7ded76cddc4acf9bf7ed440Ú@3e242e91996aadd513ecb1bc2369e44183e08e08c51550fa4b681e77f75ed8e1Ú¨810e00001a204de2d64fd111a3da0000f875ae0d1c4500003400000034000000008040050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffr   Ú¨4ae025fa2a9c337c75c024d9d8f0186c75a4a9060e2a40a9ad024317bf5df6a86cb4a764a9ca36843f8fa4f99c03e2bde46f5a29aafc83dacdf9f0a5677446b5d910417142dc7b7ba7ded76cddc4acf9bf7ed440Ú�050406ff000c001c000000000000000008cb9850e5701f2f9285dad6463ca8d0e365d4f1700f3d054e242ebcde2f3146ddd411a627af74860880ed78d6196dde3f3fb23eeea650bcs   ÿÿÿÿÿÿÿÿ)ry   )r^   Úfromhexr   ÚKeyr¦   r§   r¯   r„   r…   ÚprintÚhex)Údata_paddedÚtoken_1ÚcipherText_1ÚcipherText_2rQ   r>   rd   r¡   r¢   ÚgssapiÚr1Úr2r   r   r   Útestƒ  s    






rÃ   Ú__main__)Úenumr;   ru   Úminikerberos.protocol.constantsr   Úminikerberos.protocolr   Úunicrypto.hashlibr   Ú	unicryptor   Úunicrypto.symmetricr   rz   ÚIntFlagr   ÚEnumr   r&   r+   rI   rO   r‡   r�   r’   r¯   rÃ   r   r   r   r   r   Ú<module>   s0    !* !%?
ÿ