ó J(Zc@sMdZddlZejddkrEejddkrEddlTnddlZddlZddlZddlZddlm Z ddl m Z dd l m Z d efd „ƒYZd efd „ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZejƒZdad„Zd„Zd„Zd„ZdS(s$Id$iÿÿÿÿNiii(t*(tfloor(tOSRNG(tFortunaAccumulatort_EntropySourcecBseZd„Zd„ZRS(cCs||_||_d|_dS(Ni(t_fortunat_src_numt _pool_num(tselft accumulatortsrc_num((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyt__init__)s  cCs4|jj|j|j|ƒ|jdd@|_dS(Nii(Rtadd_random_eventRR(Rtdata((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pytfeed.s(t__name__t __module__R R(((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyR(s t_EntropyCollectorcBs#eZd„Zd„Zd„ZRS(cCsItjƒ|_t|dƒ|_t|dƒ|_t|dƒ|_dS(Niÿiþiý(Rtnewt_osrngRt _osrng_est_time_est _clock_es(RR ((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyR 4scCszxftdƒD]X}|jjdƒ}x7tdƒD])}|jj||d|dd!ƒq2Wd}q W|jjƒdS(Nii ii(trangeRtreadRRtNonetflush(Rtitblocktp((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pytreinit:s ' cCs˜|jj|jjdƒƒtjƒ}|jjtjdtd|t |ƒƒƒƒtj ƒ}|j jtjdtd|t |ƒƒƒƒdS(Nis@Iiii@i@( RRRRttimeRtstructtpacktintRtclockR(Rtt((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pytcollectDs  0 (RRR RR%(((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyR2s  t_UserFriendlyRNGcBs>eZd„Zd„Zd„Zd„Zd„Zd„ZRS(cCs8t|_tjƒ|_t|jƒ|_|jƒdS(N(tFalsetclosedRt_faRt_ecR(R((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyR Ss cCs-tjƒ|_|jjƒ|jjƒdS(skInitialize the random number generator and seed it with entropy from the operating system. N(tostgetpidt_pidR*RR)t_forget_last_reseed(R((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyRYs cCst|_d|_d|_dS(N(tTrueR(RRR)(R((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pytcloseos  cCsdS(N((R((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyRtscCs„|jrtdƒ‚nt|ttfƒs<tdƒ‚n|dkrWtdƒ‚n|jjƒ|jj |ƒ}|j ƒ|S(sReturn N bytes from the RNG.sI/O operation on closed filesan integer is requiredis%cannot read to end of infinite stream( R(t ValueErrort isinstancetlongR"t TypeErrorR*R%R)t random_datat _check_pid(RtNtretval((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyRws    cCs(tjƒ|jkr$tdƒ‚ndS(NsTPID check failed. RNG must be re-initialized after fork(). Hint: Try Random.atfork()(R+R,R-tAssertionError(R((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyR6Žs (RRR RR0RRR6(((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyR&Qs      t_LockingUserFriendlyRNGcBs,eZd„Zd„Zd„Zd„ZRS(cCs tjƒ|_tj|ƒdS(N(t threadingtLockt_lockR&R (R((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyR scCs3|jjƒztj|ƒSWd|jjƒXdS(N(R=tacquireR&R0trelease(R((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyR0¡s cCs3|jjƒztj|ƒSWd|jjƒXdS(N(R=R>R&RR?(R((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyR¨s cCs6|jjƒztj||ƒSWd|jjƒXdS(N(R=R>R&RR?(Rtbytes((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyR¯s (RRR R0RR(((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyR:œs   tRNGFilecBs>eZd„Zd„Zd„Zd„Zd„Zd„ZRS(cCst|_||_dS(N(R'R(t _singleton(Rt singleton((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyR ·s cCsdS(sPEP 343 supportN((R((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyt __enter__¼scCs|jƒdS(sPEP 343 supportN(R0(R((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyt__exit__¾scCst|_d|_dS(N(R/R(RRB(R((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyR0Âs cCs(|jrtdƒ‚n|jj|ƒS(NsI/O operation on closed file(R(R1RBR(RR@((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyRÇs cCs|jrtdƒ‚ndS(NsI/O operation on closed file(R(R1(R((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyRÌs (RRR RDRER0RR(((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyRA¶s      cCs<tjƒz tdkr%tƒantSWdtjƒXdS(N(t_singleton_lockR>RBRR:R?(((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyt_get_singletonÒs    cCs ttƒƒS(N(RARG(((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyRÜscCstƒjƒdS(N(RGR(((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyRßscCstƒj|ƒS(sEReturn the specified number of cryptographically-strong random bytes.(RGR(tn((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pytget_random_bytesâs(t __revision__tsyst version_infotCrypto.Util.py21compatR+R;R RtmathRt Crypto.RandomRtCrypto.Random.FortunaRtobjectRRR&R:RAR<RFRRBRGRRRI(((s@/tmp/pip-build-LvEk9W/pycrypto/Crypto/Random/_UserFriendlyRNG.pyts* &      K