U +„Mbk,ć@s|dZddlmZddlmZddlmZdZdZddd„Z d d „Z dd l m Z ee dd …ƒZdd d„Zdd„Zdd„ZdS)zHFunctions to create and test prime numbers. :undocumented: __package__ é)ŚRandom)ŚInteger)Ś iter_rangeéNc Cs,t|tƒst|ƒ}|dkrtS| ”r*tStdƒ}t|dƒ}|dkrPt ”j}t|ƒ}d}| ”rv|dL}|d7}q\t|ƒD]Ø}d}|||fkrĘtj d|d|d}d|kr¾|dks†nt ‚q†t |||ƒ} | ||fkrąq~td|ƒD]2} t | d|ƒ} | |krq~| |krźtSqźtSq~tS)a:Perform a Miller-Rabin primality test on an integer. The test is specified in Section C.3.1 of `FIPS PUB 186-4`__. :Parameters: candidate : integer The number to test for primality. iterations : integer The maximum number of iterations to perform before declaring a candidate a probable prime. randfunc : callable An RNG function where bases are taken from. :Returns: ``Primality.COMPOSITE`` or ``Primality.PROBABLY_PRIME``. .. __: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf ©rééérNrr)Z min_inclusiveZ max_inclusiveŚrandfunc) Ś isinstancerŚPROBABLY_PRIMEŚis_evenŚ COMPOSITErŚnewŚreadrZ random_rangeŚAssertionErrorŚpow) Ś candidateŚ iterationsr ŚoneZ minus_oneŚmŚaŚiŚbaseŚzŚj©rś.alternateré’’’’r) r rr r Zis_perfect_squarerZ jacobi_symbolŚ size_in_bitsrŚsetZmultiply_accumulateZis_oddZget_bit) rr ŚDŚjsŚKŚrZU_iZV_iZU_tempZV_temprrrrŚ lucas_testwsf                  r()Ś sieve_baseédcsŠ|dkrt ”j}t|tƒs$t|ƒ}t|ƒtkr4tSzt|j tƒWnt k r\t YSXd}|  ”‰z"t t‡fdd„|ƒƒdd}Wntk r¤d}YnXt|||dt kr¼t St|ƒt krĢt StS)ašTest if a number is prime. A number is qualified as prime if it passes a certain number of Miller-Rabin tests (dependent on the size of the number, but such that probability of a false positive is less than 10^-30) and a single Lucas test. For instance, a 1024-bit candidate will need to pass 4 Miller-Rabin tests. :Parameters: candidate : integer The number to test for primality. randfunc : callable The routine to draw random bytes from to select Miller-Rabin bases. :Returns: ``PROBABLE_PRIME`` if the number if prime with very high probability. ``COMPOSITE`` if the number is a composite. For efficiency reasons, ``COMPOSITE`` is also returned for small primes. N) )éÜé)ié)i†é)ié )ilé)iäé)izr )i°é)i¤r)itrcs ˆ|dkS)Nrr©Śx©Zbit_sizerrŚ óz%test_probable_prime..rr©r )rrrr rŚintŚ _sieve_baser ŚmapZfail_if_divisible_byŚ ValueErrorrr"ŚlistŚfilterŚ IndexErrorrr()rr Z mr_rangesZ mr_iterationsrr5rŚtest_probable_primeŽs>    ’’’ ’’ r@cKs¦| dd”}| dd”}| ddd„”}|r p > 2^(exact_bits-1). .. __: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf Ś exact_bitsNr Ś prime_filtercSsdS)NTrr3rrrr6<r7z)generate_probable_prime..śUnknown parameters: zMissing exact_bits parameteré zPrime number is not big enough.©rAr r) Śpopr<ŚkeysrrrrrŚrandomr@)ŚkwargsrAr rBŚresultrrrrŚgenerate_probable_primes,"   ’’ rKcKs†| dd”}| dd”}|r,td| ”ƒ‚|dkr>t ”j}t}|tkr‚t|d|d}|dd}| ”|krtqBt ||d}qB|S) a›Generate a random, probable safe prime. Note this operation is much slower than generating a simple prime. :Keywords: exact_bits : integer The desired size in bits of the probable safe prime. randfunc : callable An RNG function where candidate primes are taken from. :Return: A probable safe prime in the range 2^exact_bits > p > 2^(exact_bits-1). rANr rCrrErr8) rFr<rGrrrrrKr"r@)rIrAr rJŚqrrrrŚgenerate_probable_safe_primeRs     rM)N)N)Ś__doc__ZCryptorZCrypto.Math.NumbersrZCrypto.Util.py3compatrrr rr(ZCrypto.Util.numberr)Z_sieve_base_larger#r:r@rKrMrrrrŚs    Ja  ::