Browse Source

repo in state consistent with email sent to Ian at ~5:32AM 14-04-2021

tristangurtler 3 years ago
parent
commit
8c1f044b7c

+ 8 - 0
prsona/Makefile

@@ -124,6 +124,14 @@ clean: prsona_clean bgn_clean 666_clean mg_clean
 
 pclean: prsona_clean
 
+seemly:
+	-rm $(PRSONA_TMP_PATH)/*
+	-pkill client
+	-pkill server
+
+demolition:
+	scripts/bringDownTestServers.sh
+
 prsona_clean: 
 	-rm $(PRSONA_BIN_PATH)/*
 	-rm $(PRSONA_OBJ_PATH)/*

+ 1 - 0
prsona/cfg/clientIPs.cfg

@@ -1 +1,2 @@
 127.0.0.1:8082
+127.0.0.1:8083

+ 6 - 5
prsona/inc/networkServer.hpp

@@ -180,15 +180,16 @@ class PrsonaServerWebSocketHandler : public CivetWebSocketHandler  {
 
         // DATA MAINTENANCE
         void import_new_user_update(
+            struct mg_connection *conn,
             const char *filename
         );
 
         void distribute_new_user_updates(
-            std::vector<Proof> proofOfValidAddition,
-            std::vector<CurveBipoint> previousVoteTallies,
-            std::vector<Twistpoint> currentPseudonyms,
-            std::vector<EGCiphertext> currentUserEncryptedTallies,
-            std::vector<std::vector<TwistBipoint>> voteMatrix
+            const std::vector<Proof>& proofOfValidAddition,
+            const std::vector<CurveBipoint>& previousVoteTallies,
+            const std::vector<Twistpoint>& currentPseudonyms,
+            const std::vector<EGCiphertext>& currentUserEncryptedTallies,
+            const std::vector<std::vector<TwistBipoint>>& voteMatrix
         ) const;
 
         void distribute_new_vote(

+ 14 - 0
prsona/scripts/bringDownTestServers.sh

@@ -0,0 +1,14 @@
+#!/bin/sh
+
+servers=$(cat cfg/serverIPs.cfg)
+clients=$(cat cfg/clientIPs.cfg)
+
+for server in $servers
+do
+    curl $server/exit
+done
+
+for client in $clients
+do
+    curl $client/exit
+done

+ 6 - 0
prsona/scripts/startup.sh

@@ -0,0 +1,6 @@
+#!/bin/sh
+
+cd ~/prsona/prsona
+git pull
+make
+bin/$1 $2 $3 $4

+ 18 - 4
prsona/src/clientMain.cpp

@@ -15,8 +15,6 @@ enum EventType {
     CLIENT_MAKE_REP_PROOF
 };
 
-struct synchronization_tool exitSync;
-
 // Initialize the classes we use
 void initialize_prsona_classes()
 {
@@ -113,7 +111,7 @@ BGNPublicKey get_bgn_public_key(
         get_bgn_public_key_from_file(&sync, filename);
 
     remove(filename);
-    delete filename;
+    delete [] filename;
 
     return retval;
 }
@@ -251,7 +249,7 @@ void register_new_client(
         get_valid_addition_proof_from_file(&sync, filename);
 
     remove(filename);
-    delete filename;
+    delete [] filename;
 
     verify_valid_addition(newUser, generator, serverIPs, serverPorts, proofOfValidAddition, shortTermPublicKey);
 }
@@ -280,6 +278,18 @@ PrsonaClient *create_client(
     PrsonaClient *retval =
         new PrsonaClient(generatorProof, blindGenerator, publicKey, numServers);
 
+    generatorProof.clear();
+    Twistpoint freshGenerator =
+        get_generator(
+            generator,
+            serverIPs,
+            serverPorts,
+            generatorProof,
+            true);
+
+    retval->receive_fresh_generator(
+        generatorProof, freshGenerator);
+
     Proof proofOfValidSTPK;
     Twistpoint shortTermPublicKey = retval->get_short_term_public_key(
                                         proofOfValidSTPK);
@@ -670,6 +680,8 @@ int main(int argc, char *argv[])
     PrsonaClientWebSocketHandler wsHandler(prsonaClient, serverIPs, serverPorts, &generator);
     server.addWebSocketHandler("/ws", wsHandler);
 
+    struct synchronization_tool exitSync;
+
     unique_lock<mutex> exitLock(exitSync.mtx);
     exitSync.val = 0;
     exitSync.val2 = 0;
@@ -730,6 +742,8 @@ int main(int argc, char *argv[])
         exitSync.val2 = 0;
     }
 
+    cout << "[" << seedStr << "] Shutting down." << endl;
+
     mg_exit_library();
 
     delete prsonaClient;

+ 4 - 4
prsona/src/networkClient.cpp

@@ -187,7 +187,7 @@ T get_first_committed_val(
     T retval = get_committed_val_from_file<T>(&sync, filename, pi);
 
     remove(filename);
-    delete filename;
+    delete [] filename;
 
     return retval;
 }
@@ -276,7 +276,7 @@ void get_additional_commitment(
         delete commitmentSyncs[i];
 
         remove(commitmentFilenames[i]);
-        delete commitmentFilenames[i];
+        delete [] commitmentFilenames[i];
     }
 }
 
@@ -450,7 +450,7 @@ Twistpoint get_generator(
         get_generator_from_file(&sync, filename, pi);
 
     remove(filename);
-    delete filename;
+    delete [] filename;
 
     return retval;
 }
@@ -547,7 +547,7 @@ void PrsonaClientWebSocketHandler::handleClose(
         return;
 
     remove(filename);
-    delete filename;
+    delete [] filename;
 }
 
 void PrsonaClientWebSocketHandler::verify_reputation_proof(

+ 20 - 21
prsona/src/networkServer.cpp

@@ -3,6 +3,7 @@
 #include <sstream>
 #include <cstring>
 #include <cstdio>
+#include <unistd.h>
 
 #include "networkServer.hpp"
 
@@ -679,7 +680,7 @@ void PrsonaServerWebSocketHandler::generate_response(
             break;
 
         case PRSONA_NEW_USER_UPDATE:
-            import_new_user_update(filename);
+            import_new_user_update(conn, filename);
             break;
 
         case PRSONA_GET_PARTIAL_DECRYPTION:
@@ -712,7 +713,7 @@ void PrsonaServerWebSocketHandler::handleClose(
         return;
 
     remove(filename);
-    delete filename;
+    delete [] filename;
 }
 
 /*
@@ -738,7 +739,6 @@ void PrsonaServerWebSocketHandler::get_num_clients(
     std::stringstream buffer;
     std::string data;
 
-    std::cout << "actual number of clients: " << prsonaServer->get_num_clients() << std::endl;
     BinarySizeT numClients(prsonaServer->get_num_clients());
     buffer << numClients;
     data = buffer.str();
@@ -981,11 +981,11 @@ void PrsonaServerWebSocketHandler::get_pseudonyms_commitment(
 }
 
 void PrsonaServerWebSocketHandler::distribute_new_user_updates(
-    std::vector<Proof> proofOfValidAddition,
-    std::vector<CurveBipoint> previousVoteTallies,
-    std::vector<Twistpoint> currentPseudonyms,
-    std::vector<EGCiphertext> currentUserEncryptedTallies,
-    std::vector<std::vector<TwistBipoint>> voteMatrix) const
+    const std::vector<Proof>& proofOfValidAddition,
+    const std::vector<CurveBipoint>& previousVoteTallies,
+    const std::vector<Twistpoint>& currentPseudonyms,
+    const std::vector<EGCiphertext>& currentUserEncryptedTallies,
+    const std::vector<std::vector<TwistBipoint>>& voteMatrix) const
 {
     struct synchronization_tool distributeSync;
 
@@ -1025,7 +1025,10 @@ void PrsonaServerWebSocketHandler::distribute_new_user_updates(
     while (i < serverIPs.size())
     {
         if (serverIPs[i] == selfIP && serverPorts[i] == selfPort)
+        {
+            i++;
             continue;
+        }
 
         struct mg_connection *conn =
             mg_connect_websocket_client(
@@ -1054,6 +1057,11 @@ void PrsonaServerWebSocketHandler::distribute_new_user_updates(
             MG_WEBSOCKET_OPCODE_BINARY,
             data.c_str(),
             data.length());
+        mg_websocket_client_write(
+            conn,
+            MG_WEBSOCKET_OPCODE_DATACOMPLETE,
+            "",
+            0);
 
         while (!distributeSync.val2)
             distributeSync.cv.wait(syncLock);
@@ -1144,7 +1152,6 @@ void PrsonaServerWebSocketHandler::distribute_new_vote(
 void PrsonaServerWebSocketHandler::add_new_client(
     struct mg_connection *conn, const char *filename)
 {
-    std::cout << "adding new client" << std::endl;
     struct synchronization_tool updateSync;
 
     std::ifstream file(filename);
@@ -1152,11 +1159,9 @@ void PrsonaServerWebSocketHandler::add_new_client(
     Proof proofOfValidKey;
     file >> proofOfValidKey;
 
-    Twistpoint shortTermPublicKey;
+    Twistpoint shortTermPublicKey, empty;
     file >> shortTermPublicKey;
 
-    std::cout << "getting locks" << std::endl;
-
     std::unique_lock<std::mutex> lck(*updateMtx, std::defer_lock);
     obtain_update_locks(
         lck,
@@ -1166,16 +1171,12 @@ void PrsonaServerWebSocketHandler::add_new_client(
         selfPort,
         &updateSync);
 
-    std::cout << "actually adding to me" << std::endl;
-
     std::vector<Proof> proofOfValidAddition;
     prsonaServer->add_new_client(
         proofOfValidAddition,
         proofOfValidKey,
         shortTermPublicKey);
 
-    std::cout << "giving other servers updates" << std::endl;
-
     std::vector<CurveBipoint> previousVoteTallies;
     std::vector<Twistpoint> currentPseudonyms;
     std::vector<EGCiphertext> currentUserEncryptedTallies;
@@ -1193,8 +1194,6 @@ void PrsonaServerWebSocketHandler::add_new_client(
         currentUserEncryptedTallies,
         voteMatrix);
 
-    std::cout << "releasing locks" << std::endl;
-
     release_update_locks(
         lck,
         serverIPs,
@@ -1203,8 +1202,6 @@ void PrsonaServerWebSocketHandler::add_new_client(
         selfPort,
         &updateSync);
 
-    std::cout << "confirming addition to user" << std::endl;
-
     std::stringstream buffer;
     std::string data;
 
@@ -1567,7 +1564,7 @@ void PrsonaServerWebSocketHandler::accept_epoch_updates(
  */
 
 void PrsonaServerWebSocketHandler::import_new_user_update(
-    const char *filename)
+    struct mg_connection *conn, const char *filename)
 {
     std::vector<Proof> proofOfValidAddition;
     std::vector<CurveBipoint> previousVoteTallies;
@@ -1635,6 +1632,8 @@ void PrsonaServerWebSocketHandler::import_new_user_update(
         currentPseudonyms,
         currentUserEncryptedTallies,
         voteMatrix);
+
+    mg_websocket_write(conn, MG_WEBSOCKET_OPCODE_DATACOMPLETE, "", 0);
 }
 
 void PrsonaServerWebSocketHandler::get_partial_decryption(

+ 8 - 10
prsona/src/orchestratorMain.cpp

@@ -14,8 +14,8 @@
 
 using namespace std;
 
-chrono::seconds oneSecond(1); 
-chrono::seconds fiveSeconds(5); 
+const chrono::seconds ONE_SECOND(1); 
+const chrono::seconds FIVE_SECONDS(5); 
 
 int clients_websocket_data_handler(
     struct mg_connection *conn,
@@ -48,14 +48,12 @@ int start_remote_actor(string target, bool server, string id, string output)
     stringstream buffer;
     string command;
 
-    // buffer << "ssh tmgurtle@" << target << " \"screen \'~/prsona/prsona/bin/"
-    //     << (server ? "startServer.sh " : "startClient.sh ") << id << " t " << output << "\'\"" ;
+    // buffer << "ssh tmgurtle@" << target << " \"screen \'~/prsona/prsona/scripts/startup.sh "
+    //     << (server ? "server " : "client ") << id << " t " << output << "\'\"" ;
 
     buffer << "bin/" << (server ? "server " : "client ") << id << " T " << output << " &";
     command = buffer.str();
 
-
-
     return system(command.c_str());
 }
 
@@ -64,7 +62,7 @@ void wait_for_servers_ready(string dealer, int dealerPort)
     bool flag = false;
     while (!flag)
     {
-        this_thread::sleep_for(oneSecond);
+        this_thread::sleep_for(ONE_SECOND);
 
         stringstream sysString;
         string data;
@@ -105,7 +103,7 @@ void wait_for_clients_ready(string dealer, int dealerPort, size_t numClients)
     bool flag = false;
     while (!flag)
     {
-        this_thread::sleep_for(fiveSeconds);
+        this_thread::sleep_for(ONE_SECOND);
 
         stringstream sysString;
         string data;
@@ -151,7 +149,7 @@ void wait_for_clients_ready(string dealer, int dealerPort, size_t numClients)
 
 void trigger_epoch(string dealer, int dealerPort)
 {
-    this_thread::sleep_for(oneSecond);
+    this_thread::sleep_for(ONE_SECOND);
 
     bool flag = false;
     while (!flag)
@@ -392,7 +390,7 @@ int main(int argc, char* argv[])
     vector<thread> serverStartup, clientStartup;
     serverStartup.push_back(thread(start_remote_actor, dealerIP, true, "d", experimentOutput));
 
-    this_thread::sleep_for(oneSecond);
+    this_thread::sleep_for(ONE_SECOND);
 
     cout << "[ORC] Starting other servers." << endl;
 

+ 0 - 8
prsona/src/server.cpp

@@ -836,14 +836,6 @@ std::vector<std::vector<Scalar>> PrsonaServer::generate_permutation_matrix(
     for (size_t i = 0; i < order.size(); i++)
         retval[order[i]][i] = Scalar(1);
 
-    for (size_t i = 0; i < retval.size(); i++)
-    {
-        std::cout << (i == 0 ? "[[" : " [");
-        for (size_t j = 0; j < retval[i].size(); j++)
-            std::cout << retval[i][j] << (j == retval[i].size() - 1 ? "]" : " ");
-        std::cout << (i == retval.size() - 1 ? "]" : "") << std::endl;
-    }
-
     return retval;
 }
 

+ 104 - 17
prsona/src/serverMain.cpp

@@ -11,9 +11,6 @@
 
 using namespace std;
 
-struct synchronization_tool exitSync, readySync;
-mutex updateMtx;
-
 atomic<size_t> epochNum(0);
 
 // Initialize the classes we use
@@ -238,7 +235,7 @@ Twistpoint get_generator(
         pi.push_back(currProof);
 
         remove(genFilename);
-        delete genFilename;
+        delete [] genFilename;
     }
 
     return retval;
@@ -390,7 +387,7 @@ Twistpoint initiate_epoch_updates(
     generatorProofHolder.push_back(generatorProof);
 
     remove(epochFilename);
-    delete epochFilename;
+    delete [] epochFilename;
 
     return retval;
 }
@@ -772,6 +769,8 @@ void distribute_tallied_scores(
 }
 
 void epoch(
+    mutex *updateMtx,
+    atomic<size_t> *epochNum,
     PrsonaServer *prsonaServer,
     default_random_engine& rng,
     const vector<string>& serverIPs,
@@ -783,7 +782,7 @@ void epoch(
 
     struct synchronization_tool updateSync;
     
-    unique_lock<mutex> lck(updateMtx, defer_lock);
+    unique_lock<mutex> lck(*updateMtx, defer_lock);
     obtain_update_locks(
         lck,
         serverIPs,
@@ -835,7 +834,7 @@ void epoch(
         generatorProof,
         nextGenerator);
 
-    epochNum.fetch_add(1);
+    epochNum->fetch_add(1);
 
     release_update_locks(
         lck,
@@ -849,15 +848,16 @@ void epoch(
 class EpochReadyHandler : public CivetHandler
 {
     public:
-        EpochReadyHandler(size_t numServers)
-            : numServers(numServers) { /* */ }
+        EpochReadyHandler(struct synchronization_tool *exitSync, struct synchronization_tool *readySync, size_t numServers)
+            : exitSync(exitSync), readySync(readySync), numServers(numServers)
+        { /* */ }
 
         bool handleGet(CivetServer *server, struct mg_connection *conn)
         {
-            unique_lock<mutex> exitLock(exitSync.mtx, defer_lock);
-            unique_lock<mutex> readyLock(readySync.mtx);
+            unique_lock<mutex> exitLock(exitSync->mtx, defer_lock);
+            unique_lock<mutex> readyLock(readySync->mtx);
 
-            if (readySync.val < numServers)
+            if (readySync->val < numServers)
             {
                 mg_printf(conn,
                           "HTTP/1.1 503 Service Unavailable\r\nContent-Type: "
@@ -883,6 +883,7 @@ class EpochReadyHandler : public CivetHandler
         }
 
     private:
+        struct synchronization_tool *exitSync, *readySync;
         const size_t numServers;
 
 };
@@ -890,15 +891,90 @@ class EpochReadyHandler : public CivetHandler
 class EpochNumHandler : public CivetHandler
 {
     public:
+        EpochNumHandler(atomic<size_t> *epochNum)
+            : epochNum(epochNum)
+        { /* */ }
+
         bool handleGet(CivetServer *server, struct mg_connection *conn)
         {
             mg_printf(conn,
                       "HTTP/1.1 200 OK\r\nContent-Type: "
                       "text/plain\r\nConnection: close\r\n\r\n");
-            mg_printf(conn, "Epoch num: %lu\n", epochNum.load());
+            mg_printf(conn, "Epoch num: %lu\n", epochNum->load());
 
             return true;
         }
+
+    private:
+        atomic<size_t> *epochNum;
+};
+
+class UpdateLockWebSocketHandler : public CivetWebSocketHandler
+{
+    public:
+        UpdateLockWebSocketHandler(mutex *updateMtx, unique_lock<mutex> **lockHolder, bool isLocking)
+            : updateMtx(updateMtx), lockHolder(lockHolder), isLocking(isLocking)
+        { /* */ }
+
+        ~UpdateLockWebSocketHandler()
+        { delete *lockHolder; }
+
+        bool handleConnection(CivetServer *server, const struct mg_connection *conn)
+        { return true; }
+
+        void handleReadyState(CivetServer *server, struct mg_connection *conn)
+        { /* */ }
+
+        bool handleData(CivetServer *server, struct mg_connection *conn, int bits, char *data, size_t data_len)
+        {
+            switch (bits & 0xf)
+            {
+                case MG_WEBSOCKET_OPCODE_DATACOMPLETE:
+                    if (isLocking)
+                    {
+                        unique_lock<mutex> *tempHolder = new unique_lock<mutex>(*updateMtx);
+                        
+                        // Once you get to this line, we now hold the lock,
+                        // and lockHolder is guaranteed to be NULL
+                        *lockHolder = tempHolder;
+
+                        // Respond to notify that the requesting process holds the lock
+                        mg_websocket_write(conn, MG_WEBSOCKET_OPCODE_DATACOMPLETE, "", 0);
+                    }
+                    else
+                    {
+                        // You must do things in this order so that *lockHolder will be
+                        // guaranteed to be NULL at the time the lock unlocks
+                        // (deletion of the lock object)
+                        unique_lock<mutex> *tempHolder = *lockHolder;
+                        *lockHolder = NULL;
+
+                        delete tempHolder;
+                        
+                        // Respond to notify that the requesting process has released the lock
+                        mg_websocket_write(conn, MG_WEBSOCKET_OPCODE_DATACOMPLETE, "", 0);
+                    }
+                    break;
+
+                case MG_WEBSOCKET_OPCODE_CONNECTION_CLOSE:
+                    break;
+
+                default:
+                    cerr << "Unknown opcode: failing." << endl;
+                    break;
+            }
+
+            return false;
+        }
+
+        void handleClose(CivetServer *server, const struct mg_connection *conn)
+        { /* */ }
+
+
+    private:
+        mutex *updateMtx;
+        unique_lock<mutex> **lockHolder;
+        const bool isLocking;
 };
 
 int main(int argc, char *argv[])
@@ -1034,6 +1110,11 @@ int main(int argc, char *argv[])
     if (maliciousServers)
         PrsonaBase::set_server_malicious();
 
+    struct synchronization_tool exitSync, readySync;
+    mutex updateMtx;
+    unique_lock<mutex> *updateLockHolder;
+    atomic<size_t> epochNum(0);
+
     cout << "[" << seedStr << "] Creating PrsonaServer entity." << endl;
 
     // Entities we operate with
@@ -1089,7 +1170,7 @@ int main(int argc, char *argv[])
         prsonaServer = create_server_from_bgn_file(numServers, &bgnSync, bgnFilename);
 
         remove(bgnFilename);
-        delete bgnFilename;
+        delete [] bgnFilename;
     }
 
     CivetServer server(options);
@@ -1149,6 +1230,12 @@ int main(int argc, char *argv[])
     RemoteControlHandler exitHandler(&exitSync, "Server coming down!");
     server.addHandler(EXIT_URI, exitHandler);
 
+    UpdateLockWebSocketHandler lockHandler(&updateMtx, &updateLockHolder, true);
+    UpdateLockWebSocketHandler unlockHandler(&updateMtx, &updateLockHolder, false);
+
+    server.addWebSocketHandler(UPDATE_LOCK_URI, lockHandler);
+    server.addWebSocketHandler(UPDATE_UNLOCK_URI, unlockHandler);
+
     cout << "[" << seedStr << "] Entering main ready loop." << endl;
 
     if (bgnDealer)
@@ -1156,10 +1243,10 @@ int main(int argc, char *argv[])
         AltRemoteControlHandler triggerEpochHandler(1, &exitSync, "Server will initiate epoch!");
         server.addHandler(TRIGGER_EPOCH_URI, triggerEpochHandler);
 
-        EpochReadyHandler epochReadyHandler(numServers);
+        EpochReadyHandler epochReadyHandler(&exitSync, &readySync, numServers);
         server.addHandler(EPOCH_READY_URI, epochReadyHandler);
 
-        EpochNumHandler epochNumHandler;
+        EpochNumHandler epochNumHandler(&epochNum);
         server.addHandler(WHICH_EPOCH_URI, epochNumHandler);
 
         while (!exitSync.val)
@@ -1171,7 +1258,7 @@ int main(int argc, char *argv[])
             {
                 cout << "[" << seedStr << "] Executing epoch." << endl;
 
-                epoch(prsonaServer, rng, serverIPs, serverPorts, selfIP, selfPort);
+                epoch(&updateMtx, &epochNum, prsonaServer, rng, serverIPs, serverPorts, selfIP, selfPort);
 
                 exitSync.val2 = 0;
             }