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re  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 rt|}|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rd tdfS d}|d |  d fS |du rt|}||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   ir   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
