247b211
diff -up libgcrypt-1.6.1/cipher/dsa.c.tests libgcrypt-1.6.1/cipher/dsa.c
247b211
--- libgcrypt-1.6.1/cipher/dsa.c.tests	2014-02-28 13:39:01.727288335 +0100
247b211
+++ libgcrypt-1.6.1/cipher/dsa.c	2014-02-28 13:46:21.727458285 +0100
247b211
@@ -423,22 +423,29 @@ generate_fips186 (DSA_secret_key *sk, un
247b211
             initial_seed.seed = sexp_nth_data (initial_seed.sexp, 1,
16991a5
                                                     &initial_seed.seedlen);
16991a5
         }
b505458
-
16991a5
-      /* Fixme: Enable 186-3 after it has been approved and after fixing
16991a5
-         the generation function.  */
16991a5
-      /*   if (use_fips186_2) */
16991a5
-      (void)use_fips186_2;
b505458
-      ec = _gcry_generate_fips186_2_prime (nbits, qbits,
16991a5
+      if (use_fips186_2)
247b211
+        ec = _gcry_generate_fips186_2_prime (nbits, qbits,
247b211
                                            initial_seed.seed,
16991a5
                                            initial_seed.seedlen,
b505458
                                            &prime_q, &prime_p,
16991a5
                                            r_counter,
16991a5
                                            r_seed, r_seedlen);
16991a5
-      /*   else */
16991a5
-      /*     ec = _gcry_generate_fips186_3_prime (nbits, qbits, NULL, 0, */
16991a5
-      /*                                          &prime_q, &prime_p, */
16991a5
-      /*                                          r_counter, */
16991a5
-      /*                                          r_seed, r_seedlen, NULL); */
247b211
+      else if (!domain->p || !domain->q)
16991a5
+        ec = _gcry_generate_fips186_3_prime (nbits, qbits,
16991a5
+                                          initial_seed.seed,
16991a5
+                                          initial_seed.seedlen,
16991a5
+                                          &prime_q, &prime_p,
16991a5
+                                          r_counter,
16991a5
+                                          r_seed, r_seedlen, NULL);
247b211
+      else
247b211
+        {
247b211
+          /* Domain parameters p and q are given; use them.  */
247b211
+          prime_p = mpi_copy (domain->p);
247b211
+          prime_q = mpi_copy (domain->q);
247b211
+          gcry_assert (mpi_get_nbits (prime_p) == nbits);
247b211
+          gcry_assert (mpi_get_nbits (prime_q) == qbits);
247b211
+          ec = 0;
247b211
+        }
247b211
       sexp_release (initial_seed.sexp);
16991a5
       if (ec)
16991a5
         goto leave;
247b211
@@ -829,13 +829,12 @@ dsa_generate (const gcry_sexp_t genparms
247b211
       sexp_release (l1);
247b211
       sexp_release (domainsexp);
247b211
 
247b211
-      /* Check that all domain parameters are available.  */
247b211
-      if (!domain.p || !domain.q || !domain.g)
247b211
+      /* Check that p and q domain parameters are available.  */
247b211
+      if (!domain.p || !domain.q || (!domain.g && !(flags & PUBKEY_FLAG_USE_FIPS186)))
247b211
         {
247b211
           _gcry_mpi_release (domain.p);
247b211
           _gcry_mpi_release (domain.q);
247b211
           _gcry_mpi_release (domain.g);
247b211
-          sexp_release (deriveparms);
247b211
           return GPG_ERR_MISSING_VALUE;
247b211
         }
247b211
 
247b211
diff -up libgcrypt-1.6.1/cipher/primegen.c.tests libgcrypt-1.6.1/cipher/primegen.c
247b211
--- libgcrypt-1.6.1/cipher/primegen.c.tests	2014-01-29 10:48:38.000000000 +0100
247b211
+++ libgcrypt-1.6.1/cipher/primegen.c	2014-02-28 13:49:52.291325147 +0100
247b211
@@ -1649,7 +1649,7 @@ _gcry_generate_fips186_3_prime (unsigned
16991a5
   gpg_err_code_t ec;
16991a5
   unsigned char seed_help_buffer[256/8];  /* Used to hold a generated SEED. */
16991a5
   unsigned char *seed_plus;     /* Malloced buffer to hold SEED+x.  */
16991a5
-  unsigned char digest[256/8];  /* Helper buffer for SHA-1 digest.  */
16991a5
+  unsigned char digest[256/8];  /* Helper buffer for SHA-x digest.  */
16991a5
   gcry_mpi_t val_2 = NULL;      /* Helper for the prime test.  */
16991a5
   gcry_mpi_t tmpval = NULL;     /* Helper variable.  */
16991a5
   int hashalgo;                 /* The id of the Approved Hash Function.  */
247b211
@@ -1739,7 +1739,7 @@ _gcry_generate_fips186_3_prime (unsigned
16991a5
         }
247b211
       _gcry_mpi_release (prime_q); prime_q = NULL;
247b211
       ec = _gcry_mpi_scan (&prime_q, GCRYMPI_FMT_USG,
247b211
-                           value_u, sizeof value_u, NULL);
247b211
+                           value_u, qbits/8, NULL);
16991a5
       if (ec)
16991a5
         goto leave;
16991a5
       mpi_set_highbit (prime_q, qbits-1 );
247b211
@@ -1784,11 +1784,11 @@ _gcry_generate_fips186_3_prime (unsigned
16991a5
               if (seed_plus[i])
16991a5
                 break;
16991a5
             }
247b211
-          _gcry_md_hash_buffer (GCRY_MD_SHA1, digest, seed_plus, seedlen);
247b211
+          _gcry_md_hash_buffer (hashalgo, digest, seed_plus, seedlen);
b505458
 
247b211
           _gcry_mpi_release (tmpval); tmpval = NULL;
247b211
           ec = _gcry_mpi_scan (&tmpval, GCRYMPI_FMT_USG,
247b211
-                               digest, sizeof digest, NULL);
247b211
+                               digest, qbits/8, NULL);
474b273
           if (ec)
474b273
             goto leave;
474b273
           if (value_j == value_n)
247b211
@@ -1824,11 +1824,11 @@ _gcry_generate_fips186_3_prime (unsigned
16991a5
     }
16991a5
 
16991a5
   /* Step 12:  Save p, q, counter and seed.  */
16991a5
-  log_debug ("fips186-3 pbits p=%u q=%u counter=%d\n",
247b211
+  /* log_debug ("fips186-3 pbits p=%u q=%u counter=%d\n",
16991a5
              mpi_get_nbits (prime_p), mpi_get_nbits (prime_q), counter);
247b211
   log_printhex ("fips186-3 seed", seed, seedlen);
247b211
   log_printmpi ("fips186-3    p", prime_p);
247b211
-  log_printmpi ("fips186-3    q", prime_q);
247b211
+  log_printmpi ("fips186-3    q", prime_q); */
16991a5
   if (r_q)
16991a5
     {
16991a5
       *r_q = prime_q;
247b211
diff -up libgcrypt-1.6.1/cipher/rsa.c.tests libgcrypt-1.6.1/cipher/rsa.c
247b211
--- libgcrypt-1.6.1/cipher/rsa.c.tests	2014-01-29 08:49:49.000000000 +0100
247b211
+++ libgcrypt-1.6.1/cipher/rsa.c	2014-02-28 13:39:01.727288335 +0100
247b211
@@ -399,7 +399,7 @@ generate_x931 (RSA_secret_key *sk, unsig
16991a5
 
16991a5
   *swapped = 0;
16991a5
 
16991a5
-  if (e_value == 1)   /* Alias for a secure value. */
16991a5
+  if (e_value == 1 || e_value == 0)   /* Alias for a secure value. */
b505458
     e_value = 65537;
16991a5
 
16991a5
   /* Point 1 of section 4.1:  k = 1024 + 256s with S >= 0  */
247b211
diff -up libgcrypt-1.6.1/random/random-fips.c.tests libgcrypt-1.6.1/random/random-fips.c
247b211
--- libgcrypt-1.6.1/random/random-fips.c.tests	2014-01-29 10:48:38.000000000 +0100
247b211
+++ libgcrypt-1.6.1/random/random-fips.c	2014-02-28 13:39:01.727288335 +0100
247b211
@@ -692,6 +692,7 @@ get_random (void *buffer, size_t length,
16991a5
 
16991a5
   check_guards (rng_ctx);
16991a5
 
16991a5
+ reinitialize:
16991a5
   /* Initialize the cipher handle and thus setup the key if needed.  */
16991a5
   if (!rng_ctx->cipher_hd)
16991a5
     {
247b211
@@ -711,13 +712,11 @@ get_random (void *buffer, size_t length,
16991a5
   if (rng_ctx->key_init_pid != getpid ()
16991a5
       || rng_ctx->seed_init_pid != getpid ())
16991a5
     {
16991a5
-      /* We are in a child of us.  Because we have no way yet to do
16991a5
-         proper re-initialization (including self-checks etc), the
16991a5
-         only chance we have is to bail out.  Obviusly a fork/exec
16991a5
-         won't harm because the exec overwrites the old image. */
16991a5
-      fips_signal_error ("fork without proper re-initialization "
16991a5
-                         "detected in RNG");
16991a5
-      goto bailout;
16991a5
+      /* Just reinitialize the key & seed. */
16991a5
+      gcry_cipher_close(rng_ctx->cipher_hd);
16991a5
+      rng_ctx->cipher_hd = NULL;
16991a5
+      rng_ctx->is_seeded = 0;
16991a5
+      goto reinitialize;
16991a5
     }
16991a5
 
16991a5
   if (x931_aes_driver (buffer, length, rng_ctx))
247b211
diff -up libgcrypt-1.6.1/tests/keygen.c.tests libgcrypt-1.6.1/tests/keygen.c
247b211
--- libgcrypt-1.6.1/tests/keygen.c.tests	2014-02-28 13:39:01.728288358 +0100
247b211
+++ libgcrypt-1.6.1/tests/keygen.c	2014-02-28 13:42:18.288831563 +0100
247b211
@@ -215,11 +215,11 @@ check_rsa_keys (void)
16991a5
 
16991a5
 
16991a5
   if (verbose)
247b211
-    show ("creating 512 bit RSA key with e=257\n");
247b211
+    show ("creating 1024 bit RSA key with e=257\n");
b505458
   rc = gcry_sexp_new (&keyparm,
16991a5
                       "(genkey\n"
16991a5
                       " (rsa\n"
16991a5
-                      "  (nbits 3:512)\n"
16991a5
+                      "  (nbits 4:1024)\n"
16991a5
                       "  (rsa-use-e 3:257)\n"
16991a5
                       " ))", 0, 1);
16991a5
   if (rc)
247b211
@@ -233,11 +233,11 @@ check_rsa_keys (void)
16991a5
   gcry_sexp_release (key);
16991a5
 
16991a5
   if (verbose)
247b211
-    show ("creating 512 bit RSA key with default e\n");
247b211
+    show ("creating 1024 bit RSA key with default e\n");
b505458
   rc = gcry_sexp_new (&keyparm,
16991a5
                       "(genkey\n"
16991a5
                       " (rsa\n"
16991a5
-                      "  (nbits 3:512)\n"
16991a5
+                      "  (nbits 4:1024)\n"
16991a5
                       "  (rsa-use-e 1:0)\n"
16991a5
                       " ))", 0, 1);
16991a5
   if (rc)
247b211
@@ -307,12 +307,12 @@ check_dsa_keys (void)
247b211
     }
247b211
 
247b211
   if (verbose)
247b211
-    show ("creating 1536 bit DSA key\n");
247b211
+    show ("creating 2048 bit DSA key\n");
247b211
   rc = gcry_sexp_new (&keyparm,
247b211
                       "(genkey\n"
247b211
                       " (dsa\n"
247b211
-                      "  (nbits 4:1536)\n"
247b211
-                      "  (qbits 3:224)\n"
247b211
+                      "  (nbits 4:2048)\n"
247b211
+                      "  (qbits 3:256)\n"
247b211
                       " ))", 0, 1);
247b211
   if (rc)
247b211
     die ("error creating S-expression: %s\n", gpg_strerror (rc));