o
    àý°j>  ã                   @   s2  d dl Z 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	 d dl
mZ d dlmZmZ ze ¡ ZW n ey?   eZY nw dZdZd	Zd
ZdZdZdZdZdZdZdZdZdZe  dd¡Z dZ!dd„ Z"G dd„ dƒZ#G dd„ deƒZ$dd„ Z%G dd„ dƒZ&G dd „ d ƒZ'G d!d"„ d"e'ƒZ(G d#d$„ d$e'ƒZ)dS )%é    N)Úb)ÚHMACÚMD5)ÚARC4)Ú	Structure)Ú	constantsÚcryptoi   é   é   é   é   é   é    é   é   é   é   é   z<Hs   	*†H†÷c                 C   s(   dt | ƒd  d@ }t d|¡| }|S )Nr   é   z<B)ÚlenÚstructÚpack)ÚdataÚpadÚ	padbuffer© r   ú‡/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/krb5/gssapi.pyÚ_calculateMICPad?   s   r   c                   @   sH   e Zd Zdefdd„Zeddd„ƒZedd„ ƒZedd	„ ƒZd
d„ Z	dS )ÚMechIndepTokenNc                 C   s   || _ || _d S ©N)r   Ú	token_oid)Úselfr   Úoidr   r   r   Ú__init__G   s   
zMechIndepToken.__init__c                 C   s~   | dd… dkrt dƒ‚| dd … } t | ¡\}} | d|… }t |dd … ¡\}} |d|d … }||d d … } t| |ƒS )Nr   r	   ó   `zIncorrect token data!r
   )Ú	Exceptionr   Ú
get_length)r   ÚlengthÚ
token_dataÚ
oid_lengthr    r   r   r   Ú
from_bytesK   s   
zMechIndepToken.from_bytesc                 C   sX   | d dk r| d | dd … fS | d d }t j| dd| … ddd�| d| d … fS )Nr   é€   r	   ÚbigF©Ú	byteorderÚsigned)Úintr*   )r   Úbytes_countr   r   r   r&   W   s   ,zMechIndepToken.get_lengthc                 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,   Fr-   é   r   )Úto_bytesÚ
bit_lengthr   )r'   Úlbr   r   r   Úencode_length_   s   zMechIndepToken.encode_lengthc                 C   s<   | j | j }d|  t|ƒ¡ | }|d t| jƒ … | jfS )Nr$   )r    r   r6   r   )r!   Útempr   r   r   r3   g   s   zMechIndepToken.to_bytesr   )
Ú__name__Ú
__module__Ú__qualname__ÚKRB_OIDr#   Ústaticmethodr*   r&   r6   r3   r   r   r   r   r   E   s    

r   c                   @   ó   e Zd ZdZdS )ÚCheckSumField))ÚLgthz<L=16)ÚBndz16s=b"")ÚFlagsz<L=0N©r8   r9   r:   Ú	structurer   r   r   r   r>   m   ó    r>   c                 C   sP   | j tjjjkrtƒ S | j tjjjkrtƒ S | j tjjjkr!t	ƒ S t
d| j  ƒ‚)NzUnsupported etype 0x%x)Úenctyper   ÚEncryptionTypesÚaes256_cts_hmac_sha1_96ÚvalueÚGSSAPI_AES256Úaes128_cts_hmac_sha1_96ÚGSSAPI_AES128Úrc4_hmacÚ
GSSAPI_RC4r%   )Úcipherr   r   r   ÚGSSAPIt   s   rO   c                   @   s^   e Zd ZG dd„ deƒZG dd„ deƒZddd„Zdd
d„Zddd„Zddd„Z	ddd„Z
d	S )rM   c                   @   r=   )zGSSAPI_RC4.MIC))ÚTOK_IDz	<H=0x0101©ÚSGN_ALGú<H=0)ÚFillerz<L=0xffffffff©ÚSND_SEQú8s=b""©Ú	SGN_CKSUMrW   NrB   r   r   r   r   ÚMIC�   rD   rZ   c                   @   r=   )zGSSAPI_RC4.WRAP))rP   z	<H=0x0102rQ   )ÚSEAL_ALGrS   )rT   z	<H=0xffffrU   rX   )Ú
ConfounderrW   NrB   r   r   r   r   ÚWRAP‹   rD   r]   Úinitc                 C   s  d}|   ¡ }t|ƒ}||7 }t|d< |dkr!t d|¡d |d< n
t d|¡d |d< t |jdt¡ 	¡ }t t d	d
¡| 
¡ d d…  | ¡ 	¡ }	t ||	t¡ 	¡ }	|	d d… |d< t |jt d	d¡t¡ 	¡ }
t |
|d t¡ 	¡ }
t |
¡ |d ¡|d< || 
¡  }|S )Ns   `#	*†H†÷rR   r^   ú>Ló       rV   ó   ÿÿÿÿó   signaturekey ú<Lé   r   rY   r   )rZ   r   ÚGSS_HMACr   r   r   ÚnewÚcontentsr   ÚdigestÚgetDatar   Úencrypt)r!   Ú
sessionKeyr   ÚsequenceNumberÚ	directionÚGSS_GETMIC_HEADERÚtokenr   ÚKsignÚ	Sgn_CksumÚKseqÚ	finalDatar   r   r   Ú
GSS_GetMIC–   s"   *zGSSAPI_RC4.GSS_GetMICTNc                 C   sØ  d}|   ¡ }dt|ƒd  d@ }	tt|	ƒƒ|	 }
||
7 }t|d< t|d< |dkr3t d|¡d |d	< n
t d|¡d
 |d	< td dd„ t	dƒD ƒ¡ƒ|d< t
 |jdt¡ ¡ }t t dd¡| ¡ d d…  |d  | ¡ ¡ }tƒ }ddlm} ||jƒD ]	}| |dA ¡ q~t
 |t dd¡t¡ ¡ }t
 |t d|¡t¡ ¡ }t
 ||t¡ ¡ }|d d… |d< t
 |jt dd¡t¡ ¡ }t
 ||d t¡ ¡ }t |¡ |d	 ¡|d	< |d u�rGddlm} |   |t|ƒ ƒt|ƒ d … ¡}|d	 }t
 |jt dd¡t¡ ¡ }t
 ||d t¡ ¡ }t |¡ |d	 ¡}t
 |t dd¡t¡ ¡ }t
 ||d d… t¡ ¡ }t |¡}| |d | ¡dd … }n|du �r`t |¡}| |d ¡|d< | |¡}n|}|| ¡  }||fS )Ns   `+	*†H†÷r   r2   rR   r[   r^   r_   r`   rV   ra   Ú c                 S   ó   g | ]}t  tj¡‘qS r   ©ÚrandÚchoiceÚstringÚascii_letters©Ú.0Ú_r   r   r   Ú
<listcomp>Ä   ó    z'GSSAPI_RC4.GSS_Wrap.<locals>.<listcomp>r\   rb   rc   é   r   ©Úbyteséð   rY   ©ÚSEC_TRAILERr   T)r]   r   r   Úchrre   ÚGSS_RC4r   r   ÚjoinÚranger   rf   rg   r   rh   ri   Ú	bytearrayÚbuiltinsrƒ   Úappendr   rj   Úimpacket.dcerpc.v5.rpcrtr†   Údecrypt)r!   rk   r   rl   rm   rj   ÚauthDataÚGSS_WRAP_HEADERro   r   ÚpadStrrp   rq   ÚKlocalrƒ   ÚnÚKcryptrr   r†   ÚwrapÚsnd_seqÚrc4Ú
cipherTextrs   r   r   r   ÚGSS_Wrap®   sT    2
 


zGSSAPI_RC4.GSS_Wrapc                 C   s   |   ||||||¡S r   )rš   )r!   rk   r   rl   rm   rj   r�   r   r   r   Ú
GSS_Unwrapò   ó   zGSSAPI_RC4.GSS_Unwrapc                 C   sÆ  |r|d7 }|   ¡ }t|d< t|d< |dkr!t d|¡d |d< n
t d|¡d |d< td	 d
d„ tdƒD ƒ¡ƒ|d< t 	|j
dt¡ ¡ }t 	t dd¡| ¡ d d…  |d  | ¡ ¡ }tƒ }	ddlm}
 |
|j
ƒD ]	}|	 |dA ¡ qlt 	|	t dd¡t¡ ¡ }t 	|t d|¡t¡ ¡ }t 	||t¡ ¡ }|d d… |d< t 	|j
t dd¡t¡ ¡ }t 	||d t¡ ¡ }t 	|¡ |d ¡|d< |du �r8t |¡}|   |jd d… ¡}|jdd … }t 	|j
t dd¡t¡ ¡ }t 	||d t¡ ¡ }t 	|¡ |d ¡}t 	|	t dd¡t¡ ¡ }t 	||d d… t¡ ¡ }t 	|¡}| |d | ¡dd … }|d d… d fS |du �rat 	|¡}| |d ¡|d< | |¡}t| ¡ | tƒ ¡ \}}||fS d S )Nó   rR   r[   r^   r_   r`   rV   ra   ru   c                 S   rv   r   rw   r|   r   r   r   r     r€   z,GSSAPI_RC4.GSS_Wrap_LDAP.<locals>.<listcomp>r   r\   rb   rc   r�   r   r‚   r„   rY   Fr   r   éÿÿÿÿT)r]   re   rˆ   r   r   r   r‰   rŠ   r   rf   rg   r   rh   ri   r‹   rŒ   rƒ   r�   r   rj   r   r*   r   r�   r;   r3   )r!   rk   r   rl   rm   rj   ro   rp   rq   r“   rƒ   r”   r•   rr   Ú	sspi_wrapr–   r—   r˜   r™   rs   r   r   r   ÚGSS_Wrap_LDAPõ   sR    2





