|
@@ -9,13 +9,9 @@
|
|
|
|
|
|
#include "networkServer.hpp"
|
|
|
|
|
|
-#define BGN_TMP_FILE (TMP_DIR "bgn")
|
|
|
-#define GEN_TMP_FILE (TMP_DIR "generator")
|
|
|
-#define EPOCH_GEN_TMP_FILE (TMP_DIR "epoch")
|
|
|
-
|
|
|
using namespace std;
|
|
|
|
|
|
-struct synchronization_tool exitSync, bgnSync, generatorSync, readySync, updateSync, epochSync, tallySync;
|
|
|
+struct synchronization_tool exitSync, readySync;
|
|
|
mutex updateMtx;
|
|
|
|
|
|
atomic<size_t> epochNum(0);
|
|
@@ -28,53 +24,26 @@ void initialize_prsona_classes()
|
|
|
PrsonaBase::set_client_malicious();
|
|
|
}
|
|
|
|
|
|
-PrsonaServer *create_server_from_bgn_file(size_t numServers)
|
|
|
+PrsonaServer *create_server_from_bgn_file(
|
|
|
+ size_t numServers,
|
|
|
+ struct synchronization_tool *sync,
|
|
|
+ const char *filename)
|
|
|
{
|
|
|
- unique_lock<mutex> lck(bgnSync.mtx);
|
|
|
- ifstream bgnFile(BGN_TMP_FILE);
|
|
|
+ unique_lock<mutex> lck(sync->mtx);
|
|
|
+ ifstream bgnFile(filename);
|
|
|
BGN privateKey;
|
|
|
bgnFile >> privateKey;
|
|
|
|
|
|
return new PrsonaServer(numServers, privateKey);
|
|
|
}
|
|
|
|
|
|
-static int bgn_websocket_data_handler(
|
|
|
- struct mg_connection *conn,
|
|
|
- int bits,
|
|
|
- char *data,
|
|
|
- size_t data_len,
|
|
|
- void *user_data)
|
|
|
-{
|
|
|
- if ((bits & 0xf) == MG_WEBSOCKET_OPCODE_CONNECTION_CLOSE)
|
|
|
- return false;
|
|
|
-
|
|
|
- if ((bits & 0xf) != MG_WEBSOCKET_OPCODE_BINARY && (bits & 0xf) != MG_WEBSOCKET_OPCODE_CONTINUATION)
|
|
|
- {
|
|
|
- std::cerr << "Unknown opcode: failing." << std::endl;
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- unique_lock<mutex> lck(bgnSync.mtx);
|
|
|
- FILE *currFile = fopen(BGN_TMP_FILE, "ab");
|
|
|
- fwrite(data, sizeof(char), data_len, currFile);
|
|
|
- fclose(currFile);
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-static void bgn_websocket_close_handler(
|
|
|
- const struct mg_connection *conn,
|
|
|
- void *user_data)
|
|
|
-{
|
|
|
- unique_lock<mutex> lck(bgnSync.mtx);
|
|
|
- bgnSync.val = 1;
|
|
|
- bgnSync.cv.notify_all();
|
|
|
-}
|
|
|
-
|
|
|
-Twistpoint update_generator_from_gen_file(Proof& pi)
|
|
|
+Twistpoint update_generator_from_gen_file(
|
|
|
+ Proof& pi,
|
|
|
+ struct synchronization_tool *sync,
|
|
|
+ const char *filename)
|
|
|
{
|
|
|
- unique_lock<mutex> lck(generatorSync.mtx);
|
|
|
- ifstream genFile(GEN_TMP_FILE);
|
|
|
+ unique_lock<mutex> lck(sync->mtx);
|
|
|
+ ifstream genFile(filename);
|
|
|
Twistpoint retval;
|
|
|
|
|
|
genFile >> pi;
|
|
@@ -83,10 +52,13 @@ Twistpoint update_generator_from_gen_file(Proof& pi)
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
-Twistpoint update_data_from_epoch_gen_file(vector<Proof>& pi)
|
|
|
+Twistpoint update_data_from_epoch_gen_file(
|
|
|
+ vector<Proof>& pi,
|
|
|
+ struct synchronization_tool *sync,
|
|
|
+ const char *filename)
|
|
|
{
|
|
|
- unique_lock<mutex> lck(epochSync.mtx);
|
|
|
- ifstream epochFile(EPOCH_GEN_TMP_FILE);
|
|
|
+ unique_lock<mutex> lck(sync->mtx);
|
|
|
+ ifstream epochFile(filename);
|
|
|
|
|
|
Twistpoint retval;
|
|
|
BinarySizeT sizeOfVector;
|
|
@@ -105,39 +77,6 @@ Twistpoint update_data_from_epoch_gen_file(vector<Proof>& pi)
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
-static int generator_websocket_data_handler(
|
|
|
- struct mg_connection *conn,
|
|
|
- int bits,
|
|
|
- char *data,
|
|
|
- size_t data_len,
|
|
|
- void *user_data)
|
|
|
-{
|
|
|
- if ((bits & 0xf) == MG_WEBSOCKET_OPCODE_CONNECTION_CLOSE || (bits & 0xf) == MG_WEBSOCKET_OPCODE_DATACOMPLETE)
|
|
|
- return false;
|
|
|
-
|
|
|
- if ((bits & 0xf) != MG_WEBSOCKET_OPCODE_BINARY && (bits & 0xf) != MG_WEBSOCKET_OPCODE_CONTINUATION)
|
|
|
- {
|
|
|
- std::cerr << "Unknown opcode: failing." << std::endl;
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- unique_lock<mutex> lck(generatorSync.mtx);
|
|
|
- FILE *currFile = fopen(GEN_TMP_FILE, "ab");
|
|
|
- fwrite(data, sizeof(char), data_len, currFile);
|
|
|
- fclose(currFile);
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-static void generator_websocket_close_handler(
|
|
|
- const struct mg_connection *conn,
|
|
|
- void *user_data)
|
|
|
-{
|
|
|
- unique_lock<mutex> lck(generatorSync.mtx);
|
|
|
- generatorSync.val = 1;
|
|
|
- generatorSync.cv.notify_all();
|
|
|
-}
|
|
|
-
|
|
|
static int epoch_websocket_data_handler(
|
|
|
struct mg_connection *conn,
|
|
|
int bits,
|
|
@@ -145,12 +84,14 @@ static int epoch_websocket_data_handler(
|
|
|
size_t data_len,
|
|
|
void *user_data)
|
|
|
{
|
|
|
- if ((bits & 0xf) == MG_WEBSOCKET_OPCODE_CONNECTION_CLOSE)
|
|
|
+ if ((bits & 0xf) == MG_WEBSOCKET_OPCODE_CONNECTION_CLOSE || (bits & 0xf) == MG_WEBSOCKET_OPCODE_DATACOMPLETE)
|
|
|
return false;
|
|
|
if ((bits & 0xf) == MG_WEBSOCKET_OPCODE_DATACOMPLETE)
|
|
|
{
|
|
|
- unique_lock<mutex> lck(epochSync.mtx);
|
|
|
- epochSync.val++;
|
|
|
+ struct synchronization_tool *sync = (struct synchronization_tool *) user_data;
|
|
|
+
|
|
|
+ unique_lock<mutex> lck(sync->mtx);
|
|
|
+ sync->val++;
|
|
|
|
|
|
return false;
|
|
|
}
|
|
@@ -161,8 +102,11 @@ static int epoch_websocket_data_handler(
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- unique_lock<mutex> lck(epochSync.mtx);
|
|
|
- FILE *currFile = fopen(EPOCH_GEN_TMP_FILE, "ab");
|
|
|
+ struct synchronization_tool *sync = (struct synchronization_tool *) user_data;
|
|
|
+ char *filename = (char *) mg_get_user_connection_data(conn);
|
|
|
+
|
|
|
+ unique_lock<mutex> lck(sync->mtx);
|
|
|
+ FILE *currFile = fopen(filename, "ab");
|
|
|
fwrite(data, sizeof(char), data_len, currFile);
|
|
|
fclose(currFile);
|
|
|
|
|
@@ -173,9 +117,11 @@ static void epoch_websocket_close_handler(
|
|
|
const struct mg_connection *conn,
|
|
|
void *user_data)
|
|
|
{
|
|
|
- unique_lock<mutex> lck(epochSync.mtx);
|
|
|
- epochSync.val2 = 0;
|
|
|
- epochSync.cv.notify_all();
|
|
|
+ struct synchronization_tool *sync = (struct synchronization_tool *) user_data;
|
|
|
+
|
|
|
+ unique_lock<mutex> lck(sync->mtx);
|
|
|
+ sync->val2 = 0;
|
|
|
+ sync->cv.notify_all();
|
|
|
}
|
|
|
|
|
|
static int tally_websocket_data_handler(
|
|
@@ -190,10 +136,12 @@ static int tally_websocket_data_handler(
|
|
|
|
|
|
if ((bits & 0xf) == MG_WEBSOCKET_OPCODE_DATACOMPLETE)
|
|
|
{
|
|
|
- unique_lock<mutex> lck(tallySync.mtx);
|
|
|
- tallySync.val++;
|
|
|
+ struct synchronization_tool *sync = (struct synchronization_tool *) user_data;
|
|
|
+
|
|
|
+ unique_lock<mutex> lck(sync->mtx);
|
|
|
+ sync->val++;
|
|
|
|
|
|
- tallySync.cv.notify_all();
|
|
|
+ sync->cv.notify_all();
|
|
|
|
|
|
return false;
|
|
|
}
|
|
@@ -208,10 +156,13 @@ static int tally_websocket_data_handler(
|
|
|
}
|
|
|
|
|
|
Twistpoint get_generator(
|
|
|
+ default_random_engine& rng,
|
|
|
vector<Proof>& pi,
|
|
|
PrsonaServer *prsonaServer,
|
|
|
const vector<string>& serverIPs,
|
|
|
+ const vector<int>& serverPorts,
|
|
|
const string& selfIP,
|
|
|
+ int selfPort,
|
|
|
bool fresh)
|
|
|
{
|
|
|
Twistpoint retval = PrsonaServer::EL_GAMAL_GENERATOR;
|
|
@@ -226,24 +177,27 @@ Twistpoint get_generator(
|
|
|
|
|
|
for (size_t i = 0; i < serverIPs.size(); i++)
|
|
|
{
|
|
|
- if (serverIPs[i] == selfIP)
|
|
|
+ if (serverIPs[i] == selfIP && serverPorts[i] == selfPort)
|
|
|
continue;
|
|
|
|
|
|
+ struct synchronization_tool generatorSync;
|
|
|
+ char *genFilename;
|
|
|
+
|
|
|
bool flag = false;
|
|
|
while (!flag)
|
|
|
{
|
|
|
struct mg_connection *conn =
|
|
|
mg_connect_websocket_client(
|
|
|
serverIPs[i].c_str(),
|
|
|
- PRSONA_PORT,
|
|
|
+ serverPorts[i],
|
|
|
USE_SSL,
|
|
|
NULL,
|
|
|
0,
|
|
|
which,
|
|
|
"null",
|
|
|
- generator_websocket_data_handler,
|
|
|
- generator_websocket_close_handler,
|
|
|
- NULL);
|
|
|
+ file_websocket_data_handler,
|
|
|
+ file_websocket_close_handler,
|
|
|
+ &generatorSync);
|
|
|
|
|
|
if (!conn)
|
|
|
{
|
|
@@ -263,7 +217,7 @@ Twistpoint get_generator(
|
|
|
data.length());
|
|
|
|
|
|
unique_lock<mutex> lck(generatorSync.mtx);
|
|
|
- remove(GEN_TMP_FILE);
|
|
|
+ genFilename = set_temp_filename(rng, conn);
|
|
|
generatorSync.val = 0;
|
|
|
mg_websocket_client_write(
|
|
|
conn,
|
|
@@ -280,8 +234,11 @@ Twistpoint get_generator(
|
|
|
}
|
|
|
|
|
|
Proof currProof;
|
|
|
- retval = update_generator_from_gen_file(currProof);
|
|
|
+ retval = update_generator_from_gen_file(currProof, &generatorSync, genFilename);
|
|
|
pi.push_back(currProof);
|
|
|
+
|
|
|
+ remove(genFilename);
|
|
|
+ delete genFilename;
|
|
|
}
|
|
|
|
|
|
return retval;
|
|
@@ -289,10 +246,12 @@ Twistpoint get_generator(
|
|
|
|
|
|
void handout_generator(
|
|
|
const vector<Proof>& pi,
|
|
|
- const Twistpoint generator,
|
|
|
+ const Twistpoint& generator,
|
|
|
PrsonaServer *prsonaServer,
|
|
|
- const vector<string> serverIPs,
|
|
|
- string selfIP,
|
|
|
+ const vector<string>& serverIPs,
|
|
|
+ const vector<int>& serverPorts,
|
|
|
+ const string& selfIP,
|
|
|
+ int selfPort,
|
|
|
bool fresh)
|
|
|
{
|
|
|
if (fresh)
|
|
@@ -315,7 +274,7 @@ void handout_generator(
|
|
|
|
|
|
for (size_t i = 0; i < serverIPs.size(); i++)
|
|
|
{
|
|
|
- if (serverIPs[i] == selfIP)
|
|
|
+ if (serverIPs[i] == selfIP && serverPorts[i] == selfPort)
|
|
|
continue;
|
|
|
|
|
|
bool flag = false;
|
|
@@ -324,7 +283,7 @@ void handout_generator(
|
|
|
struct mg_connection *conn =
|
|
|
mg_connect_websocket_client(
|
|
|
serverIPs[i].c_str(),
|
|
|
- PRSONA_PORT,
|
|
|
+ serverPorts[i],
|
|
|
USE_SSL,
|
|
|
NULL,
|
|
|
0,
|
|
@@ -360,13 +319,16 @@ void handout_generator(
|
|
|
}
|
|
|
|
|
|
Twistpoint initiate_epoch_updates(
|
|
|
+ default_random_engine& rng,
|
|
|
const string& recipient,
|
|
|
+ int recipientPort,
|
|
|
const string& data,
|
|
|
vector<vector<Proof>>& generatorProofHolder,
|
|
|
bool isBreakdown)
|
|
|
{
|
|
|
Twistpoint retval;
|
|
|
struct synchronization_tool epochSync;
|
|
|
+ char * epochFilename;
|
|
|
const char* which = (isBreakdown ? EPOCH_BREAK_DOWN_URI : EPOCH_BUILD_UP_URI);
|
|
|
|
|
|
bool flag = false;
|
|
@@ -375,7 +337,7 @@ Twistpoint initiate_epoch_updates(
|
|
|
struct mg_connection *conn =
|
|
|
mg_connect_websocket_client(
|
|
|
recipient.c_str(),
|
|
|
- PRSONA_PORT,
|
|
|
+ recipientPort,
|
|
|
USE_SSL,
|
|
|
NULL,
|
|
|
0,
|
|
@@ -383,7 +345,7 @@ Twistpoint initiate_epoch_updates(
|
|
|
"null",
|
|
|
epoch_websocket_data_handler,
|
|
|
epoch_websocket_close_handler,
|
|
|
- NULL);
|
|
|
+ &epochSync);
|
|
|
|
|
|
if (!conn)
|
|
|
{
|
|
@@ -392,7 +354,7 @@ Twistpoint initiate_epoch_updates(
|
|
|
}
|
|
|
|
|
|
unique_lock<mutex> lck(epochSync.mtx);
|
|
|
- remove(EPOCH_GEN_TMP_FILE);
|
|
|
+ epochFilename = set_temp_filename(rng, conn);
|
|
|
epochSync.val = 0;
|
|
|
epochSync.val2 = 1;
|
|
|
|
|
@@ -423,17 +385,23 @@ Twistpoint initiate_epoch_updates(
|
|
|
vector<Proof> generatorProof;
|
|
|
generatorProofHolder.clear();
|
|
|
|
|
|
- retval = update_data_from_epoch_gen_file(generatorProof);
|
|
|
+ retval = update_data_from_epoch_gen_file(generatorProof, &epochSync, epochFilename);
|
|
|
|
|
|
generatorProofHolder.push_back(generatorProof);
|
|
|
|
|
|
+ remove(epochFilename);
|
|
|
+ delete epochFilename;
|
|
|
+
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
vector<Proof> epoch_build_up(
|
|
|
PrsonaServer *prsonaServer,
|
|
|
+ default_random_engine& rng,
|
|
|
const vector<string>& serverIPs,
|
|
|
+ const vector<int>& serverPorts,
|
|
|
const string& selfIP,
|
|
|
+ int selfPort,
|
|
|
Twistpoint& nextGenerator)
|
|
|
{
|
|
|
std::vector<std::vector<std::vector<Proof>>> pi;
|
|
@@ -448,7 +416,7 @@ vector<Proof> epoch_build_up(
|
|
|
|
|
|
for (size_t i = 0; i < serverIPs.size(); i++)
|
|
|
{
|
|
|
- if (serverIPs[i] == selfIP)
|
|
|
+ if (serverIPs[i] == selfIP && serverPorts[i] == selfPort)
|
|
|
{
|
|
|
pi.clear();
|
|
|
permutationCommits.clear();
|
|
@@ -497,6 +465,7 @@ vector<Proof> epoch_build_up(
|
|
|
|
|
|
distribute_epoch_updates(
|
|
|
serverIPs[j],
|
|
|
+ serverPorts[j],
|
|
|
data,
|
|
|
&epochSync);
|
|
|
}
|
|
@@ -512,7 +481,9 @@ vector<Proof> epoch_build_up(
|
|
|
generatorProofHolder[0],
|
|
|
nextGenerator);
|
|
|
nextGenerator = initiate_epoch_updates(
|
|
|
+ rng,
|
|
|
serverIPs[i],
|
|
|
+ serverPorts[i],
|
|
|
data,
|
|
|
generatorProofHolder,
|
|
|
false);
|
|
@@ -524,8 +495,11 @@ vector<Proof> epoch_build_up(
|
|
|
|
|
|
void epoch_break_down(
|
|
|
PrsonaServer *prsonaServer,
|
|
|
+ default_random_engine& rng,
|
|
|
const vector<string>& serverIPs,
|
|
|
+ const vector<int>& serverPorts,
|
|
|
const string& selfIP,
|
|
|
+ int selfPort,
|
|
|
const vector<Proof>& generatorProof,
|
|
|
const Twistpoint& nextGenerator)
|
|
|
{
|
|
@@ -553,7 +527,7 @@ void epoch_break_down(
|
|
|
userTallyMessageCommits.clear();
|
|
|
userTallySeedCommits.clear();
|
|
|
|
|
|
- if (serverIPs[i] == selfIP)
|
|
|
+ if (serverIPs[i] == selfIP && serverPorts[i] == selfPort)
|
|
|
{
|
|
|
prsonaServer->break_down_midway_pseudonyms(
|
|
|
generatorProof,
|
|
@@ -592,6 +566,7 @@ void epoch_break_down(
|
|
|
|
|
|
distribute_epoch_updates(
|
|
|
serverIPs[j],
|
|
|
+ serverPorts[j],
|
|
|
data,
|
|
|
&epochSync);
|
|
|
}
|
|
@@ -606,7 +581,9 @@ void epoch_break_down(
|
|
|
generatorProof,
|
|
|
nextGenerator);
|
|
|
initiate_epoch_updates(
|
|
|
+ rng,
|
|
|
serverIPs[i],
|
|
|
+ serverPorts[i],
|
|
|
data,
|
|
|
unused,
|
|
|
true);
|
|
@@ -617,15 +594,18 @@ void epoch_break_down(
|
|
|
void tally_scores(
|
|
|
PrsonaServer *prsonaServer,
|
|
|
const vector<string>& serverIPs,
|
|
|
+ const vector<int>& serverPorts,
|
|
|
const string& selfIP,
|
|
|
+ int selfPort,
|
|
|
const Twistpoint& nextGenerator,
|
|
|
std::vector<EGCiphertext>& userTallyScores,
|
|
|
std::vector<CurveBipoint>& serverTallyScores)
|
|
|
{
|
|
|
+ struct synchronization_tool tallySync;
|
|
|
tallySync.val = 0;
|
|
|
for (size_t i = 0; i < serverIPs.size(); i++)
|
|
|
{
|
|
|
- if (serverIPs[i] == selfIP)
|
|
|
+ if (serverIPs[i] == selfIP && serverPorts[i] == selfPort)
|
|
|
{
|
|
|
unique_lock<mutex> lck(tallySync.mtx);
|
|
|
tallySync.val++;
|
|
@@ -639,7 +619,7 @@ void tally_scores(
|
|
|
struct mg_connection *conn =
|
|
|
mg_connect_websocket_client(
|
|
|
serverIPs[i].c_str(),
|
|
|
- PRSONA_PORT,
|
|
|
+ serverPorts[i],
|
|
|
USE_SSL,
|
|
|
NULL,
|
|
|
0,
|
|
@@ -647,11 +627,11 @@ void tally_scores(
|
|
|
"null",
|
|
|
tally_websocket_data_handler,
|
|
|
empty_websocket_close_handler,
|
|
|
- NULL);
|
|
|
+ &tallySync);
|
|
|
|
|
|
if (!conn)
|
|
|
{
|
|
|
- std::cerr << "Trouble initiating epoch update with server at " << serverIPs[i] << std::endl;
|
|
|
+ std::cerr << "Trouble initiating epoch update with server at " << serverIPs[i] << ":" << serverPorts[i] << std::endl;
|
|
|
continue;
|
|
|
}
|
|
|
|
|
@@ -713,7 +693,9 @@ void tally_scores(
|
|
|
void distribute_tallied_scores(
|
|
|
PrsonaServer *prsonaServer,
|
|
|
const vector<string>& serverIPs,
|
|
|
+ const vector<int>& serverPorts,
|
|
|
const string& selfIP,
|
|
|
+ int selfPort,
|
|
|
const Twistpoint& nextGenerator,
|
|
|
const std::vector<EGCiphertext>& userTallyScores,
|
|
|
const std::vector<CurveBipoint>& serverTallyScores)
|
|
@@ -730,10 +712,11 @@ void distribute_tallied_scores(
|
|
|
|
|
|
data = buffer.str();
|
|
|
|
|
|
+ struct synchronization_tool tallySync;
|
|
|
tallySync.val = 0;
|
|
|
for (size_t i = 0; i < serverIPs.size(); i++)
|
|
|
{
|
|
|
- if (serverIPs[i] == selfIP)
|
|
|
+ if (serverIPs[i] == selfIP && serverPorts[i] == selfPort)
|
|
|
{
|
|
|
prsonaServer->receive_tallied_scores(userTallyScores, serverTallyScores);
|
|
|
unique_lock<mutex> lck(tallySync.mtx);
|
|
@@ -748,7 +731,7 @@ void distribute_tallied_scores(
|
|
|
struct mg_connection *conn =
|
|
|
mg_connect_websocket_client(
|
|
|
serverIPs[i].c_str(),
|
|
|
- PRSONA_PORT,
|
|
|
+ serverPorts[i],
|
|
|
USE_SSL,
|
|
|
NULL,
|
|
|
0,
|
|
@@ -756,11 +739,11 @@ void distribute_tallied_scores(
|
|
|
"null",
|
|
|
tally_websocket_data_handler,
|
|
|
empty_websocket_close_handler,
|
|
|
- NULL);
|
|
|
+ &tallySync);
|
|
|
|
|
|
if (!conn)
|
|
|
{
|
|
|
- std::cerr << "Trouble initiating epoch update with server at " << serverIPs[i] << std::endl;
|
|
|
+ std::cerr << "Trouble initiating epoch update with server at " << serverIPs[i] << ":" << serverPorts[i] << std::endl;
|
|
|
continue;
|
|
|
}
|
|
|
|
|
@@ -790,23 +773,33 @@ void distribute_tallied_scores(
|
|
|
|
|
|
void epoch(
|
|
|
PrsonaServer *prsonaServer,
|
|
|
+ default_random_engine& rng,
|
|
|
const vector<string>& serverIPs,
|
|
|
- const string& selfIP)
|
|
|
+ const vector<int>& serverPorts,
|
|
|
+ const string& selfIP,
|
|
|
+ int selfPort)
|
|
|
{
|
|
|
Twistpoint nextGenerator = PrsonaServer::EL_GAMAL_GENERATOR;
|
|
|
+
|
|
|
+ struct synchronization_tool updateSync;
|
|
|
|
|
|
unique_lock<mutex> lck(updateMtx, defer_lock);
|
|
|
obtain_update_locks(
|
|
|
lck,
|
|
|
serverIPs,
|
|
|
+ serverPorts,
|
|
|
selfIP,
|
|
|
+ selfPort,
|
|
|
&updateSync);
|
|
|
|
|
|
vector<Proof> generatorProof =
|
|
|
epoch_build_up(
|
|
|
prsonaServer,
|
|
|
+ rng,
|
|
|
serverIPs,
|
|
|
+ serverPorts,
|
|
|
selfIP,
|
|
|
+ selfPort,
|
|
|
nextGenerator);
|
|
|
|
|
|
std::vector<EGCiphertext> currentUserEncryptedTallies;
|
|
@@ -815,7 +808,9 @@ void epoch(
|
|
|
tally_scores(
|
|
|
prsonaServer,
|
|
|
serverIPs,
|
|
|
+ serverPorts,
|
|
|
selfIP,
|
|
|
+ selfPort,
|
|
|
nextGenerator,
|
|
|
currentUserEncryptedTallies,
|
|
|
currentServerEncryptedTallies);
|
|
@@ -823,15 +818,20 @@ void epoch(
|
|
|
distribute_tallied_scores(
|
|
|
prsonaServer,
|
|
|
serverIPs,
|
|
|
+ serverPorts,
|
|
|
selfIP,
|
|
|
+ selfPort,
|
|
|
nextGenerator,
|
|
|
currentUserEncryptedTallies,
|
|
|
currentServerEncryptedTallies);
|
|
|
|
|
|
epoch_break_down(
|
|
|
prsonaServer,
|
|
|
+ rng,
|
|
|
serverIPs,
|
|
|
+ serverPorts,
|
|
|
selfIP,
|
|
|
+ selfPort,
|
|
|
generatorProof,
|
|
|
nextGenerator);
|
|
|
|
|
@@ -840,7 +840,9 @@ void epoch(
|
|
|
release_update_locks(
|
|
|
lck,
|
|
|
serverIPs,
|
|
|
+ serverPorts,
|
|
|
selfIP,
|
|
|
+ selfPort,
|
|
|
&updateSync);
|
|
|
}
|
|
|
|
|
@@ -908,61 +910,131 @@ int main(int argc, char *argv[])
|
|
|
#else
|
|
|
mg_init_library(MG_FEATURES_SSL);
|
|
|
#endif
|
|
|
-
|
|
|
- const char *options[] = {"listening_ports", PRSONA_PORT_STR, 0};
|
|
|
+
|
|
|
+ string id = "";
|
|
|
+ if (argc > 1)
|
|
|
+ id = argv[1];
|
|
|
+
|
|
|
+ string seedStr;
|
|
|
+ if (id.empty())
|
|
|
+ seedStr = "default-server";
|
|
|
+ else
|
|
|
+ {
|
|
|
+ seedStr = id;
|
|
|
+ seedStr += "-server";
|
|
|
+ }
|
|
|
|
|
|
vector<string> serverIPs;
|
|
|
- string selfIP, dealerIP;
|
|
|
+ vector<int> serverPorts;
|
|
|
+ string selfIP, selfPortStr, dealerIP;
|
|
|
+ int selfPort = 0, dealerPort = 0;
|
|
|
|
|
|
- char buffer[40];
|
|
|
- ifstream serverConfig("serverIPs.cfg");
|
|
|
+ char buffer[46], *helper;
|
|
|
+ ifstream serverConfig("cfg/serverIPs.cfg");
|
|
|
while (!serverConfig.eof())
|
|
|
{
|
|
|
- serverConfig.getline(buffer, 40);
|
|
|
+ serverConfig.getline(buffer, 46);
|
|
|
if (strlen(buffer) > 0)
|
|
|
- serverIPs.push_back(string(buffer));
|
|
|
+ {
|
|
|
+ helper = buffer;
|
|
|
+ if (strchr(helper, ':'))
|
|
|
+ {
|
|
|
+ helper = strtok(helper, ":");
|
|
|
+ serverIPs.push_back(string(helper));
|
|
|
+ helper = strtok(NULL, ":");
|
|
|
+ serverPorts.push_back(atoi(helper));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ serverIPs.push_back(string(helper));
|
|
|
+ serverPorts.push_back(atoi(PRSONA_PORT_STR));
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- ifstream selfConfig("selfIP.cfg");
|
|
|
+ string selfConfigFilename = "cfg/selfIP";
|
|
|
+ if (!id.empty())
|
|
|
+ {
|
|
|
+ selfConfigFilename += "-";
|
|
|
+ selfConfigFilename += id;
|
|
|
+ }
|
|
|
+ selfConfigFilename += ".cfg";
|
|
|
+
|
|
|
+ ifstream selfConfig(selfConfigFilename);
|
|
|
while (!selfConfig.eof())
|
|
|
{
|
|
|
- selfConfig.getline(buffer, 40);
|
|
|
+ selfConfig.getline(buffer, 46);
|
|
|
if (strlen(buffer) > 0)
|
|
|
- selfIP = buffer;
|
|
|
+ {
|
|
|
+ helper = buffer;
|
|
|
+ if (strchr(helper, ':'))
|
|
|
+ {
|
|
|
+ helper = strtok(helper, ":");
|
|
|
+ selfIP = helper;
|
|
|
+ helper = strtok(NULL, ":");
|
|
|
+ selfPortStr = helper;
|
|
|
+ selfPort = atoi(helper);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ selfIP = helper;
|
|
|
+ selfPortStr = PRSONA_PORT_STR;
|
|
|
+ selfPort = atoi(PRSONA_PORT_STR);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- ifstream dealerConfig("dealerIP.cfg");
|
|
|
+ ifstream dealerConfig("cfg/dealerIP.cfg");
|
|
|
while (!dealerConfig.eof())
|
|
|
{
|
|
|
- dealerConfig.getline(buffer, 40);
|
|
|
+ dealerConfig.getline(buffer, 46);
|
|
|
if (strlen(buffer) > 0)
|
|
|
- dealerIP = buffer;
|
|
|
+ {
|
|
|
+ helper = buffer;
|
|
|
+ if (strchr(helper, ':'))
|
|
|
+ {
|
|
|
+ helper = strtok(helper, ":");
|
|
|
+ dealerIP = helper;
|
|
|
+ helper = strtok(NULL, ":");
|
|
|
+ dealerPort = atoi(helper);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dealerIP = helper;
|
|
|
+ dealerPort = atoi(PRSONA_PORT_STR);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Defaults
|
|
|
size_t numServers = serverIPs.size();
|
|
|
- bool bgnDealer = selfIP == dealerIP;
|
|
|
+ bool bgnDealer = selfIP == dealerIP && selfPort == dealerPort;
|
|
|
bool maliciousServers = true;
|
|
|
|
|
|
- if (argc > 1)
|
|
|
+ const char *options[] = {"listening_ports", selfPortStr.c_str(), 0};
|
|
|
+
|
|
|
+ if (argc > 2)
|
|
|
{
|
|
|
- bool setting = argv[1][0] == 't' || argv[1][0] == 'T';
|
|
|
+ bool setting = argv[2][0] == 't' || argv[2][0] == 'T';
|
|
|
maliciousServers = setting;
|
|
|
}
|
|
|
|
|
|
- cout << "Establishing PRSONA server with the following parameters: " << endl;
|
|
|
- cout << numServers << " PRSONA servers" << endl;
|
|
|
- cout << "This server " << (bgnDealer ? "IS" : "is NOT") << "the trusted BGN dealer" << endl;
|
|
|
- cout << "Servers are set to " << (maliciousServers ? "MALICIOUS" : "HBC") << " security" << endl;
|
|
|
- cout << "This server is at IP address: " << selfIP << endl;
|
|
|
- cout << "The BGN dealer is at IP address: " << dealerIP << endl;
|
|
|
+ seed_seq seed(seedStr.begin(), seedStr.end());
|
|
|
+ default_random_engine rng(seed);
|
|
|
+
|
|
|
+ cout << "[" << seedStr << "] Establishing PRSONA server with the following parameters: " << endl;
|
|
|
+ cout << "[" << seedStr << "] " << numServers << " PRSONA servers" << endl;
|
|
|
+ cout << "[" << seedStr << "] This server " << (bgnDealer ? "IS" : "is NOT") << " the trusted BGN dealer" << endl;
|
|
|
+ cout << "[" << seedStr << "] Servers are set to " << (maliciousServers ? "MALICIOUS" : "HBC") << " security" << endl;
|
|
|
+ cout << "[" << seedStr << "] This server is at IP address: " << selfIP << ":" << selfPort << endl;
|
|
|
+ cout << "[" << seedStr << "] The BGN dealer is at IP address: " << dealerIP << ":" << dealerPort << endl;
|
|
|
cout << endl;
|
|
|
|
|
|
// Set malicious flags where necessary
|
|
|
if (maliciousServers)
|
|
|
PrsonaBase::set_server_malicious();
|
|
|
|
|
|
- cout << "Creating PrsonaServer entity." << endl;
|
|
|
+ cout << "[" << seedStr << "] Creating PrsonaServer entity." << endl;
|
|
|
|
|
|
// Entities we operate with
|
|
|
PrsonaServer *prsonaServer;
|
|
@@ -970,7 +1042,10 @@ int main(int argc, char *argv[])
|
|
|
prsonaServer = new PrsonaServer(numServers);
|
|
|
else
|
|
|
{
|
|
|
- cout << "Retrieving BGN details." << endl;
|
|
|
+ cout << "[" << seedStr << "] Retrieving BGN details." << endl;
|
|
|
+
|
|
|
+ struct synchronization_tool bgnSync;
|
|
|
+ char *bgnFilename;
|
|
|
|
|
|
bool flag = false;
|
|
|
while (!flag)
|
|
@@ -978,24 +1053,24 @@ int main(int argc, char *argv[])
|
|
|
struct mg_connection *conn =
|
|
|
mg_connect_websocket_client(
|
|
|
dealerIP.c_str(),
|
|
|
- PRSONA_PORT,
|
|
|
+ dealerPort,
|
|
|
USE_SSL,
|
|
|
NULL,
|
|
|
0,
|
|
|
PRIVATE_BGN_URI,
|
|
|
"null",
|
|
|
- bgn_websocket_data_handler,
|
|
|
- bgn_websocket_close_handler,
|
|
|
- NULL);
|
|
|
+ file_websocket_data_handler,
|
|
|
+ file_websocket_close_handler,
|
|
|
+ &bgnSync);
|
|
|
|
|
|
if (!conn)
|
|
|
{
|
|
|
- cerr << "Couldn't obtain BGN details." << endl;
|
|
|
+ cerr << "[" << seedStr << "] Couldn't obtain BGN details." << endl;
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
unique_lock<mutex> lck(bgnSync.mtx);
|
|
|
- remove(BGN_TMP_FILE);
|
|
|
+ bgnFilename = set_temp_filename(rng, conn);
|
|
|
bgnSync.val = 0;
|
|
|
mg_websocket_client_write(
|
|
|
conn,
|
|
@@ -1011,17 +1086,20 @@ int main(int argc, char *argv[])
|
|
|
flag = true;
|
|
|
}
|
|
|
|
|
|
- prsonaServer = create_server_from_bgn_file(numServers);
|
|
|
+ prsonaServer = create_server_from_bgn_file(numServers, &bgnSync, bgnFilename);
|
|
|
+
|
|
|
+ remove(bgnFilename);
|
|
|
+ delete bgnFilename;
|
|
|
}
|
|
|
|
|
|
CivetServer server(options);
|
|
|
|
|
|
- PrsonaServerWebSocketHandler wsHandler(prsonaServer, &updateMtx, &epochNum, serverIPs, selfIP);
|
|
|
+ PrsonaServerWebSocketHandler wsHandler(prsonaServer, &rng, &updateMtx, &epochNum, serverIPs, serverPorts, selfIP, selfPort);
|
|
|
server.addWebSocketHandler("/ws", wsHandler);
|
|
|
|
|
|
if (bgnDealer)
|
|
|
{
|
|
|
- cout << "Waiting for other servers to check in and retrieve BGN details." << endl;
|
|
|
+ cout << "[" << seedStr << "] Waiting for other servers to check in and retrieve BGN details." << endl;
|
|
|
|
|
|
unique_lock<mutex> lck(readySync.mtx);
|
|
|
RemoteControlHandler serverReadyHandler(&readySync, "ACK");
|
|
@@ -1033,18 +1111,18 @@ int main(int argc, char *argv[])
|
|
|
|
|
|
vector<Proof> pi;
|
|
|
Twistpoint freshGenerator =
|
|
|
- get_generator(pi, prsonaServer, serverIPs, selfIP, true);
|
|
|
+ get_generator(rng, pi, prsonaServer, serverIPs, serverPorts, selfIP, selfPort, true);
|
|
|
|
|
|
- handout_generator(pi, freshGenerator, prsonaServer, serverIPs, selfIP, true);
|
|
|
+ handout_generator(pi, freshGenerator, prsonaServer, serverIPs, serverPorts, selfIP, selfPort, true);
|
|
|
|
|
|
Twistpoint blindGenerator =
|
|
|
- get_generator(pi, prsonaServer, serverIPs, selfIP, false);
|
|
|
+ get_generator(rng, pi, prsonaServer, serverIPs, serverPorts, selfIP, selfPort, false);
|
|
|
|
|
|
- handout_generator(pi, blindGenerator, prsonaServer, serverIPs, selfIP, false);
|
|
|
+ handout_generator(pi, blindGenerator, prsonaServer, serverIPs, serverPorts, selfIP, selfPort, false);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- cout << "Notifying BGN dealer that this server is ready." << endl;
|
|
|
+ cout << "[" << seedStr << "] Notifying BGN dealer that this server is ready." << endl;
|
|
|
|
|
|
stringstream sysString;
|
|
|
string data;
|
|
@@ -1052,13 +1130,13 @@ int main(int argc, char *argv[])
|
|
|
struct mg_connection *conn =
|
|
|
mg_connect_client(
|
|
|
dealerIP.c_str(),
|
|
|
- PRSONA_PORT,
|
|
|
+ dealerPort,
|
|
|
USE_SSL,
|
|
|
NULL,
|
|
|
0);
|
|
|
|
|
|
sysString << "GET " << SERVER_READY_URI << " HTTP/1.1\r\n";
|
|
|
- sysString << "Host: " << dealerIP << "\r\n\r\n";
|
|
|
+ sysString << "Host: " << dealerIP << ":" << dealerPort << "\r\n\r\n";
|
|
|
data = sysString.str();
|
|
|
|
|
|
mg_write(conn, data.c_str(), data.length());
|
|
@@ -1071,7 +1149,7 @@ int main(int argc, char *argv[])
|
|
|
RemoteControlHandler exitHandler(&exitSync, "Server coming down!");
|
|
|
server.addHandler(EXIT_URI, exitHandler);
|
|
|
|
|
|
- cout << "Entering main ready loop." << endl;
|
|
|
+ cout << "[" << seedStr << "] Entering main ready loop." << endl;
|
|
|
|
|
|
if (bgnDealer)
|
|
|
{
|
|
@@ -1091,9 +1169,9 @@ int main(int argc, char *argv[])
|
|
|
|
|
|
if (exitSync.val2)
|
|
|
{
|
|
|
- cout << "Executing epoch." << endl;
|
|
|
+ cout << "[" << seedStr << "] Executing epoch." << endl;
|
|
|
|
|
|
- epoch(prsonaServer, serverIPs, selfIP);
|
|
|
+ epoch(prsonaServer, rng, serverIPs, serverPorts, selfIP, selfPort);
|
|
|
|
|
|
exitSync.val2 = 0;
|
|
|
}
|
|
@@ -1105,7 +1183,7 @@ int main(int argc, char *argv[])
|
|
|
exitSync.cv.wait(exitLock);
|
|
|
}
|
|
|
|
|
|
- cout << "Shutting down." << endl;
|
|
|
+ cout << "[" << seedStr << "] Shutting down." << endl;
|
|
|
|
|
|
mg_exit_library();
|
|
|
delete prsonaServer;
|