diff --git a/rsa-keygen.c b/rsa-keygen.c index 34192e1404f11fcb2b848d7d5178dff661330e7d..f5f52647d9e67df446350d46410688fbd422d9d4 100644 --- a/rsa-keygen.c +++ b/rsa-keygen.c @@ -79,7 +79,7 @@ rsa_generate_keypair(struct rsa_public_key *pub, if (e_size) { /* We should choose e randomly. Is the size reasonable? */ - if ((e_size < 16) || (e_size > n_size) ) + if ((e_size < 16) || (e_size >= n_size) ) return 0; } else @@ -87,14 +87,18 @@ rsa_generate_keypair(struct rsa_public_key *pub, /* We have a fixed e. Check that it makes sense */ /* It must be odd */ - if (!mpz_tstbit(pub->e, 0)) + if (mpz_even_p(pub->e, 0)) return 0; /* And 3 or larger */ if (mpz_cmp_ui(pub->e, 3) < 0) return 0; + + /* And size less than n */ + if (mpz_sizeinbase(pub->e, 2) >= n_size) + return 0; } - + if (n_size < RSA_MINIMUM_N_BITS) return 0; @@ -132,6 +136,11 @@ rsa_generate_keypair(struct rsa_public_key *pub, bignum_random_prime(key->q, n_size/2, random_ctx, random, progress_ctx, progress); + + /* Very unlikely. */ + if (mpz_cmp (key->q, key->p) == 0) + continue; + mpz_sub_ui(q1, key->q, 1); /* If e was given, we must chose q such that q-1 has no factors in