Blame SOURCES/libgcrypt-1.8.4-fips-keygen.patch

e09bf5
diff -up libgcrypt-1.8.4/cipher/dsa.c.fips-keygen libgcrypt-1.8.4/cipher/dsa.c
e09bf5
--- libgcrypt-1.8.4/cipher/dsa.c.fips-keygen	2017-11-23 19:16:58.000000000 +0100
e09bf5
+++ libgcrypt-1.8.4/cipher/dsa.c	2019-02-12 14:29:25.629513989 +0100
e09bf5
@@ -457,13 +457,22 @@ generate_fips186 (DSA_secret_key *sk, un
e09bf5
                                              &prime_q, &prime_p,
e09bf5
                                              r_counter,
e09bf5
                                              r_seed, r_seedlen);
e09bf5
-      else
e09bf5
+      else if (!domain->p || !domain->q)
e09bf5
         ec = _gcry_generate_fips186_3_prime (nbits, qbits,
e09bf5
                                              initial_seed.seed,
e09bf5
                                              initial_seed.seedlen,
e09bf5
                                              &prime_q, &prime_p,
e09bf5
                                              r_counter,
e09bf5
                                              r_seed, r_seedlen, NULL);
e09bf5
+      else
e09bf5
+        {
e09bf5
+          /* Domain parameters p and q are given; use them.  */
e09bf5
+          prime_p = mpi_copy (domain->p);
e09bf5
+          prime_q = mpi_copy (domain->q);
e09bf5
+          gcry_assert (mpi_get_nbits (prime_p) == nbits);
e09bf5
+          gcry_assert (mpi_get_nbits (prime_q) == qbits);
e09bf5
+          ec = 0;
e09bf5
+        }
e09bf5
       sexp_release (initial_seed.sexp);
e09bf5
       if (ec)
e09bf5
         goto leave;
e09bf5
@@ -855,13 +866,12 @@ dsa_generate (const gcry_sexp_t genparms
e09bf5
       sexp_release (l1);
e09bf5
       sexp_release (domainsexp);
e09bf5
 
e09bf5
-      /* Check that all domain parameters are available.  */
e09bf5
-      if (!domain.p || !domain.q || !domain.g)
e09bf5
+      /* Check that p and q domain parameters are available.  */
e09bf5
+      if (!domain.p || !domain.q || (!domain.g && !(flags & PUBKEY_FLAG_USE_FIPS186)))
e09bf5
         {
e09bf5
           _gcry_mpi_release (domain.p);
e09bf5
           _gcry_mpi_release (domain.q);
e09bf5
           _gcry_mpi_release (domain.g);
e09bf5
-          sexp_release (deriveparms);
e09bf5
           return GPG_ERR_MISSING_VALUE;
e09bf5
         }
e09bf5
 
e09bf5
diff -up libgcrypt-1.8.4/cipher/rsa.c.fips-keygen libgcrypt-1.8.4/cipher/rsa.c
e09bf5
--- libgcrypt-1.8.4/cipher/rsa.c.fips-keygen	2017-11-23 19:16:58.000000000 +0100
e09bf5
+++ libgcrypt-1.8.4/cipher/rsa.c	2019-02-12 14:29:25.630513971 +0100
e09bf5
@@ -389,7 +389,7 @@ generate_fips (RSA_secret_key *sk, unsig
e09bf5
 
e09bf5
   if (nbits < 1024 || (nbits & 0x1FF))
e09bf5
     return GPG_ERR_INV_VALUE;
e09bf5
-  if (_gcry_enforced_fips_mode() && nbits != 2048 && nbits != 3072)
e09bf5
+  if (fips_mode() && nbits < 2048)
e09bf5
       return GPG_ERR_INV_VALUE;
e09bf5
 
e09bf5
   /* The random quality depends on the transient_key flag.  */
e09bf5
@@ -696,7 +696,7 @@ generate_x931 (RSA_secret_key *sk, unsig
e09bf5
 
e09bf5
   *swapped = 0;
e09bf5
 
e09bf5
-  if (e_value == 1)   /* Alias for a secure value. */
e09bf5
+  if (e_value == 1 || e_value == 0)   /* Alias for a secure value. */
e09bf5
     e_value = 65537;
e09bf5
 
e09bf5
   /* Point 1 of section 4.1:  k = 1024 + 256s with S >= 0  */