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

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