o
    �õ±j>  ã                   @   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 dlmZ dZdZG d	d
„ 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)ÚObjectIdentifier)ÚEncryptionType)Ú
encryption)Úhmac)Úmd5)ÚRC4s   `+	*†H†÷c                   @   sN   e Zd Zddd„Zedd„ ƒZedd„ ƒZedd	„ ƒZed
d„ ƒZdd„ Z	dS )ÚKRB5_MECH_INDEP_TOKENNc                 C   s   || _ || _|| _d S ©N)ÚoidÚdataÚlength)Úselfr   r
   Úremlen© r   ú”/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asyauth/protocols/kerberos/gssapi.pyÚ__init__   s   
zKRB5_MECH_INDEP_TOKEN.__init__c                 C   ó   t  t | ¡¡S r	   )r   Úfrom_bufferÚioÚBytesIO©r   r   r   r   Ú
from_bytes#   ó   z KRB5_MECH_INDEP_TOKEN.from_bytesc                 C   sˆ   |   d¡}|dkrtdƒ‚t | ¡}|   |¡}t |¡} |  ¡ }|   d¡ t | ¡}|  |¡ t 	|   |d ¡¡}t|   ¡ t
|ƒ|d�S )Né   ó   `zIncorrect token data!é   )r   )ÚreadÚ	Exceptionr   Údecode_length_bufferr   r   ÚtellÚseekr   ÚloadÚstr)ÚbuffÚstartÚremaining_lengthÚ
token_dataÚposÚ
oid_lengthÚ	token_oidr   r   r   r   '   s   






z!KRB5_MECH_INDEP_TOKEN.from_bufferc                 C   s@   |   d¡d }|dkr|}|S |d }tj|   |¡ddd�}|S )Nr   r   é   é€   ÚbigF©Ú	byteorderÚsigned)r   Úintr   )r#   Úlfr   Úbcountr   r   r   r   9   s   þz*KRB5_MECH_INDEP_TOKEN.decode_length_bufferc                 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_lengthÚlen)r   Úlbr   r   r   Úencode_lengthC   s   z#KRB5_MECH_INDEP_TOKEN.encode_lengthc                 C   sD   t | jƒ ¡ | j }dt t|ƒ¡ | }|d t| jƒ … | jfS )Nr   )r   r
   Údumpr   r   r9   r7   ©r   Útr   r   r   r5   L   s   zKRB5_MECH_INDEP_TOKEN.to_bytesr	   )
Ú__name__Ú
__module__Ú__qualname__r   Ústaticmethodr   r   r   r9   r5   r   r   r   r   r      s    



	
r   c                   @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )	ÚGSSAPIFlagsi   r   r   é   r4   é   é    N)
r=   r>   r?   Ú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_FLAGr   r   r   r   rA   R   s    rA   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   rL   [   s
    rL   c                   @   s   e Zd ZdZdZdZdS )Ú
FlagsFieldr   r   rB   N)r=   r>   r?   ÚSentByAcceptorÚSealedÚAcceptorSubkeyr   r   r   r   rU   a   s    rU   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©r   r   r   r   r   h   ó
   
zGSSMIC_RC4.__init__c                 C   r   r	   )rZ   r   r   r   r   r   r   r   r   o   r   zGSSMIC_RC4.from_bytesc                 C   sF   t ƒ }|  d¡|_|  d¡|_|  d¡|_|  d¡|_|  d¡|_|S )Nr   rB   r4   )rZ   r   r^   r_   r`   ra   rb   )r#   Úmicr   r   r   r   s   s   zGSSMIC_RC4.from_bufferc                 C   s<   | j }|| j7 }|| j7 }|| j7 }| jd ur|| j7 }|S r	   r]   r;   r   r   r   r5   ~   s   




zGSSMIC_RC4.to_bytesN©r=   r>   r?   r   r@   r   r   r5   r   r   r   r   rZ   g   s    


rZ   c                   @   s<   e Zd Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZd	d
„ ZdS )ÚGSSWRAP_RC4c                 C   s.   d| _ d| _d | _d| _d | _d | _d | _d S )Ns   r[   s   ÿÿ©r^   r_   ÚSEAL_ALGr`   ra   rb   Ú
Confounderrc   r   r   r   r   ‰   ó   
zGSSWRAP_RC4.__init__c                 C   s†   d}|d| j  ¡  7 }|d| j ¡  7 }|d| j ¡  7 }|d| j ¡  7 }|d| j ¡  7 }|d| j ¡  7 }|d| j ¡  7 }|S )	NzGSSWRAP_RC4
úTOK_ID : %s
zSGN_ALG : %s
zSEAL_ALG : %s
úFiller : %s
úSND_SEQ : %s
zSGN_CKSUM : %s
zConfounder : %s
)r^   Úhexr_   ri   r`   ra   rb   rj   r;   r   r   r   Ú__str__’   s   zGSSWRAP_RC4.__str__c                 C   r   r	   )rg   r   r   r   r   r   r   r   r   �   r   zGSSWRAP_RC4.from_bytesc                 C   s^   t ƒ }|  d¡|_|  d¡|_|  d¡|_|  d¡|_|  d¡|_|  d¡|_|  d¡|_|S )Nr   r4   )	rg   r   r^   r_   ri   r`   ra   rb   rj   )r#   Úwrapr   r   r   r   ¡   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 r	   rh   r;   r   r   r   r5   ®   s   





