123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- #include "PublicKey.hpp"
- BGNPublicKey::BGNPublicKey(const BGNPublicKey& other)
- : bipoint_curvegen(other.bipoint_curvegen), bipoint_twistgen(other.bipoint_twistgen),
- bipoint_curve_subgroup_gen(other.bipoint_curve_subgroup_gen),
- bipoint_twist_subgroup_gen(other.bipoint_twist_subgroup_gen)
- { }
- void BGNPublicKey::encrypt(CurveBipoint& G_element, const Scalar& cleartext) const
- {
- Scalar lambda;
- lambda.set_random();
- CurveBipoint 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 BGNPublicKey::encrypt(TwistBipoint& H_element, const Scalar& cleartext) const
- {
- Scalar lambda;
- lambda.set_random();
- TwistBipoint 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 BGNPublicKey::encrypt(CurveBipoint& G_element, TwistBipoint& H_element, const Scalar& cleartext) const
- {
- encrypt(G_element, cleartext);
- encrypt(H_element, cleartext);
- }
- CurveBipoint BGNPublicKey::homomorphic_addition(const CurveBipoint& a, const CurveBipoint& b) const
- {
- Scalar lambda;
- lambda.set_random();
- CurveBipoint random_mask;
- random_mask = bipoint_curve_subgroup_gen * lambda;
- return a + b + random_mask;
- }
- TwistBipoint BGNPublicKey::homomorphic_addition(const TwistBipoint& a, const TwistBipoint& b) const
- {
- Scalar lambda;
- lambda.set_random();
- TwistBipoint random_mask;
- random_mask = bipoint_twist_subgroup_gen * lambda;
- return a + b + random_mask;
- }
- Quadripoint BGNPublicKey::homomorphic_addition(const Quadripoint& a, const Quadripoint& b) const
- {
- Quadripoint random_mask;
- CurveBipoint random_mask_curve;
- TwistBipoint random_mask_twist;
-
- Scalar lambda1, lambda2;
- lambda1.set_random();
- lambda2.set_random();
- random_mask_curve = bipoint_curve_subgroup_gen * lambda1;
- random_mask_twist = bipoint_twist_subgroup_gen * lambda2;
- random_mask = pairing(bipoint_curvegen, random_mask_twist) + pairing(random_mask_curve, bipoint_twistgen);
- return a + b + random_mask;
- }
- Quadripoint BGNPublicKey::homomorphic_multiplication(const CurveBipoint& a, const TwistBipoint& b) const
- {
- Quadripoint random_mask;
- CurveBipoint random_mask_curve;
- TwistBipoint random_mask_twist;
-
- Scalar lambda1, lambda2;
- lambda1.set_random();
- lambda2.set_random();
- random_mask_curve = bipoint_curve_subgroup_gen * lambda1;
- random_mask_twist = bipoint_twist_subgroup_gen * lambda2;
- random_mask = pairing(bipoint_curvegen, random_mask_twist) + pairing(random_mask_curve, bipoint_twistgen);
- return pairing(a, b) + random_mask;
- }
- CurveBipoint BGNPublicKey::rerandomize(const CurveBipoint& a) const
- {
- Scalar lambda;
- lambda.set_random();
- CurveBipoint random_mask;
- random_mask = bipoint_curve_subgroup_gen * lambda;
- return a + random_mask;
- }
- TwistBipoint BGNPublicKey::rerandomize(const TwistBipoint& a) const
- {
- Scalar lambda;
- lambda.set_random();
- TwistBipoint random_mask;
- random_mask = bipoint_twist_subgroup_gen * lambda;
- return a + random_mask;
- }
- Quadripoint BGNPublicKey::rerandomize(const Quadripoint& a) const
- {
- Quadripoint random_mask;
- CurveBipoint random_mask_curve;
- TwistBipoint random_mask_twist;
-
- Scalar lambda1, lambda2;
- lambda1.set_random();
- lambda2.set_random();
- random_mask_curve = bipoint_curve_subgroup_gen * lambda1;
- random_mask_twist = bipoint_twist_subgroup_gen * lambda2;
- random_mask = pairing(bipoint_curvegen, random_mask_twist) + pairing(random_mask_curve, bipoint_twistgen);
- return a + random_mask;
- }
- CurveBipoint BGNPublicKey::get_bipoint_curvegen() const
- {
- return bipoint_curvegen;
- }
- TwistBipoint BGNPublicKey::get_bipoint_twistgen() const
- {
- return bipoint_twistgen;
- }
- CurveBipoint BGNPublicKey::get_bipoint_curve_subgroup_gen() const
- {
- return bipoint_curve_subgroup_gen;
- }
- TwistBipoint BGNPublicKey::get_bipoint_twist_subgroup_gen() const
- {
- return bipoint_twist_subgroup_gen;
- }
- BGNPublicKey::BGNPublicKey()
- { }
- void BGNPublicKey::set(const CurveBipoint& g, const TwistBipoint& h, const CurveBipoint& g1, const TwistBipoint& h1)
- {
- bipoint_curvegen = g;
- bipoint_twistgen = h;
-
- bipoint_curve_subgroup_gen = g1;
- bipoint_twist_subgroup_gen = h1;
- }
|