Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package libgcrypt for openSUSE:Factory 
checked in at 2022-09-19 16:02:44
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libgcrypt (Old)
 and      /work/SRC/openSUSE:Factory/.libgcrypt.new.2083 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libgcrypt"

Mon Sep 19 16:02:44 2022 rev:93 rq:1004197 version:1.9.4

Changes:
--------
--- /work/SRC/openSUSE:Factory/libgcrypt/libgcrypt.changes      2022-09-07 
11:05:09.888273563 +0200
+++ /work/SRC/openSUSE:Factory/.libgcrypt.new.2083/libgcrypt.changes    
2022-09-19 16:02:45.978058930 +0200
@@ -1,0 +2,20 @@
+Thu Sep  8 10:34:53 UTC 2022 - Pedro Monreal <pmonr...@suse.com>
+
+- FIPS: Get most of the entropy from rndjent_poll [bsc#1202117]
+  * Add libgcrypt-FIPS-rndjent_poll.patch
+  * Rebase libgcrypt-jitterentropy-3.4.0.patch
+
+-------------------------------------------------------------------
+Wed Sep  7 22:03:51 UTC 2022 - Pedro Monreal <pmonr...@suse.com>
+
+- FIPS: Check keylength in gcry_fips_indicator_kdf() [bsc#1190700]
+  * Consider approved keylength greater or equal to 112 bits.
+  * Add libgcrypt-FIPS-kdf-leylength.patch
+
+-------------------------------------------------------------------
+Wed Sep  7 12:53:14 UTC 2022 - Pedro Monreal <pmonr...@suse.com>
+
+- FIPS: Zeroize buffer and digest in check_binary_integrity()
+  * Add libgcrypt-FIPS-Zeroize-hmac.patch [bsc#1191020]
+
+-------------------------------------------------------------------

New:
----
  libgcrypt-FIPS-Zeroize-hmac.patch
  libgcrypt-FIPS-kdf-leylength.patch
  libgcrypt-FIPS-rndjent_poll.patch

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

Other differences:
------------------
++++++ libgcrypt.spec ++++++
--- /var/tmp/diff_new_pack.zgXpFt/_old  2022-09-19 16:02:47.010061687 +0200
+++ /var/tmp/diff_new_pack.zgXpFt/_new  2022-09-19 16:02:47.018061708 +0200
@@ -107,6 +107,12 @@
 Patch46:        libgcrypt-jitterentropy-3.4.0.patch
 #PATCH-FIX-SUSE bsc#1182983 gpg: out of core handler ignored in FIPS mode 
while typing Tab key to Auto-Completion
 Patch47:        libgcrypt-out-of-core-handler.patch
+#PATCH-FIX-SUSE bsc#1191020 FIPS: Zeroize buffer and digest in 
check_binary_integrity()
+Patch48:        libgcrypt-FIPS-Zeroize-hmac.patch
+#PATCH-FIX-SUSE bsc#1190700 FIPS: Check keylength in gcry_fips_indicator_kdf()
+Patch49:        libgcrypt-FIPS-kdf-leylength.patch
+#PATCH-FIX-SUSE bsc#1202117 FIPS: Get most of the entropy from rndjent_poll
+Patch50:        libgcrypt-FIPS-rndjent_poll.patch
 BuildRequires:  automake >= 1.14
 BuildRequires:  fipscheck
 BuildRequires:  libgpg-error-devel >= 1.27


++++++ libgcrypt-FIPS-Zeroize-hmac.patch ++++++
Index: libgcrypt-1.9.4/src/fips.c
===================================================================
--- libgcrypt-1.9.4.orig/src/fips.c
+++ libgcrypt-1.9.4/src/fips.c
@@ -905,6 +905,10 @@ check_binary_integrity (void)
   char *fname = NULL;
   const char key[] = "orboDeJITITejsirpADONivirpUkvarP";
 
+  /* A buffer of 64 bytes plus one for a LF and one to
+   * detect garbage.  */
+  unsigned char buffer[64+1+1];
+
   if (get_library_path ("libgcrypt.so.20", "gcry_check_version", libpath, 
sizeof(libpath)))
     err = gpg_error_from_syserror ();
   else
@@ -927,9 +931,6 @@ check_binary_integrity (void)
                 err = gpg_error_from_syserror ();
               else
                 {
-                  /* A buffer of 64 bytes plus one for a LF and one to
-                     detect garbage.  */
-                  unsigned char buffer[64+1+1];
                   const unsigned char *s;
                   int n;
 
@@ -957,6 +958,9 @@ check_binary_integrity (void)
             }
         }
     }
+  /* Zeroize digest and buffer */
+  memset (digest, 0, sizeof(digest));
+  memset (buffer, 0, sizeof(buffer));
   reporter ("binary", 0, fname, err? gpg_strerror (err):NULL);
 #ifdef HAVE_SYSLOG
   if (err)

++++++ libgcrypt-FIPS-kdf-leylength.patch ++++++
Index: libgcrypt-1.9.4/src/fips.c
===================================================================
--- libgcrypt-1.9.4.orig/src/fips.c
+++ libgcrypt-1.9.4/src/fips.c
@@ -475,10 +475,15 @@ int
 _gcry_fips_indicator_kdf (va_list arg_ptr)
 {
   enum gcry_kdf_algos alg = va_arg (arg_ptr, enum gcry_kdf_algos);
+  unsigned int keylen = 0;
 
   switch (alg)
     {
     case GCRY_KDF_PBKDF2:
+      keylen = va_arg (arg_ptr, unsigned int);
+      if (keylen < 112) {
+        return GPG_ERR_NOT_SUPPORTED;
+      }
       return GPG_ERR_NO_ERROR;
     default:
       return GPG_ERR_NOT_SUPPORTED;
Index: libgcrypt-1.9.4/doc/gcrypt.texi
===================================================================
--- libgcrypt-1.9.4.orig/doc/gcrypt.texi
+++ libgcrypt-1.9.4/doc/gcrypt.texi
@@ -983,10 +983,12 @@ algorithm supports different key sizes).
 this function returns @code{GPS_ERR_NO_ERROR}. Otherwise 
@code{GPG_ERR_NOT_SUPPORTED}
 is returned.
 
-@item GCRYCTL_FIPS_SERVICE_INDICATOR_KDF; Arguments: enum gcry_kdf_algos
+@item GCRYCTL_FIPS_SERVICE_INDICATOR_KDF; Arguments: enum gcry_kdf_algos [, 
unsigned int]
 
 Check if the given KDF is approved under the current FIPS 140-3
-certification. If the KDF is approved, this function returns 
@code{GPG_ERR_NO_ERROR}.
+certification. The second parameter provides the keylength in bits.
+Keylength values of less that 112 bits are considered non-approved.
+If the KDF is approved, this function returns @code{GPG_ERR_NO_ERROR}.
 Otherwise @code{GPG_ERR_NOT_SUPPORTED} is returned.
 
 @item GCRYCTL_FIPS_SERVICE_INDICATOR_PK; Arguments: enum gcry_pk_algos

++++++ libgcrypt-FIPS-rndjent_poll.patch ++++++
Index: libgcrypt-1.9.4/random/rndlinux.c
===================================================================
--- libgcrypt-1.9.4.orig/random/rndlinux.c
+++ libgcrypt-1.9.4/random/rndlinux.c
@@ -141,7 +141,7 @@ _gcry_rndlinux_gather_random (void (*add
   volatile pid_t apid;
   int fd;
   int n;
-  byte buffer[768];
+  byte buffer[256];
   size_t n_hw;
   size_t want = length;
   size_t last_so_far = 0;
@@ -196,26 +196,43 @@ _gcry_rndlinux_gather_random (void (*add
       my_pid = apid;
     }
 
+  if (fips_mode())
+    {
+      if (level >= GCRY_VERY_STRONG_RANDOM)
+        {
+          size_t n;
 
-  /* First read from a hardware source.  Note that _gcry_rndhw_poll_slow lets
-     it account only for up to 50% (or 25% for RDRAND) of the requested
-     bytes.  */
-  n_hw = _gcry_rndhw_poll_slow (add, origin, length);
-  if (length > 1)
-    length -= n_hw;
-
-  /* When using a blocking random generator try to get some entropy
-   * from the jitter based RNG.  In this case we take up to 50% of the
-   * remaining requested bytes.  */
-  if (level >= GCRY_VERY_STRONG_RANDOM)
-    {
-      n_hw = _gcry_rndjent_poll (add, origin, length/2);
-      if (n_hw > length/2)
-        n_hw = length/2;
+          n = _gcry_rndjent_poll (add, origin, length);
+          if (n == 0)
+            log_fatal ("unexpected error from rndjent: %s\n",
+                       strerror (errno));
+          if (n > length)
+            n = length;
+          if (length > 1)
+            length -= n;
+        }
+    }
+  else
+    {
+      /* First read from a hardware source.  Note that _gcry_rndhw_poll_slow 
lets
+         it account only for up to 50% (or 25% for RDRAND) of the requested
+         bytes.  */
+      n_hw = _gcry_rndhw_poll_slow (add, origin, length);
       if (length > 1)
         length -= n_hw;
-    }
 
+      /* When using a blocking random generator try to get some entropy
+       * from the jitter based RNG.  In this case we take up to 50% of the
+       * remaining requested bytes.  */
+      if (level >= GCRY_VERY_STRONG_RANDOM)
+        {
+          n_hw = _gcry_rndjent_poll (add, origin, length/2);
+          if (n_hw > length/2)
+            n_hw = length/2;
+          if (length > 1)
+            length -= n_hw;
+        }
+    }
 
   /* Open the requested device.  The first time a device is to be
      opened we fail with a fatal error if the device does not exists.
@@ -283,8 +301,6 @@ _gcry_rndlinux_gather_random (void (*add
           do
             {
               nbytes = length < sizeof(buffer)? length : sizeof(buffer);
-              if (nbytes > 256)
-                nbytes = 256;
               _gcry_pre_syscall ();
               ret = getentropy (buffer, nbytes);
               _gcry_post_syscall ();
Index: libgcrypt-1.9.4/random/rndjent.c
===================================================================
--- libgcrypt-1.9.4.orig/random/rndjent.c
+++ libgcrypt-1.9.4/random/rndjent.c
@@ -279,13 +279,24 @@ _gcry_rndjent_poll (void (*add)(const vo
       if (!jent_rng_is_initialized)
         {
           /* Auto-initialize.  */
-          jent_rng_is_initialized = 1;
           jent_entropy_collector_free (jent_rng_collector);
           jent_rng_collector = NULL;
           if ( !(_gcry_random_read_conf () & RANDOM_CONF_DISABLE_JENT))
             {
-              if (!jent_entropy_init ())
-                jent_rng_collector = jent_entropy_collector_alloc (1, 0);
+              if (!jent_entropy_init_ex (1, 0))
+                {
+                  jent_rng_collector = jent_entropy_collector_alloc (1, 0);
+                  jent_rng_is_initialized = 1;
+                }
+            }
+        }
+
+      if (!jent_rng_collector)
+        {
+          if (!jent_entropy_init_ex (1, 0))
+            {
+               jent_rng_collector = jent_entropy_collector_alloc (1, 0);
+               jent_rng_is_initialized = 1;
             }
         }
 

++++++ libgcrypt-jitterentropy-3.4.0.patch ++++++
--- /var/tmp/diff_new_pack.zgXpFt/_old  2022-09-19 16:02:47.194062178 +0200
+++ /var/tmp/diff_new_pack.zgXpFt/_new  2022-09-19 16:02:47.198062189 +0200
@@ -57,9 +57,8 @@
 +       * pros and cons considering that the SHA3 operation is not that
 +       * expensive.
         */
--#ifndef JENT_CPU_JITTERENTROPY_SECURE_MEMORY
+ #ifndef JENT_CPU_JITTERENTROPY_SECURE_MEMORY
 -      jent_random_data(ec);
-+#ifndef CONFIG_CRYPTO_CPU_JITTERENTROPY_SECURE_MEMORY
 +      jent_read_random_block(ec, NULL, 0);
  #endif
  
@@ -72,19 +71,16 @@
  
        /*
         * Requesting disabling and forcing of internal timer
-@@ -405,9 +415,8 @@ static struct rand_data
+@@ -405,7 +415,7 @@ static struct rand_data
                return NULL;
  
        if (!(flags & JENT_DISABLE_MEMORY_ACCESS)) {
 -              uint32_t memsize = jent_memsize(flags);
--
--              entropy_collector->mem = _gcry_calloc (1, memsize);
 +              memsize = jent_memsize(flags);
-+              entropy_collector->mem = (unsigned char *)jent_zalloc(memsize);
  
- #ifdef JENT_RANDOM_MEMACCESS
-               /*
-@@ -431,13 +440,19 @@ static struct rand_data
+               entropy_collector->mem = _gcry_calloc (1, memsize);
+ 
+@@ -431,13 +441,19 @@ static struct rand_data
                entropy_collector->memaccessloops = JENT_MEMORY_ACCESSLOOPS;
        }
  
@@ -105,7 +101,7 @@
                entropy_collector->fips_enabled = 1;
  
        /* Initialize the APT */
-@@ -469,7 +484,7 @@ static struct rand_data
+@@ -469,7 +485,7 @@ static struct rand_data
  
  err:
        if (entropy_collector->mem != NULL)
@@ -114,7 +110,7 @@
        jent_zfree(entropy_collector, sizeof(struct rand_data));
        return NULL;
  }
-@@ -511,6 +526,7 @@ JENT_PRIVATE_STATIC
+@@ -511,6 +527,7 @@ JENT_PRIVATE_STATIC
  void jent_entropy_collector_free(struct rand_data *entropy_collector)
  {
        if (entropy_collector != NULL) {
@@ -122,7 +118,7 @@
                jent_notime_disable(entropy_collector);
                if (entropy_collector->mem != NULL) {
                        jent_zfree(entropy_collector->mem,
-@@ -664,6 +680,7 @@ static inline int jent_entropy_init_comm
+@@ -664,6 +681,7 @@ static inline int jent_entropy_init_comm
        int ret;
  
        jent_notime_block_switch();
@@ -130,7 +126,7 @@
  
        if (sha3_tester())
                return EHASH;
-@@ -710,6 +727,8 @@ int jent_entropy_init_ex(unsigned int os
+@@ -710,6 +728,8 @@ int jent_entropy_init_ex(unsigned int os
        if (ret)
                return ret;
  
@@ -139,17 +135,10 @@
        /* Test without internal timer unless caller does not want it */
        if (!(flags & JENT_FORCE_INTERNAL_TIMER))
                ret = jent_time_entropy_init(osr,
-@@ -725,10 +744,14 @@ int jent_entropy_init_ex(unsigned int os
-       return jent_entropy_init_common_post(ret);
- }
- 
--#ifdef JENT_CONF_ENABLE_INTERNAL_TIMER
- JENT_PRIVATE_STATIC
- int jent_entropy_switch_notime_impl(struct jent_notime_thread *new_thread)
- {
+@@ -732,3 +752,9 @@ int jent_entropy_switch_notime_impl(stru
        return jent_notime_switch(new_thread);
  }
--#endif
+ #endif
 +
 +JENT_PRIVATE_STATIC
 +int jent_set_fips_failure_callback(jent_fips_failure_cb cb)
@@ -383,7 +372,7 @@
  }
  
  #define MAX_ACC_LOOP_BIT 7
-@@ -184,37 +202,37 @@ static inline uint32_t xoshiro128starsta
+@@ -184,13 +202,12 @@ static inline uint32_t xoshiro128starsta
  
  static void jent_memaccess(struct rand_data *ec, uint64_t loop_cnt)
  {
@@ -395,11 +384,10 @@
        } prngState = { .u = {0x8e93eec0, 0xce65608a, 0xa8d46b46, 0xe83cef69} };
        uint32_t addressMask;
 -        uint64_t acc_loop_cnt;
--
--      if (NULL == ec || NULL == ec->mem)
--              return;
--
--      addressMask =  ec->memmask;
+ 
+       if (NULL == ec || NULL == ec->mem)
+               return;
+@@ -199,7 +216,7 @@ static void jent_memaccess(struct rand_d
  
        /* Ensure that macros cannot overflow jent_loop_shuffle() */
        BUILD_BUG_ON((MAX_ACC_LOOP_BIT + MIN_ACC_LOOP_BIT) > 63);
@@ -407,18 +395,8 @@
 +      uint64_t acc_loop_cnt =
                jent_loop_shuffle(ec, MAX_ACC_LOOP_BIT, MIN_ACC_LOOP_BIT);
  
-+      if (NULL == ec || NULL == ec->mem)
-+              return;
-+      addressMask = ec->memmask;
-+
        /*
-        * Mix the current data into prngState
-        *
-        * Any time you see a PRNG in a noise source, you should be concerned.
-        *
-        * The PRNG doesn't directly produce the raw noise, it just adjusts the
-        * location being updated. The timing of the update is part of the raw
-        * sample. The main thing this process gets you isn't better
+@@ -213,8 +230,10 @@ static void jent_memaccess(struct rand_d
         * "per-update: timing, it gets you mostly independent "per-update"
         * timing, so we can now benefit from the Central Limit Theorem!
         */
@@ -431,7 +409,7 @@
  
        /*
         * testing purposes -- allow test app to set the counter, not
-@@ -358,21 +376,21 @@ unsigned int jent_measure_jitter(struct
+@@ -358,21 +377,21 @@ unsigned int jent_measure_jitter(struct
  
  /**
   * Generator of one 256 bit random number
@@ -458,7 +436,7 @@
                /* If a stuck measurement is received, repeat measurement */
                if (jent_measure_jitter(ec, 0, NULL))
                        continue;
-@@ -385,3 +403,22 @@ void jent_random_data(struct rand_data *
+@@ -385,3 +404,22 @@ void jent_random_data(struct rand_data *
                        break;
        }
  }
@@ -561,18 +539,7 @@
 ===================================================================
 --- libgcrypt-1.9.4.orig/random/jitterentropy.h
 +++ libgcrypt-1.9.4/random/jitterentropy.h
-@@ -42,6 +42,10 @@
- #ifndef _JITTERENTROPY_H
- #define _JITTERENTROPY_H
- 
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
- /***************************************************************************
-  * Jitter RNG Configuration Section
-  *
-@@ -49,7 +53,7 @@
+@@ -49,7 +49,7 @@
   ***************************************************************************/
  
  /*
@@ -581,7 +548,7 @@
   *
   * In case the hardware is identified to not provide a high-resolution time
   * stamp, this option enables a built-in high-resolution time stamp mechanism.
-@@ -166,7 +173,7 @@ struct rand_data
+@@ -166,7 +166,7 @@ struct rand_data
         * of the RNG are marked as SENSITIVE. A user must not
         * access that information while the RNG executes its loops to
         * calculate the next random value. */
@@ -590,7 +557,7 @@
        uint64_t prev_time;             /* SENSITIVE Previous time stamp */
  #define DATA_SIZE_BITS (SHA3_256_SIZE_DIGEST_BITS)
  
-@@ -378,29 +389,34 @@ int jent_entropy_init(void);
+@@ -378,28 +379,34 @@ int jent_entropy_init(void);
  JENT_PRIVATE_STATIC
  int jent_entropy_init_ex(unsigned int osr, unsigned int flags);
  
@@ -627,19 +594,9 @@
  };
  
 -#ifdef JENT_CONF_ENABLE_INTERNAL_TIMER
--
+ 
  JENT_PRIVATE_STATIC
  int jent_notime_init(void **ctx);
- 
-@@ -448,4 +464,8 @@ uint64_t jent_lfsr_var_stat(struct rand_
- 
- /* -- END of statistical test function -- */
- 
-+#ifdef __cplusplus
-+}
-+#endif
-+
- #endif /* _JITTERENTROPY_H */
 Index: libgcrypt-1.9.4/random/jitterentropy-base-user.h
 ===================================================================
 --- libgcrypt-1.9.4.orig/random/jitterentropy-base-user.h

Reply via email to