ÿØÿà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@sdZddlZejddkrEejddkrEddlTnddlTddlmZddlZddlZddl m Z ddl Z ddl Z d e fd YZd Zd e fd YZdS(s$Id$iNiii(t*(tb2a_hex(tClockRewindWarningt FortunaPoolcBsDeZdZejZdZdZdZdZdZ RS(sgFortuna pool type This object acts like a hash object, with the following differences: - It keeps a count (the .length attribute) of the number of bytes that have been added to the pool - It supports a .reset() method for in-place reinitialization - The method to add bytes to the pool is .append(), not .update(). cCs|jdS(N(treset(tself((s[/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaAccumulator.pyt__init__6scCs)|jj||jt|7_dS(N(t_htupdatetlengthtlen(Rtdata((s[/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaAccumulator.pytappend9scCs |jjS(N(Rtdigest(R((s[/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaAccumulator.pyR =scCs=tjddkr#t|jSt|jjSdS(Nii(tsyst version_infoRR tdecode(R((s[/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaAccumulator.pyt hexdigest@scCstj|_d|_dS(Ni(tSHAd256tnewRR (R((s[/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaAccumulator.pyRFs( t__name__t __module__t__doc__Rt digest_sizeRR R RR(((s[/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaAccumulator.pyR)s      cCsVg}d}xCtdD]5}||@dkr?|j|nP|d>dB}qW|S(s?Return a list of pools indexes (in range(32)) that are to be included during reseed number r. According to _Practical Cryptography_, chapter 10.5.2 "Pools": "Pool P_i is included if 2**i is a divisor of r. Thus P_0 is used every reseed, P_1 every other reseed, P_2 every fourth reseed, etc." ii il(trangeR (trtretvaltmaskti((s[/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaAccumulator.pyt which_poolsJs tFortunaAccumulatorcBsDeZdZdZdZdZdZddZdZ RS(i@g?cCsJd|_tj|_d|_gtdD]}t^q.|_dS(Nii ( t reseed_counttFortunaGeneratort AESGeneratort generatortNonet last_reseedRRtpools(RR((s[/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaAccumulator.pyRus   %cCs d|_dS(N(R#R$(R((s[/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaAccumulator.pyt_forget_last_reseedscCstj}|jdk rF|j|krFtjdtd|_n|jdj|jkr|jdks||j|j kr|j |n|j j |S(Ns-Clock rewind detected. Resetting last_reseed.i( ttimeR$R#twarningstwarnRR%R t min_pool_sizetreseed_intervalt_reseedR"tpseudo_random_data(Rtbytest current_time((s[/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaAccumulator.pyt random_datas  cCs|dkrtj}ng}|jd7_||_xBt|jD]1}|j|j|j|j|jqIWt dj |}|j j |dS(Nit( R#R'RR$RR R%R RtbtjoinR"treseed(RR/tseedR((s[/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaAccumulator.pyR,s  cCsR|j|jt||j|jtt||j|j|dS(N(R%R tbchrR (Rt source_numbert pool_numberR ((s[/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaAccumulator.pytadd_random_events N( RRR*R+RR&R0R#R,R9(((s[/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaAccumulator.pyR_s  (t __revision__RRtCrypto.Util.py21compattCrypto.Util.py3compattbinasciiRR'R(tCrypto.pct_warningsRRR tobjectRRR(((s[/opt/alt/python27/lib64/python2.7/site-packages/Crypto/Random/Fortuna/FortunaAccumulator.pyts &      !