o
    àý°j¼u  ã                
   @   s¼  d dl mZmZ d dlmZ d dlmZ d dlmZm	Z	 d dl
mZmZmZmZ d dlmZmZmZmZ d dlmZ d dlmZ d d	lmZmZmZmZ d d
lmZ d dl Z dd„ Z!G dd„ de"ƒZ#G dd„ de"ƒZ$G dd„ de%ƒZ&dd„ Z'dd„ Z(dd„ Z)dd„ Z*dd„ Z+G dd„ de"ƒZ,G d d!„ d!e,ƒZ-G d"d#„ d#e-ƒZ.G d$d%„ d%e-ƒZ/G d&d'„ d'e-ƒZ0G d(d)„ d)e0ƒZ1G d*d+„ d+e0ƒZ2G d,d-„ d-e,ƒZ3G d.d/„ d/e"ƒZ4G d0d1„ d1e4ƒZ5G d2d3„ d3e5ƒZ6G d4d5„ d5e5ƒZ7G d6d7„ d7e5ƒZ8G d8d9„ d9e4ƒZ9e#j:e.e#je/e#j;e1e#j<e2e#j=e3iZ>e$j?e8e$j@e6e$jAe7e$jBe9d:e9iZCd;d<„ ZDd=d>„ ZEG d?d@„ d@e"ƒZFdAdB„ ZGdYdCdD„ZHdYdEdF„ZIdGdH„ ZJdIdJ„ ZKdKdL„ ZLdMdN„ ZMdOdP„ ZNdZdQdR„ZOd[dSdT„ZPdUdV„ ZQd\dWdX„ZRdS )]é    )ÚhexlifyÚ	unhexlify)Úreduce©Úurandom)ÚpackÚunpack)ÚAESÚDES3ÚARC4ÚDES)ÚHMACÚMD4ÚMD5ÚSHA)ÚPBKDF2)ÚGCD)ÚbÚPY3Ú
indexbytesÚbinary_type)Ú	constantsNc                 C   s   t | ƒS ©Nr   )ÚlenBytes© r   ú‡/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/krb5/crypto.pyÚget_random_bytesC   s   r   c                   @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )	ÚEnctypeé   é   é   é   é   é   é   N)
Ú__name__Ú
__module__Ú__qualname__ÚDES_CRCÚDES_MD4ÚDES_MD5r
   ÚAES128ÚAES256ÚRC4r   r   r   r   r   G   s    r   c                   @   s4   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdS )Ú	Cksumtyper   r   r    é   é   é	   é   é   r!   ivÿÿÿN)r%   r&   r'   ÚCRC32r   ÚMD4_DESr   ÚMD5_DESÚSHA1Ú	SHA1_DES3ÚSHA1_AES128ÚSHA1_AES256ÚHMAC_MD5r   r   r   r   r.   Q   s    r.   c                   @   s   e Zd ZdS )ÚInvalidChecksumN)r%   r&   r'   r   r   r   r   r<   ^   s    r<   c                 C   s    |t | ƒ|  | }| d|  S ©Nó    )Úlen)ÚsÚpadsizeÚpadlenr   r   r   Ú_zeropadb   s   rC   c                 C   s,   t | ƒt |ƒks
