Blame SOURCES/libgcrypt-1.9.3-CVE-2021-33560.patch

e09bf5
commit 3462280f2e23e16adf3ed5176e0f2413d8861320
e09bf5
Author: NIIBE Yutaka <gniibe@fsij.org>
e09bf5
Date:   Fri May 21 11:15:07 2021 +0900
e09bf5
e09bf5
    cipher: Fix ElGamal encryption for other implementations.
e09bf5
    
e09bf5
    * cipher/elgamal.c (gen_k): Remove support of smaller K.
e09bf5
    (do_encrypt): Never use smaller K.
e09bf5
    (sign): Folllow the change of gen_k.
e09bf5
    
e09bf5
    --
e09bf5
    
e09bf5
    Cherry-pick master commit of:
e09bf5
            632d80ef30e13de6926d503aa697f92b5dbfbc5e
e09bf5
    
e09bf5
    This change basically reverts encryption changes in two commits:
e09bf5
    
e09bf5
            74386120dad6b3da62db37f7044267c8ef34689b
e09bf5
            78531373a342aeb847950f404343a05e36022065
e09bf5
    
e09bf5
    Use of smaller K for ephemeral key in ElGamal encryption is only good,
e09bf5
    when we can guarantee that recipient's key is generated by our
e09bf5
    implementation (or compatible).
e09bf5
    
e09bf5
    For detail, please see:
e09bf5
    
e09bf5
        Luca De Feo, Bertram Poettering, Alessandro Sorniotti,
e09bf5
        "On the (in)security of ElGamal in OpenPGP";
e09bf5
        in the proceedings of  CCS'2021.
e09bf5
    
e09bf5
    CVE-id: CVE-2021-33560
e09bf5
    GnuPG-bug-id: 5328
e09bf5
    Suggested-by: Luca De Feo, Bertram Poettering, Alessandro Sorniotti
e09bf5
    Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
e09bf5
e09bf5
diff --git a/cipher/elgamal.c b/cipher/elgamal.c
e09bf5
index 9835122f..eead4502 100644
e09bf5
--- a/cipher/elgamal.c
e09bf5
+++ b/cipher/elgamal.c
e09bf5
@@ -66,7 +66,7 @@ static const char *elg_names[] =
e09bf5
 
e09bf5
 
e09bf5
 static int test_keys (ELG_secret_key *sk, unsigned int nbits, int nodie);
e09bf5
-static gcry_mpi_t gen_k (gcry_mpi_t p, int small_k);
e09bf5
+static gcry_mpi_t gen_k (gcry_mpi_t p);
e09bf5
 static gcry_err_code_t generate (ELG_secret_key *sk, unsigned nbits,
e09bf5
                                  gcry_mpi_t **factors);
e09bf5
 static int  check_secret_key (ELG_secret_key *sk);
e09bf5
@@ -189,11 +189,10 @@ test_keys ( ELG_secret_key *sk, unsigned int nbits, int nodie )
e09bf5
 
e09bf5
 /****************
e09bf5
  * Generate a random secret exponent k from prime p, so that k is
e09bf5
- * relatively prime to p-1.  With SMALL_K set, k will be selected for
e09bf5
- * better encryption performance - this must never be used signing!
e09bf5
+ * relatively prime to p-1.
e09bf5
  */
e09bf5
 static gcry_mpi_t
e09bf5
-gen_k( gcry_mpi_t p, int small_k )
e09bf5
+gen_k( gcry_mpi_t p )
e09bf5
 {
e09bf5
   gcry_mpi_t k = mpi_alloc_secure( 0 );
e09bf5
   gcry_mpi_t temp = mpi_alloc( mpi_get_nlimbs(p) );
e09bf5
@@ -202,18 +201,7 @@ gen_k( gcry_mpi_t p, int small_k )
e09bf5
   unsigned int nbits, nbytes;
e09bf5
   char *rndbuf = NULL;
e09bf5
 
e09bf5
-  if (small_k)
e09bf5
-    {
e09bf5
-      /* Using a k much lesser than p is sufficient for encryption and
e09bf5
-       * it greatly improves the encryption performance.  We use
e09bf5
-       * Wiener's table and add a large safety margin. */
e09bf5
-      nbits = wiener_map( orig_nbits ) * 3 / 2;
e09bf5
-      if( nbits >= orig_nbits )
e09bf5
-        BUG();
e09bf5
-    }
e09bf5
-  else
e09bf5
-    nbits = orig_nbits;
e09bf5
-
e09bf5
+  nbits = orig_nbits;
e09bf5
 
e09bf5
   nbytes = (nbits+7)/8;
e09bf5
   if( DBG_CIPHER )
e09bf5
@@ -492,7 +480,7 @@ do_encrypt(gcry_mpi_t a, gcry_mpi_t b, gcry_mpi_t input, ELG_public_key *pkey )
e09bf5
    * error code.
e09bf5
    */
e09bf5
 
e09bf5
-  k = gen_k( pkey->p, 1 );
e09bf5
+  k = gen_k( pkey->p );
e09bf5
   mpi_powm (a, pkey->g, k, pkey->p);
e09bf5
 
e09bf5
   /* b = (y^k * input) mod p
e09bf5
@@ -608,7 +596,7 @@ sign(gcry_mpi_t a, gcry_mpi_t b, gcry_mpi_t input, ELG_secret_key *skey )
e09bf5
     *
e09bf5
     */
e09bf5
     mpi_sub_ui(p_1, p_1, 1);
e09bf5
-    k = gen_k( skey->p, 0 /* no small K ! */ );
e09bf5
+    k = gen_k( skey->p );
e09bf5
     mpi_powm( a, skey->g, k, skey->p );
e09bf5
     mpi_mul(t, skey->x, a );
e09bf5
     mpi_subm(t, input, t, p_1 );