#ifndef __BGN_HPP #define __BGN_HPP #include "Scalar.hpp" #include "Bipoint.hpp" #include "Quadripoint.hpp" #include "PublicKey.hpp" #include "PrivateKey.hpp" class BGN { public: BGN(); 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; Scalar decrypt(const Bipoint& ciphertext) const; Scalar decrypt(const Bipoint& ciphertext) const; Scalar decrypt(const Quadripoint& ciphertext) const; PublicKey get_public_key() const; private: PublicKey public_key; PrivateKey private_key; }; #endif /* __BGN_HPP */