From 3916dd5061773b92feaaac06a731e25ceb78b74c Mon Sep 17 00:00:00 2001
From: Vinnie Ryan <vinnie@openjdk.org>
Date: Tue, 23 May 2017 16:59:50 +0100
Subject: [PATCH] 8178135: Additional elliptic curve support

Reviewed-by: mullan
---
 .../jdk.crypto.ec/share/native/libsunec/impl/ecp_jac.c |  9 +++++++++
 .../jdk.crypto.ec/share/native/libsunec/impl/ecp_jm.c  | 10 ++++++++++
 2 files changed, 19 insertions(+)

diff --git a/jdk/src/jdk.crypto.ec/share/native/libsunec/impl/ecp_jac.c b/jdk/src/jdk.crypto.ec/share/native/libsunec/impl/ecp_jac.c
index 6326895ea2b..9e1bdf20f67 100644
--- a/jdk/src/jdk.crypto.ec/share/native/libsunec/impl/ecp_jac.c
+++ b/jdk/src/jdk.crypto.ec/share/native/libsunec/impl/ecp_jac.c
@@ -181,6 +181,15 @@ ec_GFp_pt_add_jac_aff(const mp_int *px, const mp_int *py, const mp_int *pz,
         MP_CHECKOK(group->meth->field_mul(&A, qx, &A, group->meth));
         MP_CHECKOK(group->meth->field_mul(&B, qy, &B, group->meth));
 
+        /*
+         * Additional checks for point equality and point at infinity
+         */
+        if (mp_cmp(px, &A) == 0 && mp_cmp(py, &B) == 0) {
+            /* POINT_DOUBLE(P) */
+            MP_CHECKOK(ec_GFp_pt_dbl_jac(px, py, pz, rx, ry, rz, group));
+            goto CLEANUP;
+        }
+
         /* C = A - px, D = B - py */
         MP_CHECKOK(group->meth->field_sub(&A, px, &C, group->meth));
         MP_CHECKOK(group->meth->field_sub(&B, py, &D, group->meth));
diff --git a/jdk/src/jdk.crypto.ec/share/native/libsunec/impl/ecp_jm.c b/jdk/src/jdk.crypto.ec/share/native/libsunec/impl/ecp_jm.c
index ca7658807ce..c5cdef9bf4a 100644
--- a/jdk/src/jdk.crypto.ec/share/native/libsunec/impl/ecp_jm.c
+++ b/jdk/src/jdk.crypto.ec/share/native/libsunec/impl/ecp_jm.c
@@ -166,6 +166,16 @@ ec_GFp_pt_add_jm_aff(const mp_int *px, const mp_int *py, const mp_int *pz,
         MP_CHECKOK(group->meth->field_mul(A, qx, A, group->meth));
         MP_CHECKOK(group->meth->field_mul(B, qy, B, group->meth));
 
+        /*
+         * Additional checks for point equality and point at infinity
+         */
+        if (mp_cmp(px, A) == 0 && mp_cmp(py, B) == 0) {
+            /* POINT_DOUBLE(P) */
+            MP_CHECKOK(ec_GFp_pt_dbl_jm(px, py, pz, paz4, rx, ry, rz, raz4,
+                                        scratch, group));
+            goto CLEANUP;
+        }
+
         /* C = A - px, D = B - py */
         MP_CHECKOK(group->meth->field_sub(A, px, C, group->meth));
         MP_CHECKOK(group->meth->field_sub(B, py, D, group->meth));