]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Added check to prevent generating a DH pubkey of 1.
authorNikos Mavrogiannopoulos <nmav@redhat.com>
Thu, 28 Nov 2013 14:06:28 +0000 (15:06 +0100)
committerNikos Mavrogiannopoulos <nmav@redhat.com>
Thu, 28 Nov 2013 14:06:33 +0000 (15:06 +0100)
lib/nettle/pk.c

index c9591496a024c8c6c92d3c77b4902647a2575442..def8d6c67a5023dada6d4acd6da17722f0768e67 100644 (file)
@@ -871,6 +871,7 @@ wrap_nettle_pk_generate_keys(gnutls_pk_algorithm_t algo,
                        struct dsa_public_key pub;
                        mpz_t r;
                        mpz_t x, y;
+                       int max_tries;
                        unsigned have_q = 0;
                        
                        if (algo != params->algo)
@@ -888,18 +889,31 @@ wrap_nettle_pk_generate_keys(gnutls_pk_algorithm_t algo,
                        mpz_init(x);
                        mpz_init(y);
                        
-                       if (have_q) {
-                               mpz_set(r, pub.q);
-                               mpz_sub_ui(r, r, 2);
-                               nettle_mpz_random(x, NULL, rnd_func, r);
-                               mpz_add_ui(x, x, 1);
-                       } else {
-                               if (level == 0)
-                                       level = mpz_sizeinbase(pub.p, 2);
-                               nettle_mpz_random_size(x, NULL, rnd_func, level);
-                       }
+                       max_tries = 3;
+                       do {
+                               if (have_q) {
+                                       mpz_set(r, pub.q);
+                                       mpz_sub_ui(r, r, 2);
+                                       nettle_mpz_random(x, NULL, rnd_func, r);
+                                       mpz_add_ui(x, x, 1);
+                               } else {
+                                       if (level == 0)
+                                               level = mpz_sizeinbase(pub.p, 2);
+                                       nettle_mpz_random_size(x, NULL, rnd_func, level);
+
+                                       if (level >= mpz_sizeinbase(pub.p, 2))
+                                               mpz_mod(x, x, pub.p);
+                               }
+
+                               mpz_powm(y, pub.g, x, pub.p);
 
-                       mpz_powm(y, pub.g, x, pub.p);
+                               max_tries--;
+                               if (max_tries <= 0) {
+                                       gnutls_assert();
+                                       ret = GNUTLS_E_RANDOM_FAILED;
+                                       goto dsa_fail;
+                               }
+                       } while(mpz_cmp_ui(y, 1) == 0);
                        
                        params->params[DSA_Y] = _gnutls_mpi_alloc_like(&pub.p);
                        if (params->params[DSA_Y] == NULL) {
@@ -909,6 +923,7 @@ wrap_nettle_pk_generate_keys(gnutls_pk_algorithm_t algo,
 
                        params->params[DSA_X] = _gnutls_mpi_alloc_like(&pub.p);
                        if (params->params[DSA_X] == NULL) {
+                               _gnutls_mpi_release(&params->params[DSA_Y]);
                                ret = GNUTLS_E_MEMORY_ERROR;
                                goto dsa_fail;
                        }