o
    \¨Êhs  ã                   @   sž   d Z dZg d¢ZddlmZ ddlZejd dkr$ejd dkr$ddlT G d	d
„ d
eƒZ	e	ƒ Z
e
jZe
jZe
jZe
jZe
jZe
jZddlmZmZmZmZ dS )zHA cryptographically strong version of Python's standard "random" module.z$Id$)ÚStrongRandomÚgetrandbitsÚ	randrangeÚrandintÚchoiceÚshuffleÚsampleé    )ÚRandomNé   é   )Ú*c                   @   sF   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S )r   Nc                 C   sX   |d u r|d u rd | _ d S |d ur|d u r|| _ d S |d u r(|d ur(|j| _ d S tdƒ‚)Nz(Cannot specify both 'rng' and 'randfunc')Ú	_randfuncÚreadÚ
ValueError)ÚselfÚrngÚrandfunc© r   úF/var/www/html/env/lib/python3.10/site-packages/Crypto/Random/random.pyÚ__init__$   s   

zStrongRandom.__init__c                 C   s:   | j du rt ¡ j| _ d|> d }|t|   t|dƒ¡ƒ@ S )z0Return a python long integer with k random bits.Nr   é   )r   r	   Únewr   Úbytes_to_longÚceil_div)r   ÚkÚmaskr   r   r   r   .   s   
zStrongRandom.getrandbitsc                 G   sø   t |ƒdkr|\}}}n$t |ƒdkr|\}}d}nt |ƒdkr'|\}d}d}n	tdt |ƒf ƒ‚t|tƒr?t|tƒr?t|tƒsCtdƒ‚|dkrKtdƒ‚t|| |ƒ}|dk rXd}|dk retd|||f ƒ‚|}||krv|  t|ƒ¡}||ksk|||  S )	zkrandrange([start,] stop[, step]):
        Return a randomly-selected element from range(start, stop, step).é   r
   r   r   z.randrange expected at most 3 arguments, got %dz$randrange requires integer argumentsz(randrange step argument must not be zeroz%empty range for randrange(%r, %r, %r))ÚlenÚ	TypeErrorÚ
isinstanceÚintr   r   r   Úsize)r   ÚargsÚstartÚstopÚstepÚnum_choicesÚrr   r   r   r   5   s8   
ÿþÿzStrongRandom.randrangec                 C   sL   t |tƒr
t |tƒstdƒ‚|  ||d ¡}||  kr!|ks$J ‚ J ‚|S )z0Return a random integer N such that a <= N <= b.z"randint requires integer argumentsr   )r   r    r   r   )r   ÚaÚbÚNr   r   r   r   W   s
   zStrongRandom.randintc                 C   s&   t |ƒdkr
tdƒ‚||  t |ƒ¡ S )zrReturn a random element from a (non-empty) sequence.

        If the seqence is empty, raises IndexError.
        r   zempty sequence)r   Ú
IndexErrorr   )r   Úseqr   r   r   r   _   s   zStrongRandom.choicec                 C   s6   t |ƒ}tt|ƒƒD ]}| |  t|ƒ¡¡||< q
dS )zShuffle the sequence in place.N)ÚlistÚranger   Úpopr   )r   ÚxÚitemsÚir   r   r   r   h   s   ÿzStrongRandom.shufflec                 C   sv   t |ƒ}||krtdƒ‚g }i }t|ƒD ]$}d}|du s ||v r-|  |¡}|du s ||v s | || ¡ d||< q|S )zNReturn a k-length list of unique elements chosen from the population sequence.zsample larger than populationNr   )r   r   r.   r   Úappend)r   Ú
populationr   r&   ÚretvalÚselectedr2   r'   r   r   r   r   r   s   
ÿ
zStrongRandom.sample)NN)
Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r   r   r   r   r   #   s    

"	
r   )r   r   Úlong_to_bytesr!   )Ú__doc__Ú__revision__Ú__all__ÚCryptor	   ÚsysÚversion_infoÚCrypto.Util.py21compatÚobjectr   Ú_rr   r   r   r   r   r   ÚCrypto.Util.numberr   r   r:   r!   r   r   r   r   Ú<module>   s    `