#include "PublicKey.hpp" void PublicKey::encrypt(Bipoint& G_element, const Scalar& cleartext) const { Scalar lambda; lambda.set_random(); Bipoint cleartext_as_element, random_mask; cleartext_as_element = get_bipoint_curvegen() * cleartext; random_mask = get_bipoint_curve_subgroup_gen() * lambda; G_element = cleartext_as_element + random_mask; } void PublicKey::encrypt(Bipoint& H_element, const Scalar& cleartext) const { Scalar lambda; lambda.set_random(); Bipoint cleartext_as_element, random_mask; cleartext_as_element = get_bipoint_twistgen() * cleartext; random_mask = get_bipoint_twist_subgroup_gen() * lambda; H_element = cleartext_as_element + random_mask; } void PublicKey::encrypt(Bipoint& G_element, Bipoint& H_element, const Scalar& cleartext) const { encrypt(G_element, cleartext); encrypt(H_element, cleartext); } Bipoint homomorphic_addition(const Bipoint& a, const Bipoint& b) const { Scalar lambda; lambda.set_random(); Bipoint random_mask; random_mask = bipoint_curve_subgroup_gen * lambda; return a + b + random_mask; } Bipoint homomorphic_addition(const Bipoint& a, const Bipoint& b) const { Scalar lambda; lambda.set_random(); Bipoint random_mask; random_mask = bipoint_twist_subgroup_gen * lambda; return a + b + random_mask; } Quadripoint homomorphic_addition(const Quadripoint& a, const Quadripoint& b) const { Quadripoint random_mask; Bipoint random_mask_curve; Bipoint random_mask_twist; Scalar lambda1, lambda2; lambda1.set_random(); lambda2.set_random(); random_mask_curve = bipoint_curve_subgroup_gen * lambda1; random_mask_curve.make_affine(); random_mask_twist = bipoint_twist_subgroup_gen * lambda2; random_mask_twist.make_affine(); random_mask = pairing(bipoint_curvegen, random_mask_twist) + pairing(random_mask_curve, bipoint_twistgen); return a + b + random_mask; } Quadripoint homomorphic_multiplication(const Bipoint& a, const Bipoint& b) const { Quadripoint random_mask; Bipoint random_mask_curve; Bipoint random_mask_twist; Bipoint a_copy = a; Bipoint b_copy = b; a_copy.make_affine(); b_copy.make_affine(); Scalar lambda1, lambda2; lambda1.set_random(); lambda2.set_random(); random_mask_curve = bipoint_curve_subgroup_gen * lambda1; random_mask_curve.makeaffine(); random_mask_twist = bipoint_twist_subgroup_gen * lambda2; random_mask_twist.makeaffine(); random_mask = pairing(bipoint_curvegen, random_mask_twist) + pairing(random_mask_curve, bipoint_twistgen); return pairing(a_copy, b_copy) + random_mask; } Bipoint PublicKey::get_bipoint_curvegen() const { return bipoint_curvegen; } Bipoint PublicKey::get_bipoint_twistgen() const { return bipoint_twistgen; } Bipoint PublicKey::get_bipoint_curve_subgroup_gen() const { return bipoint_curve_subgroup_gen; } Bipoint PublicKey::get_bipoint_twist_subgroup_gen() const { return bipoint_twist_subgroup_gen; } PublicKey::PublicKey() { } void PublicKey::set(const Bipoint& g, const Bipoint& h, const Bipoint& g1, const Bipoint& h1) { bipoint_curvegen = g; bipoint_twistgen = h; bipoint_curve_subgroup_gen = g1; bipoint_twist_subgroup_gen = h1; }