o
    àý°júG  ã                   @   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r‹n 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r™t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r€td| ƒ‚t|dd … ƒ\}}|| d< |dd … }||d … }t	|ƒdkr¢d S t d|d d… ƒd }|t
kr¼|tkr»td	| ƒ‚nS|dd … }t|ƒ\}}t d|d d… ƒd }|tkrÝt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 r•d| 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r…td| ƒ‚|dd … }t|ƒ\}}	g | d< |rÂtd|d d… ƒd }|t	kr§n|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