Browse Source

fixing serialize/deserialize for queries

Sebastian Angel 4 years ago
parent
commit
8a06be135c
3 changed files with 29 additions and 2 deletions
  1. 2 1
      main.cpp
  2. 24 0
      pir.cpp
  3. 3 1
      pir.hpp

+ 2 - 1
main.cpp

@@ -82,7 +82,8 @@ int main(int argc, char *argv[]) {
     cout << "Main: query generated" << endl;
 
     //To marshall query to send over the network, you can use serialize/deserialize:
-    //PirQuery query = deserialize_ciphertexts(d, serialize_ciphertexts(query), CIPHER_SIZE);
+    //std::string query_ser = serialize_query(query);
+    //PirQuery query2 = deserialize_query(d, 1, query_ser, CIPHER_SIZE);
 
     // Measure query processing (including expansion)
     auto time_server_s = high_resolution_clock::now();

+ 24 - 0
pir.cpp

@@ -212,6 +212,7 @@ inline Ciphertext deserialize_ciphertext(string s) {
     return c;
 }
 
+
 vector<Ciphertext> deserialize_ciphertexts(uint32_t count, string s, uint32_t len_ciphertext) {
     vector<Ciphertext> c;
     for (uint32_t i = 0; i < count; i++) {
@@ -220,6 +221,19 @@ vector<Ciphertext> deserialize_ciphertexts(uint32_t count, string s, uint32_t le
     return c;
 }
 
+PirQuery deserialize_query(uint32_t d, uint32_t count, string s, uint32_t len_ciphertext) {
+    vector<vector<Ciphertext>> c;
+    for (uint32_t i = 0; i < d; i++) {
+        c.push_back(deserialize_ciphertexts(
+              count, 
+              s.substr(i * count * len_ciphertext, count * len_ciphertext),
+              len_ciphertext)
+        );
+    }
+    return c;
+}
+
+
 inline string serialize_ciphertext(Ciphertext c) {
     std::ostringstream output;
     c.save(output);
@@ -234,6 +248,16 @@ string serialize_ciphertexts(vector<Ciphertext> c) {
     return s;
 }
 
+string serialize_query(vector<vector<Ciphertext>> c) {
+    string s;
+    for (uint32_t i = 0; i < c.size(); i++) {
+      for (uint32_t j = 0; j < c[i].size(); j++) {
+        s.append(serialize_ciphertext(c[i][j]));
+      }
+    }
+    return s;
+}
+
 string serialize_galoiskeys(GaloisKeys g) {
     std::ostringstream output;
     g.save(output);

+ 3 - 1
pir.hpp

@@ -10,7 +10,7 @@
 #define CIPHER_SIZE 32841
 
 typedef std::vector<seal::Plaintext> Database;
-typedef std::vector< std::vector< seal::Ciphertext >> PirQuery;
+typedef std::vector<std::vector<seal::Ciphertext>> PirQuery;
 typedef std::vector<seal::Ciphertext> PirReply;
 
 struct PirParams {
@@ -63,9 +63,11 @@ std::vector<std::uint64_t> compute_indices(std::uint64_t desiredIndex,
                                            std::vector<std::uint64_t> nvec);
 
 // Serialize and deserialize ciphertexts to send them over the network
+PirQuery deserialize_query(std::uint32_t d, uint32_t count, std::string s, std::uint32_t len_ciphertext);
 std::vector<seal::Ciphertext> deserialize_ciphertexts(std::uint32_t count, std::string s,
                                                       std::uint32_t len_ciphertext);
 std::string serialize_ciphertexts(std::vector<seal::Ciphertext> c);
+std::string serialize_query(std::vector<std::vector<seal::Ciphertext>> c);
 
 // Serialize and deserialize galois keys to send them over the network
 std::string serialize_galoiskeys(seal::GaloisKeys g);