J ‚tdd„ t| |ƒD ƒƒS )Nc                 s   s   � | ]	\}}||A V  qd S r   r   )Ú.0ÚxÚyr   r   r   Ú	<genexpr>k   s   € z_xorbytes.<locals>.<genexpr>)r?   Ú	bytearrayÚzip)Úb1Úb2r   r   r   Ú	_xorbytesh   s   rL   c                 C   s@   t | ƒt |ƒks
J ‚d}t| |ƒD ]
\}}|||A O }q|dkS )Nr   )r?   rI   )Úmac1Úmac2ÚresrE   rF   r   r   r   Ú
_mac_equaln   s
   rP   c                    s~   dd„ }dd„ }t | ƒ}ˆ| tˆ|ƒ }tƒ ‰ t|| ƒD ]}ˆ || d| ƒ7 ‰ q‡ ‡fdd„td|ˆƒD ƒ}tt||ƒƒS )	Nc                    sD   t ˆ ƒ‰ |d tˆ ƒ |d ‰‰t ‡ ‡‡fdd„ttˆ ƒƒD ƒƒS )Nr0   c                 3   s<   � | ]}ˆ |ˆ  ˆ? ˆ |ˆ d   dˆ > d@ B V  qdS )r   r0   éÿ   Nr   ©rD   Úi©ÚbaÚnbytesÚremainr   r   rG   €   s   €: z/_nfold.<locals>.rotate_right.<locals>.<genexpr>)rH   r?   Úrange)rU   Únbitsr   rT   r   Úrotate_right}   s   "z_nfold.<locals>.rotate_rightc                    sj   t | ƒ‰ dd„ t| |ƒD ƒ‰tdd„ ˆD ƒƒr,‡ ‡fdd„tˆ ƒD ƒ‰tdd„ ˆD ƒƒstdd„ ˆD ƒƒS )Nc                 S   s   g | ]\}}|| ‘qS r   r   )rD   Úar   r   r   r   Ú
