U
    øÐLa  ã                   @   sª   d Z ddlmZmZ ddlmZ ddlZddlmZm	Z	m
Z
 ddlmZ ddlmZmZ dd	d
gZG dd„ deƒZdd„ Zeeƒ dƒG dd
„ d
eƒƒZG dd	„ d	eƒZdS )z2passlib.tests -- unittests for passlib.crypto._md4é    )Úwith_statementÚdivision)ÚhexlifyN)Úbascii_to_strÚPY3Úu)Úlookup_hash)ÚTestCaseÚ
skipUnlessÚ_Common_MD4_TestÚMD4_Builtin_TestÚMD4_SSL_Testc                   @   sR   e Zd ZdZdddddddgZd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dS )r   z$common code for testing md4 backends)ó    Ú 31d6cfe0d16ae931b73c59d7e0c089c0)ó   aÚ bde52cb31de33e46245e05fbdbd6fb24)ó   abcZ a448017aaf21d8525fc10ae87aa6729d)s   message digestZ d9130a8164549fe818874806e1c7014b)s   abcdefghijklmnopqrstuvwxyzÚ d79e1c308aa5bbcdeea8ed63df412da9)s>   ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789Z 043f8582f241db351ce627e153e7f0e4)sP   12345678901234567890123456789012345678901234567890123456789012345678901234567890Z e33b4ddc9c38f2199c3e7b164fcc0536c                 C   s
   t dƒjS )zd
        get md4 constructor --
        overridden by subclasses to use alternate backends.
        Úmd4)r   Úconst©Úself© r   úI/tmp/pip-unpacked-wheel-8v2dfbvt/passlib/tests/test_crypto_builtin_md4.pyÚget_md4_const'   s    z_Common_MD4_Test.get_md4_constc                 C   s8   |   ¡ ƒ }|  |jd¡ |  |jd¡ |  |jd¡ dS )zinformational attributesr   é   é@   N)r   ÚassertEqualÚnameÚdigest_sizeÚ
block_size)r   Úhr   r   r   Ú
test_attrs.   s    
z_Common_MD4_Test.test_attrsc                 C   s¬   |   ¡ }|dƒ}|  | ¡ d¡ | d¡ |  | ¡ d¡ | d¡ |  | ¡ d¡ tr„|ƒ }|  t|jtdƒ¡ |  | ¡ d¡ n$|ƒ }| tdƒ¡ |  | ¡ d¡ dS )	zupdate() methodr   r   r   r   s   bcdefghijklmnopqrstuvwxyzr   ÚaN)r   r   Ú	hexdigestÚupdater   ÚassertRaisesÚ	TypeErrorr   )r   r   r!   r   r   r   Útest_md4_update5   s    

z _Common_MD4_Test.test_md4_updatec                 C   s4   |   ¡ }| jD ] \}}||ƒ ¡ }|  ||¡ qdS )zhexdigest() methodN)r   Úvectorsr$   r   ©r   r   ÚinputÚhexÚoutr   r   r   Útest_md4_hexdigestL   s    z#_Common_MD4_Test.test_md4_hexdigestc                 C   s<   |   ¡ }| jD ](\}}tt||ƒ ¡ ƒƒ}|  ||¡ qdS )zdigest() methodN)r   r)   r   r   Údigestr   r*   r   r   r   Útest_md4_digestS   s    z _Common_MD4_Test.test_md4_digestc                 C   sP   |   ¡ }|dƒ}| ¡ }| d¡ |  | ¡ d¡ | d¡ |  | ¡ d¡ dS )zcopy() methodr   s   defZ 804e7f1c2586e50b49ac65db5b645131s   ghiZ c5225580bfe176f6deeee33dee98732cN)r   Úcopyr%   r   r$   )r   r   r!   Úh2r   r   r   Útest_md4_copyZ   s    

z_Common_MD4_Test.test_md4_copyN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r)   r   r"   r(   r.   r0   r3   r   r   r   r   r      s   ÷c                   C   s,   zt  d¡ W dS  tk
r&   Y dS X dS )z1
    check if hashlib natively supports md4.
    r   TFN)ÚhashlibÚnewÚ
ValueErrorr   r   r   r   Úhas_native_md4k   s
    
r;   zhashlib lacks ssl/md4 supportc                       s    e Zd ZdZ‡ fdd„Z‡  ZS )r   zhashlib.new('md4')c                    s$   t t| ƒ ¡  |  |  ¡ jd¡ d S )Nr8   )Úsuperr   ÚsetUpr   r   r5   r   ©Ú	__class__r   r   r=   ~   s    zMD4_SSL_Test.setUp©r4   r5   r6   ZdescriptionPrefixr=   Ú__classcell__r   r   r>   r   r   w   s   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )r   zpasslib.crypto._md4.md4()c                    s^   t t| ƒ ¡  tƒ rHtj‰ ‡ fdd„}|  td|¡ t ¡  |  	tj¡ |  
|  ¡ jd¡ d S )Nc                    s   | dkrt dƒ‚ˆ | f|žŽ S )Nr   zmd4 disabled for testing)r:   )r   Úargs©Úorigr   r   Úwrapper   s    z'MD4_Builtin_Test.setUp.<locals>.wrapperr9   zpasslib.crypto._md4)r<   r   r=   r;   r8   r9   Z	patchAttrr   Úclear_cacheZ
addCleanupr   r   r5   )r   rE   r>   rC   r   r=   ˆ   s    zMD4_Builtin_Test.setUpr@   r   r   r>   r   r   …   s   )r7   Ú
__future__r   r   Úbinasciir   r8   Zpasslib.utils.compatr   r   r   Zpasslib.crypto.digestr   Zpasslib.tests.utilsr	   r
   Ú__all__r   r;   r   r   r   r   r   r   Ú<module>   s   ýS
