o
    ^¨Êh(  ã                   @   sô   d Z d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ejd dkr.ejd dkr.ddl	T ddl
T zddlZW n eyC   dZY nw ddlZddlZG dd„ dejƒZd	d
„ ZG dd„ dejƒZi fdd„Zedkrxdd„ Zejdd� dS dS )z0Self-test suite for generic Crypto.Random stuff z$Id$é    Né   é   )Ú*c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚRNGForkTestc                 C   s8   t jj ¡ }|j ¡  z
|jjW |j ¡  S |j ¡  w )z‰
        Get `FortunaAccumulator.reseed_count`, the global count of the
        number of times that the PRNG has been reseeded.
        )	ÚCryptoÚRandomÚ_UserFriendlyRNGÚ_get_singletonÚ_lockÚacquireÚ_faÚreseed_countÚrelease)ÚselfÚrng_singleton© r   ú^/var/www/html/env/lib/python3.10/site-packages/Crypto/SelfTest/Random/test__UserFriendlyRNG.pyÚ_get_reseed_count2   s
   
zRNGForkTest._get_reseed_countc                 C   sV  t j d¡rttdƒrJ ‚d S t d¡ |  ¡ }tj	j
 ¡  ¡  tj	 d¡ |  ¡ }|  ||¡ g }tdƒD ]@}t ¡ \}}t ¡ dkrht |¡ t |d¡}tj	 ¡  tj	 d¡}| |¡ | ¡  t d¡ t |¡ | t |d	¡¡ q6g }	i }
|D ]}t | ¡ ¡}|	 |¡ d|
|< | ¡  q}t|	ƒtt|
 ¡ ƒƒkr©td
t  |	¡ ƒ‚d S )NÚwinÚforkç333333Ã?r   é
   r   Úwbé   Úrbú'RNG output duplicated across fork():
%s)!ÚsysÚplatformÚ
startswithÚhasattrÚosÚtimeÚsleepr   r   r   r   r	   ÚreinitÚget_random_bytesÚassertNotEqualÚrangeÚpiper   ÚcloseÚfdopenÚatforkÚwriteÚ_exitÚappendÚbinasciiÚhexlifyÚreadÚlenÚlistÚkeysÚAssertionErrorÚpprintÚpformat)r   Úreseed_count_beforeÚreseed_count_afterÚrfilesÚiÚrfdÚwfdÚfÚdataÚresultsÚresults_dictr   r   r   ÚrunTest>   sD   







ÿÿzRNGForkTest.runTestN)Ú__name__Ú
__module__Ú__qualname__r   rA   r   r   r   r   r   0   s    r   c                 C   sP   t j d¡}t d¡ t j d¡}|  t |¡¡ |  t |¡¡ |  d ¡ d S )Nr   gš™™™™™¹?)r   r   r$   r!   r"   Úputr.   Úb2a_hex)ÚqÚaÚbr   r   r   Ú
_task_mains   s   
rJ   c                   @   s   e Zd Zdd„ ZdS )ÚRNGMultiprocessingForkTestc                    sú   d}t  ¡ ‰ ‡ fdd„t|ƒD ƒ‰t d¡ tjj ¡  	¡  tj 
d¡ t j|tjjd�}| tˆ¡}‡fdd„t|ƒD ƒ}‡fdd„t|ƒD ƒ}tt||ƒƒ}| d	¡ | ¡  | ¡  tt|ƒƒt|ƒksqtt|ƒƒt|ƒkr{td
t |¡f ƒ‚d S )Né   c                    s   g | ]}ˆ   d ¡‘qS )r   )ÚQueue©Ú.0r:   )Úmanagerr   r   Ú
<listcomp>…   s    z6RNGMultiprocessingForkTest.runTest.<locals>.<listcomp>r   r   )Ú	processesÚinitializerc                    ó   g | ]	}ˆ |   d ¡‘qS ©é   ©ÚgetrN   ©Úqueuesr   r   rQ   ‘   ó    c                    rT   rU   rW   rN   rY   r   r   rQ   ’   r[   rV   r   )ÚmultiprocessingÚManagerr&   r!   r"   r   r   r   r	   r#   r$   ÚPoolr*   Ú	map_asyncrJ   r2   ÚziprX   r(   Újoinr1   Úsetr4   r5   r6   )r   Ún_procsÚpoolÚ
map_resultÚaaÚbbÚresr   )rP   rZ   r   rA   ~   s&   

(
ÿÿz"RNGMultiprocessingForkTest.runTestN)rB   rC   rD   rA   r   r   r   r   rK   |   s    rK   c                 C   s(   g }|t ƒ g7 }td ur|tƒ g7 }|S ©N)r   r\   rK   )ÚconfigÚtestsr   r   r   Ú	get_tests    s
   rl   Ú__main__c                   C   s   t  tƒ ¡S ri   )ÚunittestÚ	TestSuiterl   r   r   r   r   Ú<lambda>¨   s    rp   Úsuite)ÚdefaultTest)Ú__doc__Ú__revision__r.   r5   rn   r    r!   r   Úversion_infoÚCrypto.Util.py21compatÚCrypto.Util.py3compatr\   ÚImportErrorÚCrypto.Random._UserFriendlyRNGr   ÚCrypto.Random.randomÚTestCaser   rJ   rK   rl   rB   rq   Úmainr   r   r   r   Ú<module>   s4   ÿC	$þ