Scalar.cpp 4.2 KB

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