<listcomp>…   ó    z7_nfold.<locals>.add_ones_complement.<locals>.<listcomp>c                 s   s   � | ]}|d @ V  qdS )i ÿÿÿNr   ©rD   rE   r   r   r   rG   ‡   ó   € z6_nfold.<locals>.add_ones_complement.<locals>.<genexpr>c                    s,   g | ]}ˆ|ˆ  d   d? ˆ| d@  ‘qS )r   r0   rQ   r   rR   ©ÚnÚvr   r   r\   ˆ   s   , c                 s   s   � | ]}|V  qd S r   r   r^   r   r   r   rG   ‰   s   € )r?   rI   ÚanyrX   rH   )Ústr1Ústr2r   r`   r   Úadd_ones_complementƒ   s   ÿz#_nfold.<locals>.add_ones_complementé   c                 3   s    � | ]}ˆ ||ˆ … V  qd S r   r   ©rD   Úp©ÚbigstrrV   r   r   rG   •   s   € z_nfold.<locals>.<genexpr>r   )r?   ÚgcdrH   rX   Úbytesr   )rU   rV   rZ   rf   ÚslenÚlcmrS   Úslicesr   rj   r   Ú_nfoldx   s   rq   c                 C   s   | dv S )N)s   s   þþþþþþþþs   s   ààààññññs   þþþþs   þþþþs   ààññs   ààññs   ààññs   ààññs   þþþþs   þþþþs   s   s   àþàþñþñþs   þàþàþñþñr   )Úkeybytesr   r   r   Ú_is_weak_des_key™   s   rs   c                   @   ó   e Zd Zedd„ ƒZdS )Ú_EnctypeProfilec                 C   s"   t |ƒ| jkrtdƒ‚t| j|ƒS )NúWrong seed length)r?   ÚseedsizeÚ
ValueErrorÚKeyÚenctype)ÚclsÚseedr   r   r   Úrandom_to_key·   s   z_EnctypeProfile.random_to_keyN)r%   r&   r'   Úclassmethodr}   r   r   r   r   ru   ¬   s    ru   c                   @   s<   e Zd Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZd	S )
Ú_SimplifiedEnctypec                 C   sX   t || jƒ}d}t|ƒ| jk r"|  ||¡}||7 }|}t|ƒ| jk s|  |d| j… ¡S )Nó    r   )rq   Ú	blocksizer?   rw   Úbasic_encryptr}   )r{   ÚkeyÚconstantÚ	plaintextÚrndseedÚ
ciphertextr   r   r   ÚderiveÈ   s   ýz_SimplifiedEnctype.derivec           	      C   sz   |   |td|dƒ¡}|   |td|dƒ¡}|d u rt| jƒ}|t|| jƒ }t |j|| j	¡ 
¡ }|  ||¡|d | j…  S )Nú>IBéU   éª   )rˆ   r   r   r�   rC   rA   r   ÚnewÚcontentsÚhashmodÚdigestr‚   Úmacsize)	r{   rƒ   Úkeyusager…   Ú
confounderÚkiÚkeÚbasic_plaintextÚhmacr   r   r   Úencrypt×   s   
z_SimplifiedEnctype.encryptc                 C   sä   |   |td|dƒ¡}|   |td|dƒ¡}t|ƒ| j| j k r"tdƒ‚t|d | j … ƒt|| j d … ƒ}}t|ƒ| j dkrDtdƒ‚|  |t	|ƒ¡}tt
 |j|| j¡ ¡ ƒ}	|	d | j… }
t||
ƒsitdƒ‚t	|| jd … ƒS )Nr‰   rŠ   r‹   úciphertext too shortr   z,ciphertext does not meet padding requirementúciphertext integrity failure)rˆ   r   r?   r�   r�   rx   rH   rA   Úbasic_decryptrm   r   rŒ   r�   rŽ   r�   rP   r<   )r{   rƒ   r‘   r‡   r“   r”   Úbasic_ctextÚmacr•   r–   Úexpmacr   r   r   Údecryptá   s   *
z_SimplifiedEnctype.decryptc                 C   s@   | j  |¡ ¡ }|d t|ƒ| j  … }|  |d¡}|  ||¡S )Ns   prf)rŽ   rŒ   r�   r?   r�   rˆ   r‚   )r{   rƒ   ÚstringÚhashvalÚ	truncatedÚkpr   r   r   Úprfò   s   z_SimplifiedEnctype.prfN)r%   r&   r'   r~   rˆ   r—   rž   r£   r   r   r   r   r   ¾   s    


	
r   c                   @   sr   e Zd ZejZdZdZdZdZ	dZ
eZedd„ ƒZedd„ ƒZedd„ ƒZed	d
„ ƒZedd„ ƒZedd„ ƒZdS )Ú_DESCBCr0   r!   c                 C   st   |d u r	t | jƒ}|d| j  t|| jƒ }| j |¡ ¡ }|d t|ƒ… | |t|ƒt|ƒ d …  }|  	||¡S r=   )
r   r�   r�   rC   rA   rŽ   rŒ   r�   r?   r‚   )r{   rƒ   r‘   r…   r’   r•   Úchecksumr   r   r   r—     s   
,z_DESCBC.encryptc           	      C   s˜   t |ƒ| j| j k rtdƒ‚|  ||¡}|d | j… }|| j| j| j … }|| j| j d … }| j |d| j  | ¡ ¡ }t	||ƒsHt
dƒ‚t|ƒS )Nr˜   r>   r™   )r?   r�   r�   rx   rš   rA   rŽ   rŒ   r�   rP   r<   rm   )	r{   rƒ   r‘   r‡   Úcomplex_plaintextÚ	cofounderrœ   Úmessager�   r   r   r   rž     s   
z_DESCBC.decryptc                    s²  dd„ }dd„ }dd„ }d}g d¢}t || | jƒ‰‡fd	d
„tdtˆƒdƒD ƒD ]d}tƒ }	|D ]}
tr<|	 |
d@ ¡ q0|	 t|
ƒd@ ¡ q0|du r…d‰ |	D ]}
ˆ tt	|
ƒdd …  
dd¡ƒ7 ‰ qNˆ d d d… ‰ tƒ }	‡ fdd
„tdtˆ ƒdƒD ƒD ]
}|	 t|dƒ¡ qz| }|||	ƒ}q)d dd„ ||ƒD ƒ¡}t|ƒrªtt|d ƒdA ƒ|d< t t|ƒtjt|ƒ¡}| ˆ¡dd … }||ƒ}t|ƒrÓtt|d ƒdA ƒ|d< t| j|ƒS )Nc                 S   s˜   d}t t| ƒƒD ]A}tt| |ƒƒdd …  dd¡}|d d…  d¡d dkr8|ttt|d d… d dƒƒƒ7 }q|ttt|d d… d dƒƒƒ7 }q|S )Nr€   r   r0   Ú0r/   Ú1r   )	rX   r?   Úbinr   ÚrjustÚcountr   ÚchrÚint)ÚdeskeyÚtemprS   Útr   r   r   Ú	fixparity!  s   $$z0_DESCBC.mit_des_string_to_key.<locals>.fixparityc                 S   sN   t ƒ }| D ]}t|ƒ d¡d dkr|d> dB }n|d> d@ }| |¡ q|S )Nrª   r   r   r   éþ   )Úlistr«   r­   Úappend)Úl1r±   Úbyter   r   r   Ú	addparity+  s   z0_DESCBC.mit_des_string_to_key.<locals>.addparityc                 S   s0   t ƒ }t| |ƒD ]\}}| ||A d@ ¡ q|S )Né   )rµ   rI   r¶   )r·   Úl2r±   rJ   rK   r   r   r   ÚXOR5  s   z*_DESCBC.mit_des_string_to_key.<locals>.XORT)r   r   r   r   r   r   r   r   c                    ó   g | ]
}ˆ ||d  … ‘qS )r0   r   rR   )r@   r   r   r\   @  ó    z1_DESCBC.mit_des_string_to_key.<locals>.<listcomp>r   r0   rº   Fr€   r   r/   r©   éÿÿÿÿc                    r½   )r/   r   rR   )Úbintempr   r   r\   Q  r¾   Ú c                 s   s   � | ]}t |ƒV  qd S r   )r®   )rD   r¸   r   r   r   rG   X  r_   z0_DESCBC.mit_des_string_to_key.<locals>.<genexpr>éð   iøÿÿÿ)rC   rA   rX   r?   rµ   r   r¶   Úordr   r«   r¬   r¯   Újoinrs   r®   r   rŒ   ÚMODE_CBCr—   ry   rz   )r{   rŸ   Úsaltr³   r¹   r¼   ÚoddÚ
tempstringÚblockÚtemp56r¸   Úbits7ÚtempkeyÚcipherÚchecksumkeyr   )rÀ   r@   r   Úmit_des_string_to_key  s>   

"""z_DESCBC.mit_des_string_to_keyc                 C   ó4   t |ƒd dks
J ‚t |jtjd¡}| t|ƒ¡S ©Nr0   r   s           )r?   r   rŒ   r�   rÅ   r—   rm   )r{   rƒ   r…   Údesr   r   r   r‚   d  ó   z_DESCBC.basic_encryptc                 C   rÐ   rÑ   )r?   r   rŒ   r�   rÅ   rž   rm   )r{   rƒ   r‡   rÒ   r   r   r   rš   j  rÓ   z_DESCBC.basic_decryptc                 C   sP   |d ur|dkrt dƒ‚t|tƒs| d¡}t|tƒs | d¡}|  ||¡}|S )Nr€   z$Invalid DES string-to-key parametersúutf-8)rx   Ú
isinstancer   ÚencoderÏ   )r{   rŸ   rÆ   Úparamsrƒ   r   r   r   Ústring_to_keyp  s   



z_DESCBC.string_to_keyN)r%   r&   r'   r   r*   rz   Úkeysizerw   r�   rA   r�   r   rŽ   r~   r—   rž   rÏ   r‚   rš   rØ   r   r   r   r   r¤   ü   s(    
	

E

r¤   c                   @   sZ   e Zd ZejZdZdZdZdZ	dZ
eZedd„ ƒZedd„ ƒZed	d
„ ƒZedd„ ƒZdS )Ú_DES3CBCé   é   r0   é   c                 C   sl   dd„ }t |ƒ}t|ƒdkrtdƒ‚||d d… ƒ||dd… ƒ||dd … ƒ}}}t| j|| | ƒS )Nc                    sv   dd„ ‰ t ˆƒdksJ ‚‡ fdd„ˆD ƒ}ˆ t‡fdd„tdƒD ƒƒƒ}t||g ƒ}t|ƒr7|d dA |d< t|ƒS )	Nc                 S   s*   | dM } t | d@ ƒ d¡d r| S | dB S )Néþÿÿÿrª   r   r   )r«   r­   )r   r   r   r   Úparity�  s   "z6_DES3CBC.random_to_key.<locals>.expand.<locals>.parityr/   c                    s   g | ]}ˆ |d @ ƒ‘qS )rÞ   r   )rD   r   )rß   r   r   r\   ’  r]   z:_DES3CBC.random_to_key.<locals>.expand.<locals>.<listcomp>c                 3   s$   � | ]}ˆ | d @ |d  > V  qdS )r   Nr   rR   )r|   r   r   rG   “  s   €" z9_DES3CBC.random_to_key.<locals>.expand.<locals>.<genexpr>rÂ   )r?   ÚsumrX   rH   rs   rm   )r|   Ú
firstbytesÚlastbyterr   r   )rß   r|   r   ÚexpandŒ  s   z&_DES3CBC.random_to_key.<locals>.expandrÜ   rv   r/   é   )rH   r?   rx   ry   rz   )r{   r|   rã   Úk1Úk2Úk3r   r   r   r}   ‡  s   4z_DES3CBC.random_to_keyc                 C   s`   |d ur|dkrt dƒ‚t|tƒs| d¡}t|tƒs | d¡}|  t|| dƒ¡}|  |d¡S )Nr€   z%Invalid DES3 string-to-key parametersrÔ   rÜ   ó   kerberos)rx   rÕ   r   rÖ   r}   rq   rˆ   )r{   rŸ   rÆ   r×   Úkr   r   r   rØ   Ÿ  s   



z_DES3CBC.string_to_keyc                 C   ó4   t |ƒd dks
J ‚t |jtjd¡}| t|ƒ¡S rÑ   )r?   r
   rŒ   r�   r	   rÅ   r—   rm   )r{   rƒ   r…   Údes3r   r   r   r‚   «  rÓ   z_DES3CBC.basic_encryptc                 C   rê   rÑ   )r?   r
   rŒ   r�   r	   rÅ   rž   rm   )r{   rƒ   r‡   rë   r   r   r   rš   ±  rÓ   z_DES3CBC.basic_decryptN)r%   r&   r'   r   r
   rz   rÙ   rw   r�   rA   r�   r   rŽ   r~   r}   rØ   r‚   rš   r   r   r   r   rÚ   ~  s     


