Replace GFp ladder implementation with ladd-2002-it-4 from EFD
authorNicola Tuveri <nic.tuv@gmail.com>
Fri, 17 Aug 2018 20:00:44 +0000 (23:00 +0300)
committerMatt Caswell <matt@openssl.org>
Tue, 21 Aug 2018 08:51:18 +0000 (09:51 +0100)
commit5d92b853f6b875ba8d1a1b51b305f14df5adb8aa
treea9a177c85cdfd29bb9d566186a13b7a4d2ca6342
parente97be718044fd9a296f05f13e3ad91427b212b7c
Replace GFp ladder implementation with ladd-2002-it-4 from EFD

The EFD database does not state that the "ladd-2002-it-3" algorithm
assumes X1 != 0.
Consequently the current implementation, based on it, fails to compute
correctly if the affine x coordinate of the scalar multiplication input
point is 0.

We replace this implementation using the alternative algorithm based on
Eq. (9) and (10) from the same paper, which being derived from the
additive relation of (6) does not incur in this problem, but costs one
extra field multiplication.

The EFD entry for this algorithm is at
https://hyperelliptic.org/EFD/g1p/auto-shortw-xz.html#ladder-ladd-2002-it-4
and the code to implement it was generated with tooling.

Regression tests add one positive test for each named curve that has
such a point. The `SharedSecret` was generated independently from the
OpenSSL codebase with sage.

This bug was originally reported by Dmitry Belyavsky on the
openssl-users maling list:
https://mta.openssl.org/pipermail/openssl-users/2018-August/008540.html

Co-authored-by: Billy Brumley <bbrumley@gmail.com>
Reviewed-by: Andy Polyakov <appro@openssl.org>
Reviewed-by: Tim Hudson <tjh@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/7000)
crypto/ec/ecp_smpl.c
test/recipes/30-test_evp_data/evppkey_ecc.txt