o
    j _                     @   s  U d dl mZmZ d dlmZ 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 d
lmZ d dlmZ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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 d0d1 d1e,Z3G d2d3 d3e,Z4G d4d5 d5e"Z5G d6d7 d7e5Z6G d8d9 d9e6Z7G d:d; d;e6Z8G d<d= d=e6Z9G d>d? d?e5Z:e#j;e.e#je/e#j<e1e#j=e2e#je3e#j>e4iZ?e	e@e-f eAd@< e$jBe9e$jCe7e$jDe8e$jEe:dAe:iZFdBdC ZGdDdE ZHG dFdG dGe"ZIdHdI ZJdXdJdKZKdXdLdMZLdNdO ZMdPdQ ZNdRdS ZOdTdU ZPdVdW ZQdS )Y    )packunpack)	unhexlifyN)Dict)gcd)hmac)md5)sha1)md4)pbkdf2)MODE_CBCMODE_ECB)DES)TDES)RC4)AESc                 C   s
   t | S N)osurandom)lenBytes r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/minikerberos/protocol/encryption.pyget_random_bytesB   s   
r   c                   @   s,   e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
Enctype                     iN)__name__
__module____qualname__DES_CRCDES_MD4DES_MD5DES3AES128AES256r   RC4_MD4r   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#   CRC32MD4MD4_DESMD5MD5_DESSHA1	SHA1_DES3SHA1_AES128SHA1_AES256HMAC_MD5r   r   r   r   r+   R   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   _zeropadc   s   rA   c                 C   sL   t | t |ks
J tj| ddd}tj|ddd}||A jt | dddS )NbigF	byteordersigned)r=   int
from_bytesto_bytes)b1b2t1t2r   r   r   	_xorbytesi   s   rM   c                 C   s@   t | t |ks
J d}t| |D ]
\}}|||A O }q|dkS )Nr   )r=   zip)mac1mac2resxyr   r   r   
_mac_equalq   s
   rT   c                    s|   dd dd }t }t| t| }dfddtt|| D   fddtd	|D }t||S )
