/* * SimpleEncCommit.h * */ #ifndef FHEOFFLINE_SIMPLEENCCOMMIT_H_ #define FHEOFFLINE_SIMPLEENCCOMMIT_H_ #include "FHEOffline/EncCommit.h" #include "FHEOffline/Proof.h" #include "FHEOffline/Prover.h" #include "FHEOffline/Verifier.h" #include "Tools/MemoryUsage.h" class MachineBase; typedef map TimerMap; template class SimpleEncCommitBase : public EncCommitBase { protected: int sec; int extra_slack; int n_rounds; void generate_ciphertexts(AddableVector& c, const vector >& m, Proof::Randomness& r, const FHE_PK& pk, map& timers); virtual void prepare_plaintext(PRNG& G) = 0; public: MemoryUsage memory_usage; SimpleEncCommitBase(const MachineBase& machine); virtual ~SimpleEncCommitBase() {} void report_size(ReportType type, MemoryUsage& res) { (void)type; res += memory_usage; } }; template using SimpleEncCommitBase_ = SimpleEncCommitBase; template class NonInteractiveProofSimpleEncCommit : public SimpleEncCommitBase_ { protected: typedef bigint S; const PlayerBase& P; const FHE_PK& pk; const FD& FTD; NonInteractiveProof proof; #ifdef LESS_ALLOC_MORE_MEM Proof::Randomness r; Prover > prover; Verifier verifier; #endif virtual const FHE_PK& get_pk_for_verification(int offset) = 0; virtual void add_ciphertexts(vector& ciphertexts, int offset) = 0; public: map& timers; NonInteractiveProofSimpleEncCommit(const PlayerBase& P, const FHE_PK& pk, const FD& FTD, map& timers, const MachineBase& machine); virtual ~NonInteractiveProofSimpleEncCommit() {} size_t generate_proof(AddableVector& c, const vector >& m, octetStream& ciphertexts, octetStream& cleartexts); size_t create_more(octetStream& my_ciphertext, octetStream& my_cleartext); virtual size_t report_size(ReportType type); using SimpleEncCommitBase_::report_size; }; template class SimpleEncCommitFactory { protected: int cnt; AddableVector c; AddableVector< Plaintext_ > m; int n_calls; void prepare_plaintext(PRNG& G); virtual void create_more() = 0; public: SimpleEncCommitFactory(const FHE_PK& pk, const FD& FTD, const MachineBase& machine); virtual ~SimpleEncCommitFactory(); bool has_left() { return cnt >= 0; } void next(Plaintext_& mess, Ciphertext& C); virtual size_t report_size(ReportType type); void report_size(ReportType type, MemoryUsage& res); }; template class SimpleEncCommit: public NonInteractiveProofSimpleEncCommit, public SimpleEncCommitFactory { protected: const FHE_PK& get_pk_for_verification(int offset) { (void)offset; return this->pk; } void prepare_plaintext(PRNG& G) { SimpleEncCommitFactory::prepare_plaintext(G); } void add_ciphertexts(vector& ciphertexts, int offset); public: SimpleEncCommit(const PlayerBase& P, const FHE_PK& pk, const FD& FTD, map& timers, const MachineBase& machine, int thread_num); void next(Plaintext_& mess, Ciphertext& C) { SimpleEncCommitFactory::next(mess, C); } void create_more(); size_t report_size(ReportType type) { return SimpleEncCommitFactory::report_size(type) + EncCommitBase_::report_size(type); } void report_size(ReportType type, MemoryUsage& res) { SimpleEncCommitFactory::report_size(type, res); SimpleEncCommitBase_::report_size(type, res); } }; template using SimpleEncCommit_ = SimpleEncCommit; template class SummingEncCommit: public SimpleEncCommitFactory, public SimpleEncCommitBase_ { typedef bigint S; InteractiveProof proof; const FHE_PK& pk; const FD& FTD; const Player& P; int thread_num; #ifdef LESS_ALLOC_MORE_MEM Prover > prover; Verifier verifier; Proof::Preimages preimages; #endif void prepare_plaintext(PRNG& G) { SimpleEncCommitFactory::prepare_plaintext(G); } public: map& timers; SummingEncCommit(const Player& P, const FHE_PK& pk, const FD& FTD, map& timers, const MachineBase& machine, int thread_num) : SimpleEncCommitFactory(pk, FTD, machine), SimpleEncCommitBase_(machine), proof(this->sec, pk, P.num_players()), pk(pk), FTD(FTD), P(P), thread_num(thread_num), #ifdef LESS_ALLOC_MORE_MEM prover(proof, FTD), verifier(proof), preimages(proof.V, this->pk, FTD.get_prime(), P.num_players()), #endif timers(timers) {} void next(Plaintext_& mess, Ciphertext& C) { SimpleEncCommitFactory::next(mess, C); } void create_more(); size_t report_size(ReportType type); void report_size(ReportType type, MemoryUsage& res) { SimpleEncCommitFactory::report_size(type, res); SimpleEncCommitBase_::report_size(type, res); } }; template class Multiplier; template class PairwiseGenerator; template class MultiEncCommit : public NonInteractiveProofSimpleEncCommit { friend PairwiseGenerator; protected: const vector& pks; const Player& P; PairwiseGenerator& generator; void prepare_plaintext(PRNG& G) { (void)G; } const FHE_PK& get_pk_for_verification(int offset) { return pks[(P.my_num() - offset + P.num_players()) % P.num_players()]; } void add_ciphertexts(vector& ciphertexts, int offset); public: MultiEncCommit(const Player& P, const vector& pks, const FD& FTD, map& timers, MachineBase& machine, PairwiseGenerator& generator); }; #endif /* FHEOFFLINE_SIMPLEENCCOMMIT_H_ */