3
[_ð]£  ã               @   s¢   d dl Z d dlZd dlZddlmZmZ yd dlZW n ek
rP   d dl	ZY nX G dd„ de
ƒZeƒ Zyejƒ ZW n ek
rŒ   dZY nX dd„ Zdd	„ ZdS )
é    Né   )ÚlongÚbinary_typec               @   sH   e Zd Zddd„Zddd„Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Z	dS )ÚEntropyPoolNc             C   sà   d| _ d | _d| _tjƒ | _ydd l}|jƒ | _d| _	W n^ t
k
r–   ydd l}|jƒ | _d| _	W n, t
k
r�   dd l}|jƒ | _d| _	Y nX Y nX td| j	 ƒ| _|d k	rÐ| jt|ƒƒ d| _tjƒ | _nd| _d| _d S )Nr   é   é   ó    TF)Ú
pool_indexÚdigestÚ	next_byteÚ
_threadingÚLockÚlockÚhashlibÚsha1ÚhashÚhash_lenÚImportErrorÚshaÚnewÚmd5Ú	bytearrayÚpoolÚstirÚseededÚosÚgetpidÚseed_pid)ÚselfÚseedr   r   r   © r    ú0/tmp/pip-build-yz_zf6az/dnspython/dns/entropy.pyÚ__init__#   s0    





zEntropyPool.__init__Fc             C   sr   |s| j jƒ  zNxH|D ]@}| j| jkr,d| _|d@ }| j| j  |N  < |  jd7  _qW W d |sl| j jƒ  X d S )Nr   éÿ   r   )r   Úacquirer	   r   r   Úrelease)r   ZentropyZalready_lockedÚcÚbr    r    r!   r   >   s    

zEntropyPool.stirc             C   s´   | j  s| jtjƒ kr°ytjdƒ}W n` tk
r„   y*tdddƒ}z|jdƒ}W d |jƒ  X W n  tk
r~   t	t
j
ƒ ƒ}Y nX Y nX d| _ tjƒ | _d | _t|ƒ}| j|dƒ d S )Nr   z/dev/urandomÚrbr   T)r   r   r   r   ÚurandomÚ	ExceptionÚopenÚreadÚcloseÚstrÚtimer
   r   r   )r   r   Úrr    r    r!   Ú_maybe_seedL   s     
zEntropyPool._maybe_seedc          
   C   sŽ   | j jƒ  zr| jƒ  | jd ks*| j| jkr`| jjt| j	ƒƒ t
| jjƒ ƒ| _| j| jdƒ d| _| j| j }|  jd7  _W d | j jƒ  X |S )NTr   r   )r   r$   r1   r
   r   r   r   Úupdater   r   r   r   r%   )r   Úvaluer    r    r!   Úrandom_8_   s    
zEntropyPool.random_8c             C   s   | j ƒ d | j ƒ  S )Né   )r4   )r   r    r    r!   Ú	random_16n   s    zEntropyPool.random_16c             C   s   | j ƒ d | j ƒ  S )Ni   )r6   )r   r    r    r!   Ú	random_32q   s    zEntropyPool.random_32c             C   sl   || d }|t dƒkr tdƒ‚|dkr8| j}t dƒ}n|dkrL| j}d}n
| j}d}|||ƒ  |d   S )	Nr   l        ztoo bigi   l   ÿÿ r5   iÿÿ  r#   )r   Ú
ValueErrorr7   r6   r4   )r   ÚfirstÚlastÚsizeZrandÚmaxr    r    r!   Úrandom_betweent   s    
zEntropyPool.random_between)N)F)
Ú__name__Ú
__module__Ú__qualname__r"   r   r1   r4   r6   r7   r=   r    r    r    r!   r      s   

r   c               C   s    t d k	rt jddƒS tjƒ S d S )Nr   i   )Úsystem_randomÚ	randranger   r6   r    r    r    r!   r6   Š   s    r6   c             C   s(   t d k	rt j| |d ƒS tj| |ƒS d S )Nr   )rA   rB   r   r=   )r9   r:   r    r    r!   Úbetween�   s    rC   )r   Úrandomr/   Ú_compatr   r   Ú	threadingr   r   Údummy_threadingÚobjectr   r   ÚSystemRandomrA   r*   r6   rC   r    r    r    r!   Ú<module>   s   g