rÚ   c                   @   s@   e Zd ZdZdZdZeZedd„ ƒZ	edd„ ƒZ
edd	„ ƒZd
S )Ú_AESEnctyper!   r   r2   c                 C   sh   t |tƒs
| d¡}t |tƒs| d¡}td|pdƒ\}dd„ }t||| j||ƒ}|  |¡}|  |d¡S )NrÔ   z>Ls      c                 S   s   t  | |t¡ ¡ S r   )r   rŒ   r   r�   )ri   r@   r   r   r   Ú<lambda>Ç  s    z+_AESEnctype.string_to_key.<locals>.<lambda>rè   )rÕ   r   rÖ   r   r   rw   r}   rˆ   )r{   rŸ   rÆ   r×   Ú
iterationsr£   r|   Útkeyr   r   r   rØ   ¿  s   




z_AESEnctype.string_to_keyc                 C   s‚   t |ƒdksJ ‚t |jtjd¡}| tt|ƒdƒ¡}t |ƒdkr?t |ƒd p(d}|d d… |dd …  |dd… d |…  }|S )Nr!   s                   iàÿÿÿiðÿÿÿ)r?   r	   rŒ   r�   rÅ   r—   rC   rm   )r{   rƒ   r…   ÚaesÚctextÚlastlenr   r   r   r‚   Ì  s   ,z_AESEnctype.basic_encryptc                    s  t ˆ ƒdksJ ‚t |jtj¡}t ˆ ƒdkr| ˆ ¡S ‡ fdd„tdt ˆ ƒdƒD ƒ}t |d ƒ}tdƒ}d}|d d… D ]}|tt| t	|ƒ¡ƒ|ƒ7 }|}q<t| t	|d ƒ¡ƒ}t|d |… |d ƒ}	||d … }
|tt| t	|d ƒt	|
ƒ ¡ƒ|ƒ7 }||	 S )Nr!   c                    s    g | ]}t ˆ ||d  … ƒ‘qS )r!   )rH   rh   ©r‡   r   r   r\   ß  s     z-_AESEnctype.basic_decrypt.<locals>.<listcomp>r   r¿   r€   rÞ   )
r?   r	   rŒ   r�   ÚMODE_ECBrž   rX   rH   rL   rm   )r{   rƒ   r‡   rð   Úcblocksrò   Úprev_cblockr…   ÚbbÚlastplaintextÚomittedr   ró   r   rš   Ø  s    
(z_AESEnctype.basic_decryptN)r%   r&   r'   r�   rA   r�   r   rŽ   r~   rØ   r‚   rš   r   r   r   r   rì   ¸  s    

rì   c                   @   ó   e Zd ZejZdZdZdS )Ú
_AES128CTSr!   N)r%   r&   r'   r   r+   rz   rÙ   rw   r   r   r   r   rû   õ  ó    rû   c                   @   rú   )Ú
_AES256CTSé    N)r%   r&   r'   r   r,   rz   rÙ   rw   r   r   r   r   rý   û  rü   rý   c                   @   sV   e Zd ZejZdZdZedd„ ƒZ	e
dd„ ƒZe
dd„ ƒZe
dd	„ ƒZe
d
d„ ƒZdS )Ú_RC4r!   c                 C   s(   dddœ}| |v r||  n| }t d|ƒS )Nr0   rg   )r    r$   ú<I)r   )r‘   ÚtableÚmsusager   r   r   Ú	usage_str  s   

