Fix incorrect result when using Add and Double

pull/871/head
Jeffrey Walton 2019-08-05 01:15:57 -04:00
parent 9be8c7074c
commit 64a6f53b65
No known key found for this signature in database
GPG Key ID: B36AB348921B1838
1 changed files with 13 additions and 14 deletions

27
ecp.cpp
View File

@ -575,12 +575,12 @@ ECP::Point ECP::AdditionFunction::operator()(const Point& P) const
Z3 = field.Add(Z3,Z3); Z3 = field.Add(Z3,Z3);
const FieldElement inv = field.MultiplicativeInverse(Z3.IsZero() ? Integer::One() : Z3); const FieldElement inv = field.MultiplicativeInverse(Z3.IsZero() ? Integer::One() : Z3);
const ECP::Point ret(field.Multiply(X3, inv), field.Multiply(Y3, inv)); X3 = field.Multiply(X3, inv); Y3 = field.Multiply(Y3, inv);
if (Z3.IsZero()) if (Z3.IsZero())
return m_ecp.Identity(); return m_ecp.Identity();
else else
return ret; return ECP::Point(X3, Y3);
} }
else if (m_alpha == A_0) else if (m_alpha == A_0)
{ {
@ -615,12 +615,12 @@ ECP::Point ECP::AdditionFunction::operator()(const Point& P) const
X3 = field.Add(X3,X3); X3 = field.Add(X3,X3);
const FieldElement inv = field.MultiplicativeInverse(Z3.IsZero() ? Integer::One() : Z3); const FieldElement inv = field.MultiplicativeInverse(Z3.IsZero() ? Integer::One() : Z3);
const ECP::Point ret(field.Multiply(X3, inv), field.Multiply(Y3, inv)); X3 = field.Multiply(X3, inv); Y3 = field.Multiply(Y3, inv);
if (Z3.IsZero()) if (Z3.IsZero())
return m_ecp.Identity(); return m_ecp.Identity();
else else
return ret; return ECP::Point(X3, Y3);
} }
else if (m_alpha == A_Star) else if (m_alpha == A_Star)
{ {
@ -655,12 +655,12 @@ ECP::Point ECP::AdditionFunction::operator()(const Point& P) const
X3 = field.Add(X3,X3); X3 = field.Add(X3,X3);
const FieldElement inv = field.MultiplicativeInverse(Z3.IsZero() ? Integer::One() : Z3); const FieldElement inv = field.MultiplicativeInverse(Z3.IsZero() ? Integer::One() : Z3);
const ECP::Point ret(field.Multiply(X3, inv), field.Multiply(Y3, inv)); X3 = field.Multiply(X3, inv); Y3 = field.Multiply(Y3, inv);
if (Z3.IsZero()) if (Z3.IsZero())
return m_ecp.Identity(); return m_ecp.Identity();
else else
return ret; return ECP::Point(X3, Y3);
} }
else // A_Montgomery else // A_Montgomery
{ {
@ -683,8 +683,7 @@ ECP::Point ECP::AdditionFunction::operator()(const Point& P) const
ECP::Point ECP::AdditionFunction::operator()(const Point& P, const Point& Q) const ECP::Point ECP::AdditionFunction::operator()(const Point& P, const Point& Q) const
{ {
// Disabled at the moment due to HMQV and FHMQV failures if (m_alpha == A_3)
if (m_alpha == A_3 && false)
{ {
const ECP::Field& field = m_ecp.GetField(); const ECP::Field& field = m_ecp.GetField();
const FieldElement& b = m_ecp.m_b; const FieldElement& b = m_ecp.m_b;
@ -746,12 +745,12 @@ ECP::Point ECP::AdditionFunction::operator()(const Point& P, const Point& Q) con
Z3 = field.Add(Z3,t1); Z3 = field.Add(Z3,t1);
const FieldElement inv = field.MultiplicativeInverse(Z3.IsZero() ? Integer::One() : Z3); const FieldElement inv = field.MultiplicativeInverse(Z3.IsZero() ? Integer::One() : Z3);
const ECP::Point ret(field.Multiply(X3, inv), field.Multiply(Y3, inv)); X3 = field.Multiply(X3, inv); Y3 = field.Multiply(Y3, inv);
if (Z3.IsZero()) if (Z3.IsZero())
return m_ecp.Identity(); return m_ecp.Identity();
else else
return ret; return ECP::Point(X3, Y3);
} }
else if (m_alpha == A_0) else if (m_alpha == A_0)
{ {
@ -790,12 +789,12 @@ ECP::Point ECP::AdditionFunction::operator()(const Point& P, const Point& Q) con
X3 = field.Add(X3,X3); X3 = field.Add(X3,X3);
const FieldElement inv = field.MultiplicativeInverse(Z3.IsZero() ? Integer::One() : Z3); const FieldElement inv = field.MultiplicativeInverse(Z3.IsZero() ? Integer::One() : Z3);
const ECP::Point ret(field.Multiply(X3, inv), field.Multiply(Y3, inv)); X3 = field.Multiply(X3, inv); Y3 = field.Multiply(Y3, inv);
if (Z3.IsZero()) if (Z3.IsZero())
return m_ecp.Identity(); return m_ecp.Identity();
else else
return ret; return ECP::Point(X3, Y3);
} }
else if (m_alpha == A_Star) else if (m_alpha == A_Star)
{ {
@ -857,12 +856,12 @@ ECP::Point ECP::AdditionFunction::operator()(const Point& P, const Point& Q) con
Z3 = field.Add(Z3,t0); Z3 = field.Add(Z3,t0);
const FieldElement inv = field.MultiplicativeInverse(Z3.IsZero() ? Integer::One() : Z3); const FieldElement inv = field.MultiplicativeInverse(Z3.IsZero() ? Integer::One() : Z3);
const ECP::Point ret(field.Multiply(X3, inv), field.Multiply(Y3, inv)); X3 = field.Multiply(X3, inv); Y3 = field.Multiply(Y3, inv);
if (Z3.IsZero()) if (Z3.IsZero())
return m_ecp.Identity(); return m_ecp.Identity();
else else
return ret; return ECP::Point(X3, Y3);
} }
else // A_Montgomery else // A_Montgomery
{ {