Fix the ECDSA timing attack mentioned in the paper at:
authorDr. Stephen Henson <steve@openssl.org>
Wed, 25 May 2011 14:42:27 +0000 (14:42 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Wed, 25 May 2011 14:42:27 +0000 (14:42 +0000)
http://eprint.iacr.org/2011/232.pdf

Thanks to the original authors Billy Bob Brumley and Nicola Tuveri for
bringing this to our attention.

CHANGES
crypto/ecdsa/ecs_ossl.c

diff --git a/CHANGES b/CHANGES
index 656b6a2f8f5851edaa206f257be4ec4a2175db4f..38ea63ae7a0b8d7218fe08e4e3c124a4cc685342 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,13 @@
 
  Changes between 1.0.0d and 1.0.1  [xx XXX xxxx]
 
+  *) Add protection against ECDSA timing attacks as mentioned in the paper
+     by Billy Bob Brumley and Nicola Tuveri, see:
+
+       http://eprint.iacr.org/2011/232.pdf
+
+     [Billy Bob Brumley and Nicola Tuveri]
+
   *) Add TLS v1.2 server support for client authentication. 
      [Steve Henson]
 
index 551cf5068fa2ebb4c87875fa1b22f6340f7de349..bbb5588cbeadc39195fd8fc4e5e982608b7a70c2 100644 (file)
@@ -144,6 +144,16 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in, BIGNUM **kinvp,
                        }
                while (BN_is_zero(k));
 
+#ifdef ECDSA_POINT_MUL_NO_CONSTTIME
+               /* We do not want timing information to leak the length of k,
+                * so we compute G*k using an equivalent scalar of fixed
+                * bit-length. */
+
+               if (!BN_add(k, k, order)) goto err;
+               if (BN_num_bits(k) <= BN_num_bits(order))
+                       if (!BN_add(k, k, order)) goto err;
+#endif /* def(ECDSA_POINT_MUL_NO_CONSTTIME) */
+
                /* compute r the x-coordinate of generator * k */
                if (!EC_POINT_mul(group, tmp_point, k, NULL, NULL, ctx))
                {