Blame SOURCES/libgcrypt-1.10.0-fips-kdf.patch

ff8b6a
From 3c04b692de1e7b45b764ff8d66bf84609b012e3a Mon Sep 17 00:00:00 2001
ff8b6a
From: Tobias Heider <tobias.heider@canonical.com>
ff8b6a
Date: Tue, 27 Sep 2022 13:31:05 +0900
ff8b6a
Subject: [PATCH] kdf:pkdf2: Check minimum allowed key size when running in
ff8b6a
 FIPS mode.
ff8b6a
ff8b6a
* cipher/kdf.c (_gcry_kdf_pkdf2): Add output length check.
ff8b6a
ff8b6a
--
ff8b6a
ff8b6a
GnuPG-bug-id: 6219
ff8b6a
---
ff8b6a
 cipher/kdf.c | 4 ++++
ff8b6a
 1 file changed, 4 insertions(+)
ff8b6a
ff8b6a
diff --git a/cipher/kdf.c b/cipher/kdf.c
ff8b6a
index 81523320..67c60df8 100644
ff8b6a
--- a/cipher/kdf.c
ff8b6a
+++ b/cipher/kdf.c
ff8b6a
@@ -160,6 +160,10 @@ _gcry_kdf_pkdf2 (const void *passphrase, size_t passphraselen,
ff8b6a
     return GPG_ERR_INV_VALUE;
ff8b6a
 #endif
ff8b6a
 
ff8b6a
+  /* Check minimum key size */
ff8b6a
+  if (fips_mode () && dklen < 14)
ff8b6a
+    return GPG_ERR_INV_VALUE;
ff8b6a
+
e35e9c
 
e35e9c
   /* Step 2 */
e35e9c
   l = ((dklen - 1)/ hlen) + 1;
ff8b6a
-- 
ff8b6a
2.37.3
ff8b6a
From e5a5e847b66eb6b80e60a2dffa347268f059aee3 Mon Sep 17 00:00:00 2001
ff8b6a
From: Jakub Jelen <jjelen@redhat.com>
ff8b6a
Date: Tue, 4 Oct 2022 12:44:54 +0200
ff8b6a
Subject: [PATCH] tests: Reproducer for short dklen in FIPS mode
ff8b6a
ff8b6a
* tests/t-kdf.c (check_pbkdf2): Add test vector with short dklen and
ff8b6a
  verify it fails in FIPS mode
ff8b6a
--
ff8b6a
ff8b6a
GnuPG-bug-id: 6219
ff8b6a
Signed-off-by: Jakub Jelen <jjelen@redhat.com>
ff8b6a
---
ff8b6a
 tests/t-kdf.c | 12 ++++++++++--
ff8b6a
 1 file changed, 10 insertions(+), 2 deletions(-)
ff8b6a
ff8b6a
diff --git a/tests/t-kdf.c b/tests/t-kdf.c
ff8b6a
index c0192d7b..716fb53e 100644
ff8b6a
--- a/tests/t-kdf.c
ff8b6a
+++ b/tests/t-kdf.c
ff8b6a
@@ -909,6 +909,14 @@ check_pbkdf2 (void)
ff8b6a
       "\x0c\x60\xc8\x0f\x96\x1f\x0e\x71\xf3\xa9"
ff8b6a
       "\xb5\x24\xaf\x60\x12\x06\x2f\xe0\x37\xa6"
ff8b6a
     },
ff8b6a
+    {
ff8b6a
+      "password", 8,
ff8b6a
+      "salt", 4,
ff8b6a
+      GCRY_MD_SHA1,
ff8b6a
+      1,
ff8b6a
+      10, /* too short dklen for FIPS */
ff8b6a
+      "\x0c\x60\xc8\x0f\x96\x1f\x0e\x71\xf3\xa9"
ff8b6a
+    },
ff8b6a
     {
ff8b6a
       "password", 8,
ff8b6a
       "salt", 4,
ff8b6a
@@ -1109,7 +1117,7 @@ check_pbkdf2 (void)
ff8b6a
                              GCRY_KDF_PBKDF2, tv[tvidx].hashalgo,
ff8b6a
                              tv[tvidx].salt, tv[tvidx].saltlen,
ff8b6a
                              tv[tvidx].c, tv[tvidx].dklen, outbuf);
