From 153141e709a3a1548215fb63a1b840fc27d6e90e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se>
Date: Wed, 24 Mar 2010 15:40:21 +0100
Subject: [PATCH] (rsa_generate_keypair): Ensure that bit size of e is less
 than bit size of n, and check for the unlikely case p = q.

Rev: nettle/rsa-keygen.c:1.6
---
 rsa-keygen.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/rsa-keygen.c b/rsa-keygen.c
index 34192e14..f5f52647 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
-- 
GitLab