B
    u9a¥š  ã               @   sX  d dl Z d dlmZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlmZ d dlmZmZmZ d dlmZ eedƒZeddgd	Zeddgd
Zyd dlZW n ek
rÊ   dZY nX e	 ed¡Zyd dlZW n ek
rü   dZY nX e	 ed¡Zdd„ ZdZdd„ ZG dd„ de	j ƒZ!G dd„ de	j ƒZ"e#dkrTe	 $¡  dS )é    N)Ú	unhexlify)Úsupport)Ú_4GÚ
bigmemtestÚimport_fresh_module)ÚHTTPExceptionÚgettotalrefcountÚhashlibÚ_hashlib)Zfresh)Zblockedzrequires _blake2zrequires _sha3c             C   sP   t | tƒstt| ƒƒ‚d}d}x,| D ]$}|||d? d@  ||d@   7 }q$W |S )NZ0123456789abcdefÚ é   é   )Ú
isinstanceÚbytesÚAssertionErrorÚrepr)ÚsÚhÚrÚi© r   ú"/usr/lib/python3.7/test_hashlib.pyÚhexstr,   s    
$r   z(http://www.pythontest.net/hashlib/{}.txtc          	   c   sž   t  | ¡}yt |¡}W n( ttfk
r@   t d |¡¡‚Y nX |N xF|D ]>}| ¡ }| 	d¡sN|sjqN| 
d¡}t |d ¡|d< |V  qNW W d Q R X d S )NzCould not retrieve {}ú#ú,r   )ÚURLÚformatr   Zopen_urlresourceÚOSErrorr   ÚunittestZSkipTestÚstripÚ
startswithÚsplitr   Úfromhex)Ú	hash_nameZurlZtestdataÚlineÚpartsr   r   r   Úread_vectors7   s    


r&   c                   sf  e Zd ZdZddhZejdkp eZdd„ Z	‡ fdd„Z
ed	d
„ ƒZeje edk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dd „ Zd£d"d#„Zd$d%„ Zd&d'„ Zed(d)„ ƒZ e!d*d+„ ƒZ"d¤d-d.„Z#d/d0„ Z$e!d1d2„ ƒZ%d3d4„ Z&e!d5d6„ ƒZ'ed7d8„ ƒZ(d9d:„ Z)d;d<„ Z*d=d>„ Z+e e,j-e.d? k d@¡e/e.d? dAd!dBdCdD„ ƒƒZ0e e,j-e.dA k d@¡e/e.dA dAd!dBdEdF„ ƒƒZ1dGdH„ Z2dIdJ„ Z3dKdL„ Z4dMdN„ Z5dOdP„ Z6dQdR„ Z7dSdT„ Z8dUdV„ Z9dWdX„ Z:dYdZ„ Z;d[d\„ Z<d]d^„ Z=d_d`„ Z>dadb„ Z?dcdd„ Z@dedf„ ZAdgdh„ ZBdidj„ ZCdkdl„ ZDdmdn„ ZEdodp„ ZFdqdr„ ZGedsdt„ ƒZHedudv„ ƒZIedwdx„ ƒZJedydz„ ƒZKed{d|„ ƒZLed}d~„ ƒZMedd€„ ƒZNedd‚„ ƒZOedƒd„„ ƒZPed…d†„ ƒZQe!d‡dˆ„ ƒZRe!d‰dŠ„ ƒZSe!d‹dŒ„ ƒZTe!ddŽ„ ƒZUe!dd„ ƒZVe!d‘d’„ ƒZWe!d“d”„ ƒZXe!d•d–„ ƒZYe!d—d˜„ ƒZZe!d™dš„ ƒZ[e!d›dœ„ ƒZ\e!ddž„ ƒZ]dŸd „ Z^ej_d¡d¢„ ƒZ`‡  ZaS )¥ÚHashLibTestCase)Úmd5ÚMD5Úsha1ZSHA1Úsha224ZSHA224Úsha256ZSHA256Úsha384ZSHA384Úsha512ZSHA512Úblake2bÚblake2sÚsha3_224Úsha3_256Úsha3_384Úsha3_512Ú	shake_128Ú	shake_256r5   r6   Úposixc          
   C   sF   y
t  |¡S  tk
r@ } z| jr0t d| ¡ W dd}~X Y nX dS )z@Import a module and return a reference to it or None on failure.z%Did a C extension fail to compile? %sN)Ú	importlibÚimport_moduleÚModuleNotFoundErrorÚ_warn_on_extension_importÚwarningsÚwarn)ÚselfZmodule_nameÚerrorr   r   r   Ú_conditional_import_moduleT   s    
 z*HashLibTestCase._conditional_import_modulec                sî  t ƒ }xˆ jD ]}| | ¡ ¡ qW ˆ  d¡}|r@| ddh¡ i ˆ _x|D ]}t ƒ ˆ j|< qLW x>ˆ j ¡ D ]0\}}| tt	|ƒ¡ d |fdd„}| |¡ qlW ˆ  d¡}|rˆ  