Nc                 S   sX   t j| ddd}t| d }||; }||? }||| > ||>  }|| jt| dddS )NrB   FrC   r-   )rF   rG   r=   rH   )strnbitsnumsizebodyremainsr   r   r   rotate_right   s   z_nfold.<locals>.rotate_rightc                    s   t |  g tdt | dD ]}| | ||  }| qtdd D r< fddt D tdd D s'ddd D S )	Nr   r   c                 s   s    | ]}|d @ V  qdS )i Nr   .0rR   r   r   r   	<genexpr>   s    z6_nfold.<locals>.add_ones_complement.<locals>.<genexpr>c                    s,   g | ]}|  d   d? | d@  qS )r   r-      r   r]   invr   r   
<listcomp>   s   , z7_nfold.<locals>.add_ones_complement.<locals>.<listcomp>    c                 s        | ]}|j d dddV  qdS r   rB   FrC   NrH   r\   r   r   r   r^          )r=   rangeappendanyjoin)str1str2ra   tr   rb   r   add_ones_complement   s   z#_nfold.<locals>.add_ones_complementrf   c                 3   s    | ]
} d | V  qdS )   Nr   r`   )r[   rU   r   r   r^      s    z_nfold.<locals>.<genexpr>c                 3   s     | ]} ||  V  qd S r   r   r]   p)bigstrnbytesr   r   r^      rj   r   )r=   rF   r   rn   rk   	functoolsreduce)rU   rw   rr   slenlcmslicesr   )rv   rw   r[   rU   r   _nfold{   s   &r}   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   r   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   r      s    r   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 )Nrf   r   )r}   	blocksizer=   r   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   rA   r?   HMACnewcontentshashmoddigestr   macsize)	r   r   keyusager   
confounderkikebasic_plaintextr   r   r   r   encrypt   s   
z_SimplifiedEnctype.encryptc                 C   s   |  |td|d}|  |td|d}t|| j| j k r"td|d | j  || j d  }}t|| j dkr@td| ||}t	|j
|| j }	|	d | j }
t||
satd|| jd  S )Nr   r   r   ciphertext too shortr   z,ciphertext does not meet padding requirementciphertext integrity failure)r   r   r=   r   r   r   r?   basic_decryptr   r   r   r   r   rT   r;   )r   r   r   r   r   r   basic_ctextmacr   r   expmacr   r   r   decrypt   s   "
z_SimplifiedEnctype.decryptc                 C   s>   |  | }|d t|| j   }| |d}| ||S )Ns   prf)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 )_DESCBCr-   r   c                 C   st   |d u r	t | j}|d| j  t|| j }| j| }|d t| | |t|t| d   }| 	||S )N )
r   r   r   rA   r?   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|S )Nr   r   r   )r=   r   r   r   r   r?   r   r   r   rT   r;   )	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}d	d
t d
    fddtdt d
D D ]V}t }	|D ]	}
|	|
d@  q8|dkrd |	D ]}
 t|
dd  dd7  qJ d d d  t }	 fddtdt  dD D ]
}|	t|d qt| }|||	}q1ddd ||D }t|r|d dA j	dddd|d< t
|t|}|dd  }||}t|rtt|d dA |d< t| j|S )Nc                 S   s   d}| D ]B}t |dd  dd}|d d dd dkr3|t|d d d djdd	d
d7 }q|t|d d d djdd	d
d7 }q|S )Nrf   r   r-   0r,   1r   r   rB   FrC   )binrjustcountrF   rH   )deskeytempbyterq   r   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   rl   )l1r   r   r   r   r   	addparity7  s   z0_DESCBC.mit_des_string_to_key.<locals>.addparityc                 S   s0   t  }t| |D ]\}}|||A d@  q|S )N   )r   rN   rl   )r   l2r   rI   rJ   r   r   r   XORA  s   z*_DESCBC.mit_des_string_to_key.<locals>.XORT)r   r   r   r   r   r   r   r   r<   r-   c                       g | ]
} ||d   qS )r-   r   r`   )r>   r   r   re   M      z1_DESCBC.mit_des_string_to_key.<locals>.<listcomp>r   r   F r   r,   r   c                    r   )r,   r   r`   )bintempr   r   re   [  r   rf   c                 s   rg   rh   ri   )r]   r   r   r   r   r^   b  rj   z0_DESCBC.mit_des_string_to_key.<locals>.<genexpr>   r   rB   rC   i)r=   rk   r   rl   r   r   rF   rn   r   rH   r   r   r   chrordr   r   )r   r   saltr   r   r   odd
tempstringblocktemp56r   bits7tempkeycipherchekcsumkeyr   )r   r>   r   mit_des_string_to_key*  s<   

""z_DESCBC.mit_des_string_to_keyc                 C   ,   t |d dks
J t|jtd}||S Nr-   r              )r=   r   r   r   r   )r   r   r   desr   r   r   r   n     
z_DESCBC.basic_encryptc                 C   r   r   )r=   r   r   r   r   )r   r   r   r   r   r   r   r   t  r   z_DESCBC.basic_decryptc                 C   s(   |d ur|dkrt d| ||}|S )Nr   z$Invalid DES string-to-key parameters)r   r   )r   r   r   paramsr   r   r   r   string_to_keyz  s   z_DESCBC.string_to_keyN)r!   r"   r#   r   r&   r   keysizer   r   r?   r   r4   r   r   r   r   r   r   r   r   r   r   r   r   r     s(    
	

C

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      r-      c                 C   sd   dd }t |dkrtd||d d ||dd ||dd  }}}t| j|| | S )Nc                    s   dd  t dksJ  fddD } tfddtdD }dd	d ||g D }t|rC|d d
A jdddd|d< |S )Nc                 S   s*   | dM } t | d@ dd r| S | dB S )Nr   r   r   )r   r   )br   r   r   parity  s   "z6_DES3CBC.random_to_key.<locals>.expand.<locals>.parityr,   c                    s   g | ]} |d @ qS )r   r   r]   r   )r   r   r   re     s    z:_DES3CBC.random_to_key.<locals>.expand.<locals>.<listcomp>c                 3   s$    | ]} | d @ |d  > V  qdS )r   Nr   r`   )r   r   r   r^     s   " z9_DES3CBC.random_to_key.<locals>.expand.<locals>.<genexpr>rf   c                 s   rg   rh   ri   r   r   r   r   r^     rj   r   r   rB   FrC   )r=   sumrk   rn   r   rH   )r   
firstbyteslastbyter~   r   )r   r   r   expand  s   z&_DES3CBC.random_to_key.<locals>.expandr   r   r,      )r=   r   r   r   )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|| d}| |d S )Nr   z%Invalid DES3 string-to-key parametersr   kerberos)r   r   r}   r   encode)r   r   r   r   kr   r   r   r     s   z_DES3CBC.string_to_keyc                 C   .   t |d dks
J t|jtdd}||S Nr-   r   r   )IV)r=   r'   r   r   r   )r   r   r   des3r   r   r   r        
z_DES3CBC.basic_encryptc                 C   r   r   )r=   r'   r   r   r   )r   r   r   r   r   r   r   r     r   z_DES3CBC.basic_decryptN)r!   r"   r#   r   r'   r   r   r   r   r?   r   SHAr   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   r/   c                 C   s:   t d|pd\}t|||| j}| |}| |d S )Nz>Ls      r   )r   PBKDF2r   r   r   r   )r   r   r   r   
iterationsr   tkeyr   r   r   r     s   
z_AESEnctype.string_to_keyc                 C   sz   t |dksJ t|jtd}|t|d}t |dkr;t |d p$d}|d d |dd   |dd d |  }|S )Nr                      ii)r=   r   r   r   r   rA   )r   r   r   aesctextlastlenr   r   r   r     s   ,z_AESEnctype.basic_encryptc                    s   t  dksJ t|jt}t  dkr| S  fddtdt  dD }t |d }d}d}|d d D ]}|t|||7 }|}q8||d }t|d | |d }	||d  }
|t||d |
 |7 }||	 S )	Nr   c                    r   )r   r   rt   r   r   r   re     r   z-_AESEnctype.basic_decrypt.<locals>.<listcomp>r   r   r   rf   r   )r=   r   r   r   r   rk   rM   )r   r   r   r   cblocksr   prev_cblockr   r   lastplaintextomittedr   r   r   r     s    
