From 7e21069bea9e8e6276591eee98f22cb07d67392d Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Fri, 4 Nov 2016 14:12:57 +0100 Subject: Splits up the Node.cpp class in 3 parts. --- node/CMakeLists.txt | 2 +- node/node.cpp | 223 +-------------------------------------------------- node/node.hpp | 9 ++- node/node_client.cpp | 46 +++++++++++ node/node_node.cpp | 174 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 229 insertions(+), 225 deletions(-) create mode 100644 node/node_client.cpp create mode 100644 node/node_node.cpp 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 -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 -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 -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 #include +#include /*! * \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 +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 +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 +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 -- cgit v1.2.3-70-g09d2