
                             d dl Z d dlZd dlZddlmZmZ 	 d dlZ G d de
      Z e       Z	  ej                         Zd Zd Zy# e$ r d dl	ZY 6w xY w# e$ r dZY w xY w)    N   )longbinary_typec                   :    e Zd Zd	dZd
dZd Zd Zd Zd Zd Z	y)EntropyPoolNc                 2   d| _         d | _        d| _        t        j                         | _        	 dd l}|j                         | _        d| _	        t        d| j                  z        | _        |;| j!                  t        |             d| _        t%        j&                         | _        y d| _        d| _        y # t        $ rT 	 dd l}|j                         | _        d| _	        n/# t        $ r# dd l}|j                         | _        d| _	        Y nw xY wY w xY w)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   s        lib/third_party/dns/entropy.py__init__zEntropyPool.__init__#   s    OO%		#DIDM edmm34	IIio&DKIIKDMDKDM!  	##GGI	 " #GGI	 "#	#s5    B9 9	D C$#D$)DDDDDc                    |s| j                   j                          	 |D ]]  }| j                  | j                  k(  rd| _        |dz  }| j                  | j                  xx   |z  cc<   | xj                  dz  c_        _ 	 |s| j                   j                          y y # |s| j                   j                          w w xY w)Nr      r   )r   acquirer   r   r   release)r!   entropyalready_lockedcbs        r#   r   zEntropyPool.stir>   s    II		$??dmm3&'DOH		$//*a/*1$  "		!!# ">		!!# "s   A"B B>c                    | j                   r!| j                  t        j                         k7  r[	 t        j                  d      }d| _         t        j                         | _        d | _        t        |      }| j                  |d       y y # t
        $ rv 	 t        ddd      }	 |j                  d      }|j                          n# |j                          w xY wn,# t
        $ r  t        t        j                               }Y nw xY wY w xY w)Nr
   z/dev/urandomrbr   T)r   r    r   r   urandom	Exceptionopenreadclosestrtimer   r   r   )r!   r"   rs      r#   _maybe_seedzEntropyPool._maybe_seedL   s    {{dmmryy{:
,zz"~ DKIIKDMDKT?DIIdD!! ;  ,,^T15A" vvbz			  ,tyy{+D,,sM   B
 
	D	C"C3CCCD	&D D	DD	D	c                 f   | j                   j                          	 | j                          | j                  | j                  | j
                  k(  ry| j                  j                  t        | j                               t        | j                  j                               | _        | j                  | j                  d       d| _        | j                  | j                     }| xj                  dz  c_        | j                   j                          |S # | j                   j                          w xY w)NTr   r   )r   r'   r7   r   r   r   r   updater   r   r   r   r(   )r!   values     r#   random_8zEntropyPool.random_8_   s    		
	 {{"dnn&E		  TYY!78'		(8(8(:;		$++t,!"KK/ENNaNII IIs   CD D0c                 J    | j                         dz  | j                         z   S )N   )r;   r!   s    r#   	random_16zEntropyPool.random_16n   s    }}$t}}66    c                 J    | j                         dz  | j                         z   S )N   )r?   r>   s    r#   	random_32zEntropyPool.random_32q   s     ~~%'$..*:::r@   c                     ||z
  dz   }|t        d      kD  rt        d      |dkD  r| j                  }t        d      }n"|dkD  r| j                  }d}n| j                  }d}|| |       z  |dz   z  z   S )	Nr   l        ztoo bigrB   l    r=   i  r&   )r   
ValueErrorrC   r?   r;   )r!   firstlastsizerandmaxs         r#   random_betweenzEntropyPool.random_betweent   s    e|a$z""Y''%<>>Dz"CCZ>>DC==DCtdf}q111r@   )N)F)
__name__
__module____qualname__r$   r   r7   r;   r?   rC   rK    r@   r#   r   r      s%    6$"&7;2r@   r   c                  b    t         t         j                  dd      S t        j                         S )Nr   rB   )system_random	randranger   r?   rO   r@   r#   r?   r?      s(     &&q%00~~r@   c                 l    t         t         j                  | |dz         S t        j                  | |      S )Nr   )rQ   rR   r   rK   )rF   rG   s     r#   betweenrT      s2     &&udQh77""5$//r@   )r   randomr5   _compatr   r   	threadingr   r   dummy_threadingobjectr   r   SystemRandomrQ   r0   r?   rT   rO   r@   r#   <module>r[      s}   $ 
   &)"
e2& e2N }'F'')M 0q  )()^  Ms"   A A 	AAAA