a
    kÄ#du_  ã                   @   s¬  d Z ddlZddlZddlZddlmZmZmZmZm	Z	 z”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 W nN eyÈ   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 Y n0 W n eyæ   edƒ‚Y n0 g d¢ZG d	d
„ d
ƒZG dd„ dƒZG dd„ deƒZdd„ Zdd„ Z dd„ Z!dd„ Z"e#g 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(ƒ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&ƒZ/G d,d-„ d-e%ƒZ0G d.d/„ d/e0ƒZ1G d0d1„ d1e1ƒZ2G d2d3„ d3e1ƒZ3G d4d5„ d5e1ƒZ4G d6d7„ d7e0ƒZ5ej6e)ej7e*eje+ej8e-ej9e.ej:e/iZ;ej<e4ej=e2ej>e3ej?e5d8e5iZ@G d9d:„ d:e%ƒZAd;d<„ ZBdS )=z6
Implementation of RFC 3961's cryptographic functions
é    N)ÚorbÚchbÚ	int_bytesÚ	bytes_intÚ	plain_str)ÚAESÚDES3ÚARC4ÚDES)ÚHMACÚMD4ÚMD5ÚSHA)ÚPBKDF2zXTo use kerberos cryptography, you need to install pycryptodome.
pip install pycryptodome)ÚEncryptionTypeÚChecksumTypeÚKeyÚInvalidChecksumc                   @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )	r   é   é   é   é   é   é   é   N)
Ú__name__Ú
__module__Ú__qualname__ZDES_CRCÚDES_MD4ÚDES_MD5r   ÚAES128ÚAES256ÚRC4© r#   r#   úI/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/libs/rfc3961.pyr   .   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 )r   r   r   r   é   é   é	   é   é   r   ivÿÿÿN)r   r   r   ZCRC32r   ZMD4_DESr   ZMD5_DESÚSHA1Ú	SHA1_DES3ÚSHA1_AES128ÚSHA1_AES256ÚHMAC_MD5r#   r#   r#   r$   r   8   s   r   c                   @   s   e Zd ZdS )r   N)r   r   r   r#   r#   r#   r$   r   E   s   r   c           
      C   sˆ   dd„ }dd„ }t | ƒ}t ||¡}tƒ }t|| ƒD ]}|| 7 }|| |ƒ} q6d| }td||ƒD ]}	||||	|	| … |ƒ}qbt|ƒS )zC
    https://www.gnu.org/software/shishi/ides.pdf - APPENDIX B
    c                 S   st   t | ƒ} d|d > d }|dkr$| S |dkrNt| d? | |d d > B |@ |ƒS t| d? | |d d > B |@ |ƒS d S )Nr   r&   r   é   é   )r   r   )ÚxÚnbÚmodr#   r#   r$   Úrot13N   s    "z_n_fold.<locals>.rot13c                    sR   dd„ t | |ƒD ƒ‰tdd„ ˆD ƒƒr@‡ ‡fdd„tˆ ƒD ƒ‰qtdd„ ˆD ƒƒS )Nc                 S   s   g | ]\}}|| ‘qS r#   r#   )Ú.0ÚaÚbr#   r#   r$   Ú
