o
    Œõ±j[  ã                   @   sL   d dl Z G dd„ dƒZdd„ Zedkr$zeƒ  W dS  ey#   Y dS w dS )é    Nc                   @   sš   e 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
dd„ Z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 )!ÚMD4z,An implementation of the MD4 hash algorithm.é    l   ÿÿ )i#Egl   ‰+›_ l   þ\u1 ivT2Nc                    sx   ˆ du rd‰ ˆ | _ tˆ ƒd }ˆ d7 ‰ ˆ dtˆ ƒd  d  7 ‰ ˆ t d|¡7 ‰ |  ‡ fdd	„td
tˆ ƒdƒD ƒ¡ dS )z0:param ByteString msg: The message to be hashed.Nó    é   ó   €ó    é@   z<Qc                    s   g | ]
}ˆ ||d  … ‘qS )r   © )Ú.0Úi©Úmsgr	   úŽ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/unicrypto/backends/pure/MD4.pyÚ
<listcomp>J   s    z MD4.__init__.<locals>.<listcomp>r   )r   ÚlenÚstructÚpackÚ_processÚrange)Úselfr   Úmlr	   r   r   Ú__init__<   s   (zMD4.__init__c                 C   s,   | j r| jj› d| j d›d�S | jj› d�S )Nú(Úsú)z())r   Ú	__class__Ú__name__©r   r	   r	   r   Ú__repr__L   s   zMD4.__repr__c                 C   ó   |   ¡ S ©N)Ú	hexdigestr   r	   r	   r   Ú__str__Q   ó   zMD4.__str__c                 C   s   | j |j kS r    )Úh)r   Úotherr	   r	   r   Ú__eq__T   s   z
MD4.__eq__c                 C   s   t jdg| j¢R Ž S )z2:return: The final hash value as a `bytes` object.z<4L)r   r   r$   r   r	   r	   r   ÚbytesW   s   z	MD4.bytesc                 C   s
   |   ¡ jS )z*:return: The final hash value as hexbytes.)r!   Úencoder   r	   r	   r   Úhexbytes[   s   
zMD4.hexbytesc                 C   s   d  dd„ |  ¡ D ƒ¡S )z-:return: The final hash value as a hexstring.Ú c                 s   s   � | ]}|d ›V  qdS )Ú02xNr	   )r
   Úvaluer	   r	   r   Ú	<genexpr>a   s   € z MD4.hexdigest.<locals>.<genexpr>)Újoinr'   r   r	   r	   r   r!   _   ó   zMD4.hexdigestc                 C   r   r    )r'   r   r	   r	   r   Údigestc   r#   z
MD4.digestc              	   C   s  |D �] }t t d|¡ƒ| j ¡ }}g d¢}tdƒD ]=}tdd„ t| | d ƒƒ\}}}	}
|||d  }}|| t || ||	 ||
 ¡ ||  }t 	|tj
@ |¡||< qg d¢}tdƒD ]G}tdd„ t| | d ƒƒ\}}}	}
|d d |d  ||d  }}|| t || ||	 ||
 ¡ ||  d	 }t 	|tj
@ |¡||< qag d
¢}g d¢}tdƒD ]A}tdd„ t| | d ƒƒ\}}}	}
|| ||d  }}|| t || ||	 ||
 ¡ ||  d }t 	|tj
@ |¡||< qµdd„ t| j|ƒD ƒ| _qd S )Nz<16I)é   é   é   é   é   c                 S   ó   | d S ©Né   r	   ©Úxr	   r	   r   Ú<lambda>m   ó    zMD4._process.<locals>.<lambda>r8   )r1   é   é	   é   c                 S   r6   r7   r	   r9   r	   r	   r   r;   u   r<   i™y‚Z)r1   r>   r3   é   )r   r   r8   é   é   é
   é   é   é   r>   r=   r?   r1   r3   r2   r@   c                 S   r6   r7   r	   r9   r	   r	   r   r;   ~   r<   i¡ëÙnc                 S   s   g | ]\}}|| t j@ ‘qS r	   )r   Úmask)r
   ÚvÚnr	   r	   r   r   ƒ   s    z MD4._process.<locals>.<listcomp>)Úlistr   Úunpackr$   Úcopyr   Úmapr   ÚFÚlrotrG   ÚGÚHÚzip)r   ÚchunksÚchunkÚXr$   ÚXirI   r   ÚjÚkÚlÚKÚSÚhnÚKir	   r	   r   r   f   s.   
$*$".$.äzMD4._processc                 C   s   | |@ |  |@ B S r    r	   ©r:   ÚyÚzr	   r	   r   rN   …   s   zMD4.Fc                 C   s   | |@ | |@ B ||@ B S r    r	   r^   r	   r	   r   rP   ‰   r/   zMD4.Gc                 C   s   | |A |A S r    r	   r^   r	   r	   r   rQ   �   s   zMD4.Hc                 C   s&   | |> t j@ | t j| ? }}||B S r    )r   rG   Úwidth)r,   rI   ÚlbitsÚrbitsr	   r	   r   rO   ‘   s   zMD4.lrotr    )r   Ú
__module__Ú__qualname__Ú__doc__ra   rG   r$   r   r   r"   r&   r'   r)   r!   r0   r   ÚstaticmethodrN   rP   rQ   rO   r	   r	   r	   r   r   3   s,    



r   c                  C   s®   dd l } t| jƒdkr&dd„ | jdd … D ƒ}|D ]
}tt|ƒ ¡ ƒ qd S g d¢}g d¢}tdƒ tƒ  t||ƒD ]\}}td|ƒ td	|ƒ td
t|ƒ ¡ ƒ tƒ  q:d S )Nr   rF   c                 S   s   g | ]}|  ¡ ‘qS r	   )r(   )r
   r   r	   r	   r   r   œ   s    zmain.<locals>.<listcomp>)r   s+   The quick brown fox jumps over the lazy dogs   BEES)Ú 31d6cfe0d16ae931b73c59d7e0c089c0Ú 1bee69a46ba811185c194762abaeae90Ú 501af1ef4b68495b5b7e37b15b4cda68zTesting the MD4 class.z	Message: z	Expected:z	Actual:  )Úsysr   ÚargvÚprintr   r!   rR   )rk   ÚmessagesÚmessageÚknown_hashesÚexpectedr	   r	   r   Úmain—   s    ÿ

ürr   Ú__main__)r   r   rr   r   ÚKeyboardInterruptr	   r	   r	   r   Ú<module>   s   /dÿý