Hello community,

here is the log from the commit of package libgcrypt for openSUSE:Factory 
checked in at 2019-06-07 18:00:42
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libgcrypt (Old)
 and      /work/SRC/openSUSE:Factory/.libgcrypt.new.4811 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libgcrypt"

Fri Jun  7 18:00:42 2019 rev:76 rq:698628 version:1.8.4

Changes:
--------
--- /work/SRC/openSUSE:Factory/libgcrypt/libgcrypt.changes      2018-12-03 
10:04:00.724060437 +0100
+++ /work/SRC/openSUSE:Factory/.libgcrypt.new.4811/libgcrypt.changes    
2019-06-07 18:00:48.569810476 +0200
@@ -1,0 +2,61 @@
+Fri Apr 26 06:47:45 UTC 2019 - Jason Sikes <[email protected]>
+
+- do not try to open /dev/urandom if getrandom() works
+  * Added libgcrypt-1.8.4-getrandom.patch
+- Drop libgcrypt-init-at-elf-load-fips.patch obsoleted
+  by libgcrypt-1.8.3-fips-ctor.patch
+
+-------------------------------------------------------------------
+Tue Apr 23 12:38:40 UTC 2019 - Jason Sikes <[email protected]>
+
+- Restored libgcrypt-binary_integrity_in_non-FIPS.patch sans section that
+  was partially causing bsc#1131183.
+- Fixed race condition in multi-threaded applications by allowing a FSM state
+  transition to the current state. This means some tests are run twice.
+  * Added libgcrypt-1.8.4-allow_FSM_same_state.patch
+- Fixed an issue in malloc/free wrappers so that memory created by the malloc()
+  wrappers will be destroyed using the free() wrappers.
+  * Added libgcrypt-1.8.4-use_xfree.patch
+
+-------------------------------------------------------------------
+Fri Apr  5 21:56:00 UTC 2019 - Jason Sikes <[email protected]>
+
+- removed libgcrypt-binary_integrity_in_non-FIPS.patch since it was breaking
+  libotr. bsc#1131183
+
+-------------------------------------------------------------------
+Tue Mar 26 16:30:23 UTC 2019 - Vítězslav Čížek <[email protected]>
+
+- libgcrypt-1.8.3-fips-ctor.patch changed the way the fips selftests
+  are invoked as well as the state transition, adjust the code so
+  a missing checksum file is not an issue in non-FIPS mode (bsc#1097073)
+  * update libgcrypt-binary_integrity_in_non-FIPS.patch
+
+-------------------------------------------------------------------
+Tue Mar 26 16:25:18 UTC 2019 - Vítězslav Čížek <[email protected]>
+
+- Enforce the minimal RSA keygen size in fips mode (bsc#1125740)
+  * add libgcrypt-fips_rsa_no_enforced_mode.patch
+
+-------------------------------------------------------------------
+Fri Mar 22 14:13:05 UTC 2019 - Vítězslav Čížek <[email protected]>
+
+- Don't run full self-tests from constructor (bsc#1097073)
+  * Don't call global_init() from the constructor, _gcry_global_constructor()
+    from libgcrypt-1.8.3-fips-ctor.patch takes care of the binary
+    integrity check instead.
+  * Only the binary checksum will be verified, the remaining
+    self-tests will be run upon the library initialization
+- Add libgcrypt-fips_ignore_FIPS_MODULE_PATH.patch
+- Drop libgcrypt-init-at-elf-load-fips.patch and
+  libgcrypt-fips_run_selftest_at_constructor.patch obsoleted
+  by libgcrypt-1.8.3-fips-ctor.patch
+
+-------------------------------------------------------------------
+Thu Mar  7 10:53:40 UTC 2019 - Pedro Monreal Gonzalez 
<[email protected]>
+
+- Skip all the self-tests except for binary integrity when called
+  from the constructor (bsc#1097073)
+  * Added libgcrypt-1.8.3-fips-ctor.patch from Fedora
+
+-------------------------------------------------------------------

Old:
----
  libgcrypt-init-at-elf-load-fips.patch

New:
----
  libgcrypt-1.8.3-fips-ctor.patch
  libgcrypt-1.8.4-allow_FSM_same_state.patch
  libgcrypt-1.8.4-getrandom.patch
  libgcrypt-1.8.4-use_xfree.patch
  libgcrypt-fips_ignore_FIPS_MODULE_PATH.patch
  libgcrypt-fips_rsa_no_enforced_mode.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libgcrypt.spec ++++++
--- /var/tmp/diff_new_pack.Bo267F/_old  2019-06-07 18:00:49.385810186 +0200
+++ /var/tmp/diff_new_pack.Bo267F/_new  2019-06-07 18:00:49.389810185 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package libgcrypt
 #
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -48,7 +48,6 @@
 #PATCH-FIX-SUSE: bnc#724841, fix a random device opening routine
 Patch14:        libgcrypt-1.6.1-fips-cfgrandom.patch
 Patch28:        libgcrypt-fix-rng.patch
-Patch29:        libgcrypt-init-at-elf-load-fips.patch
 #PATCH-FIX-SUSE add FIPS CAVS test app for DRBG
 Patch30:        drbg_test.patch
 #PATCH-FIX-SUSE run FIPS self-test from constructor
@@ -57,7 +56,13 @@
 Patch35:        libgcrypt-fipsdrv-enable-algo-for-dsa-sign.patch
 #PATCH-FIX-UPSTREAM bsc#1064455 fipsdrv patch to enable --algo for dsa-verify
 Patch36:        libgcrypt-fipsdrv-enable-algo-for-dsa-verify.patch
-Patch37:        libgcrypt-binary_integrity_in_non-FIPS.patch
+Patch39:        libgcrypt-1.8.3-fips-ctor.patch
+Patch40:        libgcrypt-fips_ignore_FIPS_MODULE_PATH.patch
+Patch41:        libgcrypt-binary_integrity_in_non-FIPS.patch
+Patch42:        libgcrypt-fips_rsa_no_enforced_mode.patch
+Patch43:        libgcrypt-1.8.4-use_xfree.patch
+Patch44:        libgcrypt-1.8.4-allow_FSM_same_state.patch
+Patch45:        libgcrypt-1.8.4-getrandom.patch
 BuildRequires:  automake >= 1.14
 BuildRequires:  fipscheck
 BuildRequires:  libgpg-error-devel >= 1.25
@@ -137,20 +142,7 @@
 
 %prep
 %setup -q
-%patch3 -p1
-%patch4 -p1
-%patch5 -p1
-%patch7 -p1
-%patch12 -p1
-%patch28 -p1
-%patch29 -p1
-%patch30 -p1
-%patch32 -p1
-%patch13 -p1
-%patch14 -p1
-%patch35 -p1
-%patch36 -p1
-%patch37 -p1
+%autopatch -p1
 
 %build
 echo building with build_hmac256 set to %{build_hmac256}

++++++ libgcrypt-1.8.3-fips-ctor.patch ++++++
Index: libgcrypt-1.8.4/cipher/md.c
===================================================================
--- libgcrypt-1.8.4.orig/cipher/md.c    2019-03-25 16:58:52.844354398 +0100
+++ libgcrypt-1.8.4/cipher/md.c 2019-03-25 16:58:53.512358321 +0100
@@ -411,11 +411,8 @@ md_enable (gcry_md_hd_t hd, int algorith
 
   if (!err && algorithm == GCRY_MD_MD5 && fips_mode ())
     {
-      _gcry_inactivate_fips_mode ("MD5 used");
       if (_gcry_enforced_fips_mode () )
         {
-          /* We should never get to here because we do not register
-             MD5 in enforced fips mode. But better throw an error.  */
           err = GPG_ERR_DIGEST_ALGO;
         }
     }
Index: libgcrypt-1.8.4/src/fips.c
===================================================================
--- libgcrypt-1.8.4.orig/src/fips.c     2019-03-25 16:58:52.844354398 +0100
+++ libgcrypt-1.8.4/src/fips.c  2019-03-25 16:58:53.516358344 +0100
@@ -91,6 +91,31 @@ static void fips_new_state (enum module_
 
 
 
+/* Initialize the FSM lock - this function may only
+   be called once and is intended to be run from the library
+   constructor  */
+void
+_gcry_initialize_fsm_lock (void)
+{
+  gpg_error_t err;
+  /* Intitialize the lock to protect the FSM.  */
+  err = gpgrt_lock_init (&fsm_lock);
+  if (err)
+    {
+      /* If that fails we can't do anything but abort the
+         process. We need to use log_info so that the FSM won't
+         get involved.  */
+      log_info ("FATAL: failed to create the FSM lock in libgcrypt: %s\n",
+                gpg_strerror (err));
+#ifdef HAVE_SYSLOG
+      syslog (LOG_USER|LOG_ERR, "Libgcrypt error: "
+              "creating FSM lock failed: %s - abort",
+              gpg_strerror (err));
+#endif /*HAVE_SYSLOG*/
+      abort ();
+    }
+}
+
 /* Check whether the OS is in FIPS mode and record that in a module
    local variable.  If FORCE is passed as true, fips mode will be
    enabled anyway. Note: This function is not thread-safe and should
@@ -100,7 +125,6 @@ void
 _gcry_initialize_fips_mode (int force)
 {
   static int done;
-  gpg_error_t err;
 
   /* Make sure we are not accidentally called twice.  */
   if (done)
@@ -190,24 +214,6 @@ _gcry_initialize_fips_mode (int force)
       /* Yes, we are in FIPS mode.  */
       FILE *fp;
 
-      /* Intitialize the lock to protect the FSM.  */
-      err = gpgrt_lock_init (&fsm_lock);
-      if (err)
-        {
-          /* If that fails we can't do anything but abort the
-             process. We need to use log_info so that the FSM won't
-             get involved.  */
-          log_info ("FATAL: failed to create the FSM lock in libgcrypt: %s\n",
-                    gpg_strerror (err));
-#ifdef HAVE_SYSLOG
-          syslog (LOG_USER|LOG_ERR, "Libgcrypt error: "
-                  "creating FSM lock failed: %s - abort",
-                  gpg_strerror (err));
-#endif /*HAVE_SYSLOG*/
-          abort ();
-        }
-
-
       /* If the FIPS force files exists, is readable and has a number
          != 0 on its first line, we enable the enforced fips mode.  */
       fp = fopen (FIPS_FORCE_FILE, "r");
@@ -370,16 +376,20 @@ _gcry_fips_is_operational (void)
 {
   int result;
 
-  if (!fips_mode ())
+  lock_fsm ();
+  if (current_state == STATE_POWERON && !fips_mode ())
+    /* If we are at this point in POWERON state it means the FIPS
+       module installation was not completed. (/etc/system-fips
+      is not present.) */
     result = 1;
   else
     {
-      lock_fsm ();
-      if (current_state == STATE_INIT)
+      if (current_state == STATE_INIT || current_state == STATE_SELFTEST)
         {
-          /* If we are still in the INIT state, we need to run the
-             selftests so that the FSM can eventually get into
-             operational state.  Given that we would need a 2-phase
+          /* If we are still in the INIT (or SELFTEST) state,
+             we need to run (or finish) the selftests so
+             that the FSM can eventually get into operational
+             state. Given that we would need a 2-phase
              initialization of libgcrypt, but that has traditionally
              not been enforced, we use this on demand self-test
              checking.  Note that Proper applications would do the
@@ -395,9 +405,11 @@ _gcry_fips_is_operational (void)
           lock_fsm ();
         }
 
-      result = (current_state == STATE_OPERATIONAL);
-      unlock_fsm ();
+      result = (current_state == STATE_OPERATIONAL) || !fips_mode ();
+      /* We always run the selftests but ignore the result
+         in non-FIPS mode. */
     }
+  unlock_fsm ();
   return result;
 }
 
@@ -722,9 +734,25 @@ _gcry_fips_run_selftests (int extended)
 {
   enum module_states result = STATE_ERROR;
   gcry_err_code_t ec = GPG_ERR_SELFTEST_FAILED;
+  int in_poweron;
 
-  if (fips_mode ())
-    fips_new_state (STATE_SELFTEST);
+  lock_fsm ();
+  in_poweron = (current_state == STATE_POWERON);
+  unlock_fsm ();
+
+  fips_new_state (STATE_SELFTEST);
+
+  /* We first check the integrity of the binary.
+     If run from the constructor we are in POWERON state,
+     we return and finish the remaining selftests before
+     real use of the library. It will be in the POWERON
+     state meanwhile.  */
+  if (in_poweron)
+    if (check_binary_integrity ())
+      goto leave;
+
+  if (in_poweron)
+    return 0;
 
   if (run_cipher_selftests (extended))
     goto leave;
@@ -743,18 +771,12 @@ _gcry_fips_run_selftests (int extended)
   if (run_pubkey_selftests (extended))
     goto leave;
 
-  /* Now check the integrity of the binary.  We do this this after
-     having checked the HMAC code.  */
-  if (check_binary_integrity ())
-    goto leave;
-
   /* All selftests passed.  */
   result = STATE_OPERATIONAL;
   ec = 0;
 
  leave:
-  if (fips_mode ())
-    fips_new_state (result);
+  fips_new_state (result);
 
   return ec;
 }
@@ -810,6 +832,7 @@ fips_new_state (enum module_states new_s
     {
     case STATE_POWERON:
       if (new_state == STATE_INIT
+          || new_state == STATE_SELFTEST
           || new_state == STATE_ERROR
           || new_state == STATE_FATALERROR)
         ok = 1;
@@ -824,6 +847,8 @@ fips_new_state (enum module_states new_s
 
     case STATE_SELFTEST:
       if (new_state == STATE_OPERATIONAL
+          || new_state == STATE_INIT
+          || new_state == STATE_SELFTEST
           || new_state == STATE_ERROR
           || new_state == STATE_FATALERROR)
         ok = 1;
Index: libgcrypt-1.8.4/src/global.c
===================================================================
--- libgcrypt-1.8.4.orig/src/global.c   2019-03-25 16:58:52.844354398 +0100
+++ libgcrypt-1.8.4/src/global.c        2019-03-25 16:58:53.516358344 +0100
@@ -145,6 +145,29 @@ global_init (void)
 }
 
 
+#ifndef FIPS_MODULE_PATH
+#define FIPS_MODULE_PATH "/etc/system-fips"
+#endif
+
+void __attribute__ ((constructor)) _gcry_global_constructor (void)
+{
+  int rv;
+
+  /* We always need the FSM lock to be functional. */
+  _gcry_initialize_fsm_lock ();
+
+  rv = access (FIPS_MODULE_PATH, F_OK);
+  if (rv < 0 && errno != ENOENT)
+    rv = 0;
+
+  if (!rv)
+    {
+      /* We run the integrity check at this point. The remaining
+         selftests are run before use of the library by application. */
+      _gcry_fips_run_selftests (0);
+    }
+}
+
 /* This function is called by the macro fips_is_operational and makes
    sure that the minimal initialization has been done.  This is far
    from a perfect solution and hides problems with an improper
@@ -675,8 +698,7 @@ _gcry_vcontrol (enum gcry_ctl_cmds cmd,
 
     case GCRYCTL_FIPS_MODE_P:
       if (fips_mode ()
-          && !_gcry_is_fips_mode_inactive ()
-          && !no_secure_memory)
+          && !_gcry_is_fips_mode_inactive ())
        rc = GPG_ERR_GENERAL; /* Used as TRUE value */
       break;
 
@@ -753,9 +775,9 @@ _gcry_vcontrol (enum gcry_ctl_cmds cmd,
       break;
 
     case GCRYCTL_SET_ENFORCED_FIPS_FLAG:
-      if (!any_init_done)
+      if (fips_mode ())
         {
-          /* Not yet initialized at all.  Set the enforced fips mode flag */
+          /* We are in FIPS mode, we can set the enforced fips mode flag. */
           _gcry_set_preferred_rng_type (0);
           _gcry_set_enforced_fips_mode ();
         }
Index: libgcrypt-1.8.4/src/g10lib.h
===================================================================
--- libgcrypt-1.8.4.orig/src/g10lib.h   2019-03-25 16:58:52.844354398 +0100
+++ libgcrypt-1.8.4/src/g10lib.h        2019-03-25 16:58:53.516358344 +0100
@@ -422,6 +422,8 @@ gpg_err_code_t _gcry_sexp_vextract_param
 
 /*-- fips.c --*/
 
+void _gcry_initialize_fsm_lock (void);
+
 void _gcry_initialize_fips_mode (int force);
 
 int _gcry_fips_mode (void);
++++++ libgcrypt-1.8.4-allow_FSM_same_state.patch ++++++
Index: libgcrypt-1.8.4/src/fips.c
===================================================================
--- libgcrypt-1.8.4.orig/src/fips.c
+++ libgcrypt-1.8.4/src/fips.c
@@ -930,6 +930,10 @@ fips_new_state (enum module_states new_s
 
     }
 
+  /* Allow a transition to the current state */
+  if (current_state == new_state)
+    ok = 1;
+
   if (ok)
     {
       current_state = new_state;
++++++ libgcrypt-1.8.4-getrandom.patch ++++++
Index: libgcrypt-1.8.4/random/random-csprng.c
===================================================================
--- libgcrypt-1.8.4.orig/random/random-csprng.c
+++ libgcrypt-1.8.4/random/random-csprng.c
@@ -55,6 +55,10 @@
 #ifdef __MINGW32__
 #include <process.h>
 #endif
+#if defined(__linux__) && defined(HAVE_SYSCALL)
+# include <sys/syscall.h>
+# include <linux/random.h>
+#endif
 #include "g10lib.h"
 #include "random.h"
 #include "rand-internal.h"
@@ -1116,6 +1120,22 @@ getfnc_gather_random (void))(void (*)(co
              enum random_origins, size_t, int);
 
 #if USE_RNDLINUX
+#if defined(__linux__) && defined(HAVE_SYSCALL) && defined(__NR_getrandom)
+  long ret;
+  char buffer[1];
+
+  _gcry_pre_syscall ();
+  ret = syscall (__NR_getrandom,
+                 (void*)buffer, (size_t)1, (unsigned int)GRND_NONBLOCK);
+  _gcry_post_syscall ();
+  if (ret != -1 || errno != ENOSYS)
+    {
+      fnc = _gcry_rndlinux_gather_random;
+      return fnc;
+    }
+  else
+          /* The syscall is not supported - fallback to /dev/urandom. */
+#endif
   if ( !access (NAME_OF_DEV_RANDOM, R_OK)
        && !access (NAME_OF_DEV_URANDOM, R_OK))
     {
Index: libgcrypt-1.8.4/random/random.c
===================================================================
--- libgcrypt-1.8.4.orig/random/random.c
+++ libgcrypt-1.8.4/random/random.c
@@ -110,8 +110,8 @@ _gcry_random_read_conf (void)
   unsigned int result = 0;
 
   fp = fopen (fname, "r");
-  if (!fp)
-    return result;
+  if (!fp) /* We make only_urandom the default. */
+    return RANDOM_CONF_ONLY_URANDOM;
 
   for (;;)
     {
Index: libgcrypt-1.8.4/random/rndlinux.c
===================================================================
--- libgcrypt-1.8.4.orig/random/rndlinux.c
+++ libgcrypt-1.8.4/random/rndlinux.c
@@ -34,6 +34,7 @@
 #include <fcntl.h>
 #if defined(__linux__) && defined(HAVE_SYSCALL)
 # include <sys/syscall.h>
+# include <linux/random.h>
 #endif
 
 #include "types.h"
@@ -248,6 +249,18 @@ _gcry_rndlinux_gather_random (void (*add
     {
       if (fd_urandom == -1)
         {
+#if defined(__linux__) && defined(HAVE_SYSCALL) && defined(__NR_getrandom)
+          long ret;
+
+          _gcry_pre_syscall ();
+          ret = syscall (__NR_getrandom,
+                         (void*)buffer, (size_t)1, (unsigned 
int)GRND_NONBLOCK);
+          _gcry_post_syscall ();
+          if (ret > -1 || errno == EAGAIN || errno == EINTR)
+            fd_urandom = -2;
+         else
+            /* The syscall is not supported - fallback to /dev/urandom. */
+#endif
           fd_urandom = open_device (NAME_OF_DEV_URANDOM, (ever_opened & 2), 1);
           ever_opened |= 2;
         }
@@ -275,6 +288,7 @@ _gcry_rndlinux_gather_random (void (*add
        * syscall and not a new device and thus we are not able to use
        * select(2) to have a timeout. */
 #if defined(__linux__) && defined(HAVE_SYSCALL) && defined(__NR_getrandom)
+      if (fd == -2)
         {
           long ret;
           size_t nbytes;
@@ -290,9 +304,7 @@ _gcry_rndlinux_gather_random (void (*add
               _gcry_post_syscall ();
             }
           while (ret == -1 && errno == EINTR);
-          if (ret == -1 && errno == ENOSYS)
-            ; /* The syscall is not supported - fallback to pulling from fd.  
*/
-          else
+          if (1)
             { /* The syscall is supported.  Some sanity checks.  */
               if (ret == -1)
                 log_fatal ("unexpected error from getrandom: %s\n",
++++++ libgcrypt-1.8.4-use_xfree.patch ++++++
Index: libgcrypt-1.8.4/src/hmac256.c
===================================================================
--- libgcrypt-1.8.4.orig/src/hmac256.c
+++ libgcrypt-1.8.4/src/hmac256.c
@@ -69,6 +69,7 @@ typedef uint32_t u32;
 
 #ifdef STANDALONE
 #define xtrymalloc(a) malloc((a))
+#define xfree(a) free((a))
 #define gpg_err_set_errno(a) (errno = (a))
 #else
 #include "g10lib.h"
@@ -341,7 +342,7 @@ _gcry_hmac256_new (const void *key, size
           tmphd = _gcry_hmac256_new (NULL, 0);
           if (!tmphd)
             {
-              free (hd);
+              xfree (hd);
               return NULL;
             }
           _gcry_hmac256_update (tmphd, key, keylen);
@@ -373,7 +374,7 @@ _gcry_hmac256_release (hmac256_context_t
       /* Note: We need to take care not to modify errno.  */
       if (ctx->use_hmac)
         my_wipememory (ctx->opad, 64);
-      free (ctx);
+      xfree (ctx);
     }
 }
 
@@ -489,7 +490,7 @@ _gcry_hmac256_file (void *result, size_t
   while ( (nread = fread (buffer, 1, buffer_size, fp)))
     _gcry_hmac256_update (hd, buffer, nread);
 
-  free (buffer);
+  xfree (buffer);
 
   if (ferror (fp))
     {

++++++ libgcrypt-binary_integrity_in_non-FIPS.patch ++++++
--- /var/tmp/diff_new_pack.Bo267F/_old  2019-06-07 18:00:49.481810152 +0200
+++ /var/tmp/diff_new_pack.Bo267F/_new  2019-06-07 18:00:49.481810152 +0200
@@ -1,15 +1,82 @@
-Index: libgcrypt-1.8.4/src/fips.c
+Index: libgcrypt-1.8.2/src/fips.c
 ===================================================================
---- libgcrypt-1.8.4.orig/src/fips.c    2018-11-26 17:30:28.040692529 +0100
-+++ libgcrypt-1.8.4/src/fips.c 2018-11-26 17:59:04.130934181 +0100
-@@ -663,7 +663,11 @@ check_binary_integrity (void)
+--- libgcrypt-1.8.2.orig/src/fips.c    2019-03-27 13:15:14.190987624 +0100
++++ libgcrypt-1.8.2/src/fips.c 2019-03-27 13:18:07.047986428 +0100
+@@ -115,6 +115,50 @@ _gcry_initialize_fsm_lock (void)
+       abort ();
+     }
+ }
++
++/* Checks whether the library will enter the FIPS mode.
++   Uses the same logic as _gcry_initialize_fips_mode */
++static int
++will_enter_fips (void)
++{
++  /* for convenience, so that a process can run fips-enabled, but
++     not necessarily all of them, enable FIPS mode via environment
++     variable LIBGCRYPT_FORCE_FIPS_MODE.       */
++  if (getenv("LIBGCRYPT_FORCE_FIPS_MODE") != NULL)
++      return 1;
++
++  /* For testing the system it is useful to override the system
++     provided detection of the FIPS mode and force FIPS mode using a
++     file.  The filename is hardwired so that there won't be any
++     confusion on whether /etc/gcrypt/ or /usr/local/etc/gcrypt/ is
++     actually used.  The file itself may be empty.  */
++  if ( !access (FIPS_FORCE_FILE, F_OK) )
++    return 1;
++
++  /* Checking based on /proc file properties.  */
++  {
++    static const char procfname[] = "/proc/sys/crypto/fips_enabled";
++    FILE *fp;
++
++    fp = fopen (procfname, "r");
++    if (fp)
++      {
++        char line[256];
++
++        if (fgets (line, sizeof line, fp) && atoi (line))
++          {
++            /* System is in fips mode.  */
++            fclose (fp);
++            return 1;
++          }
++        fclose (fp);
++      }
++  }
++
++  return 0;
++}
++
++
+ 
+ /* Check whether the OS is in FIPS mode and record that in a module
+    local variable.  If FORCE is passed as true, fips mode will be
+@@ -631,10 +675,10 @@ get_library_path(const char *libname, co
+ 
+ /* Run an integrity check on the binary.  Returns 0 on success.  */
+ static int
+-check_binary_integrity (void)
++check_binary_integrity ()
+ {
+ #ifdef ENABLE_HMAC_BINARY_CHECK
+-  gpg_error_t err;
++  gpg_error_t err = 0;
+   char libpath[4096];
+   unsigned char digest[32];
+   int dlen;
+@@ -675,7 +719,14 @@ check_binary_integrity (void)
                /* Open the file.  */
                fp = fopen (fname, "r");
                if (!fp)
 -                err = gpg_error_from_syserror ();
 +                {
-+                  /* Missing checksum is a problem only in FIPS mode */
-+                  if (fips_mode() || errno != ENOENT)
++                  /* Missing checksum is a problem only in FIPS mode.
++                     As the integrity check was moved to the POWERON state,
++                     we no longer can rely on fips_mode(). Because at the 
point,
++                     the library is not yet initialized. */
++                  if (will_enter_fips() || errno != ENOENT)
 +                    err = gpg_error_from_syserror ();
 +                }
                else

++++++ libgcrypt-fips_ignore_FIPS_MODULE_PATH.patch ++++++
Index: libgcrypt-1.8.4/src/global.c
===================================================================
--- libgcrypt-1.8.4.orig/src/global.c   2019-03-25 16:58:45.880313488 +0100
+++ libgcrypt-1.8.4/src/global.c        2019-03-25 16:58:45.896313582 +0100
@@ -144,11 +144,6 @@ global_init (void)
   BUG ();
 }
 
-
-#ifndef FIPS_MODULE_PATH
-#define FIPS_MODULE_PATH "/etc/system-fips"
-#endif
-
 void __attribute__ ((constructor)) _gcry_global_constructor (void)
 {
   int rv;
@@ -156,11 +151,6 @@ void __attribute__ ((constructor)) _gcry
   /* We always need the FSM lock to be functional. */
   _gcry_initialize_fsm_lock ();
 
-  rv = access (FIPS_MODULE_PATH, F_OK);
-  if (rv < 0 && errno != ENOENT)
-    rv = 0;
-
-  if (!rv)
     {
       /* We run the integrity check at this point. The remaining
          selftests are run before use of the library by application. */
++++++ libgcrypt-fips_rsa_no_enforced_mode.patch ++++++
Index: libgcrypt-1.8.2/cipher/rsa.c
===================================================================
--- libgcrypt-1.8.2.orig/cipher/rsa.c   2017-11-23 19:16:58.000000000 +0100
+++ libgcrypt-1.8.2/cipher/rsa.c        2019-03-26 11:14:33.737388126 +0100
@@ -389,7 +389,7 @@ generate_fips (RSA_secret_key *sk, unsig
 
   if (nbits < 1024 || (nbits & 0x1FF))
     return GPG_ERR_INV_VALUE;
-  if (_gcry_enforced_fips_mode() && nbits != 2048 && nbits != 3072)
+  if (fips_mode() && nbits != 2048 && nbits != 3072)
       return GPG_ERR_INV_VALUE;
 
   /* The random quality depends on the transient_key flag.  */

Reply via email to