B Ðñ¢dñã@sædZddlZddlZddgZeeedœdd„Zeedœd d „Zeeed œd d „Z eedœdd„Z eedœdd„Z eeedœdd„Z e dkrâedƒddlZx>edƒD]2Ze ¡\ZZerºPeddkr¤er¤edeƒq¤WedƒdS)zNumerical functions related to primes. Implementation based on the book Algorithm Design by Michael T. Goodrich and Roberto Tamassia, 2002. éNÚgetprimeÚare_relatively_prime)ÚpÚqÚreturncCs x|dkr|||}}qW|S)zPReturns the greatest common divisor of p and q >>> gcd(48, 180) 12 r©)rrrrú0/tmp/pip-target-jj3kjtpb/lib/python/rsa/prime.pyÚgcds r )ÚnumberrcCs4tj |¡}|dkrdS|dkr$dS|dkr0dSdS)aÒReturns minimum number of rounds for Miller-Rabing primality testing, based on number bitsize. According to NIST FIPS 186-4, Appendix C, Table C.3, minimum number of rounds of M-R testing, using an error probability of 2 ** (-100), for different p, q bitsizes are: * p, q bitsize: 512; rounds: 7 * p, q bitsize: 1024; rounds: 4 * p, q bitsize: 1536; rounds: 3 See: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf iéiéiéé )ÚrsaÚcommonZbit_size)r ZbitsizerrrÚget_primality_testing_rounds's r)ÚnÚkrcCsÂ|dkr dS|d}d}x|d@s4|d7}|dL}qWx†t|ƒD]z}tj |d¡d}t|||ƒ}|dks@||dkrzq@x>t|dƒD]*}t|d|ƒ}|dkr¤dS||dkrˆPqˆWdSq@WdS)a.Calculates whether n is composite (which is always correct) or prime (which theoretically is incorrect with error probability 4**-k), by applying Miller-Rabin primality testing. For reference and implementation example, see: https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test :param n: Integer to be tested for primality. :type n: int :param k: Number of rounds (witnesses) of Miller-Rabin testing. :type k: int :return: False if the number is composite, True if it's probably prime. :rtype: bool éFérr T)ÚrangerÚrandnumÚrandintÚpow)rrÚdÚrÚ_ÚaÚxrrrÚmiller_rabin_primality_testingAs(     rcCs2|dkr|dkS|d@sdSt|ƒ}t||dƒS)z™Returns True if the number is prime, and False otherwise. >>> is_prime(2) True >>> is_prime(42) False >>> is_prime(41) True r>rr ér rF)rr)r rrrrÚis_primevs r!)ÚnbitsrcCs.|dks t‚xtj |¡}t|ƒr|SqWdS)aReturns a prime number that can be stored in 'nbits' bits. >>> p = getprime(128) >>> is_prime(p-1) False >>> is_prime(p) True >>> is_prime(p+1) False >>> from rsa import common >>> common.bit_size(p) == 128 True r N)ÚAssertionErrorrrZread_random_odd_intr!)r"Úintegerrrrrs   )rÚbrcCst||ƒ}|dkS)z«Returns True if a and b are relatively prime, and False if they are not. >>> are_relatively_prime(2, 3) True >>> are_relatively_prime(2, 4) False r)r )rr%rrrrr¬s Ú__main__z'Running doctests 1000x or until failureièédz%i timesz Doctests done)Ú__doc__Z rsa.commonrZ rsa.randnumÚ__all__Úintr rÚboolrr!rrÚ__name__ÚprintÚdoctestrÚcountÚtestmodZfailuresÚtestsrrrrÚs& 5