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
@ |||< qd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<   iyZ)r1   r>   r3      )r   r   r8         
            r>   r=   r?   r1   r3   r2   r@   c                 S   r6   r7   r	   r9   r	   r	   r   r;   ~   r<   inc                 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