Scalar.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. #include "Scalar.hpp"
  2. #include <iostream>
  3. extern const scalar_t bn_n;
  4. mpz_class Scalar::mpz_bn_p = 0;
  5. mpz_class Scalar::mpz_bn_n = 0;
  6. Scalar::Scalar()
  7. {
  8. element = 0;
  9. }
  10. Scalar::Scalar(const scalar_t& input)
  11. {
  12. set(input);
  13. }
  14. Scalar::Scalar(mpz_class input)
  15. {
  16. set(input);
  17. }
  18. void Scalar::init()
  19. {
  20. mpz_bn_p = mpz_class("8FB501E34AA387F9AA6FECB86184DC21EE5B88D120B5B59E185CAC6C5E089667", 16);
  21. mpz_bn_n = mpz_class("8FB501E34AA387F9AA6FECB86184DC212E8D8E12F82B39241A2EF45B57AC7261", 16);
  22. }
  23. void Scalar::set(const scalar_t& input)
  24. {
  25. std::stringstream bufferstream;
  26. std::string buffer;
  27. mpz_class temp;
  28. bufferstream << std::hex << input[3] << input[2] << input[1] << input[0];
  29. bufferstream >> buffer;
  30. temp.set_str(buffer, 16);
  31. mpz_mod(temp.get_mpz_t(), temp.get_mpz_t(), mpz_bn_p.get_mpz_t());
  32. element = temp;
  33. }
  34. void Scalar::set(mpz_class input)
  35. {
  36. mpz_class temp = input;
  37. mpz_mod(temp.get_mpz_t(), temp.get_mpz_t(), mpz_bn_p.get_mpz_t());
  38. element = temp;
  39. }
  40. void Scalar::set_random()
  41. {
  42. scalar_t temp;
  43. /* When we ask for a random number,
  44. * we really mean a seed to find a random element of a group
  45. * and the order of the curve either is bn_n or is divided by it
  46. * (not bn_p) */
  47. scalar_setrandom(temp, bn_n);
  48. set(temp);
  49. }
  50. mpz_class Scalar::toInt() const
  51. {
  52. return element;
  53. }
  54. Scalar Scalar::operator+(const Scalar& b) const
  55. {
  56. mpz_class temp = element + b.element;
  57. mpz_mod(temp.get_mpz_t(), temp.get_mpz_t(), mpz_bn_p.get_mpz_t());
  58. return Scalar(temp);
  59. }
  60. Scalar Scalar::operator-(const Scalar& b) const
  61. {
  62. mpz_class temp = element - b.element;
  63. mpz_mod(temp.get_mpz_t(), temp.get_mpz_t(), mpz_bn_p.get_mpz_t());
  64. return Scalar(temp);
  65. }
  66. Scalar Scalar::operator*(const Scalar& b) const
  67. {
  68. mpz_class temp = element * b.element;
  69. mpz_mod(temp.get_mpz_t(), temp.get_mpz_t(), mpz_bn_p.get_mpz_t());
  70. return Scalar(temp);
  71. }
  72. Scalar Scalar::operator/(const Scalar& b) const
  73. {
  74. mpz_class temp;
  75. mpz_invert(temp.get_mpz_t(), b.element.get_mpz_t(), mpz_bn_p.get_mpz_t());
  76. temp *= element;
  77. mpz_mod(temp.get_mpz_t(), temp.get_mpz_t(), mpz_bn_p.get_mpz_t());
  78. return Scalar(temp);
  79. }
  80. Scalar& Scalar::operator++()
  81. {
  82. element++;
  83. mpz_mod(element.get_mpz_t(), element.get_mpz_t(), mpz_bn_p.get_mpz_t());
  84. return *this;
  85. }
  86. Scalar Scalar::operator++(int)
  87. {
  88. Scalar retval = *this;
  89. element++;
  90. mpz_mod(element.get_mpz_t(), element.get_mpz_t(), mpz_bn_p.get_mpz_t());
  91. return retval;
  92. }
  93. Scalar& Scalar::operator--()
  94. {
  95. element--;
  96. mpz_mod(element.get_mpz_t(), element.get_mpz_t(), mpz_bn_p.get_mpz_t());
  97. return *this;
  98. }
  99. Scalar Scalar::operator--(int)
  100. {
  101. Scalar retval = *this;
  102. element--;
  103. mpz_mod(element.get_mpz_t(), element.get_mpz_t(), mpz_bn_p.get_mpz_t());
  104. return retval;
  105. }
  106. Scalar Scalar::curveAdd(const Scalar& b) const
  107. {
  108. mpz_class temp = element + b.element;
  109. mpz_mod(temp.get_mpz_t(), temp.get_mpz_t(), mpz_bn_n.get_mpz_t());
  110. return Scalar(temp);
  111. }
  112. Scalar Scalar::curveSub(const Scalar& b) const
  113. {
  114. mpz_class temp = element - b.element;
  115. mpz_mod(temp.get_mpz_t(), temp.get_mpz_t(), mpz_bn_n.get_mpz_t());
  116. return Scalar(temp);
  117. }
  118. Scalar Scalar::curveMult(const Scalar& b) const
  119. {
  120. mpz_class temp = element * b.element;
  121. mpz_mod(temp.get_mpz_t(), temp.get_mpz_t(), mpz_bn_n.get_mpz_t());
  122. return Scalar(temp);
  123. }
  124. Scalar Scalar::curveInverse() const
  125. {
  126. mpz_class temp;
  127. mpz_invert(temp.get_mpz_t(), element.get_mpz_t(), mpz_bn_n.get_mpz_t());
  128. return Scalar(temp);
  129. }
  130. void Scalar::mult(curvepoint_fp_t rop, const curvepoint_fp_t& op1) const
  131. {
  132. SecretScalar secret_element = to_scalar_t();
  133. curvepoint_fp_scalarmult_vartime(rop, op1, secret_element.expose());
  134. }
  135. void Scalar::mult(twistpoint_fp2_t rop, const twistpoint_fp2_t& op1) const
  136. {
  137. SecretScalar secret_element = to_scalar_t();
  138. twistpoint_fp2_scalarmult_vartime(rop, op1, secret_element.expose());
  139. }
  140. void Scalar::mult(fp12e_t rop, const fp12e_t& op1) const
  141. {
  142. SecretScalar secret_element = to_scalar_t();
  143. fp12e_pow_vartime(rop, op1, secret_element.expose());
  144. }
  145. bool Scalar::operator==(const Scalar& b) const
  146. {
  147. return element == b.element;
  148. }
  149. bool Scalar::operator<(const Scalar& b) const
  150. {
  151. return element < b.element;
  152. }
  153. bool Scalar::operator<=(const Scalar& b) const
  154. {
  155. return element <= b.element;
  156. }
  157. bool Scalar::operator>(const Scalar& b) const
  158. {
  159. return element > b.element;
  160. }
  161. bool Scalar::operator>=(const Scalar& b) const
  162. {
  163. return element >= b.element;
  164. }
  165. bool Scalar::operator!=(const Scalar& b) const
  166. {
  167. return element != b.element;
  168. }
  169. Scalar::SecretScalar::SecretScalar()
  170. { }
  171. Scalar::SecretScalar::SecretScalar(const Scalar& input)
  172. {
  173. set(input.element);
  174. }
  175. Scalar::SecretScalar::SecretScalar(mpz_class input)
  176. {
  177. set(input);
  178. }
  179. const scalar_t& Scalar::SecretScalar::expose() const
  180. {
  181. return element;
  182. }
  183. void Scalar::SecretScalar::set(mpz_class input)
  184. {
  185. std::stringstream buffer;
  186. char temp[17];
  187. buffer << std::setfill('0') << std::setw(64) << input.get_str(16);
  188. for (int i = 3; i >= 0; i--)
  189. {
  190. buffer.get(temp, 17);
  191. element[i] = strtoull(temp, NULL, 16);
  192. }
  193. }
  194. Scalar::SecretScalar Scalar::to_scalar_t() const
  195. {
  196. return SecretScalar(element);
  197. }
  198. std::ostream& operator<<(std::ostream& os, const Scalar& output)
  199. {
  200. os << output.element;
  201. return os;
  202. }
  203. std::istream& operator>>(std::istream& is, Scalar& input)
  204. {
  205. is >> input.element;
  206. return is;
  207. }