zGSSWRAP_RC4.to_bytesN)	r=   r>   r?   r   rp   r@   r   r   r5   r   r   r   r   rg   ˆ   s    	

rg   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 r	   ©Úsession_key)r   rt   r   r   r   r   ¾   s   
zGSSAPI_RC4.__init__Úinitc                 C   s   t dƒ‚)Nz&Not tested! Sure it needs some changes)r   r7   ÚbytesrZ   r5   ra   Úhmac_md5rt   ÚcontentsÚupdateÚdigestr   rb   r   Úencrypt)r   r   ÚsequenceNumberÚ	directionÚGSS_GETMIC_HEADERÚpadÚpadStrre   Ú	Ksign_ctxÚKsignÚidÚtempÚ
chksum_ctxÚKseq_ctxÚKseqr   r   r   Ú
GSS_GetMICÁ   s   zGSSAPI_RC4.GSS_GetMICTNc                 C   s²  |du r|d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 | ƒ ¡ }
d}| j	j
D ]}|t|dA gƒ7 }qbd}	tj|dd�}| |	jdddd�¡ tj| ¡ dd�}| |j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¡|_|du �r±t |¡}|jd d… }|jdd … }t  |¡}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}	t|	jdddd�| ¡ d d…  | | ƒ ¡ }tj|dd�}| |¡ | ¡ d d… }|j|d d… k�r¦d tdƒfS d}|d | … d fS |du �r×t|ƒ}| |j¡|_| |¡}t| ¡ | dƒ ¡ \}}||fS d S )NTó   s    ru   rB   r,   F©r/   s       r\   r4   r   )Ú	digestmods   signaturekey é   Úlittleó    éð   r   rD   zIntegrity verification failedr   z1.2.840.113554.1.2.2)rg   ri   r5   ra   ÚosÚurandomrj   r   Únewrt   rx   ry   rz   r   rv   rb   r   r{   r   r   r   Údecryptr   )r   r   Úseq_numr}   r{   Ú	cofounderÚtokenr„   r‚   rƒ   Ú	Sgn_CksumÚklocalÚbÚKcryptr‡   Ú	sspi_wrapÚhdrrq   Úsnd_seqÚrc4Údec_cofounderÚdec_dataÚSgn_Cksum_calcr   Ú
cipherTextÚ	finalDatar   r   r   ÚGSS_Wrapè   sŠ   

2




0


özGSSAPI_RC4.GSS_Wrapc                 C   s   | j |||dd�\}}||fS )NF)r}   r{   )r¤   )r   r   r”   r}   r    Úerrr   r   r   Ú
GSS_Unwrapf  s   zGSSAPI_RC4.GSS_Unwrap)ru   )ru   TN)r=   r>   r?   r   rˆ   r¤   r¦   r   r   r   r   rr   ½   s
    

'~rr   c                   @   rY   )
ÚGSSMICc                 C   s"   d| _ d | _d| _d | _d | _d S )Ns   s   ÿÿÿÿÿ)r^   ÚFlagsr`   ra   rb   rc   r   r   r   r   n  rd   zGSSMIC.__init__c                 C   r   r	   )r§   r   r   r   r   r   r   r   r   u  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   r,   FrŠ   é   r4   )
r§   r   r^   rU   r0   r   r¨   r`   ra   rb   ©r#   Úmr   r   r   r   y  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   r,   FrŠ   r4   )r^   r¨   r5   r`   ra   rb   r;   r   r   r   r5   ƒ  s   


zGSSMIC.to_bytesNrf   r   r   r   r   r§   m  s    

	r§   c                   @   s<   e Zd Zdd„ Zedd„ ƒZedd„ ƒZdd„ Zd	d
