o
    \¨Êh–  ã                   @   sŒ   d Z ddlZejd du rejd du rddlT ddlT ddlZddlmZmZm	Z	 ddl
mZ ddlmZ dd	lmZ G d
d„ deƒZdS )z$Id$é    Né   é   )Ú*)Ú
ceil_shiftÚ
exact_log2Ú	exact_div)ÚCounter)ÚAES)ÚSHAd256c                   @   s^   e Zd ZdZejZdZdZedƒe d Z	dd„ Z
dd	„ Zd
d„ Zdd„ Zdd„ Zdd„ ZdS )ÚAESGeneratora)  The Fortuna "generator"

    This is used internally by the Fortuna PRNG to generate arbitrary amounts
    of pseudorandom data from a smaller amount of seed data.

    The output is generated by running AES-256 in counter mode and re-keying
    after every mebibyte (2**16 blocks) of output.
    é    i   ú i   c                 C   sv   t j| jd ddd�| _d | _t| jƒ| _d| j> | jksJ ‚t| j| jƒ| _	| j| j	| j ks2J ‚| j
| j | _d S )Né   r   T)ÚnbitsÚinitial_valueÚlittle_endianr   )r   ÚnewÚ
block_sizeÚcounterÚkeyr   Úblock_size_shiftr   Úkey_sizeÚblocks_per_keyÚmax_blocks_per_requestÚmax_bytes_per_request)Úself© r   úX/var/www/html/env/lib/python3.10/site-packages/Crypto/Random/Fortuna/FortunaGenerator.pyÚ__init__A   s   zAESGenerator.__init__c                 C   sT   | j d u rtdƒ| j | _ |  t | j | ¡ ¡ ¡ |  ¡  t| j ƒ| jks(J ‚d S )Nr   )	r   Úbr   Ú_set_keyr
   r   Údigestr   Úlen)r   Úseedr   r   r   ÚreseedN   s
   
zAESGenerator.reseedc                 C   s\   |dksJ ‚|d? }|d@ }g }t |ƒD ]
}| |  d¡¡ q| |  |¡¡ tdƒ |¡S )Nr   é   iÿÿ i   Ú )ÚrangeÚappendÚ_pseudo_random_datar   Újoin)r   ÚbytesÚnum_full_blocksÚ	remainderÚretvalÚir   r   r   Úpseudo_random_dataV   s   zAESGenerator.pseudo_random_datac                 C   s    || _ tj|tj| jd�| _d S )N)r   )r   r	   r   ÚMODE_CTRr   Ú_cipher)r   r   r   r   r   r    c   s   zAESGenerator._set_keyc                 C   s~   d|  kr| j kstdƒ‚ tdƒ‚t|| jƒ}|  |¡d |… }|  |  | j¡¡ t|ƒ|ks3J ‚t| jƒ| j	ks=J ‚|S )Nr   z6You cannot ask for more than 1 MiB of data per request)
r   ÚAssertionErrorr   r   Ú_generate_blocksr    r   r"   r   r   )r   r+   Ú
num_blocksr.   r   r   r   r)   g   s   ÿz AESGenerator._pseudo_random_datac                 C   s’   | j d u r	tdƒ‚d|  kr| jksJ ‚ J ‚g }t|d? ƒD ]}| | j | j¡¡ q |d@ | j> }| | j | jd |… ¡¡ t	dƒ 
|¡S )Nz#generator must be seeded before user   é   iÿ  r&   )r   r3   r   r'   r(   r2   ÚencryptÚ_four_kiblocks_of_zerosr   r   r*   )r   r5   r.   r/   Úremaining_bytesr   r   r   r4   y   s   
zAESGenerator._generate_blocksN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   r   r   r   r8   r   r$   r0   r    r)   r4   r   r   r   r   r   (   s    	
r   )Ú__revision__ÚsysÚversion_infoÚCrypto.Util.py21compatÚCrypto.Util.py3compatÚstructÚCrypto.Util.numberr   r   r   ÚCrypto.Utilr   ÚCrypto.Cipherr	   r&   r
   Úobjectr   r   r   r   r   Ú<module>   s   