<listcomp>Y   ó    z*_n_fold.<locals>.ocadd.<locals>.<listcomp>c                 s   s   | ]}|d @ V  qdS )i ÿÿÿNr#   ©r5   r1   r#   r#   r$   Ú	<genexpr>Z   r9   z)_n_fold.<locals>.ocadd.<locals>.<genexpr>c                    s,   g | ]$}ˆ|ˆ  d   d? ˆ| d@  ‘qS )r   r&   éÿ   r#   ©r5   Úi©r2   Úvr#   r$   r8   [   r9   c                 s   s   | ]
}|V  qd S ©Nr#   r:   r#   r#   r$   r;   \   r9   )ÚzipÚanyÚrangeÚ	bytearray)r1   Úyr2   r#   r?   r$   ÚocaddX   s    z_n_fold.<locals>.ocaddó    r   )ÚlenÚmathÚlcmrE   rD   Úbytes)
ÚsÚnr4   rG   ÚmrK   ÚbufÚ_Úoutr>   r#   r#   r$   Ú_n_foldI   s    
rS   c                 C   s   | dt | ƒ |   S )z@
    Return s padded with 0 bytes to a multiple of padsize.
    rH   )rI   )rM   Úpadsizer#   r#   r$   Ú_zeropadj   s    rU   c                 C   s,   t | ƒt |ƒksJ ‚tdd„ t| |ƒD ƒƒS )zB
    xor two strings together and return the resulting string
    c                 s   s   | ]\}}||A V  qd S rA   r#   )r5   r1   rF   r#   r#   r$   r;   v   r9   z_xorbytes.<locals>.<genexpr>)rI   rE   rB   )Úb1Úb2r#   r#   r$   Ú	_xorbytesq   s    rX   c                 C   s@   t | ƒt |ƒksJ ‚d}t| |ƒD ]\}}|||A O }q"|dkS )Nr   )rI   rB   )Zmac1Zmac2Úresr1   rF   r#   r#   r$   Ú
_mac_equaly   s
    rZ   )s   s   þþþþþþþþs   ààààññññs   s   s   s   ààññs   ààññs   þþþþs   þþþþs   ààññs   ààññs   þþþþs   þþþþs   àþàþñþñþs   þàþàþñþñc                   @   s   e Zd ZdZedd„ ƒZdS )Ú_EncryptionAlgorithmProfileaZ  
    Base class for etype profiles.

    Usable etype classes must define:
    :attr etype: etype number
    :attr keysize: protocol size of key in bytes
    :attr seedsize: random_to_key input size in bytes
    :attr random_to_key: (if the keyspace is not dense)
    :attr string_to_key:
    :attr encrypt:
    :attr decrypt:
    :attr prf:
    c                 C   s$   t |ƒ| jkrtdƒ‚t| j|d�S )NúWrong seed length©Úkey)rI   ÚseedsizeÚ
ValueErrorr   Úetype)ÚclsÚseedr#   r#   r$   Úrandom_to_key¨   s    z)_EncryptionAlgorithmProfile.random_to_keyN)r   r   r   Ú__doc__Úclassmethodrd   r#   r#   r#   r$   r[   ™   s   r[   c                   @   s@   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZedd	„ ƒZd
S )Ú_SimplifiedEncryptionProfilea»  
    Base class for etypes using the RFC 3961 simplified profile.
    Defines the encrypt, decrypt, and prf methods.

    Subclasses must define:

    :param blocksize: Underlying cipher block size in bytes
    :param padsize: Underlying cipher padding multiple (1 or blocksize)
    :param macsize: Size of integrity MAC in bytes
    :param hash: underlying hash function
    :param basic_encrypt, basic_decrypt: Underlying CBC/CTS cipher
    c                 C   sL   t || jƒ}d}t|ƒ| jk r8|  ||¡}||7 }|}q|  |d| j… ¡S )z0
        Also known as "DK" in RFC3961.
        r9   r   )rS   Ú	blocksizerI   r_   Úbasic_encryptrd   )rb   r^   ZconstantÚ	plaintextZrndseedÚ
ciphertextr#   r#   r$   Úderive½   s    
z#_SimplifiedEncryptionProfile.derivec           	      C   s€   |   |t d|d¡¡}|   |t d|d¡¡}|du r@t | j¡}|t|| jƒ }t 	|j
|| j¡ ¡ }|  ||¡|d| j…  S )z%
        encryption function
        ú>IBéU   éª   N)rl   ÚstructÚpackÚosÚurandomrh   rU   rT   r   Únewr^   ÚhashmodÚdigestri   Úmacsize)	rb   r^   Úkeyusagerj   Ú
