/* * 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 extra_slack; int n_rounds; void generate_ciphertexts(AddableVector& c, const vector >& m, Proof::Randomness& r, const FHE_PK& pk, map& timers, Proof& proof); 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: const PlayerBase& P; const FHE_PK& pk; const FD& FTD; virtual const FHE_PK& get_pk_for_verification(int offset) = 0; virtual void add_ciphertexts(vector& ciphertexts, int offset) = 0; public: NonInteractiveProof proof; #ifdef LESS_ALLOC_MORE_MEM Proof::Randomness r; Prover > prover; Verifier verifier; #endif map& timers; NonInteractiveProofSimpleEncCommit(const PlayerBase& P, const FHE_PK& pk, const FD& FTD, map& timers, const MachineBase& machine, bool diagonal = false); virtual ~NonInteractiveProofSimpleEncCommit() {} size_t generate_proof(AddableVector& c, 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; Proof& get_proof() { return proof; } }; template class SimpleEncCommitFactory { protected: int cnt; AddableVector c; AddableVector< Plaintext_ > m; int n_calls; const FHE_PK& pk; void prepare_plaintext(PRNG& G); virtual void create_more() = 0; public: SimpleEncCommitFactory(const FHE_PK& pk); virtual ~SimpleEncCommitFactory(); void init(const Proof& proof, const FD& FTD); 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); virtual Proof& get_proof() = 0; }; template class SimpleEncCommit: public NonInteractiveProofSimpleEncCommit, public SimpleEncCommitFactory { protected: const FHE_PK& get_pk_for_verification(int) { return NonInteractiveProofSimpleEncCommit::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, bool diagonal = false); 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); } Proof& get_proof() { return NonInteractiveProofSimpleEncCommit::get_proof(); } }; template using SimpleEncCommit_ = SimpleEncCommit; template class SummingEncCommit: public SimpleEncCommitFactory, public SimpleEncCommitBase_ { 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, bool diagonal = false); 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); } Proof& get_proof() { return proof; } }; 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, bool diagonal = false); }; #endif /* FHEOFFLINE_SIMPLEENCCOMMIT_H_ */