B
    ë?[Å  ã               @   sô   d Z ddlZejd dkr0ejd dkr0d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ÚaccumulatorZsrc_num© r   ú=lib/python3.7/site-packages/Crypto/Random/_UserFriendlyRNG.pyÚ__init__)   s    z_EntropySource.__init__c             C   s(   | j  | j| j|¡ | jd d@ | _d S )Nr   é   )r	   Z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   sb   xRt dƒD ]F}| j d¡}x0t dƒD ]$}| j ||d |d d … ¡ q$W d }q
W | 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   ÚstructZpackÚintr   Zclockr   )r   Útr   r   r   ÚcollectD   s
    $z_EntropyCollector.collectN)r   r   r   r   r'   r-   r   r   r   r   r   2   s   
r   c               @   s<   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Ú_pidr1   r'   r0   Z_forget_last_reseed)r   r   r   r   r'   Y   s    


z_UserFriendlyRNG.reinitc             C   s   d| _ d | _d | _d S )NT)r/   r   r0   )r   r   r   r   Úcloseo   s    z_UserFriendlyRNG.closec             C   s   d S )Nr   )r   r   r   r   r#   t   s    z_UserFriendlyRNG.flushc             C   sR   | j rtdƒ‚t|tƒs tdƒ‚|dk r0tdƒ‚| j ¡  | j |¡}|  	¡  |S )zReturn N bytes from the RNG.zI/O operation on closed filezan integer is requiredr   z%cannot read to end of infinite stream)
r/   Ú
ValueErrorÚ
isinstancer+   Ú	TypeErrorr1   r-   r0   Zrandom_dataÚ
_check_pid)r   ÚNZ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())r2   r3   r4   ÚAssertionError)r   r   r   r   r9   Ž   s    
z_UserFriendlyRNG._check_pidN)	r   r   r   r   r'   r5   r#   r"   r9   r   r   r   r   r.   Q   s   r.   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 )N)Ú	threadingÚLockÚ_lockr.   r   )r   r   r   r   r      s    
z _LockingUserFriendlyRNG.__init__c             C   s&   | j  ¡  z
t | ¡S | j  ¡  X d S )N)r?   Úacquirer.   r5   Úrelease)r   r   r   r   r5   ¡   s    

z_LockingUserFriendlyRNG.closec             C   s&   | j  ¡  z
t | ¡S | j  ¡  X d S )N)r?   r@   r.   r'   rA   )r   r   r   r   r'   ¨   s    

z_LockingUserFriendlyRNG.reinitc             C   s(   | j  ¡  zt | |¡S | j  ¡  X d S )N)r?   r@   r.   r"   rA   )r   Úbytesr   r   r   r"   ¯   s    
z_LockingUserFriendlyRNG.readN)r   r   r   r   r5   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d„ Zd	d
„ Zdd„ ZdS )ÚRNGFilec             C   s   d| _ || _d S )NF)r/   Ú
_singleton)r   Z	singletonr   r   r   r   ·   s    zRNGFile.__init__c             C   s   dS )zPEP 343 supportNr   )r   r   r   r   Ú	__enter__¼   s    zRNGFile.__enter__c             C   s   |   ¡  dS )zPEP 343 supportN)r5   )r   r   r   r   Ú__exit__¾   s    zRNGFile.__exit__c             C   s   d| _ d | _d S )NT)r/   rD   )r   r   r   r   r5   Â   s    zRNGFile.closec             C   s   | j rtdƒ‚| j |¡S )NzI/O operation on closed file)r/   r6   rD   r"   )r   rB   r   r   r   r"   Ç   s    zRNGFile.readc             C   s   | j rtdƒ‚d S )NzI/O operation on closed file)r/   r6   )r   r   r   r   r#   Ì   s    zRNGFile.flushN)	r   r   r   r   rE   rF   r5   r"   r#   r   r   r   r   rC   ¶   s   rC   c               C   s*   t  ¡  ztd krtƒ atS t  ¡  X d S )N)Ú_singleton_lockr@   rD   r<   rA   r   r   r   r   Ú_get_singletonÒ   s    rH   c               C   s
   t tƒ ƒS )N)rC   rH   r   r   r   r   r   Ü   s    r   c               C   s   t ƒ  ¡  d S )N)rH   r'   r   r   r   r   r'   ß   s    r'   c             C   s   t ƒ  | ¡S )zEReturn the specified number of cryptographically-strong random bytes.)rH   r"   )Únr   r   r   Úget_random_bytesâ   s    rJ   )Z__revision__ÚsysÚversion_infoZCrypto.Util.py21compatr2   r=   r*   r)   Zmathr   ZCrypto.Randomr   ZCrypto.Random.Fortunar   Úobjectr   r   r.   r<   rC   r>   rG   rD   rH   r   r'   rJ   r   r   r   r   Ú<module>   s*   
K
