a
    sd_C                     @   s   d dl Z d dlZd dlZd dlZzd dlZW n eyF   d dlZY n0 G dd dZe Z	ze
 ZW n ey~   dZY n0 dd Zdd ZdS )    Nc                   @   sN   e Zd Z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S )EntropyPoolNc                 C   st   d| _ d | _d| _t | _t | _d| _	t
d| j	 | _|d urd| t
| d| _t | _nd| _d| _d S )Nr          TF)
pool_indexdigest	next_byte
_threadingZLocklockhashlibZsha1hashhash_len	bytearraypool_stirseededosgetpidseed_pid)selfseed r   -/usr/lib/python3/dist-packages/dns/entropy.py__init__#   s    

zEntropyPool.__init__c                 C   sJ   |D ]@}| j | jkrd| _ |d@ }| j| j   |N  < |  j d7  _ qd S )Nr         )r   r   r   )r   entropycbr   r   r   r   3   s    zEntropyPool._stirc                 C   s4   | j  | | W d    n1 s&0    Y  d S )N)r	   r   )r   r   r   r   r   stir;   s    zEntropyPool.stirc                 C   s   | j r| jt krztd}W nl ty   z:tddd}|d}W d    n1 s^0    Y  W n ty   tt		 }Y n0 Y n0 d| _ t | _d | _
t|}| | d S )N   z/dev/urandomrbr   T)r   r   r   r   urandom	Exceptionopenreadstrtimer   r   r   )r   r   rr   r   r   _maybe_seed?   s    ,
zEntropyPool._maybe_seedc                 C   s   | j | |   | jd u s&| j| jkrZ| jt| j t	| j | _| 
| j d| _| j| j }|  jd7  _W d    n1 s0    Y  |S )Nr   r   )r	   r(   r   r   r   r   updatebytesr   r   r   )r   valuer   r   r   random_8O   s    ,zEntropyPool.random_8c                 C   s   |   d |    S )N   )r,   r   r   r   r   	random_16[   s    zEntropyPool.random_16c                 C   s   |   d |    S )N   )r/   r.   r   r   r   	random_32^   s    zEntropyPool.random_32c                 C   sd   || d }|dkrt d|dkr0| j}d}n|dkrD| j}d}n
| j}d}|||  |d   S )	Nr   l        ztoo bigr0   l    r-   i  r   )
ValueErrorr1   r/   r,   )r   firstlastsizeZrandmaxr   r   r   random_betweena   s    zEntropyPool.random_between)N)__name__
__module____qualname__r   r   r   r(   r,   r/   r1   r7   r   r   r   r   r      s   
r   c                   C   s    t d urt ddS t S d S )Nr   r0   )system_random	randranger   r/   r   r   r   r   r/   w   s    r/   c                 C   s(   t d urt | |d S t| |S d S )Nr   )r;   r<   r   r7   )r3   r4   r   r   r   between}   s    r=   )r   r
   Zrandomr&   Z	threadingr   ImportErrorZdummy_threadingr   r   ZSystemRandomr;   r"   r/   r=   r   r   r   r   <module>   s   T