z_AESEnctype.basic_decryptN)r!   r"   r#   r   r?   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(   r   r   r   r   r   r   r   r        r  c                   @   r  )
_AES256CTS    N)r!   r"   r#   r   r)   r   r   r   r   r   r   r   r    r  r  c                   @   V   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 )Nr-   rs   )r   r    <I)r   )r   tablemsusager   r   r   	usage_str  s   

z_RC4.usage_strc                 C   s(   | dd}t| }t| j|S )NUTF-8UTF-16LEdecoder   r
   r   r   r   r   r   r   r   utf16stringdatar   r   r   r   	  s   z_RC4.string_to_keyc                 C   sh   |d u rt d}t|j| |t }t||| t }t||t }|t|||  S )Nr-   )	r   r   r   r   r  r4   r   ARC4r   )r   r   r   r   r   r   cksumr   r   r   r   r     s   z_RC4.encryptc                 C   s   t |dk r
td|d d |dd  }}t|j| |t }t||t }t|	|}t||t }	t
||	}
|
sc|dkrct|jtddt }t||t }	t
||	}
|
sitd|dd  S )Nr   r   r   r.   r  r-   r   )r=   r   r   r   r   r  r4   r   r  r   rT   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 S r   )r   r   r   r   r   r   r   r   r   r   r   r   -  s   z_RC4.prfN)r!   r"   r#   r   r   r   r   r   staticmethodr  r   r   r   r   r   r   r   r   r   r    s    



r  c                   @   r
  )_RC4_MD4r-   c                 C   s   dS )Nrf   r   )r   r   r   r   r  8  s   z_RC4_MD4.usage_strc                 C   s0   | dd}t| }t| j|d d S )Nr  r  r-   r  r  r   r   r   r   =  s   z_RC4_MD4.string_to_keyc                 C   s    d}t |jd d || S )N                           r-   )r  r   r   )r   r   r   r   r   r   r   r   r   C  s   z_RC4_MD4.encryptc                 C   sB   t |jd d |}t|d d d}|std|dd  S )Nr-   r   r  r   )r  r   r   rT   r;   )r   r   r   r   r   r  r   r   r   r   H  s
   z_RC4_MD4.decryptc                 C   s   t  r   )NotImplementedErrorr  r   r   r   r   P  s   z_RC4_MD4.prfN)r!   r"   r#   r   r*   r   r   r   r  r  r   r   r   r   r   r   r   r   r   r  2  s    