t|dƒ¡ ˆ  
t|dƒ¡ x4ˆ j ¡ D ]&\}}t|d	| d ƒ}	|	rÜ| |	¡ qÜW ‡ fd
d„}
ˆ  d¡}|r*|
dƒ ˆ  d¡}|rB|
dƒ ˆ  d¡}|rb|
dƒ |
dƒ ˆ  d¡}|r‚|
dƒ |
dƒ |r˜|
dƒ |
dƒ ˆ  d¡}|rØ|
dƒ |
dƒ |
dƒ |
dƒ |
dƒ |
dƒ ttˆ ƒj||Ž d S )NÚ_blake2r/   r0   c             [   s&   | d krt j|f|ŽS t j|| f|ŽS )N)r	   Únew)ÚdataZ_algÚkwargsr   r   r   Ú_test_algorithm_via_hashlib_newn   s    zAHashLibTestCase.__init__.<locals>._test_algorithm_via_hashlib_newr
   Zopenssl_md5Zopenssl_sha1Zopenssl_c                s"   t tdƒ| ƒ}ˆ j|   |¡ d S )NÚ__get_builtin_constructor)Úgetattrr	   Úconstructors_to_testÚadd)ÚnameÚconstructor)r>   r   r   Úadd_builtin_constructor   s    z9HashLibTestCase.__init__.<locals>.add_builtin_constructorÚ_md5r(   Ú_sha1r*   Ú_sha256r+   r,   Ú_sha512r-   r.   Ú_sha3r1   r2   r3   r4   r5   r6   )ÚsetÚsupported_hash_namesrI   Úlowerr@   ÚupdaterH   ÚitemsrG   r	   Ú
