#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); // Serializes the query into the provided stream and returns number of bytes // written int generate_serialized_query(std::uint64_t desiredIndex, std::stringstream &stream); seal::Plaintext decode_reply(PirReply &reply); std::vector extract_coeffs(seal::Plaintext pt); std::vector extract_coeffs(seal::Plaintext pt, std::uint64_t offset); std::vector extract_bytes(seal::Plaintext pt, std::uint64_t offset); 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); // Only used for simple_query seal::Ciphertext get_one(); seal::Plaintext replace_element(seal::Plaintext pt, std::vector new_element, std::uint64_t offset); 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_; friend class PIRServer; };