cipher: Normalize the MPIs used as input to secret key functions.
authorWerner Koch <wk@gnupg.org>
Mon, 16 Dec 2013 08:22:10 +0000 (09:22 +0100)
committerWerner Koch <wk@gnupg.org>
Mon, 16 Dec 2013 10:44:25 +0000 (11:44 +0100)
* cipher/dsa.c (sign): Normalize INPUT.
* cipher/elgamal.c (decrypt): Normalize A and B.
* cipher/rsa.c (secret): Normalize the INPUT.
(rsa_decrypt): Reduce DATA before passing to secret.
--

mpi_normalize is in general not required because extra leading zeroes
do not harm the computation.  However, adding extra all zero limbs or
padding with multiples of N may be useful in side-channel attacks.
This is an extra pre-caution in case RSA blinding has been disabled.

CVE-id: CVE-2013-4576
Signed-off-by: Werner Koch <wk@gnupg.org>
cipher/dsa.c
cipher/elgamal.c
cipher/rsa.c

index 5d29ba4..50bdab1 100644 (file)
@@ -583,7 +583,10 @@ sign (gcry_mpi_t r, gcry_mpi_t s, gcry_mpi_t input, DSA_secret_key *skey,
         mpi_rshift (hash, hash, abits - qbits);
     }
   else
-    hash = input;
+    {
+      mpi_normalize (input);
+      hash = input;
+    }
 
  again:
   /* Create the K value.  */
index 3645e7d..a71a9bc 100644 (file)
@@ -497,10 +497,13 @@ do_encrypt(gcry_mpi_t a, gcry_mpi_t b, gcry_mpi_t input, ELG_public_key *pkey )
 
 
 static void
-decrypt(gcry_mpi_t output, gcry_mpi_t a, gcry_mpi_t b, ELG_secret_key *skey )
+decrypt (gcry_mpi_t output, gcry_mpi_t a, gcry_mpi_t b, ELG_secret_key *skey )
 {
   gcry_mpi_t t1 = mpi_alloc_secure( mpi_get_nlimbs( skey->p ) );
 
+  mpi_normalize (a);
+  mpi_normalize (b);
+
   /* output = b/(a^x) mod p */
   mpi_powm( t1, a, skey->x, skey->p );
   mpi_invm( t1, t1, skey->p );
index a97dcfd..e595e38 100644 (file)
@@ -712,6 +712,9 @@ stronger_key_check ( RSA_secret_key *skey )
 static void
 secret (gcry_mpi_t output, gcry_mpi_t input, RSA_secret_key *skey )
 {
+  /* Remove superfluous leading zeroes from INPUT.  */
+  mpi_normalize (input);
+
   if (!skey->p || !skey->q || !skey->u)
     {
       mpi_powm (output, input, skey->d, skey->n);
@@ -997,6 +1000,13 @@ rsa_decrypt (gcry_sexp_t *r_plain, gcry_sexp_t s_data, gcry_sexp_t keyparms)
         }
     }
 
+  /* Better make sure that there are no superfluous leading zeroes in
+     the input and it has not been "padded" using multiples of N.
+     This mitigates side-channel attacks (CVE-2013-4576).  */
+  mpi_normalize (data);
+  mpi_fdiv_r (data, data, sk.n);
+
+  /* Allocate MPI for the plaintext.  */
   plain = mpi_snew (ctx.nbits);
 
   /* We use blinding by default to mitigate timing attacks which can