Curvepoint.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #include "Curvepoint.hpp"
  2. Curvepoint::Curvepoint()
  3. {
  4. curvepoint_fp_setneutral(point);
  5. }
  6. Curvepoint::Curvepoint(curvepoint_fp_t input)
  7. {
  8. curvepoint_fp_set(point, input);
  9. }
  10. Curvepoint Curvepoint::operator+(const Curvepoint& b) const
  11. {
  12. Curvepoint retval;
  13. if (*this == b)
  14. curvepoint_fp_double(retval.point, point);
  15. else
  16. curvepoint_fp_add_vartime(retval.point, point, b.point);
  17. return retval;
  18. }
  19. Curvepoint Curvepoint::operator*(const Scalar& exp) const
  20. {
  21. Curvepoint retval;
  22. exp.mult(retval.point, point);
  23. return retval;
  24. }
  25. bool Curvepoint::operator==(const Curvepoint& b) const
  26. {
  27. bool retval;
  28. curvepoint_fp_t affine_this_point, affine_b_point;
  29. curvepoint_fp_set(affine_this_point, point);
  30. curvepoint_fp_set(affine_b_point, b.point);
  31. if (!(fpe_isone(affine_this_point->m_z) || fpe_iszero(affine_this_point->m_z)))
  32. curvepoint_fp_makeaffine(affine_this_point);
  33. if (!(fpe_isone(affine_b_point->m_z) || fpe_iszero(affine_b_point->m_z)))
  34. curvepoint_fp_makeaffine(affine_b_point);
  35. retval = fpe_iseq(affine_this_point->m_x, affine_b_point->m_x);
  36. retval = retval && fpe_iseq(affine_this_point->m_y, affine_b_point->m_y);
  37. retval = retval || (fpe_iszero(affine_this_point->m_z) && fpe_iszero(affine_b_point->m_z));
  38. return retval;
  39. }
  40. bool Curvepoint::operator<(const Curvepoint& b) const
  41. {
  42. bool lessThan[2];
  43. bool equal[2];
  44. curvepoint_fp_t affine_this_point, affine_b_point;
  45. lessThan[0] = lessThan[1] = false;
  46. curvepoint_fp_set(affine_this_point, point);
  47. curvepoint_fp_set(affine_b_point, b.point);
  48. if (fpe_iszero(affine_this_point->m_z))
  49. {
  50. // this case would be equal
  51. if (fpe_iszero(affine_b_point->m_z))
  52. return false;
  53. // point at infinity is less than all other points
  54. return true;
  55. }
  56. if (fpe_iszero(affine_b_point->m_z))
  57. return false;
  58. // already checked for the point at infinity, so we don't have to redo that here
  59. if (!fpe_isone(affine_this_point->m_z))
  60. curvepoint_fp_makeaffine(affine_this_point);
  61. if (!fpe_isone(affine_b_point->m_z))
  62. curvepoint_fp_makeaffine(affine_b_point);
  63. for (int i = 11; i >= 0; i--)
  64. {
  65. if (affine_this_point->m_x->v[i] > affine_b_point->m_x->v[i])
  66. {
  67. lessThan[0] = false;
  68. break;
  69. }
  70. if (affine_this_point->m_x->v[i] < affine_b_point->m_x->v[i])
  71. {
  72. lessThan[0] = true;
  73. break;
  74. }
  75. }
  76. for (int i = 11; i >= 0; i--)
  77. {
  78. if (affine_this_point->m_y->v[i] > affine_b_point->m_y->v[i])
  79. {
  80. lessThan[1] = false;
  81. break;
  82. }
  83. if (affine_this_point->m_y->v[i] < affine_b_point->m_y->v[i])
  84. {
  85. lessThan[1] = true;
  86. break;
  87. }
  88. }
  89. equal[0] = fpe_iseq(affine_this_point->m_x, affine_b_point->m_x);
  90. equal[1] = fpe_iseq(affine_this_point->m_y, affine_b_point->m_y);
  91. // sort is lesser x value first, and then lesser y value second if x's are equal
  92. return equal[0] ? (equal[1] ? false : lessThan[1]) : lessThan[0];
  93. }
  94. bool Curvepoint::operator>(const Curvepoint& b) const
  95. {
  96. return !(*this < b);
  97. }
  98. bool Curvepoint::operator<=(const Curvepoint& b) const
  99. {
  100. return (*this == b) || (*this < b);
  101. }
  102. bool Curvepoint::operator>=(const Curvepoint& b) const
  103. {
  104. return (*this == b) || !(*this < b);
  105. }
  106. bool Curvepoint::operator!=(const Curvepoint& b) const
  107. {
  108. return !(*this == b);
  109. }
  110. void Curvepoint::make_affine()
  111. {
  112. if (!(fpe_isone(point->m_z) || fpe_iszero(point->m_z)))
  113. curvepoint_fp_makeaffine(point);
  114. }
  115. std::ostream& operator<<(std::ostream& os, const Curvepoint& output)
  116. {
  117. os << "[";
  118. os << Fpe(output.point->m_x) << ", " << Fpe(output.point->m_y) << ", " << Fpe(output.point->m_z);
  119. os << "]";
  120. return os;
  121. }
  122. size_t CurvepointHash::operator()(const Curvepoint& x) const
  123. {
  124. if (fpe_iszero(x.point->m_z))
  125. {
  126. return 0;
  127. }
  128. size_t retval;
  129. std::hash<double> hasher;
  130. Curvepoint affine_x = x;
  131. affine_x.make_affine();
  132. for (int j = 0; j < 12; j++)
  133. {
  134. retval ^= hasher(affine_x.point->m_x->v[j]);
  135. retval ^= hasher(affine_x.point->m_y->v[j]);
  136. }
  137. return retval;
  138. }