o
    jG                     @   s   d dl mZ d dl mZ d dlmZmZmZ d dlmZ d dl	m
Z
 dZdZdZd	Zd
ZdZdZdZdZdZdZddddddZedd e D Zd&ddZd&ddZG dd dZG dd  d ZG d!d" d"eZG d#d$ d$Zd%S )'    )division)print_function)packunpackcalcsize)ntlm)ARC4s   +0   `                     
   z2NTLMSSP - Microsoft NTLM Security Support ProviderzMS KRB5 - Microsoft Kerberos 5zKRB5 - Kerberos 5z KRB5 - Kerberos 5 - User to Userz7NEGOEX - SPNEGO Extended Negotiation Security Mechanism)s
   +7
s	   *Hs	   *Hs
   *Hs
   +7c                 c   s    | ]	\}}||fV  qd S N ).0kvr   r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/spnego.py	<genexpr>-   s    r    c                 C   s  dt |   krdkrn ntdt | |  }|S dt |   kr%dkr3n ntddt | |  }|S dt |   kr?d	krMn ntd
dt | |  }|S dt |   krYdkrnn ntddt | d? t | d	@ |  }|S dt |   krzdkrn tdtddt | |  }|S td)Nr      B      BB      i  !BH   i   i z!BBH      i   l    z!BL   zError in asn1encode)lenr   	Exception)dataresr   r   r   
asn1encode/   s"   	"r*   c                 C   sV  t d| d d d }| dd  } |dkr1td}t d| d | d }| |d  } | d | }np|dkrQtd}t d| d | d }| |d  } | d | }nP|dkrytdtd }t d	| d | \}}| |d  } | d |d
| >  }n(|dkrtd}t d| d | d }| |d  } | d | }nd}| d | }|t|| d fS )Nr      r   r   r"   Hz!Hr#   r!   r$   r%   z!L)r   r   r&   )r(   len1padlen2anslen3r   r   r   
asn1decodeA   s2   r2   c                   @   sX   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdddZ	dd Z
dd ZdS )GSSAPINc                 C   s    i | _ t| d< |r| | d S )NUUID)fieldsGSS_API_SPNEGO_UUID
fromStringselfr(   r   r   r   __init__`   s
   
zGSSAPI.__init__c                 C      || j |< d S r   r5   r9   keyvaluer   r   r   __setitem__g      zGSSAPI.__setitem__c                 C   
   | j | S r   r<   r9   r>   r   r   r   __getitem__j      
zGSSAPI.__getitem__c                 C      | j |= d S r   r<   rC   r   r   r   __delitem__m      zGSSAPI.__delitem__c                 C      t |  S r   r&   getDatar9   r   r   r   __len__p   rH   zGSSAPI.__len__c                 C   rI   r   rJ   rL   r   r   r   __str__s   rH   zGSSAPI.__str__c                 C   s   t d|d d d }|tkrtd| |dd  }t|\}}t d|d d d }|tkr6td| |dd  }t|\}}|| d< ||d  | d< d S )Nr   r+   r   zUnknown AID=%xOID tag not found %xOIDPayload)r   ASN1_AIDr'   r2   ASN1_OID)r9   r(   	next_bytedecode_datatotal_bytesuuidr   r   r   r7   v   s   zGSSAPI.fromStringc                 C   ,   t | j D ]}td|| | f  qd S Nz%s: {%r}listr5   keysprintr9   ir   r   r   dump      zGSSAPI.dumpc                 C   s4   t dt}|tt dtt| d  | d  7 }|S )Nr   r4   rQ   )r   rR   r*   rS   r9   r0   r   r   r   rK      s   

zGSSAPI.getDatar   )__name__
__module____qualname__r:   r@   rD   rG   rM   rN   r7   r`   rK   r   r   r   r   r3   ^   s    

r3   c                   @   s`   e Zd ZdZdZdddZdd Zdd	 Zd
d Zdd Z	dd Z
dddZdd Zdd ZdS )SPNEGO_NegTokenRespr   r   Nc                 C   s   i | _ |r
| | d S r   )r5   r7   r8   r   r   r   r:      s   
zSPNEGO_NegTokenResp.__init__c                 C   r;   r   r<   r=   r   r   r   r@      rA   zSPNEGO_NegTokenResp.__setitem__c                 C   rB   r   r<   rC   r   r   r   rD      rE   zSPNEGO_NegTokenResp.__getitem__c                 C   rF   r   r<   rC   r   r   r   rG      rH   zSPNEGO_NegTokenResp.__delitem__c                 C   rI   r   rJ   rL   r   r   r   rM      rH   zSPNEGO_NegTokenResp.__len__c                 C   s   |   S r   )rK   rL   r   r   r   rN      s   zSPNEGO_NegTokenResp.__str__r   c           	      C   s  |}t d|d d d }|tjkrtd| |dd  }t|\}}t d|d d d }|tkr9td| |dd  }t|\}}t d|d d d }|tkr_|tkr^td| n|dd  }t|\}}t d|d d d }|tkrtd| t|dd  \}}|| d< |dd  }||d  }t	|dkrd S t d|d d d }|t
kr|tkrtd	| nS|dd  }t|\}}t d|d d d }|tkrtd
| |dd  }t|\}}|| d< |dd  }||d  }t d|d d d }|tkrtd| |dd  }t|\}}t d|d d d }|tkr1td| |dd  }t|\}}|| d< d S )Nr   r+   r   zNegTokenResp not found %xSEQUENCE tag not found %xz'MechType/ResponseToken tag not found %xzEnumerated tag not found %xNegStatez-Supported Mech/ResponseToken tag not found %xrO   SupportedMechzResponse token tag not found %xz#Octet string token tag not found %xResponseToken)r   rf   SPNEGO_NEG_TOKEN_RESPr'   r2   ASN1_SEQUENCEASN1_MECH_TYPEASN1_RESPONSE_TOKENASN1_ENUMERATEDr&   ASN1_SUPPORTED_MECHrS   ASN1_OCTET_STRING)	r9   r(   payloadrT   rU   rV   decode_data2itemtotal_bytes2r   r   r   r7      sj   


zSPNEGO_NegTokenResp.fromStringc                 C   rX   rY   rZ   r^   r   r   r   r`     ra   zSPNEGO_NegTokenResp.dumpc              
   C   s  t dtj}d| jv rYd| jv rYd| jv rY|tt dttt dtjtt dtt| d   t dt tt dt	t| d   t dt
 tt dtt| d    7 }|S d| jv rd| jv r|tt dttt dtjtt dtt| d   t dt tt dt	t| d    7 }|S d| jv r|tt dttt dtjtt dtt| d    7 }|S d| jv r|tt dttt dt