confounderÚkiÚkeÚbasic_plaintextÚhmacr#   r#   r$   ÚencryptÐ   s    z$_SimplifiedEncryptionProfile.encryptc                 C   sè   |   |t d|d¡¡}|   |t d|d¡¡}t|ƒ| j| j k rHtdƒ‚t|d| j … ƒt|| j d… ƒ }}t|ƒ| j dkrŒtdƒ‚|  	|t
|ƒ¡}tt |j|| j¡ ¡ ƒ}	|	d| j… }
t||
ƒsÖtdƒ‚t
|| jd… ƒS )	z%
        decryption function
        rm   rn   ro   zCiphertext too shortNr   z,ciphertext does not meet padding requirementúciphertext integrity failure)rl   rp   rq   rI   rh   rw   r`   rE   rT   Úbasic_decryptrL   r   rt   r^   ru   rv   rZ   )rb   r^   rx   rk   rz   r{   Úbasic_ctextÚmacr|   r}   Úexpmacr#   r#   r$   ÚdecryptÝ   s    ÿ
z$_SimplifiedEncryptionProfile.decryptc                 C   sN   | j  |¡ ¡ }t|ƒ| j r6|dt|ƒ| j  … }|  |d¡}|  ||¡S )z(
        pseudo-random function
        Ns   prf)ru   rt   rv   rI   rh   rl   ri   )rb   r^   ÚstringZhashvalÚkpr#   r#   r$   Úprfó   s
    z _SimplifiedEncryptionProfile.prfN)	r   r   r   re   rf   rl   r~   r„   r‡   r#   r#   r#   r$   rg   ¯   s   


rg   c                   @   sl   e Zd 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   sv   |d u rt  | j¡}|d| j  t|| jƒ }| j |¡ ¡ }|d t	|ƒ… | |t	|ƒt	|ƒ d …  }|  
||¡S )NrH   )rr   rs   rh   rw   rU   rT   ru   rt   rv   rI   ri   )rb   r^   rx   rj   ry   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 … }t| j |d| j  | ¡ 	¡ ƒ}t
||ƒs”tdƒ‚t|ƒS )Núciphertext too shortrH   r   )rI   rh   rw   r`   r€   rT   rE   ru   rt   rv   rZ   r   rL   )	rb   r^   rx   rk   Zcomplex_plaintextZ	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 ]´}tƒ }	|D ]}
|	 t|
ƒd@ ¡ q`|du röd‰ |	D ]$}
ˆ t|
ƒdd …  dd¡ 	¡ 7 ‰ qˆˆ d d d… ‰ tƒ }	‡ fdd
„tdtˆ ƒdƒD ƒD ]}|	 t
|dƒ¡ qà| }|||	ƒ}qRtd dd„ ||ƒD ƒ¡ƒ}t|ƒtv �rB|d dA |d< t |tj|¡}| ˆ¡dd … }t||ƒƒ}t|ƒtv �rŽ|d dA |d< t| jt|ƒd�S )Nc                 S   s’   d}t t| ƒƒD ]|}tt| | ƒƒdd …  dd¡}|d d…  d¡d dkrn|tt|d d… d dƒƒ7 }q|tt|d d… d dƒƒ7 }q|S )Nr9   r   r&   Ú0r%   Ú1r   )rD   rI   Úbinr   ÚrjustÚcountr   Úint)ZdeskeyÚtempr>   Útr#   r#   r$   Ú	fixparity,  s       z0_DESCBC.mit_des_string_to_key.<locals>.fixparityc                 S   sN   t ƒ }| D ]>}t|ƒ d¡d dkr2|d> dB }n|d> d@ }| |¡ q
|S )Nr�   r   r   r   éþ   )ÚlistrŽ   r�   Úappend)Úl1r’   Úbyter#   r#   r$   Ú	addparity6  s    z0_DESCBC.mit_des_string_to_key.<locals>.addparityc                 S   s0   t ƒ }t| |ƒD ]\}}| ||A d@ ¡ q|S )Né   )r–   rB   r—   )r˜   Úl2r’   rV   rW   r#   r#   r$   ÚXOR@  s    z*_DESCBC.mit_des_string_to_key.<locals>.XORT)r   r   r   r   r   r   r   r   c                    s   g | ]}ˆ ||d  … ‘qS )r&   r#   r=   )rM   r#   r$   r8   K  r9   z1_DESCBC.mit_des_string_to_key.<locals>.<listcomp>r   r&   r›   Fr9   r   r%   rŒ   éÿÿÿÿc                    s   g | ]}ˆ ||d  … ‘qS )r%   r#   r=   )Úbintempr#   r$   r8   Y  r9   c                 s   s   | ]}t |ƒV  qd S rA   )r   )r5   r™   r#   r#   r$   r;   _  r9   z0_DESCBC.mit_des_string_to_key.<locals>.<genexpr>éð   iøÿÿÿr]   )rU   rT   rD   rI   r–   r—   r   rŽ   r�   Úencoder‘   rE   ÚjoinrL   ÚWEAK_DES_KEYSr
   rt   ÚMODE_CBCr~   r   ra   )rb   r…   Úsaltr”   rš   r�   ZoddZ
tempstringÚblockZtemp56r™   Zbits7ZtempkeyÚcipherZchekcsumkeyr#   )rŸ   rM   r$   Úmit_des_string_to_key*  s:    

"""z_DESCBC.mit_des_string_to_keyc                 C   s4   t |ƒd dksJ ‚t |jtjd¡}| t|ƒ¡S ©Nr&   r   s           )rI   r
   rt   r^   r¤   r~   rL   )rb   r^   rj   Údesr#   r#   r$   ri   k  s    z_DESCBC.basic_encryptc                 C   s4   t |ƒd dksJ ‚t |jtjd¡}| t|ƒ¡S r©   )rI   r
   rt   r^   r¤   r„   rL   )rb   r^   rk   rª   r#   r#   r$   r€   q  s    z_DESCBC.basic_decryptc                 C   s(   |d ur|dkrt dƒ‚|  ||¡}|S )Nr9   z$Invalid DES string-to-key parameters)r`   r¨   )rb   r…   r¥   Úparamsr^   r#   r#   r$   Ústring_to_keyw  s    z_DESCBC.string_to_keyN)r   r   r   Úkeysizer_   rh   rT   rw   r   ru   rf   r~   r„   r¨   ri   r€   r¬   r#   r#   r#   r$   rˆ     s$   


