o
    \¨ÊhÅ  ã                   @   sô   d Z ddlZejd dkrejd dkrddlT 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 ddlmZ G d	d
„ d
eƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZe ¡ Zdadd„ Zdd„ Zdd„ Zdd„ ZdS )z$Id$é    Né   é   )Ú*)Úfloor)ÚOSRNG)ÚFortunaAccumulatorc                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_EntropySourcec                 C   s   || _ || _d| _d S )Nr   )Ú_fortunaÚ_src_numÚ	_pool_num)ÚselfÚaccumulatorÚsrc_num© r   úP/var/www/html/env/lib/python3.10/site-packages/Crypto/Random/_UserFriendlyRNG.pyÚ__init__)   ó   
z_EntropySource.__init__c                 C   s(   | j  | j| j|¡ | jd d@ | _d S )Nr   é   )r	   Úadd_random_eventr
   r   )r   Údatar   r   r   Úfeed.   s   z_EntropySource.feedN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   (   s    r   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú_EntropyCollectorc                 C   s2   t  ¡ | _t|dƒ| _t|dƒ| _t|dƒ| _d S )Néÿ   éþ   éý   )r   ÚnewÚ_osrngr   Ú	_osrng_esÚ_time_esÚ	_clock_es)r   r   r   r   r   r   4   s   
z_EntropyCollector.__init__c                 C   sZ   t dƒD ]!}| j d¡}t dƒD ]}| j ||d |d d … ¡ qd }q| j ¡  d S )Nr   i   é    r   )Úranger   Úreadr    r   Úflush)r   ÚiÚblockÚpr   r   r   Úreinit:   s   "z_EntropyCollector.reinitc              
   C   sp   | j  | j d¡¡ t ¡ }| j t dtd|t	|ƒ  ƒ¡¡ t 
¡ }| j t dtd|t	|ƒ  ƒ¡¡ d S )Né   z@Ii   @)r    r   r   r%   Útimer!   ÚstructÚpackÚintr   Úclockr"   )r   Útr   r   r   ÚcollectD   s
   $(z_EntropyCollector.collectN)r   r   r   r   r*   r2   r   r   r   r   r   2   s    
r   c                   @   ó<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )Ú_UserFriendlyRNGc                 C   s(   d| _ t ¡ | _t| jƒ| _|  ¡  d S ©NF)Úclosedr   Ú_far   Ú_ecr*   ©r   r   r   r   r   S   s   
z_UserFriendlyRNG.__init__c                 C   s"   t  ¡ | _| j ¡  | j ¡  dS )zkInitialize the random number generator and seed it with entropy from
        the operating system.
        N)ÚosÚgetpidÚ_pidr8   r*   r7   Ú_forget_last_reseedr9   r   r   r   r*   Y   s   


z_UserFriendlyRNG.reinitc                 C   s   d| _ d | _d | _d S ©NT)r6   r   r7   r9   r   r   r   Úcloseo   r   z_UserFriendlyRNG.closec                 C   s   d S ©Nr   r9   r   r   r   r&   t   s   z_UserFriendlyRNG.flushc                 C   sR   | j rtdƒ‚t|tƒstdƒ‚|dk rtdƒ‚| j ¡  | j |¡}|  	¡  |S )zReturn N bytes from the RNG.úI/O operation on closed filezan integer is requiredr   z%cannot read to end of infinite stream)
r6   Ú
ValueErrorÚ
isinstancer/   Ú	TypeErrorr8   r2   r7   Úrandom_dataÚ
_check_pid)r   ÚNÚretvalr   r   r   r%   w   s   

z_UserFriendlyRNG.readc                 C   s   t  ¡ | jkrtdƒ‚d S )NzTPID check failed. RNG must be re-initialized after fork(). Hint: Try Random.atfork())r:   r;   r<   ÚAssertionErrorr9   r   r   r   rF   Ž   s   
ÿz_UserFriendlyRNG._check_pidN)	r   r   r   r   r*   r?   r&   r%   rF   r   r   r   r   r4   Q   s    r4   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú_LockingUserFriendlyRNGc                 C   s   t  ¡ | _t | ¡ d S r@   )Ú	threadingÚLockÚ_lockr4   r   r9   r   r   r   r   �   s   
z _LockingUserFriendlyRNG.__init__c                 C   ó.   | j  ¡  zt | ¡W | j  ¡  S | j  ¡  w r@   )rM   Úacquirer4   r?   Úreleaser9   r   r   r   r?   ¡   ó   

z_LockingUserFriendlyRNG.closec                 C   rN   r@   )rM   rO   r4   r*   rP   r9   r   r   r   r*   ¨   rQ   z_LockingUserFriendlyRNG.reinitc                 C   s0   | j  ¡  zt | |¡W | j  ¡  S | j  ¡  w r@   )rM   rO   r4   r%   rP   ©r   Úbytesr   r   r   r%   ¯   s   
z_LockingUserFriendlyRNG.readN)r   r   r   r   r?   r*   r%   r   r   r   r   rJ   œ   s
    rJ   c                   @   r3   )ÚRNGFilec                 C   s   d| _ || _d S r5   ©r6   Ú
_singleton)r   Ú	singletonr   r   r   r   ·   s   
zRNGFile.__init__c                 C   s   dS ©zPEP 343 supportNr   r9   r   r   r   Ú	__enter__¼   s    zRNGFile.__enter__c                 C   s   |   ¡  dS rX   )r?   r9   r   r   r   Ú__exit__¾   ó   zRNGFile.__exit__c                 C   s   d| _ d | _d S r>   rU   r9   r   r   r   r?   Â   s   
zRNGFile.closec                 C   s   | j rtdƒ‚| j |¡S ©NrA   )r6   rB   rV   r%   rR   r   r   r   r%   Ç   s   zRNGFile.readc                 C   s   | j rtdƒ‚d S r\   )r6   rB   r9   r   r   r   r&   Ì   s   ÿzRNGFile.flushN)	r   r   r   r   rY   rZ   r?   r%   r&   r   r   r   r   rT   ¶   s    rT   c                   C   s0   t  ¡  ztd u rtƒ atW t  ¡  S t  ¡  w r@   )Ú_singleton_lockrO   rV   rJ   rP   r   r   r   r   Ú_get_singletonÒ   s   r^   c                   C   s
   t tƒ ƒS r@   )rT   r^   r   r   r   r   r   Ü   s   
r   c                   C   s   t ƒ  ¡  d S r@   )r^   r*   r   r   r   r   r*   ß   s   r*   c                 C   s   t ƒ  | ¡S )zEReturn the specified number of cryptographically-strong random bytes.)r^   r%   )Únr   r   r   Úget_random_bytesâ   r[   r`   )Ú__revision__ÚsysÚversion_infoÚCrypto.Util.py21compatr:   rK   r-   r,   Úmathr   ÚCrypto.Randomr   ÚCrypto.Random.Fortunar   Úobjectr   r   r4   rJ   rT   rL   r]   rV   r^   r   r*   r`   r   r   r   r   Ú<module>   s,   
K