assertTrueÚhasattrÚsuperr'   Ú__init__)r>   ÚargsrD   Z
algorithmsÚ	algorithmrA   ÚconstructorsrE   r
   rK   rL   rM   rN   rO   rP   rQ   )Ú	__class__)r>   r   rZ   ]   s`    







zHashLibTestCase.__init__c             C   s   | j  ¡ }tj |¡S )N)rH   ÚvaluesÚ	itertoolsÚchainÚfrom_iterable)r>   r]   r   r   r   Úhash_constructors    s    
z!HashLibTestCase.hash_constructorsNzRequire _hashlib modulec             C   sR   t  td¡}t d¡}|ƒ }xtdƒD ]}| d¡ q&W | j|ƒ | ddd d S )Nr   r*   éd   r   é
   )Zdelta)r   Zget_attributeÚsysÚ	c_hashlibrB   ÚrangerZ   ZassertAlmostEqual)r>   r   Z	sha1_hashZrefs_beforer   r   r   r   Útest_refleaks_in_hash___init__¥   s    
z.HashLibTestCase.test_refleaks_in_hash___init__c             C   sL   t   dtdƒ¡}x6| jD ],}||ƒ}|j| jkr<| d¡ q| ¡  qW d S )NÚbre   é   )Úarrayrh   rc   rJ   ÚshakesÚ	hexdigest)r>   ÚaÚconsÚcr   r   r   Útest_hash_array¯   s    zHashLibTestCase.test_hash_arrayc             C   s"   |   tjtdd„ | jD ƒƒ¡ d S )Nc             s   s   | ]}|  ¡ r|V  qd S )N)Úislower)Ú.0Z_algor   r   r   ú	<genexpr>º   s    z=HashLibTestCase.test_algorithms_guaranteed.<locals>.<genexpr>)ÚassertEqualr	   Úalgorithms_guaranteedrR   rS   )r>   r   r   r   Útest_algorithms_guaranteed¸   s    z*HashLibTestCase.test_algorithms_guaranteedc             C   s   |   ttjƒ tj¡¡ d S )N)rW   rR   r	   rw   ÚissubsetZalgorithms_available)r>   r   r   r   Útest_algorithms_available½   s    z)HashLibTestCase.test_algorithms_availablec             C   s$   |   ttjd¡ |   ttjd¡ d S )Nzspam spam spam spam spamé   )ÚassertRaisesÚ
ValueErrorr	   rB   Ú	TypeError)r>   r   r   r   Útest_unknown_hashÁ   s    z!HashLibTestCase.test_unknown_hashc          	   C   sÐ   t tdƒ}t tdƒ}|  t|d¡ ydd l}W n tk
rL   |  d¡ Y nX d tjd< | 	¡  z|  t|d¡ W d dt
ƒ krŠ|tjd< ntjd= X |  t|d¡ |dƒ}|  ||j¡ |  t|ƒd	dg¡ d S )
NrF   Z__builtin_constructor_cacheÚtestr   z_md5 module not availablerM   r(   é   r)   )rG   r	   r|   r}   rM   ÚImportErrorZskipTestrf   ÚmodulesÚclearÚlocalsr~   ZassertIsr(   rv   Úsorted)r>   Zget_builtin_constructorZbuiltin_constructor_cacherM   rK   r   r   r   Útest_get_builtin_constructorÅ   s(    


z,HashLibTestCase.test_get_builtin_constructorc             C   s~   xx| j D ]n}|ƒ }|j| jkrN|  | d¡t¡ |  t| d¡ƒ| d¡¡ q|  | ¡ t¡ |  t| ¡ ƒ| ¡ ¡ qW d S )Nrk   )	rc   rJ   rm   ÚassertIsInstanceÚdigestr   rv   r   rn   )r>   rp   r   r   r   r   Útest_hexdigestß   s    zHashLibTestCase.test_hexdigestc             C   s”   d}xŠ| j D ]€}|ƒ }|j| jkr$qxf|j|jfD ]V}|  ttf¡ |dƒ W d Q R X x.|D ]&}|  ttf¡ ||ƒ W d Q R X q^W q2W qW d S )N)i    l   öÿ l   
    l            l   öÿÿÿ l   
        iöÿÿÿ)rc   rJ   rm   r‰   rn   r|   r}   ÚOverflowError)r>   Zlarge_sizesrp   r   r‰   Úlengthr   r   r   Útest_digest_length_overflowé   s    
z+HashLibTestCase.test_digest_length_overflowc             C   sn   xh| j D ]^}|ƒ }|  |jt¡ |j| jkr>|  |j| j¡ n|  |j| j¡ |  |jt 	|j¡j¡ qW d S )N)
rc   rˆ   rJ   ÚstrrS   ÚassertInZassertNotInrv   r	   rB   )r>   rp   r   r   r   r   Útest_name_attribute÷   s    z#HashLibTestCase.test_name_attributec             C   s   d}d}d}d}x| j D ]þ}|ƒ }| |¡ | |¡ | |¡ | |¡ |j| jkr^d}nd}|ƒ }| || | | ¡ |  |j|Ž |j|Ž ¡ ||| | | ƒ}	|  |j|Ž |	j|Ž ¡ ||| | ƒ}
|
j|Ž }|
 ¡ }| |¡ |  |j|Ž |j|Ž ¡ |  |
j|Ž |¡ qW d S )Ns€   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaas   bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbs~   ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccs   dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd)rk   r   )rc   rU   rJ   rm   rv   r‰   Úcopy)r>   ZaasZbeesZceesZdeesrp   Zm1r[   Zm2Zm3Zm4Z	m4_digestZm4_copyr   r   r   Útest_large_update  s0    





z!HashLibTestCase.test_large_updateFc             K   sÄ   t |ƒd }| ¡ }| j| }|  t |ƒd¡ x|D ]ˆ}||f|Ž}	|sP|	 ¡ n|	 |¡}
|  |
|d|||
t |ƒ|f ¡ |s†|	 ¡ n|	 |¡}
t |¡}|  |
|¡ |s4|  t |ƒ|	j	¡ q4W d S )Né   zrHash algorithm %s constructed using %s returned hexdigest %r for %d byte input data that should have hashed to %r.)
ÚlenrT   rH   ZassertGreaterEqualrn   rv   r‰   r   r"   Údigest_size)r>   rJ   rC   rn   ZshakerD   rŒ   r]   Úhash_object_constructorÚmZcomputedr‰   r   r   r   Úcheck!  s"    


zHashLibTestCase.checkc             C   s*   | j | }x|D ]}|  t|d¡ qW d S )NZspam)rH   r|   r~   )r>   Zalgorithm_namer]   r–   r   r   r   Úcheck_no_unicode6  s    

z HashLibTestCase.check_no_unicodec             C   s@   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ d S )Nr(   r*   r+   r,   r-   r.   )r™   )r>   r   r   r   Útest_no_unicode<  s    




zHashLibTestCase.test_no_unicodec             C   s   |   d¡ |   d¡ d S )Nr/   r0   )r™   )r>   r   r   r   Útest_no_unicode_blake2D  s    
z&HashLibTestCase.test_no_unicode_blake2c             C   s@   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ d S )Nr1   r2   r3   r4   r5   r6   )r™   )r>   r   r   r   Útest_no_unicode_sha3I  s    




z$HashLibTestCase.test_no_unicode_sha3r   c             C   sÈ   | j | }x¸|D ]°}|ƒ }|  |j|¡ |  |j|¡ |rl|  t| |¡ƒ|¡ |  t| |¡ƒd| ¡ n,|  t| ¡ ƒ|¡ |  t| ¡ ƒd| ¡ |  |j|¡ |  | 	d¡d t
|ƒ¡ qW d S )Nr“   Ú_r   )rH   rv   Ú
block_sizer•   r”   r‰   rn   rJ   r   r!   r   )r>   rJ   rž   r•   Zdigest_lengthr]   r–   r—   r   r   r   Úcheck_blocksize_nameR  s    

z$HashLibTestCase.check_blocksize_namec             C   sX   |   ddd¡ |   ddd¡ |   ddd¡ |   ddd	¡ |   d
dd¡ |   ddd¡ d S )Nr(   é@   rk   r*   é   r+   é   r,   é    r-   é€   é0   r.   )rŸ   )r>   r   r   r   Útest_blocksize_namee  s    z#HashLibTestCase.test_blocksize_namec             C   s\   |   ddd¡ |   ddd¡ |   ddd	¡ |   d
dd¡ |   dddd¡ |   dddd¡ d S )Nr1   é   r¢   r2   éˆ   r£   r3   éh   r¥   r4   éH   r    r5   é¨   r   r6   )rŸ   )r>   r   r   r   Útest_blocksize_name_sha3m  s    z(HashLibTestCase.test_blocksize_name_sha3c             C   s\   | j | }xL|D ]D}|ƒ }|  || d¡ |  |j|¡ |  |j|¡ |  |j|¡ qW d S )Ni@  )rH   rv   Z_capacity_bitsZ
_rate_bitsZ_suffix)r>   rJ   ZcapacityZrateÚsuffixr]   r–   r—   r   r   r   Ú
check_sha3v  s    

zHashLibTestCase.check_sha3c             C   sd   |   dddd¡ |   dddd¡ |   dd	d
d¡ |   dddd¡ |   dddd¡ |   dddd¡ d S )Nr1   iÀ  i€  ó   r2   i   i@  r3   i   i@  r4   i   i@  r5   é   i@  ó   r6   )r®   )r>   r   r   r   Útest_extra_sha3  s    zHashLibTestCase.test_extra_sha3c             C   s    |   ddd¡ |   ddd¡ d S )Nr/   r¤   r    r0   r£   )rŸ   )r>   r   r   r   Útest_blocksize_name_blake2ˆ  s    z*HashLibTestCase.test_blocksize_name_blake2c             C   s   |   ddd¡ d S )Nr(   ó    Z d41d8cd98f00b204e9800998ecf8427e)r˜   )r>   r   r   r   Útest_case_md5_0  s    zHashLibTestCase.test_case_md5_0c             C   s   |   ddd¡ d S )Nr(   s   abcZ 900150983cd24fb0d6963f7d28e17f72)r˜   )r>   r   r   r   Útest_case_md5_1  s    zHashLibTestCase.test_case_md5_1c             C   s   |   ddd¡ d S )Nr(   s>   ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789Z d174ab98d277d9f5a5611c2c9f419d9f)r˜   )r>   r   r   r   Útest_case_md5_2“  s    zHashLibTestCase.test_case_md5_2é   z!test cannot run on 32-bit systemsr{   )ÚsizeZmemuseZdry_runc             C   s   |   dd| d¡ d S )Nr(   ó   AZ c9af2dff37468ce5dfee8f2cfc0a9c6d)r˜   )r>   r¹   r   r   r   Útest_case_md5_huge˜  s    z"HashLibTestCase.test_case_md5_hugec             C   s   |   dd| d¡ d S )Nr(   rº   Z 28138d306ff1b8281f1a9067e1a1a2b3)r˜   )r>   r¹   r   r   r   Útest_case_md5_uintmax  s    z%HashLibTestCase.test_case_md5_uintmaxc             C   s   |   ddd¡ d S )Nr*   r´   Z(da39a3ee5e6b4b0d3255bfef95601890afd80709)r˜   )r>   r   r   r   Útest_case_sha1_0¦  s    z HashLibTestCase.test_case_sha1_0c             C   s   |   ddd¡ d S )Nr*   s   abcZ(a9993e364706816aba3e25717850c26c9cd0d89d)r˜   )r>   r   r   r   Útest_case_sha1_1ª  s    z HashLibTestCase.test_case_sha1_1c             C   s   |   ddd¡ d S )Nr*   s8   abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopqZ(84983e441c3bd26ebaae4aa1f95129e5e54670f1)r˜   )r>   r   r   r   Útest_case_sha1_2®  s    z HashLibTestCase.test_case_sha1_2c             C   s   |   ddd d¡ d S )Nr*   ó   ai@B Z(34aa973cd4c4daa4f61eeb2bdbad27316534016f)r˜   )r>   r   r   r   Útest_case_sha1_3³  s    z HashLibTestCase.test_case_sha1_3c             C   s   |   ddd¡ d S )Nr+   r´   Z8d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f)r˜   )r>   r   r   r   Útest_case_sha224_0¼  s    z"HashLibTestCase.test_case_sha224_0c             C   s   |   ddd¡ d S )Nr+   s   abcZ823097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7)r˜   )r>   r   r   r   Útest_case_sha224_1À  s    z"HashLibTestCase.test_case_sha224_1c             C   s   |   ddd¡ d S )Nr+   s8   abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopqZ875388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525)r˜   )r>   r   r   r   Útest_case_sha224_2Ä  s    z"HashLibTestCase.test_case_sha224_2c             C   s   |   ddd d¡ d S )Nr+   rÀ   i@B Z820794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67)r˜   )r>   r   r   r   Útest_case_sha224_3É  s    z"HashLibTestCase.test_case_sha224_3c             C   s   |   ddd¡ d S )Nr,   r´   Z@e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855)r˜   )r>   r   r   r   Útest_case_sha256_0Î  s    z"HashLibTestCase.test_case_sha256_0c             C   s   |   ddd¡ d S )Nr,   s   abcZ@ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad)r˜   )r>   r   r   r   Útest_case_sha256_1Ò  s    z"HashLibTestCase.test_case_sha256_1c             C   s   |   ddd¡ d S )Nr,   s8   abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopqZ@248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1)r˜   )r>   r   r   r   Útest_case_sha256_2Ö  s    z"HashLibTestCase.test_case_sha256_2c             C   s   |   ddd d¡ d S )Nr,   rÀ   i@B Z@cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0)r˜   )r>   r   r   r   Útest_case_sha256_3Û  s    z"HashLibTestCase.test_case_sha256_3c             C   s   |   ddd¡ d S )Nr-   r´   Z`38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b)r˜   )r>   r   r   r   Útest_case_sha384_0à  s    z"HashLibTestCase.test_case_sha384_0c             C   s   |   ddd¡ d S )Nr-   s   abcZ`cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7)r˜   )r>   r   r   r   Útest_case_sha384_1å  s    z"HashLibTestCase.test_case_sha384_1c             C   s   |   ddd¡ d S )Nr-   sp   abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstuZ`09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039)r˜   )r>   r   r   r   Útest_case_sha384_2ê  s    z"HashLibTestCase.test_case_sha384_2c             C   s   |   ddd d¡ d S )Nr-   rÀ   i@B Z`9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b07b8b3dc38ecc4ebae97ddd87f3d8985)r˜   )r>   r   r   r   Útest_case_sha384_3ñ  s    z"HashLibTestCase.test_case_sha384_3c             C   s   |   ddd¡ d S )Nr.   r´   Z€cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e)r˜   )r>   r   r   r   Útest_case_sha512_0÷  s    z"HashLibTestCase.test_case_sha512_0c             C   s   |   ddd¡ d S )Nr.   s   abcZ€ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f)r˜   )r>   r   r   r   Útest_case_sha512_1ü  s    z"HashLibTestCase.test_case_sha512_1c             C   s   |   ddd¡ d S )Nr.   sp   abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstuZ€8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909)r˜   )r>   r   r   r   Útest_case_sha512_2  s    z"HashLibTestCase.test_case_sha512_2c             C   s   |   ddd d¡ d S )Nr.   rÀ   i@B Z€e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b)r˜   )r>   r   r   r   Útest_case_sha512_3  s    z"HashLibTestCase.test_case_sha512_3c             C   sB  |   |j|¡ x"t|d ƒD ]}|d| d qW d|d  }| jt||d |   |j|¡ x"t|d ƒD ]}|d| d qjW d|d  }	| jt||	d |   |j|¡ x td|d ƒD ]}||d qºW | jt|dd | jt|dd | jt||d d |   |j|¡ x$t|d ƒD ]}|d| d qW d|d  }
| jt||
d |   |ƒ  ¡ |d	d ¡ ¡ xtdd
ƒD ]}||d qxW | jt|dd | jt|d
d xtdd
ƒD ]}||d q¸W | jt|dd | jt|dd | jt|d
d xtdd
ƒD ]}||d qW | jt|dd | jt|d
d x"td|d ƒD ]}||d qLW | jt|dd | jt||d d |dd |dd | jt	|dd | jt	|dd |dd ||d | jt	|dd | jt	||d d | jt
|d	d | jt
|d	d |  t
|d¡ |d	d	d	d	dddd
ddddd d S )Nr{   rÀ   )Úsalt)Úperson)r•   éÿÿÿÿr   )Úkeyr´   r°   )Úfanout)Údepth)Ú
node_depth)Ú
inner_size)Ú	leaf_sizel   ÿÿ l        )Únode_offset)rC   )Ústringr   é   i   é   T)rÕ   rÒ   rÓ   r•   rÖ   r×   rÚ   rÛ   rØ   rÙ   Ú	last_node)rv   Z	SALT_SIZErh   r|   r}   ZPERSON_SIZEZMAX_DIGEST_SIZEZMAX_KEY_SIZErn   r‹   r~   )r>   rK   Z	salt_sizeZperson_sizeZkey_sizer•   Z
max_offsetr   rÒ   rÓ   rÕ   r   r   r   Úcheck_blake2  s€    