@

rˆ   c                   @   s   e Zd ZejZeZdS )Ú_DESMD5N)r   r   r   r   r   ra   r   ru   r#   r#   r#   r$   r®     s   r®   c                   @   s   e Zd ZejZeZdS )Ú_DESMD4N)r   r   r   r   r   ra   r   ru   r#   r#   r#   r$   r¯   „  s   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   sn   dd„ }t |ƒ}t|ƒdkr$tdƒ‚||d d… ƒ||dd… ƒ||dd … ƒ  }}}t| j|| | d�S )Nc                    sz   dd„ ‰ t ˆƒdksJ ‚‡ fdd„ˆD ƒ}ˆ t‡fdd„tdƒD ƒƒƒ}tt||g ƒƒ}|tv rr|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�   )r7   r#   r#   r$   Úparity˜  s    z6_DES3CBC.random_to_key.<locals>.expand.<locals>.parityr%   c                    s   g | ]}ˆ |d @ ƒ‘qS )r´   r#   )r5   r7   )rµ   r#   r$   r8   ž  r9   z:_DES3CBC.random_to_key.<locals>.expand.<locals>.<listcomp>c                 3   s"   | ]}ˆ | d @ |d  > V  qdS )r   Nr#   r=   )rc   r#   r$   r;   Ÿ  r9   z9_DES3CBC.random_to_key.<locals>.expand.<locals>.<genexpr>r    )rI   ÚsumrD   rL   rE   r£   )rc   Z
firstbytesZlastbyteZkeybytesr#   )rµ   rc   r$   Úexpand—  s    z&_DES3CBC.random_to_key.<locals>.expandr²   r\   r%   é   r]   )rE   rI   r`   r   ra   )rb   rc   r·   Zk1Zk2Zk3r#   r#   r$   rd   ’  s    4z_DES3CBC.random_to_keyc                 C   s8   |d ur|dkrt dƒ‚|  t|| dƒ¡}|  |d¡S )Nr9   z%Invalid DES3 string-to-key parametersr²   ó   kerberos)r`   rd   rS   rl   )rb   r…   r¥   r«   Úkr#   r#   r$   r¬   «  s    z_DES3CBC.string_to_keyc                 C   s4   t |ƒd dksJ ‚t |jtjd¡}| t|ƒ¡S r©   )rI   r   rt   r^   r   r¤   r~   rL   )rb   r^   rj   Údes3r#   r#   r$   ri   ²  s    z_DES3CBC.basic_encryptc                 C   s4   t |ƒd dksJ ‚t |jtjd¡}| t|ƒ¡S r©   )rI   r   rt   r^   r   r¤   r„   rL   )rb   r^   rk   r»   r#   r#   r$   r€   ¸  s    z_DES3CBC.basic_decryptN)r   r   r   r   r   ra   r­   r_   rh   rT   rw   r   ru   rf   rd   r¬   ri   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 )Ú_AESEncryptionTyper   r   r(   c                 C   sD   t  d|pd¡d }dd„ }t||| j||ƒ}|  |¡}|  |d¡S )Nz>Ls      r   c                 S   s   t  | |t¡ ¡ S rA   )r   rt   r   rv   )ÚprM   r#   r#   r$   Ú<lambda>É  r9   z2_AESEncryptionType.string_to_key.<locals>.<lambda>r¹   )rp   Úunpackr   r_   rd   rl   )rb   r…   r¥   r«   Z
iterationsr‡   rc   Ztkeyr#   r#   r$   r¬   Æ  s
    
