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   s:   d}d}x,| D ]$}|||d? d@  ||d@   7 }qW |S )NZ0123456789abcdefÚ é   é   © )ÚsÚhÚrÚir   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ÚsplitÚbytesÚ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_256r2   r3   Ú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,   r-   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+   Ú_sha3r.   r/   r0   r1   r2   r3   )ÚsetÚsupported_hash_namesrF   Úlowerr=   ÚupdaterE   ÚitemsrD   r	   Ú
assertTrueÚhasattrÚsuperr$   Ú__init__)r;   ÚargsrA   Z
algorithmsÚ	algorithmr>   ÚconstructorsrB   r
   rH   rI   rJ   rK   rL   rM   rN   )Ú	__class__)r;   r   rW   ]   s`    







zHashLibTestCase.__init__c             C   s   | j  ¡ }tj |¡S )N)rE   ÚvaluesÚ	itertoolsÚchainÚfrom_iterable)r;   rZ   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_hashlibr?   ÚrangerW   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Úbrb   é   )Úarrayre   r`   rG   Ú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_guaranteedrO   rP   )r;   r   r   r   Útest_algorithms_guaranteed¸   s    z*HashLibTestCase.test_algorithms_guaranteedc             C   s   |   ttjƒ tj¡¡ d S )N)rT   rO   r	   rt   Ú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	   r?   Ú	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 )
NrC   Z__builtin_constructor_cacheÚtestr   z_md5 module not availablerJ   r%   é   r&   )rD   r	   ry   rz   rJ   ÚImportErrorZskipTestrc   ÚmodulesÚclearÚlocalsr{   ZassertIsr%   rs   Úsorted)r;   Zget_builtin_constructorZbuiltin_constructor_cacherJ   rH   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 )Nrh   )	r`   rG   rj   ÚassertIsInstanceÚdigestr   rs   r   rk   )r;   rm   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öÿÿÿ)r`   rG   rj   r†   rk   ry   rz   ÚOverflowError)r;   Zlarge_sizesrm   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)
r`   r…   rG   ÚstrrP   ÚassertInZassertNotInrs   r	   r?   )r;   rm   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)rh   r   )r`   rR   rG   rj   rs   r†   Úcopy)r;   ZaasZbeesZceesZdeesrm   Zm1rX   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.)
ÚlenrQ   rE   ZassertGreaterEqualrk   rs   r†   r   r   Údigest_size)r;   rG   r@   rk   ZshakerA   r‰   rZ   Ú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)rE   ry   r{   )r;   Zalgorithm_namerZ   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,   r-   )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 )Nr.   r/   r0   r1   r2   r3   )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   )rE   rs   Ú
block_sizer’   r‘   r†   rk   rG   rŒ   r   Úrepr)r;   rG   r›   r’   Zdigest_lengthrZ   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%   é@   rh   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 )Nr.   é   r    r/   éˆ   r¡   r0   éh   r£   r1   éH   rž   r2   é¨   r   r3   )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@  )rE   rs   Z_capacity_bitsZ
_rate_bitsZ_suffix)r;   rG   ZcapacityZrateÚsuffixrZ   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 )Nr.   iÀ  i€  ó   r/   i   i@  r0   i   i@  r1   i   i@  r2   é   i@  ó   r3   )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ž   r-   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 systemsrx   )Ú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 )Nrx   r¾   )Úsalt)Úperson)r’   éÿÿÿÿr   )Úkeyr²   r®   )Úfanout)Údepth)Ú
node_depth)Ú
inner_size)Ú	leaf_sizel   ÿÿ l        )Únode_offset)r@   )Ústringr   é   i   é   T)rÓ   rÐ   rÑ   r’   rÔ   rÕ   rØ   rÙ   rÖ   r×   Ú	last_node)rs   Z	SALT_SIZEre   ry   rz   ZPERSON_SIZEZMAX_DIGEST_SIZEZMAX_KEY_SIZErk   rˆ   r{   )r;   rH   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= rx   é   éÿ   )Ú	bytearrayre   )r‰   ZseedÚmaskrl   rg   Úoutr   Útr   r   r   Úselftest_seq]  s    
z4HashLibTestCase.blake2_rfc7693.<locals>.selftest_seqr¡   )r’   )rÓ   r’   )rR   r†   rk   )r;   rH   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 )Nrh   rž   l   ÿÿÿÿ rŸ   r¡   r£   r   r~   r¢   é   rà   i   Z@c23a7800d98123bd10f506c61e29da5603d763b8bbad2e737f5e765a7bccd475)rÞ   r	   r,   rs   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 920568b0c5873b2f0ab67bedb6cf1b2brh   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   ÿÿÿ rh   rŸ   r    r   r~   rž   éA   rà   i   Z@6a411f08ce25adcdfb02aba641451cec53c598b24f4fc787fbdc88797f4c1dfe)rÞ   r	   r-   rs   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 )Nr-   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 )Nr-   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 )Nr-   s   fooZ bf2a8f7fe3c555012a6f8046e646bc75rh   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 )Nr-   )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 )Nr.   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 )Nr.   )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 )Nr/   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 )Nr/   )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 )Nr0   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 )Nr0   )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 )Nr1   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 )Nr1   )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 )Nr2   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 )Nr2   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 )Nr3   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 )Nr3   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)r`   rR   r	   r%   rs   rk   )r;   Zgil_minsizerm   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‘   rR   )Ú
chunk_sizeÚindex)r@   Úhasherr   r   Úhash_in_chunks1  s    z=HashLibTestCase.test_threaded_hashing.<locals>.hash_in_chunksrb   r   )ÚtargetrX   )r	   r'   rk   re   r‘   ZassertGreaterrs   Ú	threadingZThreadÚappendÚstartÚjoin)	r;   Znum_threadsZsmallest_dataZexpected_hashr
  ZthreadsZ	threadnumr  Zthreadr   )r@   r	  r   Útest_threaded_hashing#  s&    


z%HashLibTestCase.test_threaded_hashing)F)r   r   N)bÚ__name__Ú
__module__Ú__qualname__rP   rj   ÚosrG   ÚCOMPILED_WITH_PYDEBUGr8   r=   rW   Úpropertyr`   r   Zrefcount_testr   ZskipIfrd   rf   ro   ru   rw   r|   r„   r‡   rŠ   r   r   r•   r–   r—   Úrequires_blake2r˜   Úrequires_sha3r™   r   r¤   rª   r¬   r°   r±   r³   r´   rµ   rc   Ú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   saltrx   N)s   passwords   saltr   N)s   passwords   salti   N)s   passwordPASSWORDpasswords$   saltSALTsaltSALTsaltSALTsaltSALTsalti   rÒ   )s	   pass words   sa lti   rh   r²   rh   rx   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   saltrx   r'   ÚpassrÐ   r   rÒ   zunsupported hash typeÚunknowns   password)r    ÚpasswordrÐ   Z
iterationsÚdklen)Úpbkdf2_resultsrS   Ú	enumerateÚpbkdf2_test_vectorsrs   Ú
memoryviewrá   ry   r{   rz   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)  rd   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ð   rx   r   rÐ   )rÐ   )rÒ   r   rx   N)rÒ   r   N)rÒ   N)rÐ   r/  r   r0  Úmaxmem)rÐ   r/  r   r0  r!  )Úscrypt_test_vectorsr	   r.  rs   ry   r{   rz   rˆ   )
r;   r   rÐ   r/  r   r0  r(  Úresultr1  r!  r   r   r   Útest_scryptª  s>    
$
$
$

zKDFTests.test_scrypt)r  r  r  r$  r   r2  r   r   r"  r)  r,  r   Ú
skipUnlessrU   rd   r-  r4  r   r   r   r   r  H  sL    r  Ú__main__)%ri   Zbinasciir   r	   r5   r]   r  rc   r  r   r9   r}   r   Ztest.supportr   r   r   Zhttp.clientr   rU   r  rd   r*  r>   r   r5  r  rN   r  r   r   r#   ZTestCaser$   r  r  Úmainr   r   r   r   Ú<module>	   sN   


	       
