ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ Bd\Rc@sdZddlZejddkrEejddkrEddlTnddlTddlZddlmZmZm Z ddl m Z dd l m Z ddlZd efd YZdS( s$Id$iNiii(t*(t ceil_shiftt exact_log2t exact_div(tCounter(tAESt AESGeneratorcBsmeZdZejZdZd ZededZdZ dZ dZ 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 iisicCstjd|jddddt|_d|_t|j|_d|j>|jks_t t |j |j|_ |j |j |jkst |j |j|_dS(Ntnbitsit initial_valueit little_endiani(Rtnewt block_sizetTruetcountertNonetkeyRtblock_size_shifttAssertionErrorRtkey_sizetblocks_per_keytmax_blocks_per_requesttmax_bytes_per_request(tself((sY/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaGenerator.pyt__init__As( cCsw|jdkr(td|j|_n|jtj|j|j|jt |j|jksst dS(Ns( RRtbRt_set_keytSHAd256R tdigestR tlenR(Rtseed((sY/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaGenerator.pytreseedNs # cCs|dkst|d?}|d@}g}x*t|D]}|j|jdq9W|j|j|tdj|S(Niiitiii(Rtxrangetappendt_pseudo_random_dataRtjoin(Rtbytestnum_full_blockst remaindertretvalti((sY/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaGenerator.pytpseudo_random_dataVs  cCs.||_tj|tjd|j|_dS(NR (RRR tMODE_CTRR t_cipher(RR((sY/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaGenerator.pyRcs cCsd|ko|jkns.tdnt||j}|j|| }|j|j|jt||kstt|j|j kst|S(Nis6You cannot ask for more than 1 MiB of data per request( RRRRt_generate_blocksRRRRR(RR$t num_blocksR'((sY/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaGenerator.pyR"gscCs|jdkrtdnd|ko8|jknsCtg}x4t|d?D]"}|j|jj|jqZW|d@|j >}|j|jj|j| t dj |S(Ns#generator must be seeded before useii iR( RRRRR R!R+tencryptt_four_kiblocks_of_zerosRRR#(RR-R'R(tremaining_bytes((sY/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaGenerator.pyR,ys%  i(t__name__t __module__t__doc__RR RRRR/RRR)RR"R,(((sY/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaGenerator.pyR(s     (t __revision__tsyst version_infotCrypto.Util.py21compattCrypto.Util.py3compattstructtCrypto.Util.numberRRRt Crypto.UtilRt Crypto.CipherRRtobjectR(((sY/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaGenerator.pyts &