Bipoint.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  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. if (equal(point[0], b[0]))
  42. curvepoint_fp_double(retval[0], point[0]);
  43. else
  44. curvepoint_fp_add_vartime(retval[0], point[0], b[0]);
  45. if (equal(point[1], b[1]))
  46. curvepoint_fp_double(retval[1], point[1]);
  47. else
  48. curvepoint_fp_add_vartime(retval[1], point[1], b[1]);
  49. return retval;
  50. }
  51. TwistBipoint TwistBipoint::operator+(const TwistBipoint& b) const
  52. {
  53. TwistBipoint retval;
  54. if (equal(point[0], b[0]))
  55. twistpoint_fp2_double(retval[0], point[0]);
  56. else
  57. twistpoint_fp2_add_vartime(retval[0], point[0], b[0]);
  58. if (equal(point[1], b[1]))
  59. twistpoint_fp2_double(retval[1], point[1]);
  60. else
  61. twistpoint_fp2_add_vartime(retval[1], point[1], b[1]);
  62. return retval;
  63. }
  64. CurveBipoint CurveBipoint::operator*(const Scalar& exp) const
  65. {
  66. CurveBipoint retval;
  67. exp.mult(retval[0], point[0]);
  68. exp.mult(retval[1], point[1]);
  69. return retval;
  70. }
  71. TwistBipoint TwistBipoint::operator*(const Scalar& exp) const
  72. {
  73. TwistBipoint retval;
  74. exp.mult(retval[0], point[0]);
  75. exp.mult(retval[1], point[1]);
  76. return retval;
  77. }
  78. bool CurveBipoint::equal(const curvepoint_fp_t& op1, const curvepoint_fp_t& op2) const
  79. {
  80. bool retval;
  81. curvepoint_fp_t affine_op1, affine_op2;
  82. curvepoint_fp_set(affine_op1, op1);
  83. curvepoint_fp_set(affine_op2, op2);
  84. if (!(fpe_isone(affine_op1->m_z) || fpe_iszero(affine_op1->m_z)))
  85. curvepoint_fp_makeaffine(affine_op1);
  86. if (!(fpe_isone(affine_op2->m_z) || fpe_iszero(affine_op2->m_z)))
  87. curvepoint_fp_makeaffine(affine_op2);
  88. retval = fpe_iseq(affine_op1->m_x, affine_op2->m_x);
  89. retval = retval && fpe_iseq(affine_op1->m_y, affine_op2->m_y);
  90. retval = retval || (fpe_iszero(affine_op1->m_z) && fpe_iszero(affine_op2->m_z));
  91. return retval;
  92. }
  93. bool TwistBipoint::equal(const twistpoint_fp2_t& op1, const twistpoint_fp2_t& op2) const
  94. {
  95. bool retval;
  96. twistpoint_fp2_t affine_op1, affine_op2;
  97. twistpoint_fp2_set(affine_op1, op1);
  98. twistpoint_fp2_set(affine_op2, op2);
  99. if (!(fp2e_isone(affine_op1->m_z) || fp2e_iszero(affine_op1->m_z)))
  100. twistpoint_fp2_makeaffine(affine_op1);
  101. if (!(fp2e_isone(affine_op2->m_z) || fp2e_iszero(affine_op2->m_z)))
  102. twistpoint_fp2_makeaffine(affine_op2);
  103. retval = fp2e_iseq(affine_op1->m_x, affine_op2->m_x);
  104. retval = retval && fp2e_iseq(affine_op1->m_y, affine_op2->m_y);
  105. retval = retval || (fp2e_iszero(affine_op1->m_z) && fp2e_iszero(affine_op2->m_z));
  106. return retval;
  107. }
  108. bool CurveBipoint::operator==(const CurveBipoint& b) const
  109. {
  110. return equal(point[0], b[0]) && equal(point[1], b[1]);
  111. }
  112. bool TwistBipoint::operator==(const TwistBipoint& b) const
  113. {
  114. return equal(point[0], b[0]) && equal(point[1], b[1]);
  115. }
  116. bool CurveBipoint::operator!=(const CurveBipoint& b) const
  117. {
  118. return !(*this == b);
  119. }
  120. bool TwistBipoint::operator!=(const TwistBipoint& b) const
  121. {
  122. return !(*this == b);
  123. }
  124. void CurveBipoint::make_affine()
  125. {
  126. if (!(fpe_isone(point[0]->m_z) || fpe_iszero(point[0]->m_z)))
  127. curvepoint_fp_makeaffine(point[0]);
  128. if (!(fpe_isone(point[1]->m_z) || fpe_iszero(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) || fp2e_iszero(point[0]->m_z)))
  134. twistpoint_fp2_makeaffine(point[0]);
  135. if (!(fp2e_isone(point[1]->m_z) || fp2e_iszero(point[1]->m_z)))
  136. twistpoint_fp2_makeaffine(point[1]);
  137. }
  138. std::ostream& operator<<(std::ostream& os, const CurveBipoint& output)
  139. {
  140. CurveBipoint affine_out = output;
  141. affine_out.make_affine();
  142. for (int i = 0; i < 2; i++)
  143. {
  144. if (fpe_iszero(affine_out[i]->m_z))
  145. os << "Infinity";
  146. else
  147. os << Fpe(affine_out[i]->m_x) << Fpe(affine_out[i]->m_y) << Fpe(affine_out[i]->m_z);
  148. }
  149. return os;
  150. }
  151. std::istream& operator>>(std::istream& is, CurveBipoint& input)
  152. {
  153. Fpe x, y, z;
  154. for (int i = 0; i < 2; i++)
  155. {
  156. is >> x >> y >> z;
  157. fpe_set(input[i]->m_x, x.data);
  158. fpe_set(input[i]->m_y, y.data);
  159. fpe_set(input[i]->m_z, z.data);
  160. }
  161. return is;
  162. }
  163. std::ostream& operator<<(std::ostream& os, const TwistBipoint& output)
  164. {
  165. TwistBipoint affine_out = output;
  166. affine_out.make_affine();
  167. for (int i = 0; i < 2; i++)
  168. {
  169. if (fp2e_iszero(affine_out[i]->m_z))
  170. os << "Infinity";
  171. else
  172. os << Fp2e(affine_out[i]->m_x) << Fp2e(affine_out[i]->m_y) << Fp2e(affine_out[i]->m_z);
  173. }
  174. return os;
  175. }
  176. std::istream& operator>>(std::istream& is, TwistBipoint& input)
  177. {
  178. Fp2e x, y, z;
  179. for (int i = 0; i < 2; i++)
  180. {
  181. is >> x >> y >> z;
  182. fp2e_set(input[i]->m_x, x.data);
  183. fp2e_set(input[i]->m_y, y.data);
  184. fp2e_set(input[i]->m_z, z.data);
  185. }
  186. return is;
  187. }
  188. size_t CurveBipointHash::operator()(const CurveBipoint& x) const
  189. {
  190. size_t retval[2];
  191. bool infinity[2];
  192. CurveBipoint affine_x = x;
  193. std::hash<double> hasher;
  194. if (fpe_iszero(affine_x[0]->m_z))
  195. {
  196. retval[0] = 0;
  197. infinity[0] = true;
  198. }
  199. else
  200. {
  201. retval[0] = 0;
  202. infinity[0] = false;
  203. }
  204. if (fpe_iszero(affine_x[1]->m_z))
  205. {
  206. retval[1] = 0;
  207. infinity[1] = true;
  208. }
  209. else
  210. {
  211. retval[1] = 0;
  212. infinity[1] = false;
  213. }
  214. affine_x.make_affine();
  215. for (int i = 0; i < 2; i++)
  216. {
  217. for (int j = 0; j < 12 && !infinity[i]; j++)
  218. {
  219. retval[i] ^= hasher(affine_x[i]->m_x->v[j]);
  220. retval[i] ^= hasher(affine_x[i]->m_y->v[j]);
  221. }
  222. }
  223. return retval[0] ^ retval[1];
  224. }
  225. size_t TwistBipointHash::operator()(const TwistBipoint& x) const
  226. {
  227. size_t retval[2];
  228. bool infinity[2];
  229. TwistBipoint affine_x = x;
  230. std::hash<double> hasher;
  231. if (fp2e_iszero(affine_x[0]->m_z))
  232. {
  233. retval[0] = 0;
  234. infinity[0] = true;
  235. }
  236. else
  237. {
  238. retval[0] = 0;
  239. infinity[0] = false;
  240. }
  241. if (fp2e_iszero(affine_x[1]->m_z))
  242. {
  243. retval[1] = 0;
  244. infinity[1] = true;
  245. }
  246. else
  247. {
  248. retval[1] = 0;
  249. infinity[1] = false;
  250. }
  251. affine_x.make_affine();
  252. for (int i = 0; i < 2; i++)
  253. {
  254. for (int j = 0; j < 24 && !infinity[i]; j++)
  255. {
  256. retval[i] ^= hasher(affine_x[i]->m_x->v[j]);
  257. retval[i] ^= hasher(affine_x[i]->m_y->v[j]);
  258. }
  259. }
  260. return retval[0] ^ retval[1];
  261. }