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é   é   é   é   é   é   é   i€ÿÿÿN)Ú__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   ivÿÿÿN)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ú>IBéU   éª   )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|ƒrÉt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 )Néþÿÿÿr¶   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   ó                   iàÿÿÿiðÿÿÿ)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$úû	

