pir_client.hpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #pragma once
  2. #include "pir.hpp"
  3. #include <memory>
  4. #include <vector>
  5. using namespace std;
  6. class PIRClient {
  7. public:
  8. PIRClient(const seal::EncryptionParameters &encparms,
  9. const PirParams &pirparams);
  10. PirQuery generate_query(std::uint64_t desiredIndex);
  11. // Serializes the query into the provided stream and returns number of bytes
  12. // written
  13. int generate_serialized_query(std::uint64_t desiredIndex,
  14. std::stringstream &stream);
  15. seal::Plaintext decode_reply(PirReply &reply);
  16. std::vector<uint64_t> extract_coeffs(seal::Plaintext pt);
  17. std::vector<uint64_t> extract_coeffs(seal::Plaintext pt,
  18. std::uint64_t offset);
  19. std::vector<uint8_t> extract_bytes(seal::Plaintext pt, std::uint64_t offset);
  20. std::vector<uint8_t> decode_reply(PirReply &reply, uint64_t offset);
  21. seal::Plaintext decrypt(seal::Ciphertext ct);
  22. seal::GaloisKeys generate_galois_keys();
  23. // Index and offset of an element in an FV plaintext
  24. uint64_t get_fv_index(uint64_t element_index);
  25. uint64_t get_fv_offset(uint64_t element_index);
  26. // Only used for simple_query
  27. seal::Ciphertext get_one();
  28. seal::Plaintext replace_element(seal::Plaintext pt,
  29. std::vector<std::uint64_t> new_element,
  30. std::uint64_t offset);
  31. private:
  32. seal::EncryptionParameters enc_params_;
  33. PirParams pir_params_;
  34. std::unique_ptr<seal::Encryptor> encryptor_;
  35. std::unique_ptr<seal::Decryptor> decryptor_;
  36. std::unique_ptr<seal::Evaluator> evaluator_;
  37. std::unique_ptr<seal::KeyGenerator> keygen_;
  38. std::unique_ptr<seal::BatchEncoder> encoder_;
  39. std::shared_ptr<seal::SEALContext> context_;
  40. vector<uint64_t> indices_; // the indices for retrieval.
  41. vector<uint64_t> inverse_scales_;
  42. friend class PIRServer;
  43. };