a
    kÄ#d  ã                   @   s   d Z ddlZG dd„ dƒZdS )zh
MD4 implementation

Modified from:
https://gist.github.com/kangtastic/c3349fc4f9d659ee362b12d7d8c639b6
é    Nc                   @   sz   e Zd ZdZdZdZdZdZg d¢Zddd	„Z	d
d„ Z
dd„ Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZdS )ÚMD4zj
    An implementation of the MD4 hash algorithm.

    Modified to provide the same API as hashlib's.
    Zmd4é@   é    l   ÿÿ )i#Egl   ‰+›_ l   þ\u1 ivT2ó    c                 C   s
   || _ d S ©N©Úmsg©Úselfr   © r   úR/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/tls/crypto/md4.pyÚ__init__   s    zMD4.__init__c                 C   s   |  j |7  _ d S r   r   r	   r   r   r   Úupdate!   s    z
MD4.updatec                    s’   t ˆ jƒd }ˆ  jd7  _ˆ  jdt ˆ jƒd  ˆ j  7  _ˆ  jt d|¡7  _ˆ  ‡ fdd„tdt ˆ jƒˆ jƒD ƒ¡ tjdgˆ j¢R Ž S )	Né   ó   €ó    z<Qc                    s    g | ]}ˆ j ||ˆ j … ‘qS r   )r   Ú
block_size)Ú.0Úi©r
   r   r   Ú
<listcomp>,   s   ÿzMD4.digest.<locals>.<listcomp>r   z<4L)Úlenr   r   ÚstructÚpackÚ_processÚrangeÚh)r
   Úmlr   r   r   Údigest$   s    $ÿz
MD4.digestc              	   C   s  |D �]}t t d|¡ƒ| j ¡  }}g d¢}tdƒD ]z}tdd„ t| | d ƒƒ\}}}	}
|||d   }}|| t || ||	 ||
 ¡ ||  }t 	|tj
@ |¡||< q6g d¢}tdƒD ]Ž}tdd„ t| | d ƒƒ\}}}	}
|d d |d  ||d   }}|| t || ||	 ||
 ¡ ||  d	 }t 	|tj
@ |¡||< qÂg d
¢}g d¢}tdƒD ]„}tdd„ t| | d ƒƒ\}}}	}
|| ||d   }}|| t || ||	 ||
 ¡ ||  d }t 	|tj
@ |¡||< �qjdd„ t| j|ƒD ƒ| _qd S )Nz<16I)é   é   é   é   é   c                 S   s   | d S ©Né   r   ©Úxr   r   r   Ú<lambda>8   r   zMD4._process.<locals>.<lambda>r%   )r   é   é	   é   c                 S   s   | d S r$   r   r&   r   r   r   r(   @   r   i™y‚Z)r   r*   r!   é   )r   r   r%   é   é   é
   é   é   é   r*   r)   r+   r   r!   r    r,   c                 S   s   | d S r$   r   r&   r   r   r   r(   I   r   i¡ëÙnc                 S   s   g | ]\}}|| t j@ ‘qS r   )r   Úmask)r   ÚvÚnr   r   r   r   N   r   z MD4._process.<locals>.<listcomp>)Úlistr   Úunpackr   Úcopyr   Úmapr   ÚFÚlrotr3   ÚGÚHÚzip)r
   ÚchunksÚchunkÚXr   ÚXir5   r   ÚjÚkÚlÚKÚSZhnZKir   r   r   r   1   s,    
$*$".$.zMD4._processc                 C   s   | |@ |  |@ B S r   r   ©r'   ÚyÚzr   r   r   r:   P   s    zMD4.Fc                 C   s   | |@ | |@ B ||@ B S r   r   rH   r   r   r   r<   T   s    zMD4.Gc                 C   s   | |A |A S r   r   rH   r   r   r   r=   X   s    zMD4.Hc                 C   s&   | |> t j@ | t j| ?  }}||B S r   )r   r3   Úwidth)Úvaluer5   ZlbitsZrbitsr   r   r   r;   \   s    zMD4.lrotN)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Únamer   rK   r3   r   r   r   r   r   Ústaticmethodr:   r<   r=   r;   r   r   r   r   r      s$   



r   )rP   r   r   r   r   r   r   Ú<module>   s   