homomorphic_operations.cpp 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include "homomorphic_operations.hpp"
  2. extern const scalar_t bn_n;
  3. Bipoint<curvepoint_fp_t> bgn_homomorphic_addition(const Bipoint<curvepoint_fp_t>& a, const Bipoint<curvepoint_fp_t>& b, const PublicKey& public_key)
  4. {
  5. Bipoint<curvepoint_fp_t> retval, random_mask;
  6. scalar_t lambda;
  7. scalar_setrandom(lambda, bn_n);
  8. random_mask = public_key.get_bipoint_curve_groupelt().scalarmult_vartime(lambda);
  9. random_mask.makeaffine();
  10. retval = a + b + random_mask;
  11. retval.makeaffine();
  12. return retval;
  13. }
  14. Bipoint<twistpoint_fp2_t> bgn_homomorphic_addition(const Bipoint<twistpoint_fp2_t>& a, const Bipoint<twistpoint_fp2_t>& b, const PublicKey& public_key)
  15. {
  16. Bipoint<curvepoint_fp_t> retval, random_mask;
  17. scalar_t lambda;
  18. scalar_setrandom(lambda, bn_n);
  19. random_mask = public_key.get_bipoint_twist_groupelt().scalarmult_vartime(lambda);
  20. random_mask.makeaffine();
  21. retval = a + b + random_mask;
  22. retval.makeaffine();
  23. return retval;
  24. }
  25. Quadripoint bgn_homomorphic_addition(const Quadripoint& a, const Quadripoint& b, const PublicKey& public_key)
  26. {
  27. Quadripoint retval, random_mask;
  28. Bipoint<curvepoint_fp_t> random_mask_curve;
  29. Bipoint<twistpoint_fp2_t> random_mask_twist;
  30. scalar_t lambda1, lambda2;
  31. scalar_setrandom(lambda1, bn_n);
  32. scalar_setrandom(lambda2, bn_n);
  33. random_mask_curve = public_key.get_bipoint_curve_groupelt().scalarmult_vartime(lambda1);
  34. random_mask_curve.makeaffine();
  35. random_mask_twist = public_key.get_bipoint_twist_groupelt().scalarmult_vartime(lambda2);
  36. random_mask_twist.makeaffine();
  37. random_mask = pairing(public_key.get_bipoint_curvegen(), random_mask_twist) * pairing(random_mask_curve, public_key.get_bipoint_twistgen());
  38. retval = a * b * random_mask;
  39. return retval;
  40. }
  41. Quadripoint bgn_homomorphic_multiplication(const Bipoint<curvepoint_fp_t>& a, const Bipoint<twistpoint_fp2_t>& b, const PublicKey& public_key)
  42. {
  43. Quadripoint retval, random_mask;
  44. Bipoint<curvepoint_fp_t> random_mask_curve;
  45. Bipoint<twistpoint_fp2_t> random_mask_twist;
  46. scalar_t lambda1, lambda2;
  47. scalar_setrandom(lambda1, bn_n);
  48. scalar_setrandom(lambda2, bn_n);
  49. random_mask_curve = public_key.get_bipoint_curve_groupelt().scalarmult_vartime(lambda1);
  50. random_mask_curve.makeaffine();
  51. random_mask_twist = public_key.get_bipoint_twist_groupelt().scalarmult_vartime(lambda2);
  52. random_mask_twist.makeaffine();
  53. random_mask = pairing(public_key.get_bipoint_curvegen(), random_mask_twist) * pairing(random_mask_curve, public_key.get_bipoint_twistgen());
  54. retval = pairing(a, b) * random_mask;
  55. return retval;
  56. }