B c@sdZddlZejddkr0ejddkr0ddlTddlTddlZddlmZmZm Z ddl m Z ddl m Z dd lmZGd d d eZdS) z$Id$N)*) ceil_shift exact_log2 exact_div)Counter)AES)SHAd256c@s^eZdZdZejZdZdZededZ ddZ dd Z d d Z d d Z ddZddZdS) 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. iicCsLtj|jdddd|_d|_t|j|_t|j|j|_ |j |j|_ dS)NrT)ZnbitsZ initial_valueZ little_endian) rnew block_sizecounterkeyrblock_size_shiftrkey_sizeblocks_per_keymax_blocks_per_requestmax_bytes_per_request)selfrY/opt/alt/python37/lib64/python3.7/site-packages/Crypto/Random/Fortuna/FortunaGenerator.py__init__As  zAESGenerator.__init__cCs@|jdkrtd|j|_|t|j||dS)Nr )rbr_set_keyr rZdigestr)rZseedrrrreseedNs  zAESGenerator.reseedcCsT|d?}|d@}g}x t|D]}||dqW|||td|S)Nii)rangeappend_pseudo_random_datarjoin)rbytesZnum_full_blocksZ remainderretvalirrrpseudo_random_dataVszAESGenerator.pseudo_random_datacCs ||_tj|tj|jd|_dS)N)r)rr rZMODE_CTRr_cipher)rrrrrrcszAESGenerator._set_keycCsTd|kr|jks ntdt||j}||d|}|||j|S)Nrz6You cannot ask for more than 1 MiB of data per request)rAssertionErrorrr_generate_blocksrr)rr% num_blocksr&rrrr#gs  z AESGenerator._pseudo_random_datacCsx|jdkrtdg}x(t|d?D]}||j|jq$W|d@|j>}||j|jd|td |S)Nz#generator must be seeded before use ir ) rr*r!r"r)Zencrypt_four_kiblocks_of_zerosrrr$)rr,r&r'Zremaining_bytesrrrr+ys zAESGenerator._generate_blocksN)__name__ __module__ __qualname____doc__r rrrrr.rrr(rr#r+rrrrr (s   r )Z __revision__sys version_infoZCrypto.Util.py21compatZCrypto.Util.py3compatstructZCrypto.Util.numberrrrZ Crypto.UtilrZ Crypto.Cipherr r r objectr rrrrs