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

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