]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Optimizations in DH parameter generation.
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Mon, 12 Dec 2011 01:18:59 +0000 (02:18 +0100)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Mon, 12 Dec 2011 01:56:01 +0000 (02:56 +0100)
The larger prime is find first and the big loop needs to
find a smaller prime, increasing performance.
The _gnutls_rnd() function is now inline and GNUTLS_RND_NONCE doesn't update random generator state.

20 files changed:
lib/auth/psk_passwd.c
lib/auth/rsa.c
lib/auth/rsa_export.c
lib/auth/srp_passwd.c
lib/crypto-api.c
lib/ext/session_ticket.c
lib/gnutls_cipher.c
lib/gnutls_handshake.c
lib/gnutls_mpi.c
lib/gnutls_pk.c
lib/nettle/gnettle.h
lib/nettle/mpi.c
lib/nettle/pk.c
lib/nettle/rnd.c
lib/opencdk/misc.c
lib/pkcs11_secret.c
lib/random.c
lib/random.h
lib/x509/pkcs12.c
lib/x509/privkey_pkcs8.c

index 7a02c6c907dc42927f67e7fed3fcf4ac96ad7e51..195454dac650755925ce8a0d3279969f30ef812e 100644 (file)
@@ -107,7 +107,7 @@ _randomize_psk (gnutls_datum_t * psk)
 
   psk->size = 16;
 
