Allow transient-key for ecdsa.
authorWerner Koch <wk@gnupg.org>
Thu, 10 Jun 2010 09:05:42 +0000 (09:05 +0000)
committerWerner Koch <wk@gnupg.org>
Thu, 10 Jun 2010 09:05:42 +0000 (09:05 +0000)
Fix a bug in a test.

cipher/ChangeLog
cipher/ecc.c
doc/gcrypt.texi
tests/ChangeLog
tests/t-mpi-bit.c

index 82ea799..1a960d3 100644 (file)
@@ -1,3 +1,9 @@
+2010-06-10  Jeff Johnson  <n3npq@mac.com>  (wk)
+
+       * ecc.c (ecc_generate_ext): Parse transient-key flag.
+       (generate_key): Add arg TRANSIENT_KEY and use it to set the random
+       level.
+
 2010-04-12  Brad Hards  <bradh@frogmouth.net>  (wk)
 
        Spelling fixes.
index f61f579..bcfab05 100644 (file)
@@ -1,5 +1,5 @@
 /* ecc.c  -  Elliptic Curve Cryptography
-   Copyright (C) 2007, 2008 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc.
 
    This file is part of Libgcrypt.
   
@@ -504,6 +504,7 @@ generate_curve (unsigned int nbits, const char *name,
  */
 static gpg_err_code_t
 generate_key (ECC_secret_key *sk, unsigned int nbits, const char *name,
+              int transient_key,
               gcry_mpi_t g_x, gcry_mpi_t g_y,
               gcry_mpi_t q_x, gcry_mpi_t q_y)
 {
@@ -512,6 +513,7 @@ generate_key (ECC_secret_key *sk, unsigned int nbits, const char *name,
   gcry_mpi_t d;
   mpi_point_t Q;
   mpi_ec_t ctx;
+  gcry_random_level_t random_level;
 
   err = generate_curve (nbits, name, &E, &nbits);
   if (err)
@@ -528,9 +530,11 @@ generate_key (ECC_secret_key *sk, unsigned int nbits, const char *name,
       log_mpidump ("ecc generation  Gz", E.G.z);
     }
 
+  random_level = transient_key ? GCRY_STRONG_RANDOM : GCRY_VERY_STRONG_RANDOM;
   if (DBG_CIPHER)
-    log_debug ("choosing a random x of size %u\n", nbits);
-  d = gen_k (E.n, GCRY_VERY_STRONG_RANDOM); 
+    log_debug ("choosing a random x of size %u%s\n", nbits,
+               transient_key? " (transient-key)":"");
+  d = gen_k (E.n, random_level); 
 
   /* Compute Q.  */
   point_init (&Q);
@@ -962,6 +966,7 @@ ecc_generate_ext (int algo, unsigned int nbits, unsigned long evalue,
   gcry_mpi_t g_x, g_y, q_x, q_y;
   char *curve_name = NULL;
   gcry_sexp_t l1;
+  int transient_key = 0;
 
   (void)algo;
   (void)evalue;
@@ -978,6 +983,14 @@ ecc_generate_ext (int algo, unsigned int nbits, unsigned long evalue,
           if (!curve_name)
             return GPG_ERR_INV_OBJ; /* No curve name or value too large. */
         }
+
+      /* Parse the optional transient-key flag.  */
+      l1 = gcry_sexp_find_token (genparms, "transient-key", 0);
+      if (l1)
+        {
+          transient_key = 1;
+          gcry_sexp_release (l1);
+        }
     }
 
   /* NBITS is required if no curve name has been given.  */
@@ -988,7 +1001,7 @@ ecc_generate_ext (int algo, unsigned int nbits, unsigned long evalue,
   g_y = mpi_new (0);
   q_x = mpi_new (0);
   q_y = mpi_new (0);
-  ec = generate_key (&sk, nbits, curve_name, g_x, g_y, q_x, q_y);
+  ec = generate_key (&sk, nbits, curve_name, transient_key, g_x, g_y, q_x, q_y);
   gcry_free (curve_name);
   if (ec)
     return ec;
index 2ac9f2c..883de4a 100644 (file)
@@ -2736,10 +2736,10 @@ are allowed.  When specifying Q all values of N in the range 512 to
 15680 are valid as long as they are multiples of 8.
 
 @item transient-key
-This is only meaningful for RSA and DSA keys.  This is a flag with no
-value.  If given the RSA or DSA key is created using a faster and a
-somewhat less secure random number generator.  This flag may be used
-for keys which are only used for a short time and do not require full
+This is only meaningful for RSA, DSA and ECDSA keys.  This is a flag
+with no value.  If given the key is created using a faster and a
+somewhat less secure random number generator.  This flag may be used for
+keys which are only used for a short time and do not require full
 cryptographic strength.
 
 @item domain
index a194a26..f6e5b69 100644 (file)
@@ -1,3 +1,7 @@
+2010-06-10  Werner Koch  <wk@g10code.com>
+
+       * t-mpi-bit.c (mpi2bitstr_nlz): Handle case for LENGTH==0.
+
 2010-04-12  Brad Hards  <bradh@frogmouth.net>  (wk)
 
        * basic.c (check_cbc_mac_cipher): Print more info.
index 208a127..aaad0f1 100644 (file)
@@ -108,13 +108,20 @@ mpi2bitstr_nlz (gcry_mpi_t a)
 {
   char *p, *buf;
   size_t length = gcry_mpi_get_nbits (a);
-  
-  buf = p = xmalloc (length + 1);
-  while (length-- > 1)
-    *p++ = gcry_mpi_test_bit (a, length) ? '1':'0';
-  *p++ = gcry_mpi_test_bit (a, 0) ? '1':'0';
-  *p = 0;
 
+  if (!length)
+    {
+      buf = p = xmalloc (2);
+      *p++ = '0';
+    }
+  else
+    {
+      buf = p = xmalloc (length + 1);
+      while (length-- > 1)
+        *p++ = gcry_mpi_test_bit (a, length) ? '1':'0';
+      *p++ = gcry_mpi_test_bit (a, 0) ? '1':'0';
+    }
+  *p = 0;
   return buf;
 }
 
@@ -190,7 +197,7 @@ one_bit_only (int highbit)
   gcry_mpi_release (a);
 }
 
-/* Check that the shifting actually works for an amount larger than
+/* Check that right shifting actually works for an amount larger than
    the number of bits per limb. */
 static void
 test_rshift (int pass)
@@ -249,7 +256,7 @@ test_rshift (int pass)
   gcry_mpi_release (a);
 }
 
-/* Check that the left shifting.  */
+/* Check that left shifting works correctly.  */
 static void
 test_lshift (int pass)
 {