ûzGSSAPI_RC4.GSS_Wrap_LDAPc                 C   s   | j ||||dd�S )NF)rj   )r    )r!   rk   r   rl   rm   r   r   r   ÚGSS_Unwrap_LDAP2  rœ   zGSSAPI_RC4.GSS_Unwrap_LDAP©r^   ©r^   TN©r^   T)r8   r9   r:   r   rZ   r]   rt   rš   r›   r    r¡   r   r   r   r   rM      s    



D
=rM   c                   @   sv   e Zd ZdZdZG dd„ deƒZG dd„ deƒZddd„Zd	d
„ Z	dd„ Z
ddd„Zddd„Zddd„Zddd„ZdS )Ú
GSSAPI_AESNc                   @   r=   )zGSSAPI_AES.MIC))rP   z	>H=0x0404©rA   zB=0)ÚFiller0úB=0xff)rT   z>L=0xffffffffrU   )rY   z12s=b""NrB   r   r   r   r   rZ   9  rD   rZ   c                   @   r=   )zGSSAPI_AES.WRAP))rP   z	>H=0x0504r¦   )rT   r¨   )ÚECú>H=0)ÚRRCrª   rU   NrB   r   r   r   r   r]   D  rD   r]   r^   c                 C   sb   |   ¡ }t|ƒ}||7 }|  ¡ }d|d< t d|¡|d< | |t|| ¡ d d…  ¡|d< | ¡ S )Nr   rA   ú>QrV   r   rY   )rZ   r   ÚcheckSumProfiler   r   ÚchecksumÚKG_USAGE_INITIATOR_SIGNri   )r!   rk   r   rl   rm   ro   r   r­   r   r   r   rt   N  s   "zGSSAPI_AES.GSS_GetMICc                 C   s4   |t |ƒ; }t |ƒ| }||d … |d |…  }|S r   ©r   )r!   r   ÚnumBytesÚleftÚresultr   r   r   Úrotate\  s   zGSSAPI_AES.rotatec                 C   s(   |t |ƒ; }||d … |d |…  }|S r   r°   )r!   r   r±   r³   r   r   r   Úunrotateb  s   zGSSAPI_AES.unrotateTc                 C   sô   |   ¡ }|  ¡ }|jt|ƒ|j  d@ }d| }	||	7 }d}
d|d< ||d< d|d< t d	|¡|d
< | |t|| ¡  d ¡}|
|d< |  	||d |d  ¡}|t|   ¡ ƒ|d  |d  d … }| ¡ |d t|   ¡ ƒ|d  |d  …  }||fS )Nrd   ó   ÿé   é   rA   r©   r   r«   r¬   rV   ©
r]   Ú
cipherTypeÚ	blocksizer   r   r   rj   ÚKG_USAGE_INITIATOR_SEALri   r´   )r!   rk   r   rl   rm   rj   ro   rN   r   r’   Úrrcr™   Úret1Úret2r   r   r   rš   g  s    $,zGSSAPI_AES.GSS_Wrapc                 C   s–   ddl m} |  ¡ }|  |t|ƒ ƒd … ¡}	|t|  ¡ ƒt|ƒ ƒ d … | }
|  |
|	d |	d  ¡}| |t|¡}|d |	d t|  ¡ ƒ  … d fS )Nr   r…   r«   r©   )rŽ   r†   rº   r]   r   rµ   r�   ÚKG_USAGE_ACCEPTOR_SEAL)r!   rk   r   rl   rm   rj   r�   r†   rN   ro   Úrotatedr™   Ú	plainTextr   r   r   r›   …  s   ""zGSSAPI_AES.GSS_UnwrapFc                 C   s¸   |   ¡ }|  ¡ }d}	|r |jt|ƒ|j  d@ }	d|	 }
||
7 }d}d|d< |	|d< d|d< t d	|¡|d
< | |t|| ¡  d ¡}||d< |  	||d |d  ¡}|}| ¡ }||fS )Nr   rd   r¶   r·   r¸   rA   r©   r«   r¬   rV   r¹   )r!   rk   r   rl   rm   rj   Úuse_paddingro   rN   r   r’   r½   r™   r¾   r¿   r   r   r   r    ’  s$   zGSSAPI_AES.GSS_Wrap_LDAPc           
      C   sf   |   ¡ }|  |d d… ¡}|dd … }|  ||d |d  ¡}| |t|¡}	|	d |d d  … d fS )Nr   r«   r©   )rº   r]   rµ   r�   rÀ   )
