PublicKey.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include "PublicKey.hpp"
  2. void PublicKey::encrypt(CurveBipoint& G_element, const Scalar& cleartext) const
  3. {
  4. Scalar lambda;
  5. lambda.set_random();
  6. CurveBipoint cleartext_as_element, random_mask;
  7. cleartext_as_element = get_bipoint_curvegen() * cleartext;
  8. random_mask = get_bipoint_curve_subgroup_gen() * lambda;
  9. G_element = cleartext_as_element + random_mask;
  10. }
  11. void PublicKey::encrypt(TwistBipoint& H_element, const Scalar& cleartext) const
  12. {
  13. Scalar lambda;
  14. lambda.set_random();
  15. TwistBipoint cleartext_as_element, random_mask;
  16. cleartext_as_element = get_bipoint_twistgen() * cleartext;
  17. random_mask = get_bipoint_twist_subgroup_gen() * lambda;
  18. H_element = cleartext_as_element + random_mask;
  19. }
  20. void PublicKey::encrypt(CurveBipoint& G_element, TwistBipoint& H_element, const Scalar& cleartext) const
  21. {
  22. encrypt(G_element, cleartext);
  23. encrypt(H_element, cleartext);
  24. }
  25. CurveBipoint PublicKey::homomorphic_addition(const CurveBipoint& a, const CurveBipoint& b) const
  26. {
  27. Scalar lambda;
  28. lambda.set_random();
  29. CurveBipoint random_mask;
  30. random_mask = bipoint_curve_subgroup_gen * lambda;
  31. return a + b + random_mask;
  32. }
  33. TwistBipoint PublicKey::homomorphic_addition(const TwistBipoint& a, const TwistBipoint& b) const
  34. {
  35. Scalar lambda;
  36. lambda.set_random();
  37. TwistBipoint random_mask;
  38. random_mask = bipoint_twist_subgroup_gen * lambda;
  39. return a + b + random_mask;
  40. }
  41. Quadripoint PublicKey::homomorphic_addition(const Quadripoint& a, const Quadripoint& b) const
  42. {
  43. Quadripoint random_mask;
  44. CurveBipoint random_mask_curve;
  45. TwistBipoint random_mask_twist;
  46. Scalar lambda1, lambda2;
  47. lambda1.set_random();
  48. lambda2.set_random();
  49. random_mask_curve = bipoint_curve_subgroup_gen * lambda1;
  50. random_mask_twist = bipoint_twist_subgroup_gen * lambda2;
  51. random_mask = pairing(bipoint_curvegen, random_mask_twist) + pairing(random_mask_curve, bipoint_twistgen);
  52. return a + b + random_mask;
  53. }
  54. Quadripoint PublicKey::homomorphic_multiplication(const CurveBipoint& a, const TwistBipoint& b) const
  55. {
  56. Quadripoint random_mask;
  57. CurveBipoint random_mask_curve;
  58. TwistBipoint random_mask_twist;
  59. Scalar lambda1, lambda2;
  60. lambda1.set_random();
  61. lambda2.set_random();
  62. random_mask_curve = bipoint_curve_subgroup_gen * lambda1;
  63. random_mask_twist = bipoint_twist_subgroup_gen * lambda2;
  64. random_mask = pairing(bipoint_curvegen, random_mask_twist) + pairing(random_mask_curve, bipoint_twistgen);
  65. return pairing(a, b) + random_mask;
  66. }
  67. CurveBipoint PublicKey::get_bipoint_curvegen() const
  68. {
  69. return bipoint_curvegen;
  70. }
  71. TwistBipoint PublicKey::get_bipoint_twistgen() const
  72. {
  73. return bipoint_twistgen;
  74. }
  75. CurveBipoint PublicKey::get_bipoint_curve_subgroup_gen() const
  76. {
  77. return bipoint_curve_subgroup_gen;
  78. }
  79. TwistBipoint PublicKey::get_bipoint_twist_subgroup_gen() const
  80. {
  81. return bipoint_twist_subgroup_gen;
  82. }
  83. PublicKey::PublicKey()
  84. { }
  85. void PublicKey::set(const CurveBipoint& g, const TwistBipoint& h, const CurveBipoint& g1, const TwistBipoint& h1)
  86. {
  87. bipoint_curvegen = g;
  88. bipoint_twistgen = h;
  89. bipoint_curve_subgroup_gen = g1;
  90. bipoint_twist_subgroup_gen = h1;
  91. }