-  ret = gnutls_rnd (GNUTLS_RND_NONCE, (char *) psk->data, 16);
+  ret = _gnutls_rnd (GNUTLS_RND_NONCE, (char *) psk->data, 16);
   if (ret < 0)
     {
       gnutls_assert ();
index a9a88aa872be0bb8f65c944996befd9f5150f039..030ed35ddee7f4ad59c8e6d68da74dcc8196a607 100644 (file)
@@ -213,7 +213,7 @@ proc_rsa_client_kx (gnutls_session_t session, opaque * data,
 
       /* we do not need strong random numbers here.
        */
-      ret = gnutls_rnd (GNUTLS_RND_NONCE, session->key->key.data,
+      ret = _gnutls_rnd (GNUTLS_RND_NONCE, session->key->key.data,
                          session->key->key.size);
       if (ret < 0)
         {
@@ -268,7 +268,7 @@ _gnutls_gen_rsa_client_kx (gnutls_session_t session, gnutls_buffer_st* data)
       return GNUTLS_E_MEMORY_ERROR;
     }
 
-  ret = gnutls_rnd (GNUTLS_RND_RANDOM, session->key->key.data,
+  ret = _gnutls_rnd (GNUTLS_RND_RANDOM, session->key->key.data,
                      session->key->key.size);
   if (ret < 0)
     {
index 28ef8c67ca0288a1608652ec4d17d7f6b22f909e..959f72c672646d99525b1dc4f19c562beff936f2 100644 (file)
@@ -204,7 +204,7 @@ proc_rsa_export_client_kx (gnutls_session_t session, opaque * data,
 
       /* we do not need strong random numbers here.
        */
-      ret = gnutls_rnd (GNUTLS_RND_NONCE, session->key->key.data,
+      ret = _gnutls_rnd (GNUTLS_RND_NONCE, session->key->key.data,
                          session->key->key.size);
       if (ret < 0)
         {
index 7ced10179f2def0da188f5f4903859d6cacf3d2f..19972201c69267dfcb459456e0d6bf89dbb11dac 100644 (file)
@@ -404,7 +404,7 @@ _randomize_pwd_entry (SRP_PWD_ENTRY * entry)
       return GNUTLS_E_INTERNAL_ERROR;
     }
 
-  ret = gnutls_rnd (GNUTLS_RND_NONCE, &rnd, 1);
+  ret = _gnutls_rnd (GNUTLS_RND_NONCE, &rnd, 1);
   if (ret < 0)
     {
       gnutls_assert ();
@@ -421,7 +421,7 @@ _randomize_pwd_entry (SRP_PWD_ENTRY * entry)
       return GNUTLS_E_MEMORY_ERROR;
     }
 
-  ret = gnutls_rnd (GNUTLS_RND_RANDOM, entry->v.data, 20);
+  ret = _gnutls_rnd (GNUTLS_RND_RANDOM, entry->v.data, 20);
   if (ret < 0)
     {
       gnutls_assert ();
@@ -435,7 +435,7 @@ _randomize_pwd_entry (SRP_PWD_ENTRY * entry)
       return GNUTLS_E_MEMORY_ERROR;
     }
 
-  ret = gnutls_rnd (GNUTLS_RND_NONCE, entry->salt.data, entry->salt.size);
+  ret = _gnutls_rnd (GNUTLS_RND_NONCE, entry->salt.data, entry->salt.size);
   if (ret < 0)
     {
       gnutls_assert ();
index ce9d02bdecd6180c7ca77197d1de4dc0e626e367..260f942217cd6cd6594bb7e5c1d09e65f03a3793 100644 (file)
@@ -538,7 +538,7 @@ gnutls_key_generate (gnutls_datum_t * key, unsigned int key_size)
       return GNUTLS_E_MEMORY_ERROR;
     }
 
-  ret = gnutls_rnd (GNUTLS_RND_RANDOM, key->data, key->size);
+  ret = _gnutls_rnd (GNUTLS_RND_RANDOM, key->data, key->size);
   if (ret < 0)
     {
       gnutls_assert ();
index 51b21caf2b557ed73016262db1641aafb518582a..8da06361ce7c060ca5bdf3e076724046ffdc8ece 100644 (file)
@@ -555,7 +555,7 @@ gnutls_session_ticket_enable_server (gnutls_session_t session,
     }
   epriv.ptr = priv;
 
-  ret = gnutls_rnd (GNUTLS_RND_NONCE, priv->session_ticket_IV, IV_SIZE);
+  ret = _gnutls_rnd (GNUTLS_RND_NONCE, priv->session_ticket_IV, IV_SIZE);
   if (ret < 0)
     {
       gnutls_assert ();
index ed4ac8be8d42fea9fefb362e0dff3d58e2c32ba7..c15784342c3557e627f1a1b98e7151fa4cb8fbc1 100644 (file)
@@ -213,7 +213,7 @@ calc_enc_length (gnutls_session_t session, int data_size,
 
       break;
     case CIPHER_BLOCK:
-      ret = gnutls_rnd (GNUTLS_RND_NONCE, &rnd, 1);
+      ret = _gnutls_rnd (GNUTLS_RND_NONCE, &rnd, 1);
       if (ret < 0)
         return gnutls_assert_val(ret);
 
@@ -351,7 +351,7 @@ compressed_to_ciphertext (gnutls_session_t session,
         {
           /* copy the random IV.
            */
-          ret = gnutls_rnd (GNUTLS_RND_NONCE, data_ptr, blocksize);
+          ret = _gnutls_rnd (GNUTLS_RND_NONCE, data_ptr, blocksize);
           if (ret < 0)
             return gnutls_assert_val(ret);
 
index 153818e3248099232ff3b8f83cb937061d9d9ecb..16056487e804116f55f6e47784b1b6ae8943f5c8 100644 (file)
@@ -313,7 +313,7 @@ _gnutls_tls_create_random (opaque * dst)
   /* generate server random value */
   _gnutls_write_uint32 (tim, dst);
 
-  ret = gnutls_rnd (GNUTLS_RND_NONCE, &dst[4], GNUTLS_RANDOM_SIZE - 4);
+  ret = _gnutls_rnd (GNUTLS_RND_NONCE, &dst[4], GNUTLS_RANDOM_SIZE - 4);
   if (ret < 0)
     {
       gnutls_assert ();
@@ -2847,7 +2847,7 @@ _gnutls_generate_session_id (opaque * session_id, uint8_t * len)
 
   *len = TLS_MAX_SESSION_ID_SIZE;
 
-  ret = gnutls_rnd (GNUTLS_RND_NONCE, session_id, *len);
+  ret = _gnutls_rnd (GNUTLS_RND_NONCE, session_id, *len);
   if (ret < 0)
     {
       gnutls_assert ();
index b2cde7a3bec853596d5ccecacc1daf974571b2e1..681d63f4154a80eab6ac411ce1b319c637730e30 100644 (file)
@@ -66,7 +66,7 @@ _gnutls_mpi_randomize (bigint_t r, unsigned int bits,
     }
 
 
-  ret = gnutls_rnd (level, buf, size);
+  ret = _gnutls_rnd (level, buf, size);
   if (ret < 0)
     {
       gnutls_assert ();
index 59eb9478c564cf7ac5c8a25c6220e55b86670cd5..ef3bfc634e5659c84823544f6882e9be5709b402 100644 (file)
@@ -91,7 +91,7 @@ _gnutls_pkcs1_rsa_encrypt (gnutls_datum_t * ciphertext,
           return GNUTLS_E_INTERNAL_ERROR;
         }
 
-      ret = gnutls_rnd (GNUTLS_RND_RANDOM, ps, psize);
+      ret = _gnutls_rnd (GNUTLS_RND_RANDOM, ps, psize);
       if (ret < 0)
         {
           gnutls_assert ();
@@ -101,7 +101,7 @@ _gnutls_pkcs1_rsa_encrypt (gnutls_datum_t * ciphertext,
       for (i = 0; i < psize; i++)
         while (ps[i] == 0)
           {
-            ret = gnutls_rnd (GNUTLS_RND_RANDOM, &ps[i], 1);
+            ret = _gnutls_rnd (GNUTLS_RND_RANDOM, &ps[i], 1);
             if (ret < 0)
               {
                 gnutls_assert ();
index 768590c73d9cc29b8c5b4e8e2a80184fbbb3d0f9..f82531c55e03f731d440edfd2f6d5c6909e31bd7 100644 (file)
@@ -1,2 +1 @@
 #define PRIME_CHECK_PARAM 8
-
index a09549e2068051c84a7c1bbf91c35174dbe5e9dd..292af1d6c9f7a3cdd276d237e4ea719b4f54c28c 100644 (file)
@@ -1,6 +1,5 @@
 /*
- * Copyright (C) 2010 Free
- * Software Foundation, Inc.
+ * Copyright (C) 2010 Free Software Foundation, Inc.
  *
  * Author: Nikos Mavrogiannopoulos
  *
@@ -406,11 +405,12 @@ wrap_nettle_prime_check (bigint_t pp)
 
 /* generate a prime of the form p=2qw+1
  * The algorithm is simple but probably it has to be modified to gcrypt's
- * since it is really really slow. Nature did not want 2qw+1 to be prime.
+ * since it is slow. Nature did not want 2qw+1 to be prime.
  * The generator will be the generator of a subgroup of order q-1.
  *
  * Algorithm based on the algorithm in "A Computational Introduction to Number 
  * Theory and Algebra" by V. Shoup, sec 11.1 Finding a generator for Z^{*}_p
+ *
  */
 inline static int
 gen_group (mpz_t * prime, mpz_t * generator, unsigned int nbits)
@@ -439,6 +439,11 @@ gen_group (mpz_t * prime, mpz_t * generator, unsigned int nbits)
   if (nbits % 8 != 0)
     p_bytes++;
 
+  w_bits = nbits - q_bytes * 8;
+  w_bytes = w_bits / 8;
+  if (w_bits % 8 != 0)
+    w_bytes++;
+
   _gnutls_debug_log
     ("Generating group of prime of %u bits and format of 2wq+1. q_size=%u bits\n",
      nbits, q_bytes * 8);
@@ -459,50 +464,44 @@ gen_group (mpz_t * prime, mpz_t * generator, unsigned int nbits)
    */
   for (;;)
     {
-      ret = gnutls_rnd (GNUTLS_RND_RANDOM, buffer, q_bytes);
+      ret = _gnutls_rnd (GNUTLS_RND_RANDOM, buffer, w_bytes);
       if (ret < 0)
         {
           gnutls_assert ();
           goto fail;
         }
 
-      nettle_mpz_set_str_256_u (q, q_bytes, buffer);
+      nettle_mpz_set_str_256_u (w, w_bytes, buffer);
       /* always odd */
       mpz_setbit (q, 0);
 
-      ret = mpz_probab_prime_p (q, PRIME_CHECK_PARAM);
+      ret = mpz_probab_prime_p (w, PRIME_CHECK_PARAM);
       if (ret > 0)
         {
           break;
         }
     }
 
-  /* now generate w of size p_bytes - q_bytes */
-
-  w_bits = nbits - wrap_nettle_mpi_get_nbits (&q);
+  /* now generate q of size p_bytes - w_bytes */
 
   _gnutls_debug_log
-    ("Found prime q of %u bits. Will look for w of %u bits...\n",
-     wrap_nettle_mpi_get_nbits (&q), w_bits);
-
-  w_bytes = w_bits / 8;
-  if (w_bits % 8 != 0)
-    w_bytes++;
+    ("Found prime w of %u bits. Will look for q of %u bits...\n",
+     wrap_nettle_mpi_get_nbits (&w), q_bytes*8);
 
   for (;;)
     {
-      ret = gnutls_rnd (GNUTLS_RND_RANDOM, buffer, w_bytes);
+      ret = _gnutls_rnd (GNUTLS_RND_RANDOM, buffer, q_bytes);
       if (ret < 0)
         {
           gnutls_assert ();
           return ret;
         }
 
-      nettle_mpz_set_str_256_u (w, w_bytes, buffer);
+      nettle_mpz_set_str_256_u (q, q_bytes, buffer);
       /* always odd */
       mpz_setbit (w, 0);
 
-      ret = mpz_probab_prime_p (w, PRIME_CHECK_PARAM);
+      ret = mpz_probab_prime_p (q, PRIME_CHECK_PARAM);
       if (ret == 0)
         {
           continue;
@@ -520,8 +519,8 @@ gen_group (mpz_t * prime, mpz_t * generator, unsigned int nbits)
         }
     }
 
-  _gnutls_debug_log ("Found prime w of %u bits. Looking for generator...\n",
-                     wrap_nettle_mpi_get_nbits (&w));
+  _gnutls_debug_log ("Found prime q of %u bits. Looking for generator...\n",
+                     wrap_nettle_mpi_get_nbits (&q));
 
   /* finally a prime! Let calculate generator
    */
@@ -539,7 +538,7 @@ gen_group (mpz_t * prime, mpz_t * generator, unsigned int nbits)
 
   for (;;)
     {
-      ret = gnutls_rnd (GNUTLS_RND_RANDOM, buffer, r_bytes);
+      ret = _gnutls_rnd (GNUTLS_RND_NONCE, buffer, r_bytes);
       if (ret < 0)
         {
           gnutls_assert ();
index 5221aa66f089110419e2c337b739a6a26d976c9b..7e73d51abf63ec68fb17dc9fd552df93c150dcb1 100644 (file)
@@ -48,7 +48,7 @@ static inline int is_supported_curve(int curve);
 static void
 rnd_func (void *_ctx, unsigned length, uint8_t * data)
 {
-  gnutls_rnd (GNUTLS_RND_RANDOM, data, length);
+  _gnutls_rnd (GNUTLS_RND_RANDOM, data, length);
 }
 
 static void
index 6e7c69aca72a197a7d1edec08c6f147c386ed7a5..3f611f1db217a052d93ed71f48c5c1e871e16e3e 100644 (file)
@@ -447,20 +447,23 @@ wrap_nettle_rnd (void *_ctx, int level, void *data, size_t datasize)
 
   RND_LOCK;
 
-  ret = do_trivia_source (0);
-  if (ret < 0)
+  if (level != GNUTLS_RND_NONCE)
     {
-      RND_UNLOCK;
-      gnutls_assert ();
-      return ret;
-    }
+      ret = do_trivia_source (0);
+      if (ret < 0)
+        {
+          RND_UNLOCK;
+          gnutls_assert ();
+          return ret;
+        }
 
-  ret = do_device_source (0);
-  if (ret < 0)
-    {
-      RND_UNLOCK;
-      gnutls_assert ();
-      return ret;
+      ret = do_device_source (0);
+      if (ret < 0)
+        {
+          RND_UNLOCK;
+          gnutls_assert ();
+          return ret;
+        }
     }
 
   yarrow256_random (&yctx, datasize, data);
index 5b6c838bbb424e486c884658b382ccdb42f6c404..17e4eabc91c15256de8a705a465bcc912b47681f 100644 (file)
@@ -186,7 +186,7 @@ _cdk_tmpfile (void)
   FILE *fp;
   int fd, i;
 
-  gnutls_rnd (GNUTLS_RND_NONCE, rnd, DIM (rnd));
+  _gnutls_rnd (GNUTLS_RND_NONCE, rnd, DIM (rnd));
   for (i = 0; i < DIM (rnd) - 1; i++)
     {
       char c = letters[(unsigned char) rnd[i] % 26];
index ae408cca956910ce1f527b1ca65b36a3e45ddb87..1d74232ba6c0ede003ac1275a81f6913aaf6644f 100644 (file)
@@ -70,7 +70,7 @@ gnutls_pkcs11_copy_secret_key (const char *token_url, gnutls_datum_t * key,
     }
 
   /* generate a unique ID */
-  ret = gnutls_rnd (GNUTLS_RND_NONCE, id, sizeof (id));
+  ret = _gnutls_rnd (GNUTLS_RND_NONCE, id, sizeof (id));
   if (ret < 0)
     {
       gnutls_assert ();
index 5088e6ac47f0c41cb2ec372a141977146065b26a..bfbb27de3d0148b82c3c0f92d6bc548f60c877fd 100644 (file)
 #include <gnutls_errors.h>
 #include <random.h>
 
-static void *rnd_ctx;
+void *gnutls_rnd_ctx;
 
 int
 _gnutls_rnd_init (void)
 {
   if (_gnutls_rnd_ops.init != NULL)
     {
-      if (_gnutls_rnd_ops.init (&rnd_ctx) < 0)
+      if (_gnutls_rnd_ops.init (&gnutls_rnd_ctx) < 0)
         {
           gnutls_assert ();
           return GNUTLS_E_RANDOM_FAILED;
@@ -49,7 +49,7 @@ _gnutls_rnd_deinit (void)
 {
   if (_gnutls_rnd_ops.deinit != NULL)
     {
-      _gnutls_rnd_ops.deinit (rnd_ctx);
+      _gnutls_rnd_ops.deinit (gnutls_rnd_ctx);
     }
 
   return;
@@ -71,9 +71,5 @@ _gnutls_rnd_deinit (void)
 int
 gnutls_rnd (gnutls_rnd_level_t level, void *data, size_t len)
 {
-  if (len > 0)
-    {
-      return _gnutls_rnd_ops.rnd (rnd_ctx, level, data, len);
-    }
-  return 0;
+  return _gnutls_rnd(level, data, len);
 }
index 5f82c2fcec46db6c08ca30af9d0b388e90e8e1d8..921f8dc922cff2b90176ff744105677b6ffe05d6 100644 (file)
 #include <crypto-backend.h>
 
 extern int crypto_rnd_prio;
+extern void* gnutls_rnd_ctx;
 extern gnutls_crypto_rnd_st _gnutls_rnd_ops;
 
+inline static int
+_gnutls_rnd (gnutls_rnd_level_t level, void *data, size_t len)
+{
+  if (len > 0)
+    {
+      return _gnutls_rnd_ops.rnd (gnutls_rnd_ctx, level, data, len);
+    }
+  return 0;
+}
+
 void _gnutls_rnd_deinit (void);
 int _gnutls_rnd_init (void);
 
index 3e93d3c2c1783239b7b825d580d3505ced7b6b6e..4d9963ca1c1fcc4977c55c37aa5697dec01b55b0 100644 (file)
@@ -878,7 +878,7 @@ gnutls_pkcs12_generate_mac (gnutls_pkcs12_t pkcs12, const char *pass)
 
   /* Generate the salt.
    */
-  result = gnutls_rnd (GNUTLS_RND_NONCE, salt, sizeof (salt));
+  result = _gnutls_rnd (GNUTLS_RND_NONCE, salt, sizeof (salt));
   if (result < 0)
     {
       gnutls_assert ();
index b9d2eca5cb5036a39b53354425393687dd7b83f1..4421c739719fe516d274e1da503a97b16fbaaabb 100644 (file)
@@ -1901,7 +1901,7 @@ generate_key (schema_id schema,
   opaque rnd[2];
   int ret;
 
-  ret = gnutls_rnd (GNUTLS_RND_RANDOM, rnd, 2);
+  ret = _gnutls_rnd (GNUTLS_RND_RANDOM, rnd, 2);
   if (ret < 0)
     {
       gnutls_assert ();
@@ -1944,7 +1944,7 @@ generate_key (schema_id schema,
       return GNUTLS_E_INVALID_REQUEST;
     }
 
-  ret = gnutls_rnd (GNUTLS_RND_RANDOM, kdf_params->salt,
+  ret = _gnutls_rnd (GNUTLS_RND_RANDOM, kdf_params->salt,
                      kdf_params->salt_size);
   if (ret < 0)
     {
@@ -1986,7 +1986,7 @@ generate_key (schema_id schema,
 
       if (enc_params->iv_size)
         {
-          ret = gnutls_rnd (GNUTLS_RND_NONCE,
+          ret = _gnutls_rnd (GNUTLS_RND_NONCE,
                              enc_params->iv, enc_params->iv_size);
           if (ret < 0)
             {