Blame SOURCES/libgcrypt-1.10.0-fips-disable-pkcs1.5.patch

7682e8
From c7709f7b23848abf4ba65cb99cb2a9e9c7ebdefc Mon Sep 17 00:00:00 2001
7682e8
From: Jakub Jelen <jjelen@redhat.com>
7682e8
Date: Fri, 1 Apr 2022 18:29:08 +0200
7682e8
Subject: [PATCH 1/3] Do not allow PKCS #1.5 padding for encryption in FIPS
7682e8
7682e8
* cipher/pubkey-util.c (_gcry_pk_util_data_to_mpi): Block PKCS #1.5
7682e8
  padding for encryption in FIPS mode
7682e8
* cipher/rsa.c (rsa_decrypt): Block PKCS #1.5 decryption in FIPS mode
7682e8
--
7682e8
7682e8
GnuPG-bug-id: 5918
7682e8
Signed-off-by: Jakub Jelen <jjelen@redhat.com>
7682e8
---
7682e8
 cipher/pubkey-util.c | 5 ++++-
7682e8
 cipher/rsa.c         | 5 +++++
7682e8
 2 files changed, 9 insertions(+), 1 deletion(-)
7682e8
7682e8
diff --git a/cipher/pubkey-util.c b/cipher/pubkey-util.c
7682e8
index 68defea6..4953caf3 100644
7682e8
--- a/cipher/pubkey-util.c
7682e8
+++ b/cipher/pubkey-util.c
7682e8
@@ -957,7 +957,10 @@ _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi,
7682e8
       void *random_override = NULL;
7682e8
       size_t random_override_len = 0;
7682e8
 
7682e8
-      if ( !(value=sexp_nth_data (lvalue, 1, &valuelen)) || !valuelen )
7682e8
+      /* The RSA PKCS#1.5 encryption is no longer supported by FIPS */
7682e8
+      if (fips_mode ())
7682e8
+        rc = GPG_ERR_INV_FLAG;
7682e8
+      else if ( !(value=sexp_nth_data (lvalue, 1, &valuelen)) || !valuelen )
7682e8
         rc = GPG_ERR_INV_OBJ;
7682e8
       else
7682e8
         {
7682e8
diff --git a/cipher/rsa.c b/cipher/rsa.c
7682e8
index 771413b3..c6319b67 100644
7682e8
--- a/cipher/rsa.c
7682e8
+++ b/cipher/rsa.c
7682e8
@@ -1391,6 +1391,11 @@ rsa_decrypt (gcry_sexp_t *r_plain, gcry_sexp_t s_data, gcry_sexp_t keyparms)
7682e8
       rc = GPG_ERR_INV_DATA;
7682e8
       goto leave;
7682e8
     }
7682e8
+  if (fips_mode () && (ctx.encoding == PUBKEY_ENC_PKCS1))
7682e8
+    {
7682e8
+      rc = GPG_ERR_INV_FLAG;
7682e8
+      goto leave;
7682e8
+    }
7682e8
 
7682e8
   /* Extract the key.  */
7682e8
   rc = sexp_extract_param (keyparms, NULL, "nedp?q?u?",
7682e8
-- 
7682e8
2.34.1
7682e8
7682e8
7682e8
From 299e2f93415984919181e0ee651719bbf83bdd2f Mon Sep 17 00:00:00 2001
7682e8
From: Jakub Jelen <jjelen@redhat.com>
7682e8
Date: Fri, 1 Apr 2022 18:31:05 +0200
7682e8
Subject: [PATCH 2/3] tests: Replace custom bit with more generic flags
7682e8
7682e8
* tests/basic.c (global): New flag FLAG_SPECIAL
7682e8
  (check_pubkey_crypt): Change to use bitfield flags
7682e8
7682e8
--
7682e8
7682e8
GnuPG-bug-id: 5918
7682e8
Signed-off-by: Jakub Jelen <jjelen@redhat.com>
7682e8
---
7682e8
 tests/basic.c | 19 ++++++++++---------
7682e8
 1 file changed, 10 insertions(+), 9 deletions(-)
7682e8
7682e8
diff --git a/tests/basic.c b/tests/basic.c
7682e8
index a0ad33eb..1c6cb40b 100644
7682e8
--- a/tests/basic.c
7682e8
+++ b/tests/basic.c
7682e8
@@ -55,11 +55,12 @@ typedef struct test_spec_pubkey
7682e8
 }
7682e8
 test_spec_pubkey_t;
7682e8
 
7682e8
-#define FLAG_CRYPT  (1 << 0)
7682e8
-#define FLAG_SIGN   (1 << 1)
7682e8
-#define FLAG_GRIP   (1 << 2)
7682e8
-#define FLAG_NOFIPS (1 << 3)
7682e8
-#define FLAG_CFB8   (1 << 4)
7682e8
+#define FLAG_CRYPT   (1 << 0)
7682e8
+#define FLAG_SIGN    (1 << 1)
7682e8
+#define FLAG_GRIP    (1 << 2)
7682e8
+#define FLAG_NOFIPS  (1 << 3)
7682e8
+#define FLAG_CFB8    (1 << 4)
7682e8
+#define FLAG_SPECIAL (1 << 5)
7682e8
 
7682e8
 static int in_fips_mode;
7682e8
 
7682e8
@@ -15558,7 +15559,7 @@ check_pubkey_crypt (int n, gcry_sexp_t skey, gcry_sexp_t pkey, int algo,
7682e8
     int unpadded;
7682e8
     int encrypt_expected_rc;
7682e8
     int decrypt_expected_rc;
7682e8
-    int special;
7682e8
+    int flags;
7682e8
   } datas[] =
7682e8
     {
7682e8
       {	GCRY_PK_RSA,
7682e8
@@ -15642,14 +15643,14 @@ check_pubkey_crypt (int n, gcry_sexp_t skey, gcry_sexp_t pkey, int algo,
7682e8
 	"(flags oaep)",
7682e8
 	1,
7682e8
 	0,
7682e8
-	GPG_ERR_ENCODING_PROBLEM, 1 },
7682e8
+	GPG_ERR_ENCODING_PROBLEM, FLAG_SPECIAL },
7682e8
       { GCRY_PK_RSA,
7682e8
         "(data\n (flags oaep)\n"
7682e8
 	" (value #11223344556677889900AA#))\n",
7682e8
 	"(flags pkcs1)",
7682e8
 	1,
7682e8
 	0,
7682e8
-	GPG_ERR_ENCODING_PROBLEM, 1 },
7682e8
+	GPG_ERR_ENCODING_PROBLEM, FLAG_SPECIAL },
7682e8
       {	0,
7682e8
         "(data\n (flags pss)\n"
7682e8
 	" (value #11223344556677889900AA#))\n",
7682e8
@@ -15725,7 +15726,7 @@ check_pubkey_crypt (int n, gcry_sexp_t skey, gcry_sexp_t pkey, int algo,
7682e8
 	      ciph = list;
7682e8
 	    }
7682e8
 	  rc = gcry_pk_decrypt (&plain, ciph, skey);
7682e8
-          if (!rc && datas[dataidx].special == 1)
7682e8
+          if (!rc && (datas[dataidx].flags & FLAG_SPECIAL))
7682e8
             {
7682e8
               /* It may happen that OAEP formatted data which is
7682e8
                  decrypted as pkcs#1 data returns a valid pkcs#1
7682e8
-- 
7682e8
2.34.1
7682e8
7682e8
7682e8
From f736f3c70182d9c948f9105eb769c47c5578df35 Mon Sep 17 00:00:00 2001
7682e8
From: Jakub Jelen <jjelen@redhat.com>
7682e8
Date: Fri, 1 Apr 2022 18:34:42 +0200
7682e8
Subject: [PATCH 3/3] tests: Expect the RSA PKCS #1.5 encryption to fail in
7682e8
 FIPS mode
7682e8
7682e8
* tests/basic.c (check_pubkey_crypt): Expect RSA PKCS #1.5 encryption to
7682e8
  fail in FIPS mode. Expect failure when wrong padding is selected
7682e8
* tests/pkcs1v2.c (check_v15crypt): Expect RSA PKCS #1.5 encryption to
7682e8
  fail in FIPS mode
7682e8
--
7682e8
7682e8
GnuPG-bug-id: 5918
7682e8
Signed-off-by: Jakub Jelen <jjelen@redhat.com>
7682e8
---
7682e8
 tests/basic.c   | 11 +++++++----
7682e8
 tests/pkcs1v2.c | 14 +++++++++++++-
7682e8
 2 files changed, 20 insertions(+), 5 deletions(-)
7682e8
7682e8
diff --git a/tests/basic.c b/tests/basic.c
7682e8
index 1c6cb40b..85764591 100644
7682e8
--- a/tests/basic.c
7682e8
+++ b/tests/basic.c
7682e8
@@ -15568,14 +15568,16 @@ check_pubkey_crypt (int n, gcry_sexp_t skey, gcry_sexp_t pkey, int algo,
7682e8
 	NULL,
7682e8
 	0,
7682e8
 	0,
7682e8
-	0 },
7682e8
+	0,
7682e8
+	FLAG_NOFIPS },
7682e8
       {	GCRY_PK_RSA,
7682e8
         "(data\n (flags pkcs1)\n"
7682e8
 	" (value #11223344556677889900AA#))\n",
7682e8
 	"(flags pkcs1)",
7682e8
 	1,
7682e8
 	0,
7682e8
-	0 },
7682e8
+	0,
7682e8
+	FLAG_NOFIPS },
7682e8
       { GCRY_PK_RSA,
7682e8
         "(data\n (flags oaep)\n"
7682e8
 	" (value #11223344556677889900AA#))\n",
7682e8
@@ -15677,7 +15679,8 @@ check_pubkey_crypt (int n, gcry_sexp_t skey, gcry_sexp_t pkey, int algo,
7682e8
 	die ("converting data failed: %s\n", gpg_strerror (rc));
7682e8
 
7682e8
       rc = gcry_pk_encrypt (&ciph, data, pkey);
7682e8
-      if (in_fips_mode && (flags & FLAG_NOFIPS))
7682e8
+      if (in_fips_mode && ((flags & FLAG_NOFIPS) ||
7682e8
+                           (datas[dataidx].flags & FLAG_NOFIPS)))
7682e8
         {
7682e8
           if (!rc)
7682e8
             fail ("gcry_pk_encrypt did not fail as expected in FIPS mode\n");
7682e8
@@ -15726,7 +15729,7 @@ check_pubkey_crypt (int n, gcry_sexp_t skey, gcry_sexp_t pkey, int algo,
7682e8
 	      ciph = list;
7682e8
 	    }
7682e8
 	  rc = gcry_pk_decrypt (&plain, ciph, skey);
7682e8
-          if (!rc && (datas[dataidx].flags & FLAG_SPECIAL))
7682e8
+          if ((!rc || in_fips_mode) && (datas[dataidx].flags & FLAG_SPECIAL))
7682e8
             {
7682e8
               /* It may happen that OAEP formatted data which is
7682e8
                  decrypted as pkcs#1 data returns a valid pkcs#1
7682e8
diff --git a/tests/pkcs1v2.c b/tests/pkcs1v2.c
7682e8
index f26e779b..6c7f3d81 100644
7682e8
--- a/tests/pkcs1v2.c
7682e8
+++ b/tests/pkcs1v2.c
7682e8
@@ -454,7 +454,19 @@ check_v15crypt (void)
7682e8
           gcry_free (seed);
7682e8
 
7682e8
           err = gcry_pk_encrypt (&ciph, plain, pub_key);
7682e8
-          if (err)
7682e8
+          if (in_fips_mode)
7682e8
+            {
7682e8
+              if (!err)
7682e8
+                {
7682e8
+                  fail ("gcry_pk_encrypt should have failed in FIPS mode:\n");
7682e8
+                }
7682e8
+              gcry_sexp_release (plain);
7682e8
+              plain = NULL;
7682e8
+              gcry_sexp_release (ciph);
7682e8
+              ciph = NULL;
7682e8
+              continue;
7682e8
+            }
7682e8
+          else if (err)
7682e8
             {
7682e8
               show_sexp ("plain:\n", ciph);
7682e8
               fail ("gcry_pk_encrypt failed: %s\n", gpg_strerror (err));
7682e8
-- 
7682e8
2.34.1
7682e8