diff --git a/rsa-keygen.c b/rsa-keygen.c index fc465f6ff5bc8bfaa990caa5b60989b32107e52d..236bc1214cd9d23c8882d8bfc6c645680d20ad43 100644 --- a/rsa-keygen.c +++ b/rsa-keygen.c @@ -35,6 +35,7 @@ #include "rsa.h" #include "bignum.h" +#include "nettle-internal.h" #ifndef DEBUG # define DEBUG 0 @@ -69,10 +70,11 @@ bignum_next_prime(mpz_t p, mpz_t n, int count, void *progress_ctx, nettle_progress_func progress) { mpz_t tmp; - unsigned long *moduli = NULL; + TMP_DECL(moduli, unsigned long, NUMBER_OF_PRIMES); + unsigned long difference; - int prime_limit = NUMBER_OF_PRIMES; - + unsigned prime_limit = NUMBER_OF_PRIMES; + /* First handle tiny numbers */ if (mpz_cmp_ui(n, 2) <= 0) { @@ -87,22 +89,23 @@ bignum_next_prime(mpz_t p, mpz_t n, int count, mpz_init(tmp); - if (prime_limit && (mpz_cmp_ui(p, primes[prime_limit]) <= 0) ) - /* Use unly 3, 5 and 7 */ + if (mpz_cmp_ui(p, primes[prime_limit-1]) <= 0) + /* Use only 3, 5 and 7 */ prime_limit = 3; - - if (prime_limit) - { - /* Compute residues modulo small odd primes */ - int i; - - moduli = alloca(prime_limit * sizeof(*moduli)); - for (i = 0; i < prime_limit; i++) - moduli[i] = mpz_fdiv_ui(p, primes[i]); - } - + + /* Compute residues modulo small odd primes */ + TMP_ALLOC(moduli, prime_limit); + { + unsigned i; + for (i = 0; i < prime_limit; i++) + moduli[i] = mpz_fdiv_ui(p, primes[i]); + } + for (difference = 0; ; difference += 2) { + int composite = 0; + unsigned i; + if (difference >= ULONG_MAX - 10) { /* Should not happen, at least not very often... */ mpz_add_ui(p, p, difference); @@ -110,20 +113,14 @@ bignum_next_prime(mpz_t p, mpz_t n, int count, } /* First check residues */ - if (prime_limit) + for (i = 0; i < prime_limit; i++) { - int composite = 0; - int i; - - for (i = 0; i < prime_limit; i++) - { - if (moduli[i] == 0) - composite = 1; - moduli[i] = (moduli[i] + 2) % primes[i]; - } - if (composite) - continue; + if (moduli[i] == 0) + composite = 1; + moduli[i] = (moduli[i] + 2) % primes[i]; } + if (composite) + continue; mpz_add_ui(p, p, difference); difference = 0;