|
@@ -48,8 +48,14 @@ CurveBipoint CurveBipoint::operator+(const CurveBipoint& b) const
|
|
{
|
|
{
|
|
CurveBipoint retval;
|
|
CurveBipoint retval;
|
|
|
|
|
|
- curvepoint_fp_add_vartime(retval[0], point[0], b.point[0]);
|
|
+ if (equal(point[0], b[0]))
|
|
- curvepoint_fp_add_vartime(retval[1], point[1], b.point[1]);
|
|
+ curvepoint_fp_double(retval[0], point[0]);
|
|
|
|
+ else
|
|
|
|
+ curvepoint_fp_add_vartime(retval[0], point[0], b[0]);
|
|
|
|
+ if (equal(point[1], b[1]))
|
|
|
|
+ curvepoint_fp_double(retval[1], point[1]);
|
|
|
|
+ else
|
|
|
|
+ curvepoint_fp_add_vartime(retval[1], point[1], b[1]);
|
|
|
|
|
|
return retval;
|
|
return retval;
|
|
}
|
|
}
|
|
@@ -58,8 +64,14 @@ TwistBipoint TwistBipoint::operator+(const TwistBipoint& b) const
|
|
{
|
|
{
|
|
TwistBipoint retval;
|
|
TwistBipoint retval;
|
|
|
|
|
|
- twistpoint_fp2_add_vartime(retval[0], point[0], b.point[0]);
|
|
+ if (equal(point[0], b[0]))
|
|
- twistpoint_fp2_add_vartime(retval[1], point[1], b.point[1]);
|
|
+ twistpoint_fp2_double(retval[0], point[0]);
|
|
|
|
+ else
|
|
|
|
+ twistpoint_fp2_add_vartime(retval[0], point[0], b[0]);
|
|
|
|
+ if (equal(point[1], b[1]))
|
|
|
|
+ twistpoint_fp2_double(retval[1], point[1]);
|
|
|
|
+ else
|
|
|
|
+ twistpoint_fp2_add_vartime(retval[1], point[1], b[1]);
|
|
|
|
|
|
return retval;
|
|
return retval;
|
|
}
|
|
}
|
|
@@ -84,68 +96,66 @@ TwistBipoint TwistBipoint::operator*(const Scalar& exp) const
|
|
return retval;
|
|
return retval;
|
|
}
|
|
}
|
|
|
|
|
|
-bool CurveBipoint::operator==(const CurveBipoint& b) const
|
|
+bool CurveBipoint::equal(const curvepoint_fp_t& op1, const curvepoint_fp_t& op2) const
|
|
{
|
|
{
|
|
- CurveBipoint affine_this = *this;
|
|
|
|
- CurveBipoint affine_b = b;
|
|
|
|
- affine_this.make_affine();
|
|
|
|
- affine_b.make_affine();
|
|
|
|
-
|
|
|
|
bool retval;
|
|
bool retval;
|
|
|
|
+ curvepoint_fp_t affine_op1, affine_op2;
|
|
|
|
+
|
|
|
|
+ curvepoint_fp_set(affine_op1, op1);
|
|
|
|
+ curvepoint_fp_set(affine_op2, op2);
|
|
|
|
+
|
|
|
|
+ if (!(fpe_isone(affine_op1->m_z) || fpe_iszero(affine_op1->m_z)))
|
|
|
|
+ curvepoint_fp_makeaffine(affine_op1);
|
|
|
|
|
|
- retval = fpe_iseq(affine_this[0]->m_x, affine_b[0]->m_x);
|
|
+ if (!(fpe_isone(affine_op2->m_z) || fpe_iszero(affine_op2->m_z)))
|
|
- retval = retval && fpe_iseq(affine_this[0]->m_y, affine_b[0]->m_y);
|
|
+ curvepoint_fp_makeaffine(affine_op2);
|
|
- retval = retval && fpe_iseq(affine_this[1]->m_x, affine_b[1]->m_x);
|
|
+
|
|
- retval = retval && fpe_iseq(affine_this[1]->m_y, affine_b[1]->m_y);
|
|
+ retval = fpe_iseq(affine_op1->m_x, affine_op2->m_x);
|
|
|
|
+ retval = retval && fpe_iseq(affine_op1->m_y, affine_op2->m_y);
|
|
|
|
+ retval = retval || (fpe_iszero(affine_op1->m_z) && fpe_iszero(affine_op2->m_z));
|
|
|
|
|
|
return retval;
|
|
return retval;
|
|
}
|
|
}
|
|
|
|
|
|
-bool TwistBipoint::operator==(const TwistBipoint& b) const
|
|
+bool TwistBipoint::equal(const twistpoint_fp2_t& op1, const twistpoint_fp2_t& op2) const
|
|
{
|
|
{
|
|
- TwistBipoint affine_this = *this;
|
|
|
|
- TwistBipoint affine_b = b;
|
|
|
|
- affine_this.make_affine();
|
|
|
|
- affine_b.make_affine();
|
|
|
|
-
|
|
|
|
bool retval;
|
|
bool retval;
|
|
|
|
+ twistpoint_fp2_t affine_op1, affine_op2;
|
|
|
|
|
|
- retval = fp2e_iseq(affine_this[0]->m_x, affine_b[0]->m_x);
|
|
+ twistpoint_fp2_set(affine_op1, op1);
|
|
- retval = retval && fp2e_iseq(affine_this[0]->m_y, affine_b[0]->m_y);
|
|
+ twistpoint_fp2_set(affine_op2, op2);
|
|
- retval = retval && fp2e_iseq(affine_this[1]->m_x, affine_b[1]->m_x);
|
|
+
|
|
- retval = retval && fp2e_iseq(affine_this[1]->m_y, affine_b[1]->m_y);
|
|
+ if (!(fp2e_isone(affine_op1->m_z) || fp2e_iszero(affine_op1->m_z)))
|
|
|
|
+ twistpoint_fp2_makeaffine(affine_op1);
|
|
|
|
+
|
|
|
|
+ if (!(fp2e_isone(affine_op2->m_z) || fp2e_iszero(affine_op2->m_z)))
|
|
|
|
+ twistpoint_fp2_makeaffine(affine_op2);
|
|
|
|
+
|
|
|
|
+ retval = fp2e_iseq(affine_op1->m_x, affine_op2->m_x);
|
|
|
|
+ retval = retval && fp2e_iseq(affine_op1->m_y, affine_op2->m_y);
|
|
|
|
+ retval = retval || (fp2e_iszero(affine_op1->m_z) && fp2e_iszero(affine_op2->m_z));
|
|
|
|
|
|
return retval;
|
|
return retval;
|
|
}
|
|
}
|
|
|
|
|
|
-bool CurveBipoint::operator!=(const CurveBipoint& b) const
|
|
+bool CurveBipoint::operator==(const CurveBipoint& b) const
|
|
{
|
|
{
|
|
- return !(*this == b);
|
|
+ return equal(point[0], b[0]) && equal(point[1], b[1]);
|
|
}
|
|
}
|
|
|
|
|
|
-bool TwistBipoint::operator!=(const TwistBipoint& b) const
|
|
+bool TwistBipoint::operator==(const TwistBipoint& b) const
|
|
{
|
|
{
|
|
- return !(*this == b);
|
|
+ return equal(point[0], b[0]) && equal(point[1], b[1]);
|
|
}
|
|
}
|
|
|
|
|
|
-CurveBipoint CurveBipoint::mult_by_2() const
|
|
+bool CurveBipoint::operator!=(const CurveBipoint& b) const
|
|
{
|
|
{
|
|
- CurveBipoint retval;
|
|
+ return !(*this == b);
|
|
-
|
|
|
|
- curvepoint_fp_double(retval[0], point[0]);
|
|
|
|
- curvepoint_fp_double(retval[1], point[1]);
|
|
|
|
-
|
|
|
|
- return retval;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-TwistBipoint TwistBipoint::mult_by_2() const
|
|
+bool TwistBipoint::operator!=(const TwistBipoint& b) const
|
|
{
|
|
{
|
|
- TwistBipoint retval;
|
|
+ return !(*this == b);
|
|
-
|
|
|
|
- twistpoint_fp2_double(retval[0], point[0]);
|
|
|
|
- twistpoint_fp2_double(retval[1], point[1]);
|
|
|
|
-
|
|
|
|
- return retval;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
void CurveBipoint::make_affine()
|
|
void CurveBipoint::make_affine()
|
|
@@ -194,40 +204,84 @@ std::ostream& operator<<(std::ostream& os, const TwistBipoint& output)
|
|
|
|
|
|
size_t CurveBipointHash::operator()(const CurveBipoint& x) const
|
|
size_t CurveBipointHash::operator()(const CurveBipoint& x) const
|
|
{
|
|
{
|
|
- size_t retval = 0;
|
|
+ size_t retval[2];
|
|
|
|
+ bool infinity[2];
|
|
CurveBipoint affine_x = x;
|
|
CurveBipoint affine_x = x;
|
|
std::hash<double> hasher;
|
|
std::hash<double> hasher;
|
|
|
|
+
|
|
|
|
+ if (fpe_iszero(affine_x[0]->m_z))
|
|
|
|
+ {
|
|
|
|
+ retval[0] = 0;
|
|
|
|
+ infinity[0] = true;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ retval[0] = 0;
|
|
|
|
+ infinity[0] = false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (fpe_iszero(affine_x[1]->m_z))
|
|
|
|
+ {
|
|
|
|
+ retval[1] = 0;
|
|
|
|
+ infinity[1] = true;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ retval[1] = 0;
|
|
|
|
+ infinity[1] = false;
|
|
|
|
+ }
|
|
|
|
|
|
affine_x.make_affine();
|
|
affine_x.make_affine();
|
|
|
|
|
|
for (int i = 0; i < 2; i++)
|
|
for (int i = 0; i < 2; i++)
|
|
{
|
|
{
|
|
- for (int j = 0; j < 12; j++)
|
|
+ for (int j = 0; j < 12 && !infinity[i]; j++)
|
|
{
|
|
{
|
|
- retval ^= hasher(affine_x[i]->m_x->v[j]);
|
|
+ retval[i] ^= hasher(affine_x[i]->m_x->v[j]);
|
|
- retval ^= hasher(affine_x[i]->m_y->v[j]);
|
|
+ retval[i] ^= hasher(affine_x[i]->m_y->v[j]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- return retval;
|
|
+ return retval[0] ^ retval[1];
|
|
}
|
|
}
|
|
|
|
|
|
size_t TwistBipointHash::operator()(const TwistBipoint& x) const
|
|
size_t TwistBipointHash::operator()(const TwistBipoint& x) const
|
|
{
|
|
{
|
|
- size_t retval = 0;
|
|
+ size_t retval[2];
|
|
|
|
+ bool infinity[2];
|
|
TwistBipoint affine_x = x;
|
|
TwistBipoint affine_x = x;
|
|
std::hash<double> hasher;
|
|
std::hash<double> hasher;
|
|
-
|
|
|
|
- affine_x.make_affine();
|
|
|
|
|
|
|
|
|
|
+ if (fp2e_iszero(affine_x[0]->m_z))
|
|
|
|
+ {
|
|
|
|
+ retval[0] = 0;
|
|
|
|
+ infinity[0] = true;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ retval[0] = 0;
|
|
|
|
+ infinity[0] = false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (fp2e_iszero(affine_x[1]->m_z))
|
|
|
|
+ {
|
|
|
|
+ retval[1] = 0;
|
|
|
|
+ infinity[1] = true;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ retval[1] = 0;
|
|
|
|
+ infinity[1] = false;
|
|
|
|
+ }
|
|
|
|
+
|
|
for (int i = 0; i < 2; i++)
|
|
for (int i = 0; i < 2; i++)
|
|
{
|
|
{
|
|
- for (int j = 0; j < 24; j++)
|
|
+ for (int j = 0; j < 24 && !infinity[i]; j++)
|
|
{
|
|
{
|
|
- retval ^= hasher(affine_x[i]->m_x->v[j]);
|
|
+ retval[i] ^= hasher(affine_x[i]->m_x->v[j]);
|
|
- retval ^= hasher(affine_x[i]->m_y->v[j]);
|
|
+ retval[i] ^= hasher(affine_x[i]->m_y->v[j]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- return retval;
|
|
+ return retval[0] ^ retval[1];
|
|
}
|
|
}
|