aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--node/CMakeLists.txt2
-rw-r--r--node/node.cpp223
-rw-r--r--node/node.hpp9
-rw-r--r--node/node_client.cpp46
-rw-r--r--node/node_node.cpp174
5 files changed, 229 insertions, 225 deletions
diff --git a/node/CMakeLists.txt b/node/CMakeLists.txt
index 05468bd..3659984 100644
--- a/node/CMakeLists.txt
+++ b/node/CMakeLists.txt
@@ -2,7 +2,7 @@ find_package(Boost COMPONENTS system program_options REQUIRED)
add_executable(node
main.cpp
- node.hpp node.cpp
+ node.hpp node_node.cpp node_client.cpp node.cpp
)
if(WIN32)
diff --git a/node/node.cpp b/node/node.cpp
index b2bd290..fa9a721 100644
--- a/node/node.cpp
+++ b/node/node.cpp
@@ -79,224 +79,7 @@ void Node::start_initialisation() {
next_node.async_send(init);
}
-
-void Node::handle_node_initialization(const cmix_proto::Initialization& init)
-{
- if(network_settings.is_first) {
- set_network_key(&cmix_ctx, init.public_share().data(), init.public_share().size());
-
- cmix_proto::SecretKey sec;
- sec.set_secret_key(init.public_share().data(), init.public_share().size());
-
- next_node.async_send(sec);
- } else {
- size_t len = get_group_element_array_size(&cmix_ctx);
-
- cmix_proto::Initialization n_init;
- n_init.mutable_public_share()->resize(len);
- add_public_share(&cmix_ctx, &(*n_init.mutable_public_share())[0], init.public_share().data());
-
- BOOST_LOG_TRIVIAL(trace) << "Sending intialization";
- next_node.async_send(n_init);
- }
-}
-
-void Node::handle_node_secretkey(cmix_proto::SecretKey const& secret)
-{
- std::string share = secret.secret_key();
-
- set_network_key(&cmix_ctx, secret.secret_key().data(), secret.secret_key().size());
-
- if(network_settings.is_first) {
- start_precomputation();
- } else {
- next_node.async_send(secret);
- }
-}
-
-template <typename T>
-cmix_proto::PrePre fill_precomputation_pre_message(CMixContext& ctx, T const& rs, T const& ms) {
- if(start_mix(&ctx, rs.size()) != no_error) {
- exit(-1);
- }
-
- if(initialize_mix_randomness(&ctx) != no_error) {
- exit(-1);
- }
-
- cmix_proto::PrePre prepre;
-
- for(size_t i = 0; i < ctx.nr_participants; ++i) {
- size_t len = get_group_element_array_size(&ctx);
-
- prepre.mutable_m_er(i)->resize(len);
- prepre.mutable_r_er(i)->resize(len);
-
- if(encrypt_r_and_multiply(
- &ctx,
- &(*prepre.mutable_r_er(i))[0],
- &(*prepre.mutable_m_er(i))[0],
- rs.Get(i).data(),
- ms.Get(i).data(),
- i
- ) != no_error) {
- exit(-1);
- }
- }
- return prepre;
-}
-
-template <typename T>
-cmix_proto::PreMix fill_precomputation_mix_message(CMixContext const& ctx, T const& rs, T const& ms) {
- cmix_proto::PreMix premix;
- for(size_t i = 0; i < ctx.nr_participants; ++i) {
- auto new_pos = ctx.permutation[i];
- size_t el_len = get_group_element_array_size(&ctx);
-
- premix.mutable_r_epirs(new_pos)->resize(el_len);
- premix.mutable_m_epirs(new_pos)->resize(el_len);
-
- multiply_s(
- &ctx,
- &(*premix.mutable_r_epirs(new_pos))[0],
- &(*premix.mutable_m_epirs(new_pos))[0],
- rs.Get(i).data(),
- ms.Get(i).data(),
- i
- );
- }
- return premix;
-}
-
-template <typename T>
-cmix_proto::PrePost fill_precomputation_post_message(CMixContext& ctx, T const& rs, T const& ms) {
- cmix_proto::PrePost prepost;
-
- for(size_t i = 0; i < ctx.nr_participants; ++i) {
- post_process(&ctx, rs.Get(i).data(), ms.Get(i).data(), i);
- *prepost.mutable_r_epirs(i) = rs.Get(i);
- *prepost.mutable_m_epirs(i) = ms.Get(i);
- }
-
- return prepost;
-}
-
-void Node::handle_node_prepre(cmix_proto::PrePre const& pre) {
- if(network_settings.is_first) {
- cmix_proto::PreMix premix = fill_precomputation_mix_message(cmix_ctx, pre.r_er(), pre.m_er());
- next_node.async_send(premix);
- } else {
- cmix_proto::PrePre prepre = fill_precomputation_pre_message(cmix_ctx, pre.r_er(), pre.m_er());
- next_node.async_send(prepre);
- }
-}
-
-void Node::handle_node_premix(cmix_proto::PreMix const& premix) {
- if(network_settings.is_first) {
- cmix_proto::PrePost prepost = fill_precomputation_post_message(cmix_ctx, premix.r_epirs(), premix.m_epirs());
- next_node.async_send(prepost);
- } else {
- cmix_proto::PreMix n_premix = fill_precomputation_mix_message(cmix_ctx, premix.r_epirs(), premix.m_epirs());
- next_node.async_send(n_premix);
- }
-}
-
-void Node::handle_node_prepost(cmix_proto::PrePost const& prepost) {
- if(network_settings.is_first) {
-
- } else {
- cmix_proto::PrePost n_prepost = fill_precomputation_post_message(cmix_ctx, prepost.r_epirs(), prepost.m_epirs());
- next_node.async_send(n_prepost);
- }
-}
-
-void Node::handle_node_message(cmix_proto::CMixMessage message)
-{
- switch(message.contents_case()) {
- case cmix_proto::CMixMessage::ContentsCase::kInitialization: {
- BOOST_LOG_TRIVIAL(trace) << "Handling initialization";
- handle_node_initialization(message.initialization());
- break;
- }
- case cmix_proto::CMixMessage::ContentsCase::kBye: {
- BOOST_LOG_TRIVIAL(trace) << "Handling bye";
- //Todo: find a nice way to handle network shutdown.
- break;
- }
- case cmix_proto::CMixMessage::ContentsCase::kSecretkey: {
- BOOST_LOG_TRIVIAL(trace) << "Handling SecretKey";
- handle_node_secretkey(message.secretkey());
- break;
- }
- case cmix_proto::CMixMessage::ContentsCase::kPrepre: {
- BOOST_LOG_TRIVIAL(trace) << "Handling PrePre";
- handle_node_prepre(message.prepre());
- break;
- }
- case cmix_proto::CMixMessage::ContentsCase::kPremix: {
- BOOST_LOG_TRIVIAL(trace) << "Handling PreMix";
- handle_node_premix(message.premix());
- break;
- }
- case cmix_proto::CMixMessage::ContentsCase::kPrepost: {
- BOOST_LOG_TRIVIAL(trace) << "Handling PrePost";
- handle_node_prepost(message.prepost());
- break;
- }
- default: {
- BOOST_LOG_TRIVIAL(error) << "handle_node_message: CMixMessage contains unknown contents.";
- }
- }
- prev_node.async_receive([this](cmix_proto::CMixMessage message) {
- handle_node_message(message);
- });
-}
-
-void Node::handle_client_keyexchange(ClientConnections::key_type handle, cmix_proto::KeyExchange ke) {
- CMixClientData d;
-
- size_t len = get_group_element_array_size(&cmix_ctx);
-
- cmix_proto::KeyExchange nke;
- nke.mutable_public_key()->resize(len);
- nke.mutable_value()->resize(len);
-
- key_exchange(&cmix_ctx, &d.shared_value.shared, &(*nke.mutable_public_key())[0], &(*nke.mutable_value())[0], ke.public_key().data(), ke.value().data());
-
- data[handle] = d;
-
- clients.at(handle).async_send(nke);
-}
-
-void Node::handle_client_bye(ClientConnections::key_type handle, cmix_proto::Bye)
-{
- clients.at(handle).close();
- clients.erase(handle);
-}
-
-void Node::handle_client_message(ClientConnections::key_type handle, cmix_proto::CMixMessage message)
-{
- switch(message.contents_case()) {
- case cmix_proto::CMixMessage::ContentsCase::kKeyexchange: {
- BOOST_LOG_TRIVIAL(trace) << "Handling keyexchange";
- handle_client_keyexchange(handle, message.keyexchange());
- break;
- }
- case cmix_proto::CMixMessage::ContentsCase::kBye: {
- BOOST_LOG_TRIVIAL(trace) << "Handling bye";
- handle_client_bye(handle, message.bye());
- return;
- }
- default: {
- BOOST_LOG_TRIVIAL(error) << "handle_client_message: CMixMessage contains unknown contents.";
- }
- }
- clients.at(handle).async_receive([this, handle](cmix_proto::CMixMessage message){
- handle_client_message(handle, message);
- });
-}
-
-void Node::handle_imanode(Purgatory::iterator handle) {
+void Node::handle_imanode(Purgatory::iterator handle, cmix_proto::ImANode const&) {
handle->on_done([]{});
prev_node = std::move(*handle);
purgatory.erase(handle);
@@ -312,7 +95,7 @@ void Node::handle_imanode(Purgatory::iterator handle) {
});
}
-void Node::handle_imaclient(Purgatory::iterator handle, cmix_proto::ImAClient c) {
+void Node::handle_imaclient(Purgatory::iterator handle, cmix_proto::ImAClient const& c) {
std::string client_id = c.id();
clients.emplace(c.id(), decltype(clients)::mapped_type(std::move(*handle)));
clients.at(c.id()).on_done([this, client_id]{
@@ -330,7 +113,7 @@ void Node::handle_message(Purgatory::iterator handle, cmix_proto::CMixMessage me
switch(message.contents_case()) {
case cmix_proto::CMixMessage::ContentsCase::kImanode: {
BOOST_LOG_TRIVIAL(trace) << "Handling imanode";
- handle_imanode(handle);
+ handle_imanode(handle, message.imanode());
return;
}
case cmix_proto::CMixMessage::ContentsCase::kImaclient: {
diff --git a/node/node.hpp b/node/node.hpp
index a143359..ea73121 100644
--- a/node/node.hpp
+++ b/node/node.hpp
@@ -13,6 +13,7 @@
#include <boost/asio/io_service.hpp>
#include <list>
+#include <string>
/*!
* \file
@@ -86,12 +87,12 @@ class Node
void handle_node_prepost(cmix_proto::PrePost const& prepost);
void handle_node_message(cmix_proto::CMixMessage message);
- void handle_client_keyexchange(ClientConnections::key_type handle, cmix_proto::KeyExchange ke);
- void handle_client_bye(ClientConnections::key_type handle, cmix_proto::Bye);
+ void handle_client_keyexchange(ClientConnections::key_type handle, cmix_proto::KeyExchange const& ke);
+ void handle_client_bye(ClientConnections::key_type handle, cmix_proto::Bye const&);
void handle_client_message(ClientConnections::key_type handle, cmix_proto::CMixMessage message);
- void handle_imanode(Purgatory::iterator handle);
- void handle_imaclient(Purgatory::iterator handle, cmix_proto::ImAClient c);
+ void handle_imanode(Purgatory::iterator handle, cmix_proto::ImANode const&);
+ void handle_imaclient(Purgatory::iterator handle, cmix_proto::ImAClient const& c);
void handle_message(Purgatory::iterator handle, cmix_proto::CMixMessage message);
public:
diff --git a/node/node_client.cpp b/node/node_client.cpp
new file mode 100644
index 0000000..fef1937
--- /dev/null
+++ b/node/node_client.cpp
@@ -0,0 +1,46 @@
+
+#include "node.hpp"
+
+void Node::handle_client_keyexchange(ClientConnections::key_type handle, cmix_proto::KeyExchange const& ke) {
+ CMixClientData d;
+
+ size_t len = get_group_element_array_size(&cmix_ctx);
+
+ cmix_proto::KeyExchange nke;
+ nke.mutable_public_key()->resize(len);
+ nke.mutable_value()->resize(len);
+
+ key_exchange(&cmix_ctx, &d.shared_value.shared, &(*nke.mutable_public_key())[0], &(*nke.mutable_value())[0], ke.public_key().data(), ke.value().data());
+
+ data[handle] = d;
+
+ clients.at(handle).async_send(nke);
+}
+
+void Node::handle_client_bye(ClientConnections::key_type handle, cmix_proto::Bye const&)
+{
+ clients.at(handle).close();
+ clients.erase(handle);
+}
+
+void Node::handle_client_message(ClientConnections::key_type handle, cmix_proto::CMixMessage message)
+{
+ switch(message.contents_case()) {
+ case cmix_proto::CMixMessage::ContentsCase::kKeyexchange: {
+ BOOST_LOG_TRIVIAL(trace) << "Handling keyexchange";
+ handle_client_keyexchange(handle, message.keyexchange());
+ break;
+ }
+ case cmix_proto::CMixMessage::ContentsCase::kBye: {
+ BOOST_LOG_TRIVIAL(trace) << "Handling bye";
+ handle_client_bye(handle, message.bye());
+ return;
+ }
+ default: {
+ BOOST_LOG_TRIVIAL(error) << "handle_client_message: CMixMessage contains unknown contents.";
+ }
+ }
+ clients.at(handle).async_receive([this, handle](cmix_proto::CMixMessage message){
+ handle_client_message(handle, message);
+ });
+} \ No newline at end of file
diff --git a/node/node_node.cpp b/node/node_node.cpp
new file mode 100644
index 0000000..fecc4ad
--- /dev/null
+++ b/node/node_node.cpp
@@ -0,0 +1,174 @@
+
+#include "node.hpp"
+
+template <typename T>
+cmix_proto::PrePre fill_precomputation_pre_message(CMixContext& ctx, T const& rs, T const& ms) {
+ if(start_mix(&ctx, rs.size()) != no_error) {
+ exit(-1);
+ }
+
+ if(initialize_mix_randomness(&ctx) != no_error) {
+ exit(-1);
+ }
+
+ cmix_proto::PrePre prepre;
+
+ for(size_t i = 0; i < ctx.nr_participants; ++i) {
+ size_t len = get_group_element_array_size(&ctx);
+
+ prepre.mutable_m_er(i)->resize(len);
+ prepre.mutable_r_er(i)->resize(len);
+
+ if(encrypt_r_and_multiply(
+ &ctx,
+ &(*prepre.mutable_r_er(i))[0],
+ &(*prepre.mutable_m_er(i))[0],
+ rs.Get(i).data(),
+ ms.Get(i).data(),
+ i
+ ) != no_error) {
+ exit(-1);
+ }
+ }
+ return prepre;
+}
+
+template <typename T>
+cmix_proto::PreMix fill_precomputation_mix_message(CMixContext const& ctx, T const& rs, T const& ms) {
+ cmix_proto::PreMix premix;
+ for(size_t i = 0; i < ctx.nr_participants; ++i) {
+ auto new_pos = ctx.permutation[i];
+ size_t el_len = get_group_element_array_size(&ctx);
+
+ premix.mutable_r_epirs(new_pos)->resize(el_len);
+ premix.mutable_m_epirs(new_pos)->resize(el_len);
+
+ multiply_s(
+ &ctx,
+ &(*premix.mutable_r_epirs(new_pos))[0],
+ &(*premix.mutable_m_epirs(new_pos))[0],
+ rs.Get(i).data(),
+ ms.Get(i).data(),
+ i
+ );
+ }
+ return premix;
+}
+
+template <typename T>
+cmix_proto::PrePost fill_precomputation_post_message(CMixContext& ctx, T const& rs, T const& ms) {
+ cmix_proto::PrePost prepost;
+
+ for(size_t i = 0; i < ctx.nr_participants; ++i) {
+ post_process(&ctx, rs.Get(i).data(), ms.Get(i).data(), i);
+ *prepost.mutable_r_epirs(i) = rs.Get(i);
+ *prepost.mutable_m_epirs(i) = ms.Get(i);
+ }
+
+ return prepost;
+}
+
+void Node::handle_node_initialization(const cmix_proto::Initialization& init)
+{
+ if(network_settings.is_first) {
+ set_network_key(&cmix_ctx, init.public_share().data(), init.public_share().size());
+
+ cmix_proto::SecretKey sec;
+ sec.set_secret_key(init.public_share().data(), init.public_share().size());
+
+ next_node.async_send(sec);
+ } else {
+ size_t len = get_group_element_array_size(&cmix_ctx);
+
+ cmix_proto::Initialization n_init;
+ n_init.mutable_public_share()->resize(len);
+ add_public_share(&cmix_ctx, &(*n_init.mutable_public_share())[0], init.public_share().data());
+
+ BOOST_LOG_TRIVIAL(trace) << "Sending intialization";
+ next_node.async_send(n_init);
+ }
+}
+
+void Node::handle_node_secretkey(cmix_proto::SecretKey const& secret)
+{
+ std::string share = secret.secret_key();
+
+ set_network_key(&cmix_ctx, secret.secret_key().data(), secret.secret_key().size());
+
+ if(network_settings.is_first) {
+ start_precomputation();
+ } else {
+ next_node.async_send(secret);
+ }
+}
+
+void Node::handle_node_prepre(cmix_proto::PrePre const& pre) {
+ if(network_settings.is_first) {
+ cmix_proto::PreMix premix = fill_precomputation_mix_message(cmix_ctx, pre.r_er(), pre.m_er());
+ next_node.async_send(premix);
+ } else {
+ cmix_proto::PrePre prepre = fill_precomputation_pre_message(cmix_ctx, pre.r_er(), pre.m_er());
+ next_node.async_send(prepre);
+ }
+}
+
+void Node::handle_node_premix(cmix_proto::PreMix const& premix) {
+ if(network_settings.is_first) {
+ cmix_proto::PrePost prepost = fill_precomputation_post_message(cmix_ctx, premix.r_epirs(), premix.m_epirs());
+ next_node.async_send(prepost);
+ } else {
+ cmix_proto::PreMix n_premix = fill_precomputation_mix_message(cmix_ctx, premix.r_epirs(), premix.m_epirs());
+ next_node.async_send(n_premix);
+ }
+}
+
+void Node::handle_node_prepost(cmix_proto::PrePost const& prepost) {
+ if(network_settings.is_first) {
+
+ } else {
+ cmix_proto::PrePost n_prepost = fill_precomputation_post_message(cmix_ctx, prepost.r_epirs(), prepost.m_epirs());
+ next_node.async_send(n_prepost);
+ }
+}
+
+void Node::handle_node_message(cmix_proto::CMixMessage message)
+{
+ switch(message.contents_case()) {
+ case cmix_proto::CMixMessage::ContentsCase::kInitialization: {
+ BOOST_LOG_TRIVIAL(trace) << "Handling initialization";
+ handle_node_initialization(message.initialization());
+ break;
+ }
+ case cmix_proto::CMixMessage::ContentsCase::kBye: {
+ BOOST_LOG_TRIVIAL(trace) << "Handling bye";
+ //Todo: find a nice way to handle network shutdown.
+ break;
+ }
+ case cmix_proto::CMixMessage::ContentsCase::kSecretkey: {
+ BOOST_LOG_TRIVIAL(trace) << "Handling SecretKey";
+ handle_node_secretkey(message.secretkey());
+ break;
+ }
+ case cmix_proto::CMixMessage::ContentsCase::kPrepre: {
+ BOOST_LOG_TRIVIAL(trace) << "Handling PrePre";
+ handle_node_prepre(message.prepre());
+ break;
+ }
+ case cmix_proto::CMixMessage::ContentsCase::kPremix: {
+ BOOST_LOG_TRIVIAL(trace) << "Handling PreMix";
+ handle_node_premix(message.premix());
+ break;
+ }
+ case cmix_proto::CMixMessage::ContentsCase::kPrepost: {
+ BOOST_LOG_TRIVIAL(trace) << "Handling PrePost";
+ handle_node_prepost(message.prepost());
+ break;
+ }
+ default: {
+ BOOST_LOG_TRIVIAL(error) << "handle_node_message: CMixMessage contains unknown contents.";
+ }
+ }
+ prev_node.async_receive([this](cmix_proto::CMixMessage message) {
+ handle_node_message(message);
+ });
+} \ No newline at end of file