z_RC4.usage_strc                 C   s    |  d¡}t| jt |¡ ¡ ƒS )NzUTF-16LE)rÖ   ry   rz   r   rŒ   r�   )r{   rŸ   rÆ   r×   Úutf16stringr   r   r   rØ     s   
z_RC4.string_to_keyc                 C   sn   |d u rt dƒ}t |j|  |¡t¡ ¡ }t ||| t¡ ¡ }t ||t¡ ¡ }|t |¡ t	|| ƒ¡ S )Nr0   )
r   r   rŒ   r�   r  r   r�   r   r—   rm   )r{   rƒ   r‘   r…   r’   r“   Úcksumr”   r   r   r   r—     s   z_RC4.encryptc                 C   sø   t |ƒdk r
tdƒ‚t|d d… ƒt|dd … ƒ}}t |j|  |¡t¡ ¡ }t ||t¡ ¡ }tt	 |¡ 
t|ƒ¡ƒ}tt ||t¡ ¡ ƒ}	t||	ƒ}
|
sn|dkrnt |jtddƒt¡ ¡ }t ||t¡ ¡ }	t||	ƒ}
|
sttdƒ‚t|dd … ƒS )NrÛ   r˜   r!   r1   r   r0   r™   )r?   rx   rH   r   rŒ   r�   r  r   r�   r   rž   rm   rP   r   r<   )r{   rƒ   r‘   r‡   r  r›   r“   r”   r•   Ú	exp_cksumÚokr   r   r   rž     s   "

z_RC4.decryptc                 C   s   t  |jt|ƒt¡ ¡ S r   )r   rŒ   r�   rm   r   r�   )r{   rƒ   rŸ   r   r   r   r£   0  s   z_RC4.prfN)r%   r&   r'   r   r-   rz   rÙ   rw   Ústaticmethodr  r~   rØ   r—   rž   r£   r   r   r   r   rÿ     s    



rÿ   c                   @   rt   )Ú_ChecksumProfilec                 C   s,   |   |||¡}tt|ƒt|ƒƒstdƒ‚d S )Nzchecksum verification failure)r¥   rP   rH   r<   )r{   rƒ   r‘   Útextr  Úexpectedr   r   r   Úverify:  s   ÿz_ChecksumProfile.verifyN)r%   r&   r'   r~   r  r   r   r   r   r	  5  s    r	  c                       ó,   e Zd Zedd„ ƒZe‡ fdd„ƒZ‡  ZS )Ú_SimplifiedChecksumc                 C   s<   | j  |td|dƒ¡}t |j|| j j¡ ¡ }|d | j… S )Nr‰   é™   )	Úencrˆ   r   r   rŒ   r�   rŽ   r�   r�   )r{   rƒ   r‘   r
  Úkcr–   r   r   r   r¥   H  s   z_SimplifiedChecksum.checksumc                    s0   |j | jj krtdƒ‚tt| ƒ ||||¡ d S ©NzWrong key type for checksum)rz   r  rx   Úsuperr  r  ©r{   rƒ   r‘   r
  r  ©Ú	__class__r   r   r  N  s   z_SimplifiedChecksum.verify©r%   r&   r'   r~   r¥   r  Ú__classcell__r   r   r  r   r  A  s
    
r  c                   @   ó   e Zd ZdZeZdS )Ú_SHA1AES128r2   N)r%   r&   r'   r�   rû   r  r   r   r   r   r  U  ó    r  c                   @   r  )Ú_SHA1AES256r2   N)r%   r&   r'   r�   rý   r  r   r   r   r   r  Z  r  r  c                   @   r  )Ú	_SHA1DES3rÝ   N)r%   r&   r'   r�   rÚ   r  r   r   r   r   r  _  r  r  c                       r  )Ú_HMACMD5c                 C   s>   t  |jdt¡ ¡ }t t |¡| ¡ ¡ }t  ||t¡ ¡ S )Ns   signaturekey )r   rŒ   r�   r   r�   rÿ   r  )r{   rƒ   r‘   r
  ÚksignÚmd5hashr   r   r   r¥   e  s   z_HMACMD5.checksumc                    s.   |j tjkr
tdƒ‚tt| ƒ ||||¡ d S r  )rz   r   r-   rx   r  r  r  r  r  r   r   r  k  s   z_HMACMD5.verifyr  r   r   r  r   r  d  s
    
r  l   vÿ c                 C   ó   | t vr
td|  ƒ‚t |  S )NzInvalid enctype %d)Ú_enctype_tablerx   )rz   r   r   r   Ú_get_enctype_profile„  ó   r#  c                 C   r!  )NzInvalid cksumtype %d)Ú_checksum_tablerx   )Ú	cksumtyper   r   r   Ú_get_checksum_profileŠ  r$  r'  c                   @   s   e Zd Zdd„ ZdS )ry   c                 C   s.   t |ƒ}t|ƒ|jkrtdƒ‚|| _|| _d S )NzWrong key length)r#  r?   rÙ   rx   rz   r�   )Úselfrz   r�   Úer   r   r   Ú__init__‘  s
   
zKey.__init__N)r%   r&   r'   r*  r   r   r   r   ry   �  s    ry   c                 C   s(   t | ƒ}t|ƒ|jkrtdƒ‚| |¡S )NzWrong crypto seed length)r#  r?   rw   rx   r}   )rz   r|   r)  r   r   r   r}   ™  s   
r}   c                 C   ó   t | ƒ}| |||¡S r   )r#  rØ   )rz   rŸ   rÆ   r×   r)  r   r   r   rØ      ó   rØ   c                 C   s"   t | jƒ}| | |t|ƒt|ƒ¡S r   )r#  rz   r—   rm   )rƒ   r‘   r…   r’   r)  r   r   r   r—   ¥  s   
r—   c                 C   s   t | jƒ}| | ||¡S r   )r#  rz   rž   )rƒ   r‘   r‡   r)  r   r   r   rž   ª  s   
rž   c                 C   s   t | jƒ}| | |¡S r   )r#  rz   r£   )rƒ   rŸ   r)  r   r   r   r£   ±  s   
r£   c                 C   r+  r   )r'  r¥   )r&  rƒ   r‘   r
  Úcr   r   r   Úmake_checksum¶  r,  r.  c                 C   s   t | ƒ}| ||||¡ d S r   )r'  r  )r&  rƒ   r‘   r
  r  r-  r   r   r   Úverify_checksum»  s   r/  c                 C   s   | sd S t t| ƒƒS r   )r?   r   )rƒ   r   r   r   Úget_hex_key_lengthÃ  s   r0  c                 C   sP   | t jkr|r	|S t|ƒdkr|S d S | t jkr&|r|S t|ƒdkr$|S d S d S )Nrþ   r!   )r   r,   r0  r+   )rz   Úgeneric_aes_keyÚ
aes128_keyÚ
aes256_keyr   r   r   Úget_matching_aes_keyÉ  s   

r4  c                 C   sv   | t jt jfv r!t| |||d�}|d u rtd|  ƒ‚t| t|ƒƒS | t jkr5|s.td|  ƒ‚t| t|ƒƒS td|  ƒ‚)N)r1  r2  r3  z Missing AES key for enctype 0x%xz Missing NT hash for enctype 0x%xzUnsupported enctype 0x%x)r   r,   r+   r4  rx   ry   r   r-   )rz   Únt_hashr1  r2  r3  Úmatching_aes_keyr   r   r   Úget_kerberos_key_for_enctypeÛ  s   ü
r7  c              	   C   s<   dd„ }t | ƒ}| tt||||jƒƒt||||jƒƒƒ¡S )Nc                 S   sN   d}d}t |ƒ|k r!|t| tt|ƒƒ| ƒ7 }|d7 }t |ƒ|k s
|d |… S )Nr€   r   )r?   r£   r   r®   )rƒ   ÚpepperÚlÚoutr­   r   r   r   Úprfplusò  s   þzcf2.<locals>.prfplus)r#  r}   rL   rH   rw   )rz   Úkey1Úkey2Úpepper1Úpepper2r;  r)  r   r   r   Úcf2ï  s
   	ÿr@  c              	   C   sô  i }| rt | ƒ|ttjjjƒ< |r.t|ƒdkr#t |ƒ|ttjjjƒ< nt |ƒ|ttjjjƒ< i }| 	¡ D ]\}	}
t
|	|
ƒ||	< q4ttjjjƒttjjjƒttjjjƒg}|sX|ró|s||r||r|| d¡rtd| ¡ | d¡ ¡ | ¡ f }nd| ¡ |f }|D ]r}|dkr±|r±t ¡ }| t |ƒ¡ t
|| ¡ ƒ||< t dt |¡j|t|| jƒ d¡f ¡ q~|rã|rÂt |ƒ dd	¡ dd	¡}n|}t|||ƒ||< t dt |¡j|t|| jƒ d¡f ¡ q~t d
t |¡j|f ¡ q~|S t d¡ |S )Né@   ú$z%shost%s.%sz%s%sr$   z(Calculated type %s (%d) Kerberos key: %srÔ   z	utf-16-leÚreplacezjCannot calculate type %s (%d) Kerberos key: salt is None: Missing -s/--salt or (-u/--user and -d/--domain)z8No password supplied, skipping Kerberos keys calculation)r   r¯   r   ÚEncryptionTypesÚrc4_hmacÚvaluer?   Úaes256_cts_hmac_sha1_96Úaes128_cts_hmac_sha1_96Úitemsry   ÚendswithÚupperÚrstripÚlowerr   rŒ   Úupdater�   ÚloggingÚdebugÚnamer   r�   ÚdecoderÖ   rØ   )Úrc4rð   ÚpasswordÚhex_passrÆ   ÚuserÚdomainÚkeysÚekeysÚktrƒ   Ú
allciphersrÍ   Úmd4Ú	rawsecretr   r   r   Úgenerate_kerberos_keysÿ  sF   ý
"..
ÿr^  r   )NNN)NNNN)NNNNNNN)SÚbinasciir   r   Ú	functoolsr   Úosr   Ústructr   r   ÚCryptodome.Cipherr	   r
   r   r   ÚCryptodome.Hashr   r   r   r   ÚCryptodome.Protocol.KDFr   ÚCryptodome.Util.numberr   rl   Úsixr   r   r   r   Úimpacket.krb5r   rO  r   Úobjectr   r.   rx   r<   rC   rL   rP   rq   rs   ru   r   r¤   rÚ   rì   rû   rý   rÿ   r	  r  r  r  r  r  r*   r+   r,   r-   r"  r8   r9   r:   r;   r%  r#  r'  ry   r}   rØ   r—   rž   r£   r.  r/  r0  r4  r7  r@  r^  r   r   r   r   Ú<module>   s|   (

!> :=4û
û		



