ó õùPc@s½dZddlZejddkrEejddkrEddlTnddlTddlZddlmZmZm Z ddl m Z dd l m Z ddlZd efd „ƒYZdS( s$Id$iÿÿÿÿNiii(t*(t ceil_shiftt exact_log2t exact_div(tCounter(tAESt AESGeneratorcBsmeZdZejZdZd ZedƒedZd„Z d„Z d„Z d „Z d „Z d „ZRS( s)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 iiticCs­tjd|jddddtƒ|_d|_t|jƒ|_d|j>|jks_t ‚t |j |jƒ|_ |j |j |jks–t ‚|j |j|_dS(Ntnbitsit initial_valueit little_endiani(Rtnewt block_sizetTruetcountertNonetkeyRtblock_size_shifttAssertionErrorRtkey_sizetblocks_per_keytmax_blocks_per_requesttmax_bytes_per_request(tself((sA..\python\site-packages\Crypto\Random\Fortuna\FortunaGenerator.pyt__init__As( cCsw|jdkr(tdƒ|j|_n|jtj|j|ƒjƒƒ|jƒt |jƒ|jksst ‚dS(NR( RRtbRt_set_keytSHAd256R tdigestRtlenR(Rtseed((sA..\python\site-packages\Crypto\Random\Fortuna\FortunaGenerator.pytreseedNs # cCs‚|dkst‚|d?}|d@}g}x*t|ƒD]}|j|jdƒƒq9W|j|j|ƒƒtdƒj|ƒS(Niiitiiÿÿi(Rtxrangetappendt_pseudo_random_dataRtjoin(Rtbytestnum_full_blockst remaindertretvalti((sA..\python\site-packages\Crypto\Random\Fortuna\FortunaGenerator.pytpseudo_random_dataVs  cCs.||_tj|tjd|jƒ|_dS(NR(RRR tMODE_CTRRt_cipher(RR((sA..\python\site-packages\Crypto\Random\Fortuna\FortunaGenerator.pyRcs cCs¦d|ko|jkns.tdƒ‚nt||jƒ}|j|ƒ| }|j|j|jƒƒt|ƒ|ks„t‚t|jƒ|j ks¢t‚|S(Nis6You cannot ask for more than 1 MiB of data per request( RRRRt_generate_blocksRRRRR(RR%t num_blocksR(((sA..\python\site-packages\Crypto\Random\Fortuna\FortunaGenerator.pyR#gscCsÄ|jdkrtdƒ‚nd|ko8|jknsCt‚g}x4t|d?ƒD]"}|j|jj|jƒƒqZW|d@|j >}|j|jj|j| ƒƒt dƒj |ƒS(Ns#generator must be seeded before useii iÿR ( RRRRR!R"R,tencryptt_four_kiblocks_of_zerosRRR$(RR.R(R)tremaining_bytes((sA..\python\site-packages\Crypto\Random\Fortuna\FortunaGenerator.pyR-ys%  i(t__name__t __module__t__doc__RR RRRR0RRR*RR#R-(((sA..\python\site-packages\Crypto\Random\Fortuna\FortunaGenerator.pyR(s     (t __revision__tsyst version_infotCrypto.Util.py21compattCrypto.Util.py3compattstructtCrypto.Util.numberRRRt Crypto.UtilRt Crypto.CipherRRtobjectR(((sA..\python\site-packages\Crypto\Random\Fortuna\FortunaGenerator.pyts &