U
    h                     @   s   U d dl Z d dlZd dlZd dlZd dlZd dlmZmZ G dd dZe Z	ee e
d< ze ZW n ek
r~   dZY nX edddZeeed	d
dZdS )    N)AnyOptionalc                   @   s   e Zd Zdee dddZeddddZedddd	Zdd
ddZe	d
ddZ
e	d
ddZe	d
ddZe	e	e	dddZdS )EntropyPoolN)seedc                 C   sp   d| _ d | _d| _t | _t | _d| _	t
d| j	 | _|d k	r`| | d| _t | _nd| _d| _d S )Nr          TF)
pool_indexdigest	next_byte	threadingLocklockhashlibsha1hashhash_len	bytearraypool_stirseededosgetpidseed_pid)selfr    r   //tmp/pip-unpacked-wheel-47wolagk/dns/entropy.py__init__    s    


zEntropyPool.__init__)entropyreturnc                 C   sJ   |D ]@}| j | jkrd| _ |d@ }| j| j   |N  < |  j d7  _ qd S )Nr         )r   r   r   )r   r   cbr   r   r   r   0   s    zEntropyPool._stirc              	   C   s    | j  | | W 5 Q R X d S )N)r   r   )r   r   r   r   r   stir8   s    zEntropyPool.stirr   c                 C   s   | j r| jt krztd}W n` tk
r   z&tddd}|d}W 5 Q R X W n$ tk
r|   tt		 
 }Y nX Y nX d| _ t | _d | _t|}| | d S )N   z/dev/urandomrbr   T)r   r   r   r   urandom	Exceptionopenreadstrtimeencoder	   r   r   )r   r   rr   r   r   _maybe_seed<   s    
zEntropyPool._maybe_seedc              	   C   s   | j r |   | jd ks&| j| jkrZ| jt| j t	| j | _| 
| j d| _| j| j }|  jd7  _W 5 Q R X |S )Nr   r    )r   r/   r	   r
   r   r   updatebytesr   r   r   )r   valuer   r   r   random_8L   s    zEntropyPool.random_8c                 C   s   |   d |    S )N   )r3   r   r   r   r   	random_16X   s    zEntropyPool.random_16c                 C   s   |   d |    S )N   )r6   r5   r   r   r   	random_32[   s    zEntropyPool.random_32firstlastr   c                 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 bigr7   l    r4   i  r   )
ValueErrorr8   r6   r3   )r   r:   r;   sizeZrandmaxr   r   r   random_between^   s    zEntropyPool.random_between)N)__name__
__module____qualname__r   r1   r   r   r#   r/   intr3   r6   r8   r?   r   r   r   r   r      s   r   system_randomr$   c                   C   s    t d k	rt ddS t S d S )Nr   r7   )rD   	randranger   r6   r   r   r   r   r6   w   s    r6   r9   c                 C   s(   t d k	rt | |d S t| |S d S )Nr    )rD   rE   r   r?   )r:   r;   r   r   r   between~   s    rF   )r   r   randomr   r,   typingr   r   r   r   __annotations__SystemRandomrD   r(   rC   r6   rF   r   r   r   r   <module>   s    T
