#pragma once #include "pir.hpp" #include #include using namespace std; class PIRClient { public: PIRClient(const seal::EncryptionParameters &encparms, const PirParams &pirparams); PirQuery generate_query(std::uint64_t desiredIndex); seal::Plaintext decode_reply(PirReply reply); std::vector decode_reply(PirReply reply, uint64_t offset); seal::Plaintext decrypt(seal::Ciphertext ct); seal::GaloisKeys generate_galois_keys(); // Index and offset of an element in an FV plaintext uint64_t get_fv_index(uint64_t element_index); uint64_t get_fv_offset(uint64_t element_index); private: seal::EncryptionParameters enc_params_; PirParams pir_params_; std::unique_ptr encryptor_; std::unique_ptr decryptor_; std::unique_ptr evaluator_; std::unique_ptr keygen_; std::unique_ptr encoder_; std::shared_ptr context_; vector indices_; // the indices for retrieval. vector inverse_scales_; seal::Ciphertext compose_to_ciphertext(std::vector plains); friend class PIRServer; };