r  c                   @   r   )_ChecksumProfilec                 C   s$   |  |||}t||stdd S )Nzchecksum verification failure)r   rT   r;   )r   r   r   textr  expectedr   r   r   verify[  s   
z_ChecksumProfile.verifyN)r!   r"   r#   r   r#  r   r   r   r   r   V  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   i  s   z_SimplifiedChecksum.checksumc                    s0   |j | jj krtdtt| |||| d S NzWrong key type for checksum)r   r'  r   superr%  r#  r   r   r   r!  r  	__class__r   r   r#  o  s   z_SimplifiedChecksum.verifyr!   r"   r#   r   r   r#  __classcell__r   r   r,  r   r%  b  s
    
r%  c                   @      e Zd ZdZeZdS )_SHA1AES128r/   N)r!   r"   r#   r   r  r'  r   r   r   r   r1  v      r1  c                   @   r0  )_SHA1AES256r/   N)r!   r"   r#   r   r  r'  r   r   r   r   r3  {  r2  r3  c                   @   r0  )	_SHA1DES3r   N)r!   r"   r#   r   r   r'  r   r   r   r   r4    r2  r4  c                       r$  )_HMACMD5c                 C   s<   t |jdt }tt||  }t ||t S )Ns   signaturekey )r   r   r   r4   r   r  r  )r   r   r   r!  ksignmd5hashr   r   r   r     s   z_HMACMD5.checksumc                    s.   |j tjkr
tdtt| |||| d S r)  )r   r   r   r   r*  r5  r#  r+  r,  r   r   r#    s   z_HMACMD5.verifyr.  r   r   r,  r   r5    s
    
r5  _enctype_tablel   v c                 C      | t vr
td|  t |  S )NzInvalid enctype %d)r8  r   )r   r   r   r   _get_enctype_profile     r:  c                 C   r9  )NzInvalid cksumtype %d)_checksum_tabler   )	cksumtyper   r   r   _get_checksum_profile  r;  r>  c                   @   s&   e Zd ZdedefddZdd ZdS )r   r   r   c                 C   s8   |t jkrt|}t||jkrtd|| _|| _d S )NzWrong key length)r   r*   r:  r=   r   r   r   r   )selfr   r   er   r   r   __init__  s   

zKey.__init__c                 C   s&   d}| j d ur| j  }d| j|f S )Nz<EMPTY>zKey(%d, %s))r   hexr   )r?  r   r   r   r   __str__  s   

zKey.__str__N)r!   r"   r#   r   bytesrA  rC  r   r   r   r   r     s    r   c                 C   s(   t | }t||jkrtd||S )NzWrong crypto seed length)r:  r=   r   r   r   )r   r   r@  r   r   r   r     s   
r   c                 C   s(   t |tr	| }t| }||||S r   )
isinstancerU   r   r:  r   )r   r   r   r   r@  r   r   r   r     s   
r   c                 C   s   t | j}|| |||S r   )r:  r   r   )r   r   r   r   r@  r   r   r   r     s   
r   c                 C   s   t | j}|| ||S r   )r:  r   r   )r   r   r   r@  r   r   r   r     s   
r   c                 C   s   t | j}|| |S r   )r:  r   r   )r   r   r@  r   r   r   r     s   
r   c                 C   s   t | }||||S r   )r>  r   )r=  r   r   r!  cr   r   r   make_checksum  s   rG  c                 C   s   t | }||||| d S r   )r>  r#  )r=  r   r   r!  r  rF  r   r   r   verify_checksum  s   rH  c                 C   s4   dd }t | }|t||||j||||jS )Nc                 S   sR   d}d}t ||k r#|t| |jdddd| 7 }|d7 }t ||k s
|d | S )Nrf   r   rB   FrC   )r=   r   rH   )r   pepperloutr   r   r   r   prfplus  s   zcf2.<locals>.prfplus)r:  r   rM   r   )r   key1key2pepper1pepper2rL  r@  r   r   r   cf2  s
   	rQ  r   )Rstructr   r   binasciir   r   rx   r   typingr   mathr   	unicryptor   r   unicrypto.hashlibr   r4   r	   r   r
   unicrypto.pbkdf2r   r   unicrypto.symmetricr   r   r   r   r'   r   r  r   r   objectr   r+   r   r;   rA   rM   rT   r}   r   r   r   r   r   r   r  r  r  r  r   r%  r1  r3  r4  r5  r&   r(   r)   r*   r8  rU   __annotations__r7   r8   r9   r:   r<  r:  r>  r   r   r   r   r   r   rG  rH  rQ  r   r   r   r   <module>   s   +
*>{496$	