z _AESEncryptionType.string_to_keyc                 C   s‚   t |ƒdksJ ‚t |jtjd¡}| tt|ƒdƒ¡}t |ƒdkr~t |ƒd pPd}|d d… |dd …  |dd… d |…  }|S )Nr   s                   iàÿÿÿiðÿÿÿ)rI   r   rt   r^   r¤   r~   rU   rL   )rb   r^   rj   ÚaesZctextÚlastlenr#   r#   r$   ri   Î  s    ,z _AESEncryptionType.basic_encryptc                    s  t ˆ ƒdksJ ‚t |jtj¡}t ˆ ƒdkr6| ˆ ¡S ‡ fdd„tdt ˆ ƒdƒD ƒ}t |d ƒ}tdƒ}d}|d d… D ]$}|tt| t	|ƒ¡ƒ|ƒ7 }|}qxt| t	|d ƒ¡ƒ}t|d |… |d ƒ}	||d … }
|tt| t	|d ƒt	|
ƒ ¡ƒ|ƒ7 }||	 S )Nr   c                    s    g | ]}t ˆ ||d  … ƒ‘qS )r   )rE   )r5   r½   ©rk   r#   r$   r8   á  s   z4_AESEncryptionType.basic_decrypt.<locals>.<listcomp>r   rž   r9   r´   )
rI   r   rt   r^   ZMODE_ECBr„   rD   rE   rX   rL   )rb   r^   rk   rÀ   ZcblocksrÁ   Zprev_cblockrj   ZbbZlastplaintextZomittedr#   rÂ   r$   r€   Ú  s(    

ÿÿz _AESEncryptionType.basic_decryptN)r   r   r   rh   rT   rw   r   ru   rf   r¬   ri   r€   r#   r#   r#   r$   r¼   ¿  s   

r¼   c                   @   s   e Zd ZdZdZdZdS )Ú
_AES128CTSr   r   N©r   r   r   ra   r­   r_   r#   r#   r#   r$   rÃ   û  s   rÃ   c                   @   s   e Zd ZdZdZdZdS )Ú
_AES256CTSr   é    NrÄ   r#   r#   r#   r$   rÅ     s   rÅ   c                   @   sT   e Zd Zd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   r   c                 C   s*   dddœ}| |v r||  n| }t  d|¡S )Nr&   r0   )r   r   ú<I)rp   rq   )rx   ÚtableZmsusager#   r#   r$   Ú	usage_str  s    
z_RC4.usage_strc                 C   s&   t |ƒ d¡}t| jt |¡ ¡ d�S )NzUTF-16LEr]   )r   r¡   r   ra   r   rt   rv   )rb   r…   r¥   r«   Zutf16stringr#   r#   r$   r¬     s    z_RC4.string_to_keyc                 C   sp   |d u rt  d¡}t |j|  |¡t¡ ¡ }t ||| t¡ ¡ }t ||t¡ ¡ }|t |¡ 	t
|| ƒ¡ S )Nr&   )rr   rs   r   rt   r^   rÊ   r   rv   r	   r~   rL   )rb   r^   rx   rj   ry   rz   Ú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||	ƒ}
|
sÞ|dkrÞt |jt dd¡t¡ ¡ }t ||t¡ ¡ }	t||	ƒ}
|
sêtdƒ‚t|dd … ƒS )Nr±   rŠ   r   r'   rÈ   r&   r   )rI   r`   rE   r   rt   r^   rÊ   r   rv   r	   r„   rL   rZ   rp   rq   r   )rb   r^   rx   rk   rË   r�   rz   r{   r|   Z	exp_cksumÚokr#   r#   r$   r„   "  s    "

