|
@@ -1,67 +1,15 @@
|
|
|
#include <iostream>
|
|
|
+#include <sstream>
|
|
|
+#include <cstring>
|
|
|
+#include <cstdio>
|
|
|
|
|
|
#include "networkServer.hpp"
|
|
|
|
|
|
-#define TMP_FILE_SIZE 12
|
|
|
-#define TMP_DIR "~/tmp/"
|
|
|
-#define TMP_DIR_SIZE 6
|
|
|
-
|
|
|
-std::string random_string(size_t length)
|
|
|
-{
|
|
|
- auto randchar = []() -> char
|
|
|
- {
|
|
|
- const char charset[] =
|
|
|
- "0123456789_-"
|
|
|
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
|
- "abcdefghijklmnopqrstuvwxyz";
|
|
|
- const size_t max_index = (sizeof(charset) - 1);
|
|
|
- return charset[ rand() % max_index ];
|
|
|
- };
|
|
|
- std::string str(length,0);
|
|
|
- std::generate_n(str.begin(), length, randchar);
|
|
|
- return str;
|
|
|
-}
|
|
|
-
|
|
|
-static int synchro_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_DATACOMPLETE)
|
|
|
- {
|
|
|
- struct synchronization_tool *synch = (struct synchronization_tool *) user_data;
|
|
|
-
|
|
|
- unique_lock<mutex> lck(synch->mtx);
|
|
|
- synch->val++;
|
|
|
-
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- std::cerr << "Unknown response when trying to get update lock." << std::endl;
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
-static void synchro_websocket_close_handler(
|
|
|
- const struct mg_connection *conn,
|
|
|
- void *user_data)
|
|
|
-{
|
|
|
- struct synchronization_tool *synch = (struct synchronization_tool *) user_data;
|
|
|
-
|
|
|
- unique_lock<mutex> lck(synch->mtx);
|
|
|
- synch->val2 = 0;
|
|
|
- synch->cv.notify_all();
|
|
|
-}
|
|
|
-
|
|
|
void obtain_update_locks(
|
|
|
std::unique_lock<std::mutex> &lck,
|
|
|
const std::vector<std::string>& serverIPs,
|
|
|
const std::string& selfIP,
|
|
|
- struct synchronization_tool *synch)
|
|
|
+ struct synchronization_tool *sync)
|
|
|
{
|
|
|
size_t i = 0;
|
|
|
while (i < serverIPs.size())
|
|
@@ -84,7 +32,7 @@ void obtain_update_locks(
|
|
|
"null",
|
|
|
synchro_websocket_data_handler,
|
|
|
synchro_websocket_close_handler,
|
|
|
- (void *) synch);
|
|
|
+ (void *) sync);
|
|
|
|
|
|
if (!conn)
|
|
|
{
|
|
@@ -92,19 +40,21 @@ void obtain_update_locks(
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- unique_lock<mutex> lck(synch->mtx);
|
|
|
- synch->val = 0;
|
|
|
- synch->val2 = 1;
|
|
|
+ unique_lock<mutex> lck(sync->mtx);
|
|
|
+ sync->val = 0;
|
|
|
+ sync->val2 = 0;
|
|
|
mg_websocket_client_write(
|
|
|
conn,
|
|
|
MG_WEBSOCKET_OPCODE_DATACOMPLETE,
|
|
|
"",
|
|
|
0);
|
|
|
|
|
|
- while (synch->val2)
|
|
|
- synch->cv.wait(lck);
|
|
|
+ while (!sync->val2)
|
|
|
+ sync->cv.wait(lck);
|
|
|
+
|
|
|
+ mg_close_connection(conn);
|
|
|
|
|
|
- if (synch->val)
|
|
|
+ if (sync->val)
|
|
|
i++;
|
|
|
}
|
|
|
}
|
|
@@ -113,7 +63,7 @@ void release_update_locks(
|
|
|
std::unique_lock<std::mutex> &lck,
|
|
|
const std::vector<std::string>& serverIPs,
|
|
|
const std::string& selfIP,
|
|
|
- struct synchronization_tool *synch)
|
|
|
+ struct synchronization_tool *sync)
|
|
|
{
|
|
|
ssize_t i = serverIPs.size() - 1;
|
|
|
while (i >= 0)
|
|
@@ -136,7 +86,7 @@ void release_update_locks(
|
|
|
"null",
|
|
|
synchro_websocket_data_handler,
|
|
|
synchro_websocket_close_handler,
|
|
|
- (void *) synch);
|
|
|
+ (void *) sync);
|
|
|
|
|
|
if (!conn)
|
|
|
{
|
|
@@ -144,19 +94,21 @@ void release_update_locks(
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- unique_lock<mutex> lck(synch->mtx);
|
|
|
- synch->val = 0;
|
|
|
- synch->val2 = 1;
|
|
|
+ unique_lock<mutex> lck(sync->mtx);
|
|
|
+ sync->val = 0;
|
|
|
+ sync->val2 = 0;
|
|
|
mg_websocket_client_write(
|
|
|
conn,
|
|
|
MG_WEBSOCKET_OPCODE_DATACOMPLETE,
|
|
|
"",
|
|
|
0);
|
|
|
|
|
|
- while (synch->val2)
|
|
|
- synch->cv.wait(lck);
|
|
|
+ while (!sync->val2)
|
|
|
+ sync->cv.wait(lck);
|
|
|
|
|
|
- if (synch->val)
|
|
|
+ mg_close_connection(conn);
|
|
|
+
|
|
|
+ if (sync->val)
|
|
|
i--;
|
|
|
}
|
|
|
}
|
|
@@ -165,10 +117,11 @@ std::string make_epoch_initiator_string(
|
|
|
const std::vector<Proof>& generatorProof,
|
|
|
const Twistpoint& nextGenerator)
|
|
|
{
|
|
|
- stringstream buffer;
|
|
|
+ std::stringstream buffer;
|
|
|
|
|
|
- buffer << generatorProof.size();
|
|
|
- for (size_t i = 0; i < generatorProof.size(); i++)
|
|
|
+ BinarySizeT sizeOfVector(generatorProof.size());
|
|
|
+ buffer << sizeOfVector;
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
buffer << generatorProof[i];
|
|
|
|
|
|
buffer << nextGenerator;
|
|
@@ -182,15 +135,16 @@ void read_epoch_initiator_string(
|
|
|
Twistpoint& nextGenerator)
|
|
|
{
|
|
|
ifstream file(filename);
|
|
|
- size_t limitI;
|
|
|
+ BinarySizeT sizeOfVector;
|
|
|
|
|
|
generatorProof.clear();
|
|
|
|
|
|
- file >> limitI;
|
|
|
- for (size_t i = 0; i < limitI; i++)
|
|
|
+ file >> sizeOfVector;
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
{
|
|
|
Proof currProof;
|
|
|
file >> currProof;
|
|
|
+
|
|
|
generatorProof.push_back;
|
|
|
}
|
|
|
|
|
@@ -211,65 +165,81 @@ std::string make_epoch_update_string(
|
|
|
const Twistpoint& nextGenerator,
|
|
|
bool doUserTallies)
|
|
|
{
|
|
|
- stringstream buffer;
|
|
|
+ std::stringstream buffer;
|
|
|
|
|
|
- buffer << pi.size();
|
|
|
- for (size_t i = 0; i < pi.size(); i++)
|
|
|
+ BinarySizeT sizeOfVectorI, sizeOfVectorJ;
|
|
|
+
|
|
|
+ sizeOfVectorI.set(pi.size());
|
|
|
+ buffer << sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
{
|
|
|
- buffer << pi[i].size();
|
|
|
- for (size_t j = 0; j < pi[i].size(); j++)
|
|
|
+ sizeOfVectorJ.set(pi[i].size());
|
|
|
+ buffer << sizeOfVectorJ;
|
|
|
+
|
|
|
+ for (size_t j = 0; j < sizeOfVectorJ.val(); j++)
|
|
|
buffer << pi[i][j];
|
|
|
}
|
|
|
|
|
|
- buffer << permutationCommits.size();
|
|
|
- for (size_t i = 0; i < permutationCommits.size(); i++)
|
|
|
- for (size_t j = 0; j < permutationCommits[i].size(); j++)
|
|
|
+ sizeOfVectorI.set(permutationCommits.size());
|
|
|
+ buffer << sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
+ for (size_t j = 0; j < sizeOfVectorI.val(); j++)
|
|
|
buffer << permutationCommits[i][j];
|
|
|
|
|
|
- buffer << freshPseudonymCommits.size();
|
|
|
- for (size_t i = 0; i < freshPseudonymCommits.size(); i++)
|
|
|
- for (size_t j = 0; j < freshPseudonymCommits[i].size(); j++)
|
|
|
+ sizeOfVectorI.set(freshPseudonymCommits.size());
|
|
|
+ buffer << sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
+ for (size_t j = 0; j < sizeOfVectorI.val(); j++)
|
|
|
buffer << freshPseudonymCommits[i][j];
|
|
|
|
|
|
- buffer << freshPseudonymSeedCommits.size();
|
|
|
- for (size_t i = 0; i < freshPseudonymSeedCommits.size(); i++)
|
|
|
- for (size_t j = 0; j < freshPseudonymSeedCommits[i].size(); j++)
|
|
|
+ sizeOfVectorI.set(freshPseudonymSeedCommits.size());
|
|
|
+ buffer << sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
+ for (size_t j = 0; j < sizeOfVectorI.val(); j++)
|
|
|
buffer << freshPseudonymSeedCommits[i][j];
|
|
|
|
|
|
- buffer << serverTallyCommits.size();
|
|
|
- for (size_t i = 0; i < serverTallyCommits.size(); i++)
|
|
|
- for (size_t j = 0; j < serverTallyCommits[i].size(); j++)
|
|
|
+ sizeOfVectorI.set(serverTallyCommits.size());
|
|
|
+ buffer << sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
+ for (size_t j = 0; j < sizeOfVectorI.val(); j++)
|
|
|
buffer << serverTallyCommits[i][j];
|
|
|
|
|
|
- buffer << partwayVoteMatrixCommits.size();
|
|
|
- for (size_t i = 0; i < partwayVoteMatrixCommits.size(); i++)
|
|
|
- for (size_t j = 0; j < partwayVoteMatrixCommits[i].size(); j++)
|
|
|
- for (size_t k = 0; k < partwayVoteMatrixCommits[i][j].size(); k++)
|
|
|
+ sizeOfVectorI.set(partwayVoteMatrixCommits.size());
|
|
|
+ buffer << sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
+ for (size_t j = 0; j < sizeOfVectorI.val(); j++)
|
|
|
+ for (size_t k = 0; k < sizeOfVectorI.val(); k++)
|
|
|
buffer << partwayVoteMatrixCommits[i][j][k];
|
|
|
|
|
|
- buffer << finalVoteMatrixCommits.size();
|
|
|
- for (size_t i = 0; i < finalVoteMatrixCommits.size(); i++)
|
|
|
- for (size_t j = 0; j < finalVoteMatrixCommits[i].size(); j++)
|
|
|
- for (size_t k = 0; k < finalVoteMatrixCommits[i][j].size(); k++)
|
|
|
+ sizeOfVectorI.set(finalVoteMatrixCommits.size());
|
|
|
+ buffer << sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
+ for (size_t j = 0; j < sizeOfVectorI.val(); j++)
|
|
|
+ for (size_t k = 0; k < sizeOfVectorI.val(); k++)
|
|
|
buffer << finalVoteMatrixCommits[i][j][k];
|
|
|
|
|
|
- buffer << userTallyMaskCommits.size();
|
|
|
- for (size_t i = 0; i < userTallyMaskCommits.size(); i++)
|
|
|
- for (size_t j = 0; j < userTallyMaskCommits[i].size(); j++)
|
|
|
+ sizeOfVectorI.set(userTallyMaskCommits.size());
|
|
|
+ buffer << sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
+ for (size_t j = 0; j < sizeOfVectorI.val(); j++)
|
|
|
buffer << userTallyMaskCommits[i][j];
|
|
|
|
|
|
- buffer << userTallyMessageCommits.size();
|
|
|
- for (size_t i = 0; i < userTallyMessageCommits.size(); i++)
|
|
|
- for (size_t j = 0; j < userTallyMessageCommits[i].size(); j++)
|
|
|
+ sizeOfVectorI.set(userTallyMessageCommits.size());
|
|
|
+ buffer << sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
+ for (size_t j = 0; j < sizeOfVectorI.val(); j++)
|
|
|
buffer << userTallyMessageCommits[i][j];
|
|
|
|
|
|
- buffer << userTallySeedCommits.size();
|
|
|
- for (size_t i = 0; i < userTallySeedCommits.size(); i++)
|
|
|
- for (size_t j = 0; j < userTallySeedCommits[i].size(); j++)
|
|
|
+ sizeOfVectorI.set(userTallySeedCommits.size());
|
|
|
+ buffer << sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
+ for (size_t j = 0; j < sizeOfVectorI.val(); j++)
|
|
|
buffer << userTallySeedCommits[i][j];
|
|
|
|
|
|
buffer << nextGenerator;
|
|
|
- buffer << doUserTallies;
|
|
|
+
|
|
|
+ BinaryBool flag(doUserTallies);
|
|
|
+ buffer << flag;
|
|
|
|
|
|
return buffer.str();
|
|
|
}
|
|
@@ -289,7 +259,7 @@ bool read_epoch_update_string(
|
|
|
Twistpoint& nextGenerator)
|
|
|
{
|
|
|
ifstream file(filename);
|
|
|
- size_t limitI, limitJ;
|
|
|
+ BinarySizeT sizeOfVectorI, sizeOfVectorJ;
|
|
|
|
|
|
pi.clear();
|
|
|
permutationCommits.clear();
|
|
@@ -302,85 +272,92 @@ bool read_epoch_update_string(
|
|
|
userTallyMessageCommits.clear();
|
|
|
userTallySeedCommits.clear();
|
|
|
|
|
|
- file >> limitI;
|
|
|
- for (size_t i = 0; i < limitI; i++)
|
|
|
+
|
|
|
+ file >> sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
{
|
|
|
std::vector<Proof> currRow;
|
|
|
|
|
|
- file >> limitJ;
|
|
|
- for (size_t j = 0; j < limitJ; j++)
|
|
|
+ file >> sizeOfVectorJ;
|
|
|
+ for (size_t j = 0; j < sizeOfVectorJ.val(); j++)
|
|
|
{
|
|
|
Proof currProof;
|
|
|
file >> currProof;
|
|
|
+
|
|
|
currRow.push_back(currProof);
|
|
|
}
|
|
|
|
|
|
pi.push_back(currRow);
|
|
|
}
|
|
|
|
|
|
- file >> limitI;
|
|
|
- for (size_t i = 0; i < limitI; i++)
|
|
|
+ file >> sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
{
|
|
|
std::vector<Twistpoint> currRow;
|
|
|
- for (size_t j = 0; j < limitI; j++)
|
|
|
+ for (size_t j = 0; j < sizeOfVectorI.val(); j++)
|
|
|
{
|
|
|
Twistpoint currCommit;
|
|
|
file >> currCommit;
|
|
|
+
|
|
|
currRow.push_back(currCommit);
|
|
|
}
|
|
|
permutationCommits.push_back(currRow);
|
|
|
}
|
|
|
|
|
|
- file >> limitI;
|
|
|
- for (size_t i = 0; i < limitI; i++)
|
|
|
+ file >> sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
{
|
|
|
std::vector<Twistpoint> currRow;
|
|
|
- for (size_t j = 0; j < limitI; j++)
|
|
|
+ for (size_t j = 0; j < sizeOfVectorI.val(); j++)
|
|
|
{
|
|
|
Twistpoint currCommit;
|
|
|
file >> currCommit;
|
|
|
+
|
|
|
currRow.push_back(currCommit);
|
|
|
}
|
|
|
freshPseudonymCommits.push_back(currRow);
|
|
|
}
|
|
|
|
|
|
- file >> limitI;
|
|
|
- for (size_t i = 0; i < limitI; i++)
|
|
|
+ file >> sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
{
|
|
|
std::vector<Twistpoint> currRow;
|
|
|
- for (size_t j = 0; j < limitI; j++)
|
|
|
+ for (size_t j = 0; j < sizeOfVectorI.val(); j++)
|
|
|
{
|
|
|
Twistpoint currCommit;
|
|
|
file >> currCommit;
|
|
|
+
|
|
|
currRow.push_back(currCommit);
|
|
|
}
|
|
|
freshPseudonymSeedCommits.push_back(currRow);
|
|
|
}
|
|
|
|
|
|
- file >> limitI;
|
|
|
- for (size_t i = 0; i < limitI; i++)
|
|
|
+ file >> sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
{
|
|
|
std::vector<CurveBipoint> currRow;
|
|
|
- for (size_t j = 0; j < limitI; j++)
|
|
|
+ for (size_t j = 0; j < sizeOfVectorI.val(); j++)
|
|
|
{
|
|
|
CurveBipoint currCommit;
|
|
|
file >> currCommit;
|
|
|
+
|
|
|
currRow.push_back(currCommit);
|
|
|
}
|
|
|
serverTallyCommits.push_back(currRow);
|
|
|
}
|
|
|
|
|
|
- file >> limitI;
|
|
|
- for (size_t i = 0; i < limitI; i++)
|
|
|
+ file >> sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
{
|
|
|
std::vector<std::vector<TwistBipoint>> currMatrix;
|
|
|
- for (size_t j = 0; j < limitI; j++)
|
|
|
+ for (size_t j = 0; j < sizeOfVectorI.val(); j++)
|
|
|
{
|
|
|
std::vector<TwistBipoint> currRow;
|
|
|
- for (size_t k = 0; k < limitI; k++)
|
|
|
+ for (size_t k = 0; k < sizeOfVectorI.val(); k++)
|
|
|
{
|
|
|
TwistBipoint currCommit;
|
|
|
file >> currCommit;
|
|
|
+
|
|
|
currRow.push_back(currCommit);
|
|
|
}
|
|
|
currMatrix.push_back(currRow);
|
|
@@ -388,17 +365,18 @@ bool read_epoch_update_string(
|
|
|
partwayVoteMatrixCommits.push_back(currMatrix);
|
|
|
}
|
|
|
|
|
|
- file >> limitI;
|
|
|
- for (size_t i = 0; i < limitI; i++)
|
|
|
+ file >> sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
{
|
|
|
std::vector<std::vector<TwistBipoint>> currMatrix;
|
|
|
- for (size_t j = 0; j < limitI; j++)
|
|
|
+ for (size_t j = 0; j < sizeOfVectorI.val(); j++)
|
|
|
{
|
|
|
std::vector<TwistBipoint> currRow;
|
|
|
- for (size_t k = 0; k < limitI; k++)
|
|
|
+ for (size_t k = 0; k < sizeOfVectorI.val(); k++)
|
|
|
{
|
|
|
TwistBipoint currCommit;
|
|
|
file >> currCommit;
|
|
|
+
|
|
|
currRow.push_back(currCommit);
|
|
|
}
|
|
|
currMatrix.push_back(currRow);
|
|
@@ -406,40 +384,43 @@ bool read_epoch_update_string(
|
|
|
finalVoteMatrixCommits.push_back(currMatrix);
|
|
|
}
|
|
|
|
|
|
- file >> limitI;
|
|
|
- for (size_t i = 0; i < limitI; i++)
|
|
|
+ file >> sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
{
|
|
|
std::vector<Twistpoint> currRow;
|
|
|
- for (size_t j = 0; j < limitI; j++)
|
|
|
+ for (size_t j = 0; j < sizeOfVectorI.val(); j++)
|
|
|
{
|
|
|
Twistpoint currCommit;
|
|
|
file >> currCommit;
|
|
|
+
|
|
|
currRow.push_back(currCommit);
|
|
|
}
|
|
|
userTallyMaskCommits.push_back(currRow);
|
|
|
}
|
|
|
|
|
|
- file >> limitI;
|
|
|
- for (size_t i = 0; i < limitI; i++)
|
|
|
+ file >> sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
{
|
|
|
std::vector<Twistpoint> currRow;
|
|
|
- for (size_t j = 0; j < limitI; j++)
|
|
|
+ for (size_t j = 0; j < sizeOfVectorI.val(); j++)
|
|
|
{
|
|
|
Twistpoint currCommit;
|
|
|
file >> currCommit;
|
|
|
+
|
|
|
currRow.push_back(currCommit);
|
|
|
}
|
|
|
userTallyMessageCommits.push_back(currRow);
|
|
|
}
|
|
|
|
|
|
- file >> limitI;
|
|
|
- for (size_t i = 0; i < limitI; i++)
|
|
|
+ file >> sizeOfVectorI;
|
|
|
+ for (size_t i = 0; i < sizeOfVectorI.val(); i++)
|
|
|
{
|
|
|
std::vector<Twistpoint> currRow;
|
|
|
- for (size_t j = 0; j < limitI; j++)
|
|
|
+ for (size_t j = 0; j < sizeOfVectorI.val(); j++)
|
|
|
{
|
|
|
Twistpoint currCommit;
|
|
|
file >> currCommit;
|
|
|
+
|
|
|
currRow.push_back(currCommit);
|
|
|
}
|
|
|
userTallySeedCommits.push_back(currRow);
|
|
@@ -447,16 +428,16 @@ bool read_epoch_update_string(
|
|
|
|
|
|
file >> nextGenerator;
|
|
|
|
|
|
- bool doUserTallies;
|
|
|
+ BinaryBool doUserTallies;
|
|
|
file >> doUserTallies;
|
|
|
|
|
|
- return doUserTallies;
|
|
|
+ return doUserTallies.val();
|
|
|
}
|
|
|
|
|
|
void distribute_epoch_updates(
|
|
|
const std::string& recipient,
|
|
|
const std::string& data,
|
|
|
- const struct synchronization_tool* synch)
|
|
|
+ const struct synchronization_tool* sync)
|
|
|
{
|
|
|
bool flag = false;
|
|
|
while (!flag)
|
|
@@ -472,7 +453,7 @@ void distribute_epoch_updates(
|
|
|
"null",
|
|
|
synchro_websocket_data_handler,
|
|
|
empty_websocket_close_handler,
|
|
|
- (void *) synch);
|
|
|
+ (void *) sync);
|
|
|
|
|
|
if (!conn)
|
|
|
{
|
|
@@ -492,6 +473,8 @@ void distribute_epoch_updates(
|
|
|
"",
|
|
|
0);
|
|
|
|
|
|
+ mg_close_connection(conn);
|
|
|
+
|
|
|
flag = true;
|
|
|
}
|
|
|
}
|
|
@@ -503,7 +486,7 @@ void distribute_epoch_updates(
|
|
|
PrsonaServerWebSocketHandler::PrsonaServerWebSocketHandler(
|
|
|
const PrsonaServer *prsonaServer,
|
|
|
const std::mutex *updateMtx,
|
|
|
- const size_t *epochNum,
|
|
|
+ const std::atomic<size_t> *epochNum,
|
|
|
const std::vector<std::string> &serverIPs,
|
|
|
const std::string &selfIP)
|
|
|
: prsonaServer(prsonaServer), updateMtx(updateMtx), epochNum(epochNum),
|
|
@@ -523,20 +506,6 @@ virtual bool PrsonaServerWebSocketHandler::handleConnection(
|
|
|
return flag;
|
|
|
}
|
|
|
|
|
|
-void PrsonaServerWebSocketHandler::set_temp_filename(
|
|
|
- struct mg_connection *conn) const
|
|
|
-{
|
|
|
- std::string filename = random_string(TMP_FILE_SIZE);
|
|
|
-
|
|
|
- char *c_filename = new char[TMP_FILE_SIZE+TMP_DIR_SIZE+1];
|
|
|
- strncpy(c_filename, TMP_DIR, TMP_DIR_SIZE);
|
|
|
- for (size_t i = 0; i < TMP_FILE_SIZE; i++)
|
|
|
- c_filename[i + TMP_DIR_SIZE] = filename[i];
|
|
|
- c_filename[TMP_DIR_SIZE + TMP_FILE_SIZE] = 0;
|
|
|
-
|
|
|
- mg_set_user_connection_data(conn, c_filename);
|
|
|
-}
|
|
|
-
|
|
|
virtual void PrsonaServerWebSocketHandler::handleReadyState(
|
|
|
CivetServer *server,
|
|
|
struct mg_connection *conn)
|
|
@@ -757,7 +726,7 @@ void PrsonaServerWebSocketHandler::get_num_clients(
|
|
|
std::stringstream buffer;
|
|
|
std::string data;
|
|
|
|
|
|
- size_t numClients = prsonaServer->get_num_clients();
|
|
|
+ BinarySizeT numClients(prsonaServer->get_num_clients());
|
|
|
buffer << numClients;
|
|
|
data = buffer.str();
|
|
|
|
|
@@ -770,7 +739,7 @@ void PrsonaServerWebSocketHandler::get_num_servers(
|
|
|
std::stringstream buffer;
|
|
|
std::string data;
|
|
|
|
|
|
- size_t numServers = prsonaServer->get_num_servers();
|
|
|
+ BinarySizeT numServers(prsonaServer->get_num_servers());
|
|
|
buffer << numServers;
|
|
|
data = buffer.str();
|
|
|
|
|
@@ -797,8 +766,10 @@ void PrsonaServerWebSocketHandler::get_current_votes_by(
|
|
|
prsonaServer->get_current_votes_by(pi, shortTermPublicKey);
|
|
|
|
|
|
buffer << pi;
|
|
|
- buffer << votes.size();
|
|
|
- for (size_t i = 0; i < votes.size(); i++)
|
|
|
+
|
|
|
+ BinarySizeT sizeOfVector(votes.size());
|
|
|
+ buffer << sizeOfVector;
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
buffer << votes[i];
|
|
|
|
|
|
data = buffer.str();
|
|
@@ -817,9 +788,11 @@ void PrsonaServerWebSocketHandler::get_all_current_votes(
|
|
|
prsonaServer->get_all_current_votes(pi);
|
|
|
|
|
|
buffer << pi;
|
|
|
- buffer << votes.size();
|
|
|
- for (size_t i = 0; i < votes.size(); i++)
|
|
|
- for (size_t j = 0; j < votes[i].size(); j++)
|
|
|
+
|
|
|
+ BinarySizeT sizeOfVector(votes.size());
|
|
|
+ buffer << sizeOfVector;
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
+ for (size_t j = 0; j < sizeOfVector.val(); j++)
|
|
|
buffer << votes[i][j];
|
|
|
|
|
|
data = buffer.str();
|
|
@@ -884,8 +857,10 @@ void PrsonaServerWebSocketHandler::get_current_pseudonyms(
|
|
|
prsonaServer->get_current_pseudonyms(pi);
|
|
|
|
|
|
buffer << pi;
|
|
|
- buffer << pseudonyms.size();
|
|
|
- for (size_t i = 0; i < pseudonyms.size(); i++)
|
|
|
+
|
|
|
+ BinarySizeT sizeOfVector(pseudonyms.size());
|
|
|
+ buffer << sizeOfVector;
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
buffer << pseudonyms[i];
|
|
|
|
|
|
data = buffer.str();
|
|
@@ -1001,27 +976,33 @@ void PrsonaServerWebSocketHandler::distribute_new_user_updates(
|
|
|
{
|
|
|
std::stringstream buffer;
|
|
|
std::string data;
|
|
|
+ BinarySizeT sizeOfVector;
|
|
|
|
|
|
- buffer << proofOfValidAddition.size();
|
|
|
- for (size_t i = 0; i < proofOfValidAddition.size(); i++)
|
|
|
+ sizeOfVector.set(proofOfValidAddition.size());
|
|
|
+ buffer << sizeOfVector;
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
buffer << proofOfValidAddition[i];
|
|
|
|
|
|
- buffer << previousVoteTallies.size();
|
|
|
- for (size_t i = 0; i < previousVoteTallies.size(); i++)
|
|
|
+ sizeOfVector.set(previousVoteTallies.size());
|
|
|
+ buffer << sizeOfVector;
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
buffer << previousVoteTallies[i];
|
|
|
|
|
|
- buffer << currentPseudonyms.size();
|
|
|
- for (size_t i = 0; i < currentPseudonyms.size(); i++)
|
|
|
+ sizeOfVector.set(currentPseudonyms.size());
|
|
|
+ buffer << sizeOfVector;
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
buffer << currentPseudonyms[i];
|
|
|
|
|
|
- buffer << currentUserEncryptedTallies.size();
|
|
|
- for (size_t i = 0; i < currentUserEncryptedTallies.size(); i++)
|
|
|
+ sizeOfVector.set(currentUserEncryptedTallies.size());
|
|
|
+ buffer << sizeOfVector;
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
buffer << currentUserEncryptedTallies[i];
|
|
|
|
|
|
- buffer << voteMatrix.size();
|
|
|
- for (size_t i = 0; i < voteMatrix.size(); i++)
|
|
|
- for (size_t j = 0; j < voteMatrix[i].size(); j++)
|
|
|
- buffer << voteMatrix[i][j];
|
|
|
+ sizeOfVector.set(voteMatrix.size());
|
|
|
+ buffer << sizeOfVector;
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
+ for (size_t j = 0; j < sizeOfVector.val(); j++)
|
|
|
+ buffer << voteMatrix[i][j];
|
|
|
|
|
|
data = buffer.str();
|
|
|
|
|
@@ -1042,7 +1023,7 @@ void PrsonaServerWebSocketHandler::distribute_new_user_updates(
|
|
|
"null",
|
|
|
synchro_websocket_data_handler,
|
|
|
synchro_websocket_close_handler,
|
|
|
- (void *) distributeSynch);
|
|
|
+ (void *) distributeSync);
|
|
|
|
|
|
if (!conn)
|
|
|
{
|
|
@@ -1050,19 +1031,21 @@ void PrsonaServerWebSocketHandler::distribute_new_user_updates(
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- unique_lock<mutex> synchLock(distributeSynch->mtx);
|
|
|
- distributeSynch->isReady = false;
|
|
|
- distributeSynch->isOngoing = true;
|
|
|
+ unique_lock<mutex> syncLock(distributeSync->mtx);
|
|
|
+ distributeSync->val = 0;
|
|
|
+ distributeSync->val2 = 0;
|
|
|
mg_websocket_client_write(
|
|
|
conn,
|
|
|
MG_WEBSOCKET_OPCODE_BINARY,
|
|
|
data.c_str(),
|
|
|
data.length());
|
|
|
|
|
|
- while (distributeSynch->isOngoing)
|
|
|
- distributeSynch->cv.wait(synchLock);
|
|
|
+ while (!distributeSync->val2)
|
|
|
+ distributeSync->cv.wait(syncLock);
|
|
|
+
|
|
|
+ mg_close_connection(conn);
|
|
|
|
|
|
- if (distributeSynch->isReady)
|
|
|
+ if (distributeSync->val)
|
|
|
i++;
|
|
|
}
|
|
|
}
|
|
@@ -1074,17 +1057,22 @@ void PrsonaServerWebSocketHandler::distribute_new_vote(
|
|
|
{
|
|
|
std::stringstream buffer;
|
|
|
std::string data;
|
|
|
+ BinarySizeT sizeOfVector;
|
|
|
|
|
|
- buffer << pi.size();
|
|
|
- for (size_t i = 0; i < pi.size(); i++)
|
|
|
+ sizeOfVector.set(pi.size());
|
|
|
+ buffer << sizeOfVector;
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
buffer << pi[i];
|
|
|
|
|
|
- buffer << newVotes.size();
|
|
|
- for (size_t i = 0; i < newVotes.size(); i++)
|
|
|
+ sizeOfVector.set(newVotes.size());
|
|
|
+ buffer << sizeOfVector;
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
buffer << newVotes[i];
|
|
|
|
|
|
buffer << shortTermPublicKey;
|
|
|
- buffer << false;
|
|
|
+
|
|
|
+ BinaryBool flag(false);
|
|
|
+ buffer << flag;
|
|
|
|
|
|
data = buffer.str();
|
|
|
|
|
@@ -1105,7 +1093,7 @@ void PrsonaServerWebSocketHandler::distribute_new_vote(
|
|
|
"null",
|
|
|
synchro_websocket_data_handler,
|
|
|
synchro_websocket_close_handler,
|
|
|
- (void *) distributeSynch);
|
|
|
+ (void *) distributeSync);
|
|
|
|
|
|
if (!conn)
|
|
|
{
|
|
@@ -1113,19 +1101,21 @@ void PrsonaServerWebSocketHandler::distribute_new_vote(
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- unique_lock<mutex> synchLock(distributeSynch->mtx);
|
|
|
- distributeSynch->isReady = false;
|
|
|
- distributeSynch->isOngoing = true;
|
|
|
+ unique_lock<mutex> syncLock(distributeSync->mtx);
|
|
|
+ distributeSync->val = 0;
|
|
|
+ distributeSync->val2 = 0;
|
|
|
mg_websocket_client_write(
|
|
|
conn,
|
|
|
MG_WEBSOCKET_OPCODE_BINARY,
|
|
|
data.c_str(),
|
|
|
data.length());
|
|
|
|
|
|
- while (distributeSynch->isOngoing)
|
|
|
- distributeSynch->cv.wait(synchLock);
|
|
|
+ while (!distributeSync->val2)
|
|
|
+ distributeSync->cv.wait(syncLock);
|
|
|
+
|
|
|
+ mg_close_connection(conn);
|
|
|
|
|
|
- if (distributeSynch->isReady)
|
|
|
+ if (distributeSync->val)
|
|
|
i++;
|
|
|
}
|
|
|
}
|
|
@@ -1150,7 +1140,7 @@ void PrsonaServerWebSocketHandler::add_new_client(
|
|
|
lck,
|
|
|
serverIPs,
|
|
|
selfIP,
|
|
|
- &updateSynch);
|
|
|
+ &updateSync);
|
|
|
|
|
|
std::vector<Proof> proofOfValidAddition;
|
|
|
prsonaServer->add_new_client(
|
|
@@ -1179,10 +1169,11 @@ void PrsonaServerWebSocketHandler::add_new_client(
|
|
|
lck,
|
|
|
serverIPs,
|
|
|
selfIP,
|
|
|
- &updateSynch);
|
|
|
+ &updateSync);
|
|
|
|
|
|
- buffer << proofOfValidAddition.size();
|
|
|
- for (size_t i = 0; i < proofOfValidAddition.size(); i++)
|
|
|
+ BinarySizeT sizeOfVector(proofOfValidAddition.size());
|
|
|
+ buffer << sizeOfVector;
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
buffer << proofOfValidAddition[i];
|
|
|
|
|
|
data = buffer.str();
|
|
@@ -1195,11 +1186,11 @@ void PrsonaServerWebSocketHandler::receive_vote(
|
|
|
{
|
|
|
ifstream file(filename);
|
|
|
|
|
|
- size_t sizeOfPi;
|
|
|
- file >> sizeOfPi;
|
|
|
+ BinarySizeT sizeOfVector;
|
|
|
+ file >> sizeOfVector;
|
|
|
|
|
|
std::vector<Proof> pi;
|
|
|
- for (size_t i = 0; i < sizeOfPi; i++)
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
{
|
|
|
Proof currProof;
|
|
|
file >> currProof;
|
|
@@ -1207,11 +1198,10 @@ void PrsonaServerWebSocketHandler::receive_vote(
|
|
|
pi.push_back(currProof);
|
|
|
}
|
|
|
|
|
|
- size_t sizeOfVotes;
|
|
|
- file >> sizeOfVotes;
|
|
|
+ file >> sizeOfVector;
|
|
|
|
|
|
std::vector<TwistBipoint> newVotes;
|
|
|
- for (size_t i = 0; i < sizeOfVotes; i++)
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
{
|
|
|
TwistBipoint currVote;
|
|
|
file >> currVote;
|
|
@@ -1222,17 +1212,17 @@ void PrsonaServerWebSocketHandler::receive_vote(
|
|
|
Twistpoint shortTermPublicKey;
|
|
|
file >> shortTermPublicKey;
|
|
|
|
|
|
- bool shouldDeal;
|
|
|
+ BinaryBool shouldDeal;
|
|
|
file >> shouldDeal;
|
|
|
|
|
|
std::unique_lock<std::mutex> lck(*updateMtx, std::defer_lock);
|
|
|
- if (shouldDeal)
|
|
|
+ if (shouldDeal.val())
|
|
|
{
|
|
|
obtain_update_locks(
|
|
|
lck,
|
|
|
serverIPs,
|
|
|
selfIP,
|
|
|
- &distributeSynch);
|
|
|
+ &distributeSync);
|
|
|
}
|
|
|
|
|
|
prsonaServer->receive_vote(
|
|
@@ -1240,14 +1230,14 @@ void PrsonaServerWebSocketHandler::receive_vote(
|
|
|
newVotes,
|
|
|
shortTermPublicKey);
|
|
|
|
|
|
- if (shouldDeal)
|
|
|
+ if (shouldDeal.val())
|
|
|
{
|
|
|
distribute_new_vote(pi, newVotes, shortTermPublicKey);
|
|
|
release_update_locks(
|
|
|
lck,
|
|
|
serverIPs,
|
|
|
selfIP,
|
|
|
- &distributeSynch);
|
|
|
+ &distributeSync);
|
|
|
}
|
|
|
|
|
|
mg_websocket_write(conn, MG_WEBSOCKET_OPCODE_DATACOMPLETE, "", 0);
|
|
@@ -1307,14 +1297,15 @@ void PrsonaServerWebSocketHandler::set_generator(
|
|
|
{
|
|
|
ifstream file(filename);
|
|
|
|
|
|
- size_t sizeOfPi;
|
|
|
- file >> sizeOfPi;
|
|
|
+ BinarySizeT sizeOfVector;
|
|
|
+ file >> sizeOfVector;
|
|
|
|
|
|
std::vector<Proof> pi;
|
|
|
- for (size_t i = 0; i < sizeOfPi; i++)
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
{
|
|
|
Proof currProof;
|
|
|
file >> currProof;
|
|
|
+
|
|
|
pi.push_back(currProof);
|
|
|
}
|
|
|
|
|
@@ -1475,7 +1466,7 @@ void PrsonaServerWebSocketHandler::break_down_midway_pseudonyms(
|
|
|
while (epochSync.val < serverIPs.size())
|
|
|
epochSync.cv.wait(lck);
|
|
|
|
|
|
- (*epochNum)++;
|
|
|
+ epochNum->fetch_add(1);
|
|
|
|
|
|
mg_websocket_write(conn, MG_WEBSOCKET_OPCODE_DATACOMPLETE, "", 0);
|
|
|
}
|
|
@@ -1541,53 +1532,53 @@ void PrsonaServerWebSocketHandler::import_new_user_update(
|
|
|
|
|
|
ifstream file(filename);
|
|
|
|
|
|
- buffer << voteMatrix.size();
|
|
|
- for (size_t i = 0; i < voteMatrix.size(); i++)
|
|
|
- for (size_t j = 0; j < voteMatrix[i].size(); j++)
|
|
|
- buffer << voteMatrix[i][j];
|
|
|
-
|
|
|
- size_t sizeOfVector;
|
|
|
+ BinarySizeT sizeOfVector;
|
|
|
|
|
|
file >> sizeOfVector;
|
|
|
- for (size_t i = 0; i < sizeOfVector; i++)
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
{
|
|
|
Proof currProof;
|
|
|
file >> currProof;
|
|
|
+
|
|
|
proofOfValidAddition.push_back(currProof);
|
|
|
}
|
|
|
|
|
|
file >> sizeOfVector;
|
|
|
- for (size_t i = 0; i < sizeOfVector; i++)
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
{
|
|
|
CurveBipoint currTally;
|
|
|
file >> currTally;
|
|
|
+
|
|
|
previousVoteTallies.push_back(currTally);
|
|
|
}
|
|
|
|
|
|
file >> sizeOfVector;
|
|
|
- for (size_t i = 0; i < sizeOfVector; i++)
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
{
|
|
|
Twistpoint currNym;
|
|
|
file >> currNym;
|
|
|
+
|
|
|
currentPseudonyms.push_back(currNym);
|
|
|
}
|
|
|
|
|
|
file >> sizeOfVector;
|
|
|
- for (size_t i = 0; i < sizeOfVector; i++)
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
{
|
|
|
EGCiphertext currTally;
|
|
|
file >> currTally;
|
|
|
+
|
|
|
currentUserEncryptedTallies.push_back(currTally);
|
|
|
}
|
|
|
|
|
|
file >> sizeOfVector;
|
|
|
- for (size_t i = 0; i < sizeOfVector; i++)
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
{
|
|
|
std::vector<TwistBipoint> currRow;
|
|
|
- for (size_t j = 0; j < sizeOfVector; j++)
|
|
|
+ for (size_t j = 0; j < sizeOfVector.val(); j++)
|
|
|
{
|
|
|
TwistBipoint currVote;
|
|
|
file >> currVote;
|
|
|
+
|
|
|
currRow.push_back(currVote);
|
|
|
}
|
|
|
voteMatrix.push_back(currRow);
|
|
@@ -1615,19 +1606,21 @@ void PrsonaServerWebSocketHandler::receive_tallied_scores(
|
|
|
std::vector<EGCiphertext> userScores;
|
|
|
std::vector<CurveBipoint> serverScores;
|
|
|
|
|
|
- size_t sizeOfVector;
|
|
|
+ BinarySizeT sizeOfVector;
|
|
|
file >> sizeOfVector;
|
|
|
- for (size_t i = 0; i < sizeOfVector; i++)
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
{
|
|
|
EGCiphertext currScore;
|
|
|
file >> currScore;
|
|
|
+
|
|
|
userScores.push_back(currScore);
|
|
|
}
|
|
|
|
|
|
- for (size_t i = 0; i < sizeOfVector; i++)
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
{
|
|
|
CurveBipoint currScore;
|
|
|
file >> currScore;
|
|
|
+
|
|
|
serverScores.push_back(currScore);
|
|
|
}
|
|
|
|
|
@@ -1649,8 +1642,9 @@ void PrsonaServerWebSocketHandler::get_generator(
|
|
|
std::stringstream buffer;
|
|
|
std::string data;
|
|
|
|
|
|
- buffer << pi.size();
|
|
|
- for (size_t i = 0; i < pi.size(); i++)
|
|
|
+ BinarySizeT sizeOfVector(pi.size());
|
|
|
+ buffer << sizeOfVector;
|
|
|
+ for (size_t i = 0; i < sizeOfVector.val(); i++)
|
|
|
buffer << pi[i];
|
|
|
|
|
|
buffer << generator;
|