„ ZdS )ÚGSSWrapTokenc                 C   s.   d| _ d | _d| _d | _d | _d | _d | _d S )Ns   ó   ÿ)r^   r¨   r`   ÚECÚRRCra   ÚDatarc   r   r   r   r   �  rk   zGSSWrapToken.__init__c                 C   r   r	   )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   r,   FrŠ   r4   )r¬   r   r^   rU   r0   r   r¨   r`   r®   r¯   ra   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   r,   FrŠ   r   r4   )r^   r¨   r5   r`   r®   r¯   ra   r°   r;   r   r   r   r5   §  s   


zGSSWrapToken.to_bytesc                 C   sŒ   d}|d| j  ¡  7 }|d| j 7 }|d| j ¡  7 }|d| j 7 }|d| j 7 }|d| j 7 }| jd ur@|d| j ¡  7 }|S |d	7 }|S )
NzGSSWrapToken
rl   zFlags : %s
rm   z	EC : %s
z
RRC : %s
rn   zData : %s
zData : None
)r^   ro   r¨   r`   r®   r¯   ra   r°   r;   r   r   r   rp   ³  s   
ÿzGSSWrapToken.__str__N)	r=   r>   r?   r   r@   r   r   r5   rp   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
d„Zddd„ZdS )Ú
GSSAPI_AESc                 C   s   || _ || _|| _d | _d S r	   )rt   Úchecksum_profileÚcipher_typeÚcipher)r   rt   r³   r²   r   r   r   r   Â  s   
zGSSAPI_AES.__init__c                 C   s4   |t |ƒ; }t |ƒ| }||d … |d |…  }|S r	   ©r7   )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   ÚunrotateÎ  s   zGSSAPI_AES.unrotatec                 C   st   dt |ƒd  d@ }t|gƒ| }||7 }tƒ }tj|_||_|  ¡ }| | j	t
jj|| ¡ d d…  ¡|_| ¡ S )NrB   é   rC   )r7   rv   r§   rU   rX   r¨   ra   r²   Úchecksumrt   rL   rT   Úvaluer5   )r   r   r”   r   r€   r«   r²   r   r   r   rˆ   Ó  s   &zGSSAPI_AES.GSS_GetMICFc                 C   sª   |   ¡ }d}|du r|jt|ƒ |j }d| }||7 }tƒ }tjtjB |_||_d|_	||_
| | jtjj|| ¡  d ¡}d|_	|  ||j	|j ¡}|}	| ¡ }
|	|
fS )Nr   Tr­   é   )r³   Ú	blocksizer7   r¬   rU   rX   rW   r¨   r®   r¯   ra   r{   rt   rL   rS   r½   r5   r¹   )r   r   r”   Úuse_paddingr´   r   r€   r<   Úcipher_textÚret1Úret2r   r   r   r¤   à  s"   zGSSAPI_AES.GSS_Wrapru   Nc                 C   sž   |   ¡ }t |d d… ¡}|dd … }|  ||j|j ¡}	| | jtj	j
|	¡}
t |
dd … ¡}d|_|d d… | ¡ krCd tdƒfS |
d |jd  … d fS )NrC   iðÿÿÿr¾   zGSS_Unwrap signature mismatch!)r³   r¬   r   rº   r¯   r®   r“   rt   rL   rQ   r½   r5   r   )r   r   r”   r}   Ú	auth_datarÀ   r´   Úoriginal_hdrÚrotatedrÁ   Ú
plain_textÚnew_hdrr   r   r   r¦   ù  s   zGSSAPI_AES.GSS_Unwrap)F)ru   NF)	r=   r>   r?   r   r¹   rº   rˆ   r¤   r¦   r   r   r   r   r±   Á  s    
r±   c                 C   s`   | 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
kr)t| ƒS td| j  ƒ‚)NzUnsupported etype %s)Úenctyper   ÚEnctypeÚAES256r±   Ú
_AES256CTSÚ_SHA1AES256ÚAES128Ú
_AES128CTSÚ_SHA1AES128r   rr   r   rs   r   r   r   Ú
get_gssapi  s   rÑ   c            	      C   s~   d} t  t jjt d¡¡}d}t|ƒ}| | |¡\}}tt	|ƒƒ || }t|ƒ | 
||¡\}}t| ¡ ƒ t| ¡ ƒ d S )Ns   ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯Ú@3e242e91996aadd513ecb1bc2369e44183e08e08c51550fa4b681e77f75ed8e1r   )r   ÚKeyrÊ   rË   rv   ÚfromhexrÑ   r¤   Úprintr7   r¦   ro   )	r   rt   r|   ÚgssapiÚr1Úr2ÚsentrÂ   rÃ   r   r   r   Útest  s   rÚ   Ú__main__) Úenumr   r�   Úasn1crypto.corer   Úminikerberos.protocol.constantsr   Úminikerberos.protocolr   Ú	unicryptor   Úunicrypto.hashlibr   Úunicrypto.symmetricr   ÚGSS_WRAP_HEADERÚGSS_WRAP_HEADER_OIDr   ÚIntFlagrA   ÚEnumrL   rU   rZ   rg   rr   r§   r¬   r±   rÑ   rÚ   r=   r   r   r   r   Ú<module>   s6    
:	!5 1!3Q
ÿ