tt dtt| d   t dt tt dtt| d    7 }|S |tt dttt dt
tt dtt| d    7 }|S )Nr   rh   ri   rj   mechListMIC)r   rf   rk   r5   r*   rl   SPNEGO_NEG_TOKEN_TARGro   rp   rS   rn   rq   ASN1_MECH_LIST_MICrb   r   r   r   rK     s   


	=


-


 


zSPNEGO_NegTokenResp.getDatar   r   )rc   rd   re   rk   rw   r:   r@   rD   rG   rM   rN   r7   r`   rK   r   r   r   r   rf      s    

>rf   c                   @   s"   e Zd ZdZdddZdd ZdS )	SPNEGO_NegTokenInitr   r   c                 C   s&  t | | | d }td|d d d }|tjkr td| |dd  }t|\}}td|d d d }|tkrAtd| |dd  }t|\}}td|d d d }|tkrbtd| |dd  }|}t|\}}td|d d d }|tkrtd| |dd  }t|\}}	g | d< |rtd|d d d }|t	krn|dd  }t|\}
}| d 
|
 ||d  }|s||d  }t|dkrtd|d d d }|tkr|dd  }t|\}}td|d d d }|tkr|dd  }t|\}}|| d	< d S d S d S d S )
NrQ   r   r+   r   zNegTokenInit not found %xrg   zMechType tag not found %x	MechTypes	MechToken)r3   r7   r   rz   SPNEGO_NEG_TOKEN_INITr'   r2   rl   rm   rS   appendr&   ASN1_MECH_TOKENrq   )r9   r(   rr   rT   rU   rV   ru   remaining_datatotal_bytes3total_bytes4rt   r   r   r   r7   Q  s^   


zSPNEGO_NegTokenInit.fromStringc              	   C   s   d}| d D ]}|t dt7 }|t|7 }qd}d| jv r/t dttt dtt| d   }t dtj}|tt dttt dt	tt dtt|  |  7 }|| d< t
| S )N    r{   r   r|   rQ   )r   rS   r*   r5   r   rq   rz   r}   rl   rm   r3   rK   )r9   	mechTypesr_   	mechTokenr0   r   r   r   rK     s:   


	
zSPNEGO_NegTokenInit.getDataNry   )rc   rd   re   r}   r7   rK   r   r   r   r   rz   H  s    
3rz   c                   @   s.   e Zd Zdd Zdd Zdd Zdd	d
ZdS )SPNEGOCipherc                 C   s   || _ | j tj@ r@t| j || _t| j |d| _t| j || _t| j |d| _t	
| j}|j| _t	
| j}|j| _n|| _|| _|| _|| _t	
| j}|j| _|j| _d| _d S )NServerr   )_SPNEGOCipher__flagsr   *NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITYSIGNKEY_SPNEGOCipher__clientSigningKey_SPNEGOCipher__serverSigningKeySEALKEY_SPNEGOCipher__clientSealingKey_SPNEGOCipher__serverSealingKeyr   newencrypt"_SPNEGOCipher__clientSealingHandle"_SPNEGOCipher__serverSealingHandle_SPNEGOCipher__sequence)r9   flagsrandomSessionKeycipher3cipher4cipherr   r   r   r:     s$   

zSPNEGOCipher.__init__c              	   C   s:   t | j| j| j||| j| j\}}|  jd7  _||fS Nr+   )r   SEALr   r   r   r   r   )r9   
plain_datasealedMessage	signaturer   r   r   r     s   zSPNEGOCipher.encryptc              	   C   s<   t | j| j| j|d d |dd  | j| j\}}||fS )Nr$   )r   r   r   r   r   r   r   )r9   answerr   r   r   r   decrypt  s   

zSPNEGOCipher.decryptr   Fc                 C   s   t | j| j| j||}|r7| jt j@ r)t| j}|j	| _t| j
}|j	| _nt| j}|j	| _|j	| _|  jd7  _|S r   )r   MACr   r   r   r   r   r   r   r   r   r   r   )r9   r(   seqNumreset_cipherr   r   r   r   r   r   r   sign  s   
zSPNEGOCipher.signN)r   F)rc   rd   re   r:   r   r   r   r   r   r   r   r     s
    r   N)r   ) 
__future__r   r   structr   r   r   impacketr   Cryptodome.Cipherr   r6   rl   rR   rS   rq   rm   r   rp   rn   rx   ro   r{   dictitems	TypesMechr*   r2   r3   rf   rz   r   r   r   r   r   <module>   s<   

= .V