Scalar.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  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. Scalar Scalar::operator+(const Scalar& b) const
  51. {
  52. mpz_class temp = element + b.element;
  53. mpz_mod(temp.get_mpz_t(), temp.get_mpz_t(), mpz_bn_p.get_mpz_t());
  54. return Scalar(temp);
  55. }
  56. Scalar Scalar::operator-(const Scalar& b) const
  57. {
  58. mpz_class temp = element - b.element;
  59. mpz_mod(temp.get_mpz_t(), temp.get_mpz_t(), mpz_bn_p.get_mpz_t());
  60. return Scalar(temp);
  61. }
  62. Scalar Scalar::operator*(const Scalar& b) const
  63. {
  64. mpz_class temp = element * b.element;
  65. mpz_mod(temp.get_mpz_t(), temp.get_mpz_t(), mpz_bn_p.get_mpz_t());
  66. return Scalar(temp);
  67. }
  68. Scalar Scalar::operator/(const Scalar& b) const
  69. {
  70. mpz_class temp;
  71. mpz_invert(temp.get_mpz_t(), b.element.get_mpz_t(), mpz_bn_p.get_mpz_t());
  72. temp *= element;
  73. mpz_mod(temp.get_mpz_t(), temp.get_mpz_t(), mpz_bn_p.get_mpz_t());
  74. return Scalar(temp);
  75. }
  76. Scalar& Scalar::operator++()
  77. {
  78. element++;
  79. mpz_mod(element.get_mpz_t(), element.get_mpz_t(), mpz_bn_p.get_mpz_t());
  80. return *this;
  81. }
  82. Scalar Scalar::operator++(int)
  83. {
  84. Scalar retval = *this;
  85. element++;
  86. mpz_mod(element.get_mpz_t(), element.get_mpz_t(), mpz_bn_p.get_mpz_t());
  87. return retval;
  88. }
  89. Scalar& Scalar::operator--()
  90. {
  91. element--;
  92. mpz_mod(element.get_mpz_t(), element.get_mpz_t(), mpz_bn_p.get_mpz_t());
  93. return *this;
  94. }
  95. Scalar Scalar::operator--(int)
  96. {
  97. Scalar retval = *this;
  98. element--;
  99. mpz_mod(element.get_mpz_t(), element.get_mpz_t(), mpz_bn_p.get_mpz_t());
  100. return retval;
  101. }
  102. Scalar Scalar::curveInverse() const
  103. {
  104. mpz_class temp;
  105. mpz_invert(temp.get_mpz_t(), element.get_mpz_t(), mpz_bn_n.get_mpz_t());
  106. return Scalar(temp);
  107. }
  108. void Scalar::mult(curvepoint_fp_t rop, const curvepoint_fp_t& op1) const
  109. {
  110. SecretScalar secret_element = to_scalar_t();
  111. curvepoint_fp_scalarmult_vartime(rop, op1, secret_element.expose());
  112. }
  113. void Scalar::mult(twistpoint_fp2_t rop, const twistpoint_fp2_t& op1) const
  114. {
  115. SecretScalar secret_element = to_scalar_t();
  116. twistpoint_fp2_scalarmult_vartime(rop, op1, secret_element.expose());
  117. }
  118. void Scalar::mult(fp12e_t rop, const fp12e_t& op1) const
  119. {
  120. SecretScalar secret_element = to_scalar_t();
  121. fp12e_pow_vartime(rop, op1, secret_element.expose());
  122. }
  123. bool Scalar::operator==(const Scalar& b) const
  124. {
  125. return element == b.element;
  126. }
  127. bool Scalar::operator!=(const Scalar& b) const
  128. {
  129. return element != b.element;
  130. }
  131. Scalar::SecretScalar::SecretScalar()
  132. { }
  133. Scalar::SecretScalar::SecretScalar(const Scalar& input)
  134. {
  135. set(input.element);
  136. }
  137. Scalar::SecretScalar::SecretScalar(mpz_class input)
  138. {
  139. set(input);
  140. }
  141. const scalar_t& Scalar::SecretScalar::expose() const
  142. {
  143. return element;
  144. }
  145. void Scalar::SecretScalar::set(mpz_class input)
  146. {
  147. std::stringstream buffer;
  148. char temp[17];
  149. buffer << std::setfill('0') << std::setw(64) << input.get_str(16);
  150. for (int i = 3; i >= 0; i--)
  151. {
  152. buffer.get(temp, 17);
  153. element[i] = strtoull(temp, NULL, 16);
  154. }
  155. }
  156. Scalar::SecretScalar Scalar::to_scalar_t() const
  157. {
  158. return SecretScalar(element);
  159. }
  160. std::ostream& operator<<(std::ostream& os, const Scalar& output)
  161. {
  162. os << output.element;
  163. return os;
  164. }
  165. std::istream& operator>>(std::istream& is, Scalar& input)
  166. {
  167. is >> input.element;
  168. return is;
  169. }