|
@@ -13,47 +13,32 @@
|
|
#include <cstring> // std::memcpy
|
|
#include <cstring> // std::memcpy
|
|
#include <bsd/stdlib.h> // arc4random_buf
|
|
#include <bsd/stdlib.h> // arc4random_buf
|
|
#include <x86intrin.h> // SSE and AVX intrinsics
|
|
#include <x86intrin.h> // SSE and AVX intrinsics
|
|
-#include "prg.h"
|
|
|
|
-#include "prg_aes_impl.h"
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-const size_t ncores = 16;
|
|
|
|
-uint64_t progress[ncores] = {0};
|
|
|
|
-
|
|
|
|
|
|
+#include <chrono>
|
|
#include <thread>
|
|
#include <thread>
|
|
-#include <iostream>
|
|
|
|
#include <deque>
|
|
#include <deque>
|
|
-
|
|
|
|
#include <../boost/asio.hpp>
|
|
#include <../boost/asio.hpp>
|
|
|
|
|
|
using boost::asio::ip::tcp;
|
|
using boost::asio::ip::tcp;
|
|
-
|
|
|
|
-
|
|
|
|
-#include "block.h"
|
|
|
|
-#include <type_traits>
|
|
|
|
-
|
|
|
|
-#include <chrono>
|
|
|
|
-
|
|
|
|
using namespace std::chrono;
|
|
using namespace std::chrono;
|
|
|
|
+using namespace std;
|
|
|
|
+using socket_t = boost::asio::ip::tcp::socket;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
|
|
+#include "prg.h"
|
|
|
|
+#include "prg_aes_impl.h"
|
|
|
|
+#include "block.h"
|
|
#include "duoram-utils.h"
|
|
#include "duoram-utils.h"
|
|
#include "duoram-read.h"
|
|
#include "duoram-read.h"
|
|
#include "duoram-refresh.h"
|
|
#include "duoram-refresh.h"
|
|
#include "duoram-write.h"
|
|
#include "duoram-write.h"
|
|
#include "readvectors.h"
|
|
#include "readvectors.h"
|
|
-using namespace std;
|
|
|
|
|
|
|
|
-using socket_t = boost::asio::ip::tcp::socket;
|
|
|
|
|
|
+
|
|
|
|
|
|
- void accept_conncections_from_Pb(boost::asio::io_context&io_context, std::vector<socket_t>& sockets_, int port, size_t j)
|
|
|
|
|
|
+void accept_conncections_from_Pb(boost::asio::io_context&io_context, std::vector<socket_t>& sockets_, int port, size_t j)
|
|
{
|
|
{
|
|
tcp::acceptor acceptor_a(io_context, tcp::endpoint(tcp::v4(), port));
|
|
tcp::acceptor acceptor_a(io_context, tcp::endpoint(tcp::v4(), port));
|
|
tcp::socket sb_a(acceptor_a.accept());
|
|
tcp::socket sb_a(acceptor_a.accept());
|
|
- sockets_[j] = std::move(sb_a);
|
|
|
|
-
|
|
|
|
- // sockets_.emplace_back(std::move(sb_a));
|
|
|
|
|
|
+ sockets_[j] = std::move(sb_a);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -61,26 +46,23 @@ using socket_t = boost::asio::ip::tcp::socket;
|
|
int main(const int argc, const char * argv[])
|
|
int main(const int argc, const char * argv[])
|
|
{
|
|
{
|
|
|
|
|
|
- size_t expo = atoi(argv[3]);
|
|
|
|
- size_t db_nitems = 1ULL << expo;
|
|
|
|
-
|
|
|
|
|
|
+ size_t expo = atoi(argv[3]);
|
|
|
|
+ size_t db_nitems = 1ULL << expo;
|
|
size_t number_of_writes = atoi(argv[4]);
|
|
size_t number_of_writes = atoi(argv[4]);
|
|
size_t number_of_ind_reads = atoi(argv[5]);
|
|
size_t number_of_ind_reads = atoi(argv[5]);
|
|
size_t number_of_dep_reads = atoi(argv[6]);
|
|
size_t number_of_dep_reads = atoi(argv[6]);
|
|
size_t number_of_accesses = atoi(argv[7]);
|
|
size_t number_of_accesses = atoi(argv[7]);
|
|
|
|
|
|
reading_temp = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
reading_temp = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
-
|
|
|
|
- DB = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
|
|
- updated_DB = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
|
|
- blinded_DB = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
|
|
|
|
+ DB = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
|
|
+ updated_DB = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
|
|
+ blinded_DB = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
|
|
|
|
- blinded_DB_recv = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
|
|
- updated_blinded_DB_recv = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
|
|
-
|
|
|
|
|
|
+ blinded_DB_recv = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
|
|
+ updated_blinded_DB_recv = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
b = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
b = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
- c = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
|
|
- d = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
|
|
|
|
+ c = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
|
|
+ d = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
|
|
|
|
reading_b = (int8_t *) malloc(db_nitems * sizeof(int8_t));
|
|
reading_b = (int8_t *) malloc(db_nitems * sizeof(int8_t));
|
|
reading_c = (int8_t *) malloc(db_nitems * sizeof(int8_t));
|
|
reading_c = (int8_t *) malloc(db_nitems * sizeof(int8_t));
|
|
@@ -90,10 +72,7 @@ int main(const int argc, const char * argv[])
|
|
writing_d = (int8_t *) malloc(db_nitems * sizeof(int8_t));
|
|
writing_d = (int8_t *) malloc(db_nitems * sizeof(int8_t));
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- // size_t read_at[number_of_writes];
|
|
|
|
- // size_t rand_point[number_of_writes];
|
|
|
|
|
|
+
|
|
size_t * rotate_by_ = new size_t[number_of_writes];
|
|
size_t * rotate_by_ = new size_t[number_of_writes];
|
|
|
|
|
|
|
|
|
|
@@ -185,24 +164,19 @@ int main(const int argc, const char * argv[])
|
|
|
|
|
|
generate_random_distinguished_points(party);
|
|
generate_random_distinguished_points(party);
|
|
|
|
|
|
- AES_KEY aeskey;
|
|
|
|
-
|
|
|
|
- //read_final_cws(sockets_2[0]);
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
|
|
+ AES_KEY aeskey;
|
|
blinds = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
blinds = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
updated_blinds = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
updated_blinds = (DB_t *) std::aligned_alloc(sizeof(__m256i), db_nitems * sizeof(DB_t));
|
|
|
|
|
|
- setup(DB, updated_DB, blinded_DB_recv, blinds, updated_blinds, updated_blinded_DB_recv, db_nitems, party);
|
|
|
|
|
|
+ size_t * where_to_write = new size_t[number_of_writes];
|
|
|
|
+ size_t * where_to_read_dependent = new size_t[number_of_dep_reads];
|
|
|
|
+ size_t * where_to_read_independent = new size_t[number_of_ind_reads];
|
|
|
|
+
|
|
|
|
|
|
- auto start_total = std::chrono::steady_clock::now();
|
|
|
|
-
|
|
|
|
|
|
+ auto start_total = std::chrono::steady_clock::now();
|
|
|
|
+
|
|
|
|
+ setup(DB, updated_DB, blinded_DB_recv, blinds, updated_blinds, updated_blinded_DB_recv, db_nitems, party);
|
|
|
|
|
|
- size_t * where_to_write = new size_t[number_of_writes];
|
|
|
|
- size_t * where_to_read_dependent = new size_t[number_of_dep_reads];
|
|
|
|
- size_t * where_to_read_independent = new size_t[number_of_ind_reads];
|
|
|
|
-
|
|
|
|
for(size_t i = 0; i < number_of_accesses; ++i)
|
|
for(size_t i = 0; i < number_of_accesses; ++i)
|
|
{
|
|
{
|
|
for(size_t j = 0; j < number_of_writes; ++j)
|
|
for(size_t j = 0; j < number_of_writes; ++j)
|
|
@@ -235,12 +209,11 @@ int main(const int argc, const char * argv[])
|
|
|
|
|
|
#ifdef VERBOSE
|
|
#ifdef VERBOSE
|
|
boost::asio::write(sockets_[0], boost::asio::buffer(&ri, sizeof(ri)));
|
|
boost::asio::write(sockets_[0], boost::asio::buffer(&ri, sizeof(ri)));
|
|
- boost::asio::read(sockets_[0], boost::asio::buffer(&ri_recv, sizeof(ri_recv)));
|
|
|
|
-
|
|
|
|
|
|
+ boost::asio::read(sockets_[0], boost::asio::buffer(&ri_recv, sizeof(ri_recv)));
|
|
int64_t ri_reconstruction = ri + ri_recv;
|
|
int64_t ri_reconstruction = ri + ri_recv;
|
|
std::cout << "ri_reconstruction = " << ri_reconstruction << std::endl;
|
|
std::cout << "ri_reconstruction = " << ri_reconstruction << std::endl;
|
|
#endif
|
|
#endif
|
|
-
|
|
|
|
|
|
+
|
|
#ifdef ThreeParty
|
|
#ifdef ThreeParty
|
|
DuORAM_Write * WritePb_ = new DuORAM_Write[number_of_writes];
|
|
DuORAM_Write * WritePb_ = new DuORAM_Write[number_of_writes];
|
|
DuORAM_Write * WritePb_recv = new DuORAM_Write[number_of_writes];
|
|
DuORAM_Write * WritePb_recv = new DuORAM_Write[number_of_writes];
|
|
@@ -258,6 +231,7 @@ int main(const int argc, const char * argv[])
|
|
{
|
|
{
|
|
DB_t FCW_read = 0;
|
|
DB_t FCW_read = 0;
|
|
|
|
|
|
|
|
+ /*The definition of read_final_correction_word appears in duoram-utils.h*/
|
|
read_final_correction_word(party, FCW_read);
|
|
read_final_correction_word(party, FCW_read);
|
|
|
|
|
|
#ifdef VERBOSE
|
|
#ifdef VERBOSE
|
|
@@ -271,18 +245,21 @@ int main(const int argc, const char * argv[])
|
|
read(sockets_2[1], boost::asio::buffer(&Gamma[w], sizeof(DB_t)));
|
|
read(sockets_2[1], boost::asio::buffer(&Gamma[w], sizeof(DB_t)));
|
|
boost::asio::write(sockets_[0], boost::asio::buffer(&WritePb_[w], sizeof(DuORAM_Write)));
|
|
boost::asio::write(sockets_[0], boost::asio::buffer(&WritePb_[w], sizeof(DuORAM_Write)));
|
|
boost::asio::read(sockets_[0], boost::asio::buffer(&WritePb_recv[w], sizeof(DuORAM_Write)));
|
|
boost::asio::read(sockets_[0], boost::asio::buffer(&WritePb_recv[w], sizeof(DuORAM_Write)));
|
|
-
|
|
|
|
- read_flags(party, db_nitems);
|
|
|
|
|
|
+
|
|
|
|
+ /*The definition of read_flags_for_writing appears in duoram-utils.h*/
|
|
|
|
+ read_flags_for_writing(party, db_nitems);
|
|
|
|
|
|
rotate_by_[w] = WritePb_[w].shift + WritePb_recv[w].shift;
|
|
rotate_by_[w] = WritePb_[w].shift + WritePb_recv[w].shift;
|
|
|
|
|
|
#ifdef VERBOSE
|
|
#ifdef VERBOSE
|
|
- std::cout << "print database: " << std::endl;
|
|
|
|
|
|
+ std::cout << "print database: " << std::endl;
|
|
|
|
+ /* The definition of reconstruct_database appears in duoram-utils.h */
|
|
reconstruct_database(sockets_[0], DB, db_nitems);
|
|
reconstruct_database(sockets_[0], DB, db_nitems);
|
|
#endif
|
|
#endif
|
|
|
|
|
|
for(size_t j = 0; j < db_nitems; ++j) reading_temp[j] = DB[j] + updated_blinded_DB_recv[j];
|
|
for(size_t j = 0; j < db_nitems; ++j) reading_temp[j] = DB[j] + updated_blinded_DB_recv[j];
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ /*The definition of dot_product_with_bool appears in duoram-write.h*/
|
|
if(!party) read_out[w] = dot_product_with_bool(reading_temp, writing_b, db_nitems, rotate_by_[w]) +
|
|
if(!party) read_out[w] = dot_product_with_bool(reading_temp, writing_b, db_nitems, rotate_by_[w]) +
|
|
dot_product_with_bool(updated_blinds, writing_b, db_nitems, rotate_by_[w]) -
|
|
dot_product_with_bool(updated_blinds, writing_b, db_nitems, rotate_by_[w]) -
|
|
dot_product_with_bool(updated_blinds, writing_c, db_nitems, rotate_by_[w]) + Gamma[w];
|
|
dot_product_with_bool(updated_blinds, writing_c, db_nitems, rotate_by_[w]) + Gamma[w];
|
|
@@ -291,19 +268,19 @@ int main(const int argc, const char * argv[])
|
|
dot_product_with_bool(updated_blinds, writing_c, db_nitems, rotate_by_[w]) -
|
|
dot_product_with_bool(updated_blinds, writing_c, db_nitems, rotate_by_[w]) -
|
|
dot_product_with_bool(updated_blinds, writing_d, db_nitems, rotate_by_[w]) + Gamma[w];
|
|
dot_product_with_bool(updated_blinds, writing_d, db_nitems, rotate_by_[w]) + Gamma[w];
|
|
|
|
|
|
- #ifdef DEBUG
|
|
|
|
|
|
+ #ifdef VERBOSE
|
|
std::cout << "read_out[" << w << "] = " << read_out[w] << std::endl;
|
|
std::cout << "read_out[" << w << "] = " << read_out[w] << std::endl;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- #ifdef DEBUG
|
|
|
|
|
|
+ #ifdef VERBOSE
|
|
std::cout << "reconstructing the output: " << print_reconstruction(sockets_[0], read_out[w]) << "\n";
|
|
std::cout << "reconstructing the output: " << print_reconstruction(sockets_[0], read_out[w]) << "\n";
|
|
#endif
|
|
#endif
|
|
|
|
|
|
distinguised_value[0] = 80 * (1 + w);
|
|
distinguised_value[0] = 80 * (1 + w);
|
|
update_message[w] = distinguised_value[0] - read_out[w] + alpha0;
|
|
update_message[w] = distinguised_value[0] - read_out[w] + alpha0;
|
|
|
|
|
|
- #ifdef DEBUG
|
|
|
|
- std::cout << "-> The updated message shares is " << update_message[w] << std::endl;
|
|
|
|
|
|
+ #ifdef VERBOSE
|
|
|
|
+ std::cout << "The updated message shares is = " << update_message[w] << std::endl;
|
|
#endif
|
|
#endif
|
|
boost::asio::write(sockets_2[2], boost::asio::buffer(&update_message[w], sizeof(DB_t)));
|
|
boost::asio::write(sockets_2[2], boost::asio::buffer(&update_message[w], sizeof(DB_t)));
|
|
boost::asio::write(sockets_[2], boost::asio::buffer(&update_message[w], sizeof(DB_t)));
|
|
boost::asio::write(sockets_[2], boost::asio::buffer(&update_message[w], sizeof(DB_t)));
|
|
@@ -311,17 +288,21 @@ int main(const int argc, const char * argv[])
|
|
|
|
|
|
CW[w] = CW[w] + update_message[w];
|
|
CW[w] = CW[w] + update_message[w];
|
|
|
|
|
|
- #ifdef DEBUG
|
|
|
|
|
|
+ #ifdef VERBOSE
|
|
std::cout << "cw = " << CW[w] << std::endl;
|
|
std::cout << "cw = " << CW[w] << std::endl;
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
for(size_t w = 0; w < number_of_writes; ++w)
|
|
for(size_t w = 0; w < number_of_writes; ++w)
|
|
- {
|
|
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ /*The definition of DuoramUpdate appears in duoram-write.h*/
|
|
DuoramUpdate(party, db_nitems, rotate_by_[w], DB, updated_DB, writing_b, b, CW[w], update_message[w], writing_c, writing_d, c, d);
|
|
DuoramUpdate(party, db_nitems, rotate_by_[w], DB, updated_DB, writing_b, b, CW[w], update_message[w], writing_c, writing_d, c, d);
|
|
|
|
+
|
|
#ifdef DEBUG
|
|
#ifdef DEBUG
|
|
#ifdef ThreeParty
|
|
#ifdef ThreeParty
|
|
|
|
+ /*The definition debug_ appears in duoram-utils.h*/
|
|
debug_(sockets_2[0], sockets_[0], db_nitems);
|
|
debug_(sockets_2[0], sockets_[0], db_nitems);
|
|
#endif
|
|
#endif
|
|
#endif
|
|
#endif
|
|
@@ -332,13 +313,13 @@ int main(const int argc, const char * argv[])
|
|
printf("elapsed_seconds_writes = %f\n",elapsed_seconds_writes.count());
|
|
printf("elapsed_seconds_writes = %f\n",elapsed_seconds_writes.count());
|
|
|
|
|
|
#ifdef VERBOSE
|
|
#ifdef VERBOSE
|
|
|
|
+ std::cout << "Reconstructing the database after doing " << number_of_writes << " writes " << std::endl;
|
|
reconstruct_database(sockets_[0], DB, db_nitems);
|
|
reconstruct_database(sockets_[0], DB, db_nitems);
|
|
#endif
|
|
#endif
|
|
-
|
|
|
|
// WRITES END.
|
|
// WRITES END.
|
|
- #ifdef ThreeParty
|
|
|
|
|
|
|
|
- printf("\n\n================================= WRITES END =================================\n\n\n");
|
|
|
|
|
|
+ #ifdef ThreeParty
|
|
|
|
+ std::cout << std::endl << std::endl << "============== WRITES END ==============" << std::endl << std::endl;
|
|
auto start_ind_reads = std::chrono::steady_clock::now();
|
|
auto start_ind_reads = std::chrono::steady_clock::now();
|
|
size_t * WritePb_ind_reads = new size_t[number_of_ind_reads];
|
|
size_t * WritePb_ind_reads = new size_t[number_of_ind_reads];
|
|
size_t * WritePb_ind_reads_recv = new size_t[number_of_ind_reads];
|
|
size_t * WritePb_ind_reads_recv = new size_t[number_of_ind_reads];
|