zHashLibTestCase.check_blake2c             C   s€   dd„ }|dd}xd|D ]\}xV|D ]N}|||ƒ}|||ƒ}	|||d}
|  |
 ¡ ¡ |||	|d}|  | ¡ ¡ q"W qW | ¡ S )Nc             S   sX   d}d| |@ }d}t | ƒ}x6t| ƒD ]*}|| |@ }|| }}|d? d@ ||< q&W |S )Nl   ÿÿ l   ­KZ= r{   é   éÿ   )Ú	bytearrayrh   )rŒ   ZseedÚmaskro   rj   Úoutr   Útr   r   r   Úselftest_seq]  s    
z4HashLibTestCase.blake2_rfc7693.<locals>.selftest_seqr£   )r•   )rÕ   r•   )rU   r‰   rn   )r>   rK   Zmd_lenZin_lenrç   ZouterZoutlenZinlenZindatarÕ   ZunkeyedZkeyedr   r   r   Úblake2_rfc7693\  s    





zHashLibTestCase.blake2_rfc7693c             C   sN   |   tjddddd¡ ddddg}ddd	d
ddg}|  |  tj||¡d¡ d S )Nrk   r    l   ÿÿÿÿ r¡   r£   r¥   r   r   r¤   é   râ   i   Z@c23a7800d98123bd10f506c61e29da5603d763b8bbad2e737f5e765a7bccd475)rà   r	   r/   rv   rè   )r>   Z
b2b_md_lenZ
b2b_in_lenr   r   r   Útest_blake2br  s    zHashLibTestCase.test_blake2bc             C   s   |   ddd¡ d S )Nr/   r´   Z€786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce)r˜   )r>   r   r   r   Útest_case_blake2b_0{  s    z#HashLibTestCase.test_case_blake2b_0c             C   s   |   ddd¡ d S )Nr/   s   abcZ€ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923)r˜   )r>   r   r   r   Útest_case_blake2b_1  s    z#HashLibTestCase.test_case_blake2b_1c             C   s*   | j ddddddddd	d
ddddd d S )Nr/   s   fooZ 920568b0c5873b2f0ab67bedb6cf1b2brk   s   bars   bazs   bingr“   r   r   r¸   é   rÞ   T)r•   rÕ   rÒ   rÓ   rÖ   r×   rÚ   rÛ   rØ   rÙ   rß   )r˜   )r>   r   r   r   Ú test_case_blake2b_all_parameters‡  s    z0HashLibTestCase.test_case_blake2b_all_parametersc             C   s8   x2t dƒD ]&\}}}t |¡}| jd|||d q
W d S )Nr/   )rÕ   )r&   r   r"   r˜   )r>   ÚmsgrÕ   Úmdr   r   r   Útest_blake2b_vectors™  s    
z$HashLibTestCase.test_blake2b_vectorsc             C   sN   |   tjddddd¡ ddddg}ddd	d
ddg}|  |  tj||¡d¡ d S )Né   r£   l   ÿÿÿ rk   r¡   r¢   r   r   r    éA   râ   i   Z@6a411f08ce25adcdfb02aba641451cec53c598b24f4fc787fbdc88797f4c1dfe)rà   r	   r0   rv   rè   )r>   Z
b2s_md_lenZ
b2s_in_lenr   r   r   Útest_blake2sŸ  s    zHashLibTestCase.test_blake2sc             C   s   |   ddd¡ d S )Nr0   r´   Z@69217a3079908094e11121d042354a7c1f55b6482ca1a51e1b250dfd1ed0eef9)r˜   )r>   r   r   r   Útest_case_blake2s_0¨  s    z#HashLibTestCase.test_case_blake2s_0c             C   s   |   ddd¡ d S )Nr0   s   abcZ@508c5e8c327c14e2e1a72ba34eeb452f37458b209ed63a294d999b4c86675982)r˜   )r>   r   r   r   Útest_case_blake2s_1­  s    z#HashLibTestCase.test_case_blake2s_1c             C   s*   | j ddddddddd	d
ddddd d S )Nr0   s   fooZ bf2a8f7fe3c555012a6f8046e646bc75rk   s   bars   bazs   bingr“   r   r   r¸   rí   rÞ   T)r•   rÕ   rÒ   rÓ   rÖ   r×   rÚ   rÛ   rØ   rÙ   rß   )r˜   )r>   r   r   r   Ú test_case_blake2s_all_parameters²  s    z0HashLibTestCase.test_case_blake2s_all_parametersc             C   s8   x2t dƒD ]&\}}}t |¡}| jd|||d q
W d S )Nr0   )rÕ   )r&   r   r"   r˜   )r>   rï   rÕ   rð   r   r   r   Útest_blake2s_vectorsÄ  s    
z$HashLibTestCase.test_blake2s_vectorsc             C   s   |   ddd¡ d S )Nr1   r´   Z86b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7)r˜   )r>   r   r   r   Útest_case_sha3_224_0Ê  s    z$HashLibTestCase.test_case_sha3_224_0c             C   s(   x"t dƒD ]\}}|  d||¡ q
W d S )Nr1   )r&   r˜   )r>   rï   rð   r   r   r   Útest_case_sha3_224_vectorÏ  s    z)HashLibTestCase.test_case_sha3_224_vectorc             C   s   |   ddd¡ d S )Nr2   r´   Z@a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a)r˜   )r>   r   r   r   Útest_case_sha3_256_0Ô  s    z$HashLibTestCase.test_case_sha3_256_0c             C   s(   x"t dƒD ]\}}|  d||¡ q
W d S )Nr2   )r&   r˜   )r>   rï   rð   r   r   r   Útest_case_sha3_256_vectorÙ  s    z)HashLibTestCase.test_case_sha3_256_vectorc             C   s   |   ddd¡ d S )Nr3   r´   Z`0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004)r˜   )r>   r   r   r   Útest_case_sha3_384_0Þ  s    z$HashLibTestCase.test_case_sha3_384_0c             C   s(   x"t dƒD ]\}}|  d||¡ q
W d S )Nr3   )r&   r˜   )r>   rï   rð   r   r   r   Útest_case_sha3_384_vectorä  s    z)HashLibTestCase.test_case_sha3_384_vectorc             C   s   |   ddd¡ d S )Nr4   r´   Z€a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26)r˜   )r>   r   r   r   Útest_case_sha3_512_0é  s    z$HashLibTestCase.test_case_sha3_512_0c             C   s(   x"t dƒD ]\}}|  d||¡ q
W d S )Nr4   )r&   r˜   )r>   rï   rð   r   r   r   Útest_case_sha3_512_vectorï  s    z)HashLibTestCase.test_case_sha3_512_vectorc             C   s$   |   dddd¡ |   dddd¡ d S )Nr5   r´   Z@7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef26TZ7f9c)r˜   )r>   r   r   r   Útest_case_shake_128_0ô  s    z%HashLibTestCase.test_case_shake_128_0c             C   s*   x$t dƒD ]\}}|  d||d¡ q
W d S )Nr5   T)r&   r˜   )r>   rï   rð   r   r   r   Útest_case_shake128_vectorû  s    z)HashLibTestCase.test_case_shake128_vectorc             C   s$   |   dddd¡ |   dddd¡ d S )Nr6   r´   Z@46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762fTZ46b9)r˜   )r>   r   r   r   Útest_case_shake_256_0   s    z%HashLibTestCase.test_case_shake_256_0c             C   s*   x$t dƒD ]\}}|  d||d¡ q
W d S )Nr6   T)r&   r˜   )r>   rï   rð   r   r   r   Útest_case_shake256_vector  s    z)HashLibTestCase.test_case_shake256_vectorc             C   s®   d}xL| j D ]B}|ƒ }| d¡ | d| ¡ | d¡ |d| ƒ}| d¡ qW t ¡ }| d¡ | d| ¡ | d¡ |  | ¡ d¡ t d| ¡}|  | ¡ d¡ d S )Ni   ó   1ó   #ó   xZ cb1e1a2cbc80be75e19935d621fb9b21Z cfb767f225d58469c5de3632a8803958)rc   rU   r	   r(   rv   rn   )r>   Zgil_minsizerp   r—   r   r   r   Útest_gil  s    



zHashLibTestCase.test_gilc       	         sØ   t  ¡ ‰d}d}|d ‰ t  ˆ | ¡ ¡ }‡ ‡fdd„}g }xZt|ƒD ]N}tˆ ƒd|  }|  |d¡ |  |t|ƒ d¡ tj||fd}| 	|¡ qFW x|D ]}| 
¡  qžW x|D ]}| ¡  q´W |  |ˆ ¡ ¡ d S )	Nr¸   s   swineflui@ c                s8   d}x.|t ˆ ƒk r2ˆ ˆ |||  … ¡ || 7 }qW d S )Nr   )r”   rU   )Ú
chunk_sizeÚindex)rC   Úhasherr   r   Úhash_in_chunks1  s    z=HashLibTestCase.test_threaded_hashing.<locals>.hash_in_chunksre   r   )Útargetr[   )r	   r*   rn   rh   r”   ZassertGreaterrv   Ú	threadingZThreadÚappendÚstartÚjoin)	r>   Znum_threadsZsmallest_dataZexpected_hashr  ZthreadsZ	threadnumr	  Zthreadr   )rC   r  r   Útest_threaded_hashing#  s&    


z%HashLibTestCase.test_threaded_hashing)F)r   r   N)bÚ__name__Ú
__module__Ú__qualname__rS   rm   ÚosrJ   ÚCOMPILED_WITH_PYDEBUGr;   r@   rZ   Úpropertyrc   r   Zrefcount_testr   ZskipIfrg   ri   rr   rx   rz   r   r‡   rŠ   r   r   r’   r˜   r™   rš   Úrequires_blake2r›   Úrequires_sha3rœ   rŸ   r¦   r¬   r®   r²   r³   rµ   r¶   r·   rf   Úmaxsizer   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ô   rõ   rö   r÷   rø   rù   rú   rû   rü   rý   rþ   rÿ   r   r  r  r  r  r  Zreap_threadsr  Ú__classcell__r   r   )r^   r   r'   G   s¤   	C		

 
	 
				O		r'   c            	   @   sX  e Zd ZdddddgZddddded	ƒfd
ddddedƒfdddddedƒfgZe d¡dfe d¡dfe d¡dfe d¡dfe d¡dfge d¡dfe d¡dfe d¡dfe d¡dfe d¡dfge d ¡dfe d!¡dfe d"¡dfe d#¡d$fe d%¡dfgd&œZd'd(„ Z	d)d*„ Z
e eed+ƒd,¡d-d.„ ƒZe eed/ƒd0¡d1d2„ ƒZdS )3ÚKDFTests)s   passwords   saltr{   N)s   passwords   saltr“   N)s   passwords   salti   N)s   passwordPASSWORDpasswords$   saltSALTsaltSALTsaltSALTsaltSALTsalti   rÔ   )s	   pass words   sa lti   rk   r´   rk   r{   Z€77d6576238657b203b19ca42c18a0497f16b4844e3074ae8dfdffa3fede21442fcd0069ded0948f8326a753a0fc81f17e8d3e0fb2e0d3628cf35e20c38d18906s   passwords   NaCli   rò   Z€fdbabe1c9d3472007856e7190d01e9fe7c6ad7cbc8237830e77376634b3731622eaf30d92e22a3886ff109279d9830dac727afb94a83ee6d8360cbdfa2cc0640s   pleaseletmeins   SodiumChloridei @  Z€7023bdcb3afd7348461c06cd81fd38ebfda8fbba904f8e3ea9b543f6545da1f2d5432955613f0fcf62d49705242a9af9e61e85dc0d651e40dfcf017b45575887Z(0c60c80f961f0e71f3a9b524af6012062fe037a6NZ(ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957Z(4b007901b765489abead49d926f721d065a429c1Z23d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038é   Z 56fa6aa75548099dcc37d7f03425e0c3Z@120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17bZ@ae4d0c95af6b46d32d0adff928f06dd02a303f8ef3c251dfd6e2d85a95474c43Z@c5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134aZP348c89dbcbd32b2f32d814b8116e84cf2b17347ebc1800181c4e2a1fb8dd53e1c635518c7dac47e9é(   Z 89b69d0516f829893c696226650a8687Z€867f70cf1ade02cff3752599a3a53dc4af34c7a669815ae5d513554e1c8cf252c02d470a285a0501bad999bfe943c08f050235d7d68b1da55e63f73b60a57fceZ€e1d9c16aa681708a45f5c7c4e215ceb66e011a2e9f0040713f18aefdb866d53cf76cab2868a39b9f7840edce4fef5a82be67335c77a6068e04112754f27ccf4eZ€d197b1b33db0143e018b12f3d1d1479e6cdebdcc97c5c0f87f6902e072f457b5143f30602641b3d55cd335988cb36b84376060ecd532e039b742a239434af2d5Z€8c0511f4c6e597c6ac6315d8f0362e225f3c501495ba23b868c005174dc4ee71115b59f9e60cd9532fa33e0f75aefe30225c583a186cd82bd4daea9724a3d3b8r    Z 9d9e9c4cd21fe4be24d5b8244c759665)r*   r,   r.   c             C   s²  xÞ| j  ¡ D ]Ð\}}xÆt| jƒD ]¸\}}|\}}}}	|| \}
}|rH|}	||||||	ƒ}|  ||
|||||	f¡ ||t|ƒt|ƒ||	ƒ}||t|ƒt|ƒ||	ƒ}|  ||
¡ |	d kr |||||ƒ}|  ||
||||f¡ q W qW |  t|dddd¡ |  t|dddd¡ |  t	|dddd¡ |  t	|dddd	¡ |  t	|ddddd¡ |  t	|ddddd	¡ |  
t	d
¡ |ddddƒ W d Q R X |ddddd d}|  || j d d d ¡ d S )Ns   sha1s   passs   saltr{   r*   ÚpassrÒ   r   rÔ   zunsupported hash typeÚunknowns   password)r#   ÚpasswordrÒ   Z
iterationsÚdklen)Úpbkdf2_resultsrV   Ú	enumerateÚpbkdf2_test_vectorsrv   Ú
memoryviewrã   r|   r~   r}   ZassertRaisesRegex)r>   Zpbkdf2Zdigest_nameÚresultsr   Zvectorr"  rÒ   Úroundsr#  ÚexpectedZoverwrite_dklenrå   r   r   r   Ú_test_pbkdf2_hmac  s:    


zKDFTests._test_pbkdf2_hmacc             C   s   |   tj¡ d S )N)r+  Ú
py_hashlibÚpbkdf2_hmac)r>   r   r   r   Útest_pbkdf2_hmac_py¡  s    zKDFTests.test_pbkdf2_hmac_pyr-  z   test requires OpenSSL > 1.0c             C   s   |   tj¡ d S )N)r+  rg   r-  )r>   r   r   r   Útest_pbkdf2_hmac_c¤  s    zKDFTests.test_pbkdf2_hmac_cÚscryptz   test requires OpenSSL > 1.1c       
   
   C   sX  x:| j D ]0\}}}}}}tj|||||d}|  ||¡ qW tjdddddd |  t¡ tjdddddd W d Q R X |  t¡ tjdddddd W d Q R X |  t¡ t d¡ W d Q R X |  t¡ t dd¡ W d Q R X |  t¡ tjdddddd	 W d Q R X x>d
D ]6}|  tttf¡ tjdd|ddd W d Q R X qW x>dD ]6}|  tttf¡ tjddd|dd W d Q R X qVW x>dD ]6}|  tttf¡ tjdddd|d W d Q R X q–W x@dD ]8}|  tttf¡ tjddddd|d W d Q R X qÖW x@dD ]8}	|  tttf¡ tjddddd|	d W d Q R X qW d S )N)rÒ   Únr   Úps   passwords   saltr“   rò   r{   r"  rÒ   )rÒ   )rÔ   r   r{   N)rÔ   r   N)rÔ   N)rÒ   r1  r   r2  Úmaxmem)rÒ   r1  r   r2  r#  )Úscrypt_test_vectorsr	   r0  rv   r|   r~   r}   r‹   )
r>   r"  rÒ   r1  r   r2  r*  Úresultr3  r#  r   r   r   Útest_scryptª  s>    
$
$
$

zKDFTests.test_scrypt)r  r  r  r&  r   r4  r   r"   r$  r+  r.  r   Ú
skipUnlessrX   rg   r/  r6  r   r   r   r   r  H  sL    r  Ú__main__)%rl   Zbinasciir   r	   r8   r`   r  rf   r  r   r<   r€   r   Ztest.supportr   r   r   Zhttp.clientr   rX   r  rg   r,  rA   r‚   r7  r  rQ   r  r   r   r&   ZTestCaser'   r  r  Úmainr   r   r   r   Ú<module>	   sN   


	       