r!   rk   r   rl   rm   rN   ro   rÁ   r™   rÂ   r   r   r   r¡   ´  s   zGSSAPI_AES.GSS_Unwrap_LDAPr¢   r¤   r£   )r^   TF)r8   r9   r:   r­   rº   r   rZ   r]   rt   r´   rµ   rš   r›   r    r¡   r   r   r   r   r¥   5  s    




"r¥   c                   @   ó   e Zd ZejZejZdS )rI   N)r8   r9   r:   r   Ú_SHA1AES256r­   Ú
_AES256CTSrº   r   r   r   r   rI   À  ó    
rI   c                   @   rÄ   )rK   N)r8   r9   r:   r   Ú_SHA1AES128r­   Ú
_AES128CTSrº   r   r   r   r   rK   Ä  rÇ   rK   )*r   Úrandomrz   Úsixr   ÚCryptodome.Hashr   r   ÚCryptodome.Cipherr   Úimpacket.structurer   Úimpacket.krb5r   r   ÚSystemRandomrx   ÚNotImplementedErrorÚGSS_C_DCE_STYLEÚGSS_C_DELEG_FLAGÚGSS_C_MUTUAL_FLAGÚGSS_C_REPLAY_FLAGÚGSS_C_SEQUENCE_FLAGÚGSS_C_CONF_FLAGÚGSS_C_INTEG_FLAGre   rˆ   rÀ   ÚKG_USAGE_ACCEPTOR_SIGNr¼   r¯   r   ÚKRB5_AP_REQr;   r   r   r>   rO   rM   r¥   rI   rK   r   r   r   r   Ú<module>   sN   þ( 7 