z_RC4.decryptc                 C   s   t  |jt|ƒt¡ ¡ S rA   )r   rt   r^   rL   r   rv   )rb   r^   r…   r#   r#   r$   r‡   6  s    z_RC4.prfN)r   r   r   ra   r­   r_   ÚstaticmethodrÊ   rf   r¬   r~   r„   r‡   r#   r#   r#   r$   rÇ     s   



rÇ   c                   @   s   e Zd Zedd„ ƒZdS )Ú_ChecksumProfilec                 C   s,   |   |||¡}tt|ƒt|ƒƒs(tdƒ‚d S )Nzchecksum verification failure)r‰   rZ   rE   r   )rb   r^   rx   ÚtextrË   Úexpectedr#   r#   r$   Úverify@  s    z_ChecksumProfile.verifyN)r   r   r   rf   rÑ   r#   r#   r#   r$   rÎ   ;  s   rÎ   c                       s,   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 )Nrm   é™   )
Úencrl   rp   rq   r   rt   r^   ru   rv   rw   )rb   r^   rx   rÏ   Úkcr}   r#   r#   r$   r‰   N  s    z_SimplifiedChecksum.checksumc                    s0   |j | jj krtdƒ‚tt| ƒ ||||¡ d S ©NzWrong key type for checksum)ra   rÔ   r`   ÚsuperrÒ   rÑ   ©rb   r^   rx   rÏ   rË   ©Ú	__class__r#   r$   rÑ   T  s    z_SimplifiedChecksum.verify©r   r   r   rf   r‰   rÑ   Ú__classcell__r#   r#   rÙ   r$   rÒ   G  s   
rÒ   c                   @   s   e Zd ZdZeZdS )Ú_SHA1AES128r(   N)r   r   r   rw   rÃ   rÔ   r#   r#   r#   r$   rÝ   [  s   rÝ   c                   @   s   e Zd ZdZeZdS )Ú_SHA1AES256r(   N)r   r   r   rw   rÅ   rÔ   r#   r#   r#   r$   rÞ   `  s   rÞ   c                   @   s   e Zd ZdZeZdS )Ú	_SHA1DES3r³   N)r   r   r   rw   r°   rÔ   r#   r#   r#   r$   rß   e  s   rß   c                       s,   e Zd Zedd„ ƒZe‡ fdd„ƒZ‡  ZS )Ú_HMACMD5c                 C   s>   t  |jdt¡ ¡ }t t |¡| ¡ ¡ }t  ||t¡ ¡ S )Ns   signaturekey )r   rt   r^   r   rv   rÇ   rÊ   )rb   r^   rx   rÏ   ZksignZmd5hashr#   r#   r$   r‰   k  s    z_HMACMD5.checksumc                    s.   |j tjkrtdƒ‚tt| ƒ ||||¡ d S rÖ   )ra   r   r"   r`   r×   rà   rÑ   rØ   rÙ   r#   r$   rÑ   q  s    z_HMACMD5.verifyrÛ   r#   r#   rÙ   r$   rà   j  s   
rà   l   vÿ c                   @   sb   e Zd Zddd„Zdd„ Zddd„Zdd	„ Zd
d„ Zdd„ Zdd„ Z	e
dd„ ƒZe
ddd„ƒZdS )r   Nc                 C   sª   || _ zt| | _W n ty2   td| ƒ‚Y n0 || _|d urpzt| | _W n tyn   td| ƒ‚Y n0 |d ur t|ƒ| jjkr tdt|ƒ| jjf ƒ‚|| _	d S )NúUnknown etype '%s'z%Wrong key length. Got %s. Expected %s)
ÚeptypeÚ	_enctypesÚepr`   Ú	cksumtypeÚ
_checksumsÚcprI   r­   r^   )Úselfra   rå   r^   r#   r#   r$   Ú__init__Œ  s     ÿzKey.__init__c                 C   s&   d| j | jd urdt| jƒ ndf S )Nz
<Key %s%s>z (%s octets)Ú )râ   r^   rI   )rè   r#   r#   r$   Ú__repr__ž  s    þzKey.__repr__c                 C   s   | j  | |t|ƒ|¡S rA   )rä   r~   rL   )rè   rx   rj   ry   r#   r#   r$   r~   ¤  s    zKey.encryptc                 C   s   | j  | ||¡S rA   )rä   r„   )rè   rx   rk   r#   r#   r$   r„   §  s    zKey.decryptc                 C   s   | j  | |¡S rA   )rä   r‡   )rè   r…   r#   r#   r$   r‡   ¬  s    zKey.prfc                 C   s"   | j d u rtdƒ‚| j | ||¡S ©Nzchecksumtype not specified !)rå   r`   rç   r‰   )rè   rx   rÏ   r#   r#   r$   Úmake_checksum¯  s    
zKey.make_checksumc                 C   s(   | j d u rtdƒ‚| j | |||¡ d S rì   )rå   r`   rç   rÑ   )rè   rx   rÏ   rË   r#   r#   r$   Úverify_checksum´  s    
zKey.verify_checksumc                 C   sL   zt | }W n ty*   td| ƒ‚Y n0 t|ƒ|jkrBtdƒ‚| |¡S )Nrá   zWrong crypto seed length)rã   r`   rI   r_   rd   )rb   ra   rc   rä   r#   r#   r$   rd   ¼  s    zKey.random_to_keyc                 C   s:   zt | }W n ty*   td| ƒ‚Y n0 | |||¡S )Nrá   )rã   r`   r¬   )rb   ra   r…   r¥   r«   rä   r#   r#   r$   r¬   Æ  s
    zKey.string_to_key)NN)N)N)r   r   r   ré   rë   r~   r„   r‡   rí   rî   rf   rd   r¬   r#   r#   r#   r$   r   ‹  s   


	r   c              	   C   s4   dd„ }t | jttt|| |ƒƒt|||ƒƒƒƒd�S )z
    KRB-FX-CF2 RFC6113
    c                 S   sH   d}d}t |ƒ| jjk r8||  t|ƒ| ¡7 }|d7 }q|d | jj… S )Nr9   r   )rI   rä   r_   r‡   r   )r^   ZpepperrR   r�   r#   r#   r$   ÚprfplusÔ  s    
zKRB_FX_CF2.<locals>.prfplusr]   )r   râ   rL   rX   rE   )Úkey1Úkey2Zpepper1Zpepper2rï   r#   r#   r$   Ú
KRB_FX_CF2Ï  s    	ÿÿþrò   )Cre   rJ   rr   rp   Zscapy.compatr   r   r   r   r   ZCryptodome.Cipherr   r   r	   r
   ZCryptodome.Hashr   r   r   r   ZCryptodome.Protocol.KDFr   ÚImportErrorZCrypto.CipherZCrypto.HashZCrypto.Protocol.KDFÚ__all__r   r   r`   r   rS   rU   rX   rZ   Úsetr£   Úobjectr[   rg   rˆ   r®   r¯   r°   r¼   rÃ   rÅ   rÇ   rÎ   rÒ   rÝ   rÞ   rß   rà   r   r   r    r!   r"   rã   r+   r,   r-   r.   ræ   r   rò   r#   r#   r#   r$   Ú<module>   sv   ÿ

!
ÿS}6<4úû	D