#ifndef __PUBLICKEY_HPP #define __PUBLICKEY_HPP #include "Scalar.hpp" #include "Bipoint.hpp" #include "Quadripoint.hpp" #include "pairing.hpp" class PublicKey { public: PublicKey() = default; PublicKey(const Bipoint& g, const Bipoint& h, const Bipoint& g1, const Bipoint& h1); void set(const Bipoint& g, const Bipoint& h, const Bipoint& g1, const Bipoint& h1); void encrypt(Bipoint& G_element, const Scalar& cleartext) const; void encrypt(Bipoint& H_element, const Scalar& cleartext) const; void encrypt(Bipoint& G_element, Bipoint& H_element, const Scalar& cleartext) const; Bipoint homomorphic_addition(const Bipoint& a, const Bipoint& b) const; Bipoint homomorphic_addition(const Bipoint& a, const Bipoint& b) const; Quadripoint homomorphic_addition(const Quadripoint& a, const Quadripoint& b) const; Quadripoint homomorphic_multiplication(const Bipoint& a, const Bipoint& b) const; Bipoint get_bipoint_curvegen() const; Bipoint get_bipoint_twistgen() const; Bipoint get_bipoint_curve_subgroup_gen() const; Bipoint get_bipoint_twist_subgroup_gen() const; private: Bipoint bipoint_curvegen; // g Bipoint bipoint_twistgen; // h Bipoint bipoint_curve_subgroup_gen; // (g^(a1), g^(b1)) Bipoint bipoint_twist_subgroup_gen; // (h^(a2), h^(b2)) }; #endif