Bipoint.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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. curvepoint_fp_t affine_point0, affine_point1, affine_b0, affine_b1;
  69. curvepoint_fp_set(affine_point0, point[0]);
  70. curvepoint_fp_set(affine_point1, point[1]);
  71. curvepoint_fp_set(affine_b0, b[0]);
  72. curvepoint_fp_set(affine_b1, b[1]);
  73. curvepoint_fp_makeaffine(affine_point0);
  74. curvepoint_fp_makeaffine(affine_point1);
  75. curvepoint_fp_makeaffine(affine_b0);
  76. curvepoint_fp_makeaffine(affine_b1);
  77. bool retval;
  78. retval = fpe_iseq(affine_point0->m_x, affine_b0->m_x);
  79. retval = retval && fpe_iseq(affine_point0->m_y, affine_b0->m_y);
  80. retval = retval && fpe_iseq(affine_point1->m_x, affine_b1->m_x);
  81. retval = retval && fpe_iseq(affine_point1->m_y, affine_b1->m_y);
  82. return retval;
  83. }
  84. bool TwistBipoint::operator==(const TwistBipoint& b) const
  85. {
  86. twistpoint_fp2_t affine_point0, affine_point1, affine_b0, affine_b1;
  87. twistpoint_fp2_set(affine_point0, point[0]);
  88. twistpoint_fp2_set(affine_point1, point[1]);
  89. twistpoint_fp2_set(affine_b0, b[0]);
  90. twistpoint_fp2_set(affine_b1, b[1]);
  91. twistpoint_fp2_makeaffine(affine_point0);
  92. twistpoint_fp2_makeaffine(affine_point1);
  93. twistpoint_fp2_makeaffine(affine_b0);
  94. twistpoint_fp2_makeaffine(affine_b1);
  95. bool retval;
  96. retval = fp2e_iseq(affine_point0->m_x, affine_b0->m_x);
  97. retval = retval && fp2e_iseq(affine_point0->m_y, affine_b0->m_y);
  98. retval = retval && fp2e_iseq(affine_point1->m_x, affine_b1->m_x);
  99. retval = retval && fp2e_iseq(affine_point1->m_y, affine_b1->m_y);
  100. return retval;
  101. }
  102. bool CurveBipoint::operator!=(const CurveBipoint& b) const
  103. {
  104. return !(*this == b);
  105. }
  106. bool TwistBipoint::operator!=(const TwistBipoint& b) const
  107. {
  108. return !(*this == b);
  109. }
  110. CurveBipoint CurveBipoint::mult_by_2() const
  111. {
  112. CurveBipoint retval;
  113. curvepoint_fp_double(retval[0], point[0]);
  114. curvepoint_fp_double(retval[1], point[1]);
  115. return retval;
  116. }
  117. TwistBipoint TwistBipoint::mult_by_2() const
  118. {
  119. TwistBipoint retval;
  120. twistpoint_fp2_double(retval[0], point[0]);
  121. twistpoint_fp2_double(retval[1], point[1]);
  122. return retval;
  123. }
  124. void CurveBipoint::make_affine()
  125. {
  126. if (!(fpe_isone(point[0]->m_z)))
  127. curvepoint_fp_makeaffine(point[0]);
  128. if (!(fpe_isone(point[1]->m_z)))
  129. curvepoint_fp_makeaffine(point[1]);
  130. }
  131. void TwistBipoint::make_affine()
  132. {
  133. if (!(fp2e_isone(point[0]->m_z)))
  134. twistpoint_fp2_makeaffine(point[0]);
  135. if (!(fp2e_isone(point[1]->m_z)))
  136. twistpoint_fp2_makeaffine(point[1]);
  137. }
  138. std::ostream& operator<<(std::ostream& os, const CurveBipoint& output)
  139. {
  140. os << "{[";
  141. for (int i = 0; i < 2; i++)
  142. {
  143. os << Fpe(output[i]->m_x) << ", " << Fpe(output[i]->m_y) << ", " << Fpe(output[i]->m_z);
  144. if (i < 1)
  145. os << "], [";
  146. }
  147. os << "]}";
  148. return os;
  149. }
  150. std::ostream& operator<<(std::ostream& os, const TwistBipoint& output)
  151. {
  152. os << "{[";
  153. for (int i = 0; i < 2; i++)
  154. {
  155. os << Fp2e(output[i]->m_x) << ", " << Fp2e(output[i]->m_y) << ", " << Fp2e(output[i]->m_z);
  156. if (i < 1)
  157. os << "], [";
  158. }
  159. os << "]}";
  160. return os;
  161. }
  162. size_t CurveBipointHash::operator()(const CurveBipoint& x) const
  163. {
  164. size_t retval = 0;
  165. CurveBipoint affine_x = x;
  166. std::hash<double> hasher;
  167. affine_x.make_affine();
  168. for (int i = 0; i < 2; i++)
  169. {
  170. for (int j = 0; j < 12; j++)
  171. {
  172. retval ^= hasher(affine_x[i]->m_x->v[j]);
  173. retval ^= hasher(affine_x[i]->m_y->v[j]);
  174. }
  175. }
  176. return retval;
  177. }
  178. size_t TwistBipointHash::operator()(const TwistBipoint& x) const
  179. {
  180. size_t retval = 0;
  181. TwistBipoint affine_x = x;
  182. std::hash<double> hasher;
  183. affine_x.make_affine();
  184. for (int i = 0; i < 2; i++)
  185. {
  186. for (int j = 0; j < 24; j++)
  187. {
  188. retval ^= hasher(affine_x[i]->m_x->v[j]);
  189. retval ^= hasher(affine_x[i]->m_y->v[j]);
  190. }
  191. }
  192. return retval;
  193. }