pir.hpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #pragma once
  2. #include "seal/seal.h"
  3. #include "seal/util/polyarithsmallmod.h"
  4. #include <cassert>
  5. #include <cmath>
  6. #include <string>
  7. #include <vector>
  8. #define CIPHER_SIZE 32828
  9. typedef std::vector<seal::Plaintext> Database;
  10. typedef std::vector<seal::Ciphertext> PirQuery;
  11. typedef std::vector<seal::Ciphertext> PirReply;
  12. struct PirParams {
  13. std::uint64_t n; // number of plaintexts in database
  14. std::uint32_t d; // number of dimensions for the database (usually 2)
  15. std::uint32_t expansion_ratio; // ratio of plaintext to ciphertext
  16. std::uint32_t dbc; // decomposition bit count (used by relinearization)
  17. std::vector<std::uint64_t> nvec; // size of each of the d dimensions
  18. };
  19. void gen_params(std::uint64_t ele_num, // number of elements (not FV plaintexts) in database
  20. std::uint64_t ele_size, // size of each element
  21. std::uint32_t N, // degree of polynomial
  22. std::uint32_t logt, // bits of plaintext coefficient
  23. std::uint32_t d, // dimension of database
  24. seal::EncryptionParameters &params, seal::EncryptionParameters &expanded_params,
  25. PirParams &pir_params);
  26. void update_params(std::uint64_t ele_num,
  27. std::uint64_t ele_size,
  28. std::uint32_t d,
  29. const seal::EncryptionParameters &old_params,
  30. seal::EncryptionParameters &expanded_params, PirParams &pir_params);
  31. // returns the plaintext modulus after expansion
  32. std::uint32_t plainmod_after_expansion(std::uint32_t logt, std::uint32_t N,
  33. std::uint32_t d, std::uint64_t ele_num,
  34. std::uint64_t ele_size);
  35. // returns the number of plaintexts that the database can hold
  36. std::uint64_t plaintexts_per_db(std::uint32_t logtp, std::uint64_t N, std::uint64_t ele_num,
  37. std::uint64_t ele_size);
  38. // returns the number of elements that a single FV plaintext can hold
  39. std::uint64_t elements_per_ptxt(std::uint32_t logtp, std::uint64_t N, std::uint64_t ele_size);
  40. // returns the number of coefficients needed to store one element
  41. std::uint64_t coefficients_per_element(std::uint32_t logtp, std::uint64_t ele_size);
  42. // Converts an array of bytes to a vector of coefficients, each of which is less
  43. // than the plaintext modulus
  44. std::vector<std::uint64_t> bytes_to_coeffs(std::uint32_t limit, const std::uint8_t *bytes,
  45. std::uint64_t size);
  46. // Converts an array of coefficients into an array of bytes
  47. void coeffs_to_bytes(std::uint32_t logtp, const seal::Plaintext &coeffs, std::uint8_t *output,
  48. std::uint32_t size_out);
  49. // Takes a vector of coefficients and returns the corresponding FV plaintext
  50. void vector_to_plaintext(const vector<std::uint64_t> &coeffs, seal::Plaintext &plain);
  51. // Since the database has d dimensions, and an item is a particular cell
  52. // in the d-dimensional hypercube, this function computes the corresponding
  53. // index for each of the d dimensions
  54. std::vector<std::uint64_t> compute_indices(std::uint64_t desiredIndex,
  55. std::vector<std::uint64_t> nvec);
  56. // Serialize and deserialize ciphertexts to send them over the network
  57. std::vector<seal::Ciphertext> deserialize_ciphertexts(std::uint32_t count, std::string s,
  58. std::uint32_t len_ciphertext);
  59. std::string serialize_ciphertexts(vector<seal::Ciphertext> c);
  60. // Serialize and deserialize galois keys to send them over the network
  61. std::string serialize_galoiskeys(seal::GaloisKeys g);
  62. seal::GaloisKeys *deserialize_galoiskeys(std::string s);