Bipoint.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. #include "Bipoint.hpp"
  2. CurveBipoint::CurveBipoint()
  3. {
  4. curvepoint_fp_setneutral(point[0]);
  5. curvepoint_fp_setneutral(point[1]);
  6. }
  7. TwistBipoint::TwistBipoint()
  8. {
  9. twistpoint_fp2_setneutral(point[0]);
  10. twistpoint_fp2_setneutral(point[1]);
  11. }
  12. CurveBipoint::CurveBipoint(curvepoint_fp_t p1, curvepoint_fp_t p2)
  13. {
  14. curvepoint_fp_set(point[0], p1);
  15. curvepoint_fp_set(point[1], p2);
  16. }
  17. TwistBipoint::TwistBipoint(twistpoint_fp2_t p1, twistpoint_fp2_t p2)
  18. {
  19. twistpoint_fp2_set(point[0], p1);
  20. twistpoint_fp2_set(point[1], p2);
  21. }
  22. curvepoint_fp_t& CurveBipoint::operator[](int n)
  23. {
  24. return point[n];
  25. }
  26. twistpoint_fp2_t& TwistBipoint::operator[](int n)
  27. {
  28. return point[n];
  29. }
  30. const curvepoint_fp_t& CurveBipoint::operator[](int n) const
  31. {
  32. return point[n];
  33. }
  34. const twistpoint_fp2_t& TwistBipoint::operator[](int n) const
  35. {
  36. return point[n];
  37. }
  38. CurveBipoint CurveBipoint::operator+(const CurveBipoint& b) const
  39. {
  40. CurveBipoint retval;
  41. curvepoint_fp_add_vartime(retval[0], point[0], b.point[0]);
  42. curvepoint_fp_add_vartime(retval[1], point[1], b.point[1]);
  43. return retval;
  44. }
  45. TwistBipoint TwistBipoint::operator+(const TwistBipoint& b) const
  46. {
  47. TwistBipoint retval;
  48. twistpoint_fp2_add_vartime(retval[0], point[0], b.point[0]);
  49. twistpoint_fp2_add_vartime(retval[1], point[1], b.point[1]);
  50. return retval;
  51. }
  52. CurveBipoint CurveBipoint::operator*(const Scalar& exp) const
  53. {
  54. CurveBipoint retval;
  55. exp.mult(retval[0], point[0]);
  56. exp.mult(retval[1], point[1]);
  57. return retval;
  58. }
  59. TwistBipoint TwistBipoint::operator*(const Scalar& exp) const
  60. {
  61. TwistBipoint retval;
  62. exp.mult(retval[0], point[0]);
  63. exp.mult(retval[1], point[1]);
  64. return retval;
  65. }
  66. bool CurveBipoint::operator==(const CurveBipoint& b) const
  67. {
  68. CurveBipoint affine_this = *this;
  69. CurveBipoint affine_b = b;
  70. affine_this.make_affine();
  71. affine_b.make_affine();
  72. bool retval;
  73. retval = fpe_iseq(affine_this[0]->m_x, affine_b[0]->m_x);
  74. retval = retval && fpe_iseq(affine_this[0]->m_y, affine_b[0]->m_y);
  75. retval = retval && fpe_iseq(affine_this[1]->m_x, affine_b[1]->m_x);
  76. retval = retval && fpe_iseq(affine_this[1]->m_y, affine_b[1]->m_y);
  77. return retval;
  78. }
  79. bool TwistBipoint::operator==(const TwistBipoint& b) const
  80. {
  81. TwistBipoint affine_this = *this;
  82. TwistBipoint affine_b = b;
  83. affine_this.make_affine();
  84. affine_b.make_affine();
  85. bool retval;
  86. retval = fp2e_iseq(affine_this[0]->m_x, affine_b[0]->m_x);
  87. retval = retval && fp2e_iseq(affine_this[0]->m_y, affine_b[0]->m_y);
  88. retval = retval && fp2e_iseq(affine_this[1]->m_x, affine_b[1]->m_x);
  89. retval = retval && fp2e_iseq(affine_this[1]->m_y, affine_b[1]->m_y);
  90. return retval;
  91. }
  92. bool CurveBipoint::operator!=(const CurveBipoint& b) const
  93. {
  94. return !(*this == b);
  95. }
  96. bool TwistBipoint::operator!=(const TwistBipoint& b) const
  97. {
  98. return !(*this == b);
  99. }
  100. CurveBipoint CurveBipoint::mult_by_2() const
  101. {
  102. CurveBipoint retval;
  103. curvepoint_fp_double(retval[0], point[0]);
  104. curvepoint_fp_double(retval[1], point[1]);
  105. return retval;
  106. }
  107. TwistBipoint TwistBipoint::mult_by_2() const
  108. {
  109. TwistBipoint retval;
  110. twistpoint_fp2_double(retval[0], point[0]);
  111. twistpoint_fp2_double(retval[1], point[1]);
  112. return retval;
  113. }
  114. void CurveBipoint::make_affine()
  115. {
  116. if (!(fpe_isone(point[0]->m_z) || fpe_iszero(point[0]->m_z)))
  117. curvepoint_fp_makeaffine(point[0]);
  118. if (!(fpe_isone(point[1]->m_z) || fpe_iszero(point[0]->m_z)))
  119. curvepoint_fp_makeaffine(point[1]);
  120. }
  121. void TwistBipoint::make_affine()
  122. {
  123. if (!(fp2e_isone(point[0]->m_z) || fp2e_iszero(point[0]->m_z)))
  124. twistpoint_fp2_makeaffine(point[0]);
  125. if (!(fp2e_isone(point[1]->m_z) || fp2e_iszero(point[1]->m_z)))
  126. twistpoint_fp2_makeaffine(point[1]);
  127. }
  128. std::ostream& operator<<(std::ostream& os, const CurveBipoint& output)
  129. {
  130. os << "{[";
  131. for (int i = 0; i < 2; i++)
  132. {
  133. os << Fpe(output[i]->m_x) << ", " << Fpe(output[i]->m_y) << ", " << Fpe(output[i]->m_z);
  134. if (i < 1)
  135. os << "], [";
  136. }
  137. os << "]}";
  138. return os;
  139. }
  140. std::ostream& operator<<(std::ostream& os, const TwistBipoint& output)
  141. {
  142. os << "{[";
  143. for (int i = 0; i < 2; i++)
  144. {
  145. os << Fp2e(output[i]->m_x) << ", " << Fp2e(output[i]->m_y) << ", " << Fp2e(output[i]->m_z);
  146. if (i < 1)
  147. os << "], [";
  148. }
  149. os << "]}";
  150. return os;
  151. }
  152. size_t CurveBipointHash::operator()(const CurveBipoint& x) const
  153. {
  154. size_t retval = 0;
  155. CurveBipoint affine_x = x;
  156. std::hash<double> hasher;
  157. affine_x.make_affine();
  158. for (int i = 0; i < 2; i++)
  159. {
  160. for (int j = 0; j < 12; j++)
  161. {
  162. retval ^= hasher(affine_x[i]->m_x->v[j]);
  163. retval ^= hasher(affine_x[i]->m_y->v[j]);
  164. }
  165. }
  166. return retval;
  167. }
  168. size_t TwistBipointHash::operator()(const TwistBipoint& x) const
  169. {
  170. size_t retval = 0;
  171. TwistBipoint affine_x = x;
  172. std::hash<double> hasher;
  173. affine_x.make_affine();
  174. for (int i = 0; i < 2; i++)
  175. {
  176. for (int j = 0; j < 24; j++)
  177. {
  178. retval ^= hasher(affine_x[i]->m_x->v[j]);
  179. retval ^= hasher(affine_x[i]->m_y->v[j]);
  180. }
  181. }
  182. return retval;
  183. }