PublicKey.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include "PublicKey.hpp"
  2. void PublicKey::encrypt(Bipoint<curvepoint_fp_t>& G_element, const Scalar& cleartext) const
  3. {
  4. Scalar lambda;
  5. lambda.set_random();
  6. Bipoint<curvepoint_fp_t> 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(Bipoint<twistpoint_fp2_t>& H_element, const Scalar& cleartext) const
  12. {
  13. Scalar lambda;
  14. lambda.set_random();
  15. Bipoint<twistpoint_fp2_t> 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(Bipoint<curvepoint_fp_t>& G_element, Bipoint<twistpoint_fp2_t>& H_element, const Scalar& cleartext) const
  21. {
  22. encrypt(G_element, cleartext);
  23. encrypt(H_element, cleartext);
  24. }
  25. Bipoint<curvepoint_fp_t> homomorphic_addition(const Bipoint<curvepoint_fp_t>& a, const Bipoint<curvepoint_fp_t>& b) const
  26. {
  27. Scalar lambda;
  28. lambda.set_random();
  29. Bipoint<curvepoint_fp_t> random_mask;
  30. random_mask = bipoint_curve_subgroup_gen * lambda;
  31. return a + b + random_mask;
  32. }
  33. Bipoint<twistpoint_fp2_t> homomorphic_addition(const Bipoint<twistpoint_fp2_t>& a, const Bipoint<twistpoint_fp2_t>& b) const
  34. {
  35. Scalar lambda;
  36. lambda.set_random();
  37. Bipoint<curvepoint_fp_t> random_mask;
  38. random_mask = bipoint_twist_subgroup_gen * lambda;
  39. return a + b + random_mask;
  40. }
  41. Quadripoint homomorphic_addition(const Quadripoint& a, const Quadripoint& b) const
  42. {
  43. Quadripoint random_mask;
  44. Bipoint<curvepoint_fp_t> random_mask_curve;
  45. Bipoint<twistpoint_fp2_t> 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_curve.make_affine();
  51. random_mask_twist = bipoint_twist_subgroup_gen * lambda2;
  52. random_mask_twist.make_affine();
  53. random_mask = pairing(bipoint_curvegen, random_mask_twist) + pairing(random_mask_curve, bipoint_twistgen);
  54. return a + b + random_mask;
  55. }
  56. Quadripoint homomorphic_multiplication(const Bipoint<curvepoint_fp_t>& a, const Bipoint<twistpoint_fp2_t>& b) const
  57. {
  58. Quadripoint random_mask;
  59. Bipoint<curvepoint_fp_t> random_mask_curve;
  60. Bipoint<twistpoint_fp2_t> random_mask_twist;
  61. Bipoint<curvepoint_fp_t> a_copy = a;
  62. Bipoint<twistpoint_fp2_t> b_copy = b;
  63. a_copy.make_affine();
  64. b_copy.make_affine();
  65. Scalar lambda1, lambda2;
  66. lambda1.set_random();
  67. lambda2.set_random();
  68. random_mask_curve = bipoint_curve_subgroup_gen * lambda1;
  69. random_mask_curve.makeaffine();
  70. random_mask_twist = bipoint_twist_subgroup_gen * lambda2;
  71. random_mask_twist.makeaffine();
  72. random_mask = pairing(bipoint_curvegen, random_mask_twist) + pairing(random_mask_curve, bipoint_twistgen);
  73. return pairing(a_copy, b_copy) + random_mask;
  74. }
  75. Bipoint<curvepoint_fp_t> PublicKey::get_bipoint_curvegen() const
  76. {
  77. return bipoint_curvegen;
  78. }
  79. Bipoint<twistpoint_fp2_t> PublicKey::get_bipoint_twistgen() const
  80. {
  81. return bipoint_twistgen;
  82. }
  83. Bipoint<curvepoint_fp_t> PublicKey::get_bipoint_curve_subgroup_gen() const
  84. {
  85. return bipoint_curve_subgroup_gen;
  86. }
  87. Bipoint<twistpoint_fp2_t> PublicKey::get_bipoint_twist_subgroup_gen() const
  88. {
  89. return bipoint_twist_subgroup_gen;
  90. }
  91. PublicKey::PublicKey()
  92. { }
  93. void PublicKey::set(const Bipoint<curvepoint_fp_t>& g, const Bipoint<twistpoint_fp2_t>& h, const Bipoint<curvepoint_fp_t>& g1, const Bipoint<twistpoint_fp2_t>& h1)
  94. {
  95. bipoint_curvegen = g;
  96. bipoint_twistgen = h;
  97. bipoint_curve_subgroup_gen = g1;
  98. bipoint_twist_subgroup_gen = h1;
  99. }