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);
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())
return m_ecp.Identity();
else
return ret;
return ECP::Point(X3, Y3);
}
else if (m_alpha == A_0)
{
@ -615,12 +615,12 @@ ECP::Point ECP::AdditionFunction::operator()(const Point& P) const
X3 = field.Add(X3,X3);
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())
return m_ecp.Identity();
else
return ret;
return ECP::Point(X3, Y3);
}
else if (m_alpha == A_Star)
{
@ -655,12 +655,12 @@ ECP::Point ECP::AdditionFunction::operator()(const Point& P) const
X3 = field.Add(X3,X3);
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())
return m_ecp.Identity();
else
return ret;
return ECP::Point(X3, Y3);
}
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
{
// Disabled at the moment due to HMQV and FHMQV failures
if (m_alpha == A_3 && false)
if (m_alpha == A_3)
{
const ECP::Field& field = m_ecp.GetField();
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);
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())
return m_ecp.Identity();
else
return ret;
return ECP::Point(X3, Y3);
}
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);
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())
return m_ecp.Identity();
else
return ret;
return ECP::Point(X3, Y3);
}
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);
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())
return m_ecp.Identity();
else
return ret;
return ECP::Point(X3, Y3);
}
else // A_Montgomery
{