ff8b6a
-      if (in_fips_mode && tvidx > 6)
ff8b6a
+      if (in_fips_mode && tvidx > 7)
ff8b6a
         {
ff8b6a
           if (!err)
ff8b6a
             fail ("pbkdf2 test %d unexpectedly passed in FIPS mode: %s\n",
ff8b6a
@@ -1118,7 +1126,7 @@ check_pbkdf2 (void)
ff8b6a
         }
ff8b6a
       if (err)
ff8b6a
         {
ff8b6a
-          if (in_fips_mode && tv[tvidx].plen < 14)
ff8b6a
+          if (in_fips_mode && (tv[tvidx].plen < 14 || tv[tvidx].dklen < 14))
ff8b6a
             {
ff8b6a
               if (verbose)
ff8b6a
                 fprintf (stderr,
ff8b6a
-- 
ff8b6a
2.37.3
ff8b6a
e35e9c
From f4a861f3e5ae82f278284061e4829c03edf9c3a7 Mon Sep 17 00:00:00 2001
e35e9c
From: Jakub Jelen <jjelen@redhat.com>
e35e9c
Date: Fri, 18 Nov 2022 09:49:50 +0900
e35e9c
Subject: [PATCH] pkdf2: Add checks for FIPS.
e35e9c
e35e9c
* cipher/kdf.c (_gcry_kdf_pkdf2): Require 8 chars passphrase for FIPS.
e35e9c
Set bounds for salt length and iteration count in FIPS mode.
e35e9c
e35e9c
--
e35e9c
e35e9c
GnuPG-bug-id: 6039
e35e9c
Signed-off-by: Jakub Jelen <jjelen@redhat.com>
e35e9c
---
e35e9c
 cipher/kdf.c | 12 ++++++++++++
e35e9c
 1 file changed, 12 insertions(+)
e35e9c
e35e9c
diff --git a/cipher/kdf.c b/cipher/kdf.c
e35e9c
index d22584da..823c744e 100644
e35e9c
--- a/cipher/kdf.c
e35e9c
+++ b/cipher/kdf.c
e35e9c
@@ -160,6 +160,18 @@ _gcry_kdf_pkdf2 (const void *passphrase, size_t passphraselen,
e35e9c
     return GPG_ERR_INV_VALUE;
e35e9c
 #endif
e35e9c
 
e35e9c
+  /* FIPS requires minimum passphrase length, see FIPS 140-3 IG D.N */
e35e9c
+  if (fips_mode () && passphraselen < 8)
e35e9c
+    return GPG_ERR_INV_VALUE;
e35e9c
+
e35e9c
+  /* FIPS requires minimum salt length of 128 b (SP 800-132 sec. 5.1, p.6) */
e35e9c
+  if (fips_mode () && saltlen < 16)
e35e9c
+    return GPG_ERR_INV_VALUE;
e35e9c
+
e35e9c
+  /* FIPS requires minimum iterations bound (SP 800-132 sec 5.2, p.6) */
e35e9c
+  if (fips_mode () && iterations < 1000)
e35e9c
+    return GPG_ERR_INV_VALUE;
e35e9c
+
e35e9c
   /* Check minimum key size */
e35e9c
   if (fips_mode () && dklen < 14)
e35e9c
     return GPG_ERR_INV_VALUE;
e35e9c
-- 
e35e9c
2.39.0
e35e9c
e35e9c
From f5fe94810f3099c9ccc2ca3a5891502922ab0576 Mon Sep 17 00:00:00 2001
e35e9c
From: Jakub Jelen <jjelen@redhat.com>
e35e9c
Date: Tue, 28 Feb 2023 12:53:28 +0100
e35e9c
Subject: [PATCH] kdf: Update tests in regards to the allowed parameters in
e35e9c
 FIPS mode.
e35e9c
e35e9c
* cipher/kdf.c (check_one): run selftests for more approved parameters
e35e9c
and check that wrong parameters correctly fail in FIPS mode.
e35e9c
e35e9c
--
e35e9c
e35e9c
Fixes-commit: 535a4d345872aa2cd2ab3a5f9c4411d0a0313328
e35e9c
GnuPG-bug-id: 5512
e35e9c
Signed-off-by: Jakub Jelen <jjelen@redhat.com>
e35e9c
---
e35e9c
 cipher/kdf.c | 22 +++++++++++++++-------
e35e9c
 1 file changed, 15 insertions(+), 7 deletions(-)
e35e9c
e35e9c
diff --git a/cipher/kdf.c b/cipher/kdf.c
e35e9c
index 823c744e..12beec56 100644
e35e9c
--- a/cipher/kdf.c
e35e9c
+++ b/cipher/kdf.c
e35e9c
@@ -2059,17 +2059,25 @@ check_one (int algo, int hash_algo,
e35e9c
 {
e35e9c
   unsigned char key[512]; /* hardcoded to avoid allocation */
e35e9c
   size_t keysize = expectlen;
e35e9c
-
e35e9c
-  /* Skip test with shoter passphrase in FIPS mode.  */
e35e9c
-  if (fips_mode () && passphraselen < 14)
e35e9c
-    return NULL;
e35e9c
+  int rv;
e35e9c
 
e35e9c
   if (keysize > sizeof(key))
e35e9c
     return "invalid tests data";
e35e9c
 
e35e9c
-  if (_gcry_kdf_derive (passphrase, passphraselen, algo,
e35e9c
-                        hash_algo, salt, saltlen, iterations,
e35e9c
-                        keysize, key))
e35e9c
+  rv = _gcry_kdf_derive (passphrase, passphraselen, algo,
e35e9c
+                         hash_algo, salt, saltlen, iterations,
e35e9c
+                         keysize, key);
e35e9c
+  /* In fips mode we have special requirements for the input and
e35e9c
+   * output parameters */
e35e9c
+  if (fips_mode ())
e35e9c
+    {
e35e9c
+      if (rv && (passphraselen < 8 || saltlen < 16 ||
e35e9c
+                 iterations < 1000 || expectlen < 14))
e35e9c
+        return NULL;
e35e9c
+      else if (rv)
e35e9c
+        return "gcry_kdf_derive unexpectedly failed in FIPS Mode";
e35e9c
+    }
e35e9c
+  else if (rv)
e35e9c
     return "gcry_kdf_derive failed";
e35e9c
 
e35e9c
   if (memcmp (key, expect, expectlen))
e35e9c
-- 
e35e9c
2.39.2
e35e9c