o
    ju                  
   @   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!   ivN)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>IBU      )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 rd |	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|rtt|d dA |d< tt|tjt|}|dd  }||}t|rt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 )Nr   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                   ii)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|rt }|t | t
|| ||< tdt|j|t|| jdf  q~|r|rt |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
		



