diff options
Diffstat (limited to 'node/node_node.cpp')
| -rw-r--r-- | node/node_node.cpp | 217 |
1 files changed, 175 insertions, 42 deletions
diff --git a/node/node_node.cpp b/node/node_node.cpp index a0e04fa..56e883d 100644 --- a/node/node_node.cpp +++ b/node/node_node.cpp @@ -80,33 +80,49 @@ void fill_precomputation_mix_message(CMixContext const& ctx, cmix_proto::PreMix& } template <typename T> -void fill_precomputation_post_message(CMixContext& ctx, cmix_proto::PrePost& prepost, T const& rs, T const& ms) { - size_t len = get_group_element_array_size(&ctx); - - std::vector<char*> r_epirs(ms.size(), nullptr); - std::vector<char*> m_epirs(ms.size(), nullptr); +void fill_precomputation_post_message(CMixContext& ctx, cmix_proto::PrePost& prepost, T const& rs, T const& ms, T const& cs = T{}) { + std::vector<char const*> rsv(ms.size(), nullptr); std::vector<char const*> msv(ms.size(), nullptr); - for(auto i = 0; i < ms.size(); ++i) { - std::string* r = prepost.add_r_epirs(); - r->resize(len); - r_epirs[size_t(i)] = &(*r)[0]; - - std::string* m = prepost.add_m_epirs(); - m->resize(len); - m_epirs[i] = &(*m)[0]; - + for(auto i = 0; i < ms.size(); ++i) { rsv[i] = rs.Get(i).data(); msv[i] = ms.Get(i).data(); } - post_process( + std::string* decryption_commitment = prepost.add_decryption_commitments(); + decryption_commitment->resize(get_commitment_length(&ctx)); + + precomputation_post_process( &ctx, - r_epirs.data(), - m_epirs.data(), + &(*decryption_commitment)[0], rsv.data(), msv.data() ); + + *prepost.mutable_r_epirs() = rs; + *prepost.mutable_m_epirs() = ms; + *prepost.mutable_decryption_commitments() = cs; +} + +template <typename T> +void fill_commitments_message(CMixContext& ctx, cmix_proto::Commitments& commits, T const& ms, T const& cs) { + + std::vector<char const*> msv(ms.size(), nullptr); + for(auto i = 0; i < ms.size(); ++i) { + msv[i] = ms.Get(i).data(); + } + + std::vector<char> commitment(get_commitment_length(&ctx), '\0'); + + commit_precomputation_ciphertext( + &ctx, + commitment.data(), + msv.data() + ); + + *commits.mutable_m_epirs() = ms; + *commits.mutable_decryption_commitments() = cs; + commits.set_ciphertext_commitment(commitment.data(), commitment.size()); } template <typename T> @@ -157,6 +173,55 @@ void fill_realtime_mix_message(CMixContext& ctx, cmix_proto::RealMix& realmix, T ); } +void fill_realtime_post_message(CMixContext& ctx, cmix_proto::RealPost& realpost, cmix_proto::RealMix const& realmix) { + + size_t len = get_group_element_array_size(&ctx); + std::vector<char*> mv(ctx.nr_participants, nullptr); + for(int i = 0; i < ctx.nr_participants; ++i) { + std::string* m = realpost.add_m_epirs(); + m->resize(len); + mv[i] = &(*m)[0]; + } + + get_epirs( + &ctx, + mv.data() + ); + + std::string* m = realpost.mutable_pimrs_commitment(); + m->resize(get_commitment_length(&ctx)); + + std::vector<const char*> mvs(ctx.nr_participants, nullptr); + for(int i = 0; i < ctx.nr_participants; ++i) { + mvs[i] = realmix.m(i).data(); + } + + get_pimrs_commitment( + &ctx, + &(*m)[0], + mvs.data() + ); +} + +void fill_realtime_post_message(CMixContext& ctx, cmix_proto::RealPost& n_realpost, cmix_proto::RealPost const& realpost) { + size_t len = get_group_element_array_size(&ctx); + std::vector<char*> mv(ctx.nr_participants, nullptr); + std::vector<char const*> mvs(ctx.nr_participants, nullptr); + for(size_t i = 0; i < ctx.nr_participants; ++i) { + std::string* m = n_realpost.add_m_epirs(); + m->resize(len); + mv[i] = &(*m)[0]; + + mvs[i] = realpost.m_epirs(i).data(); + } + + decrypt_epirs( + &ctx, + mv.data(), + mvs.data() + ); +} + void Node::handle_node_initialization(const cmix_proto::Initialization& init) { if(network_settings.is_first) { @@ -252,21 +317,39 @@ void Node::handle_node_premix(cmix_proto::PreMix const& premix) { } void Node::handle_node_prepost(cmix_proto::PrePost const& prepost) { - if(network_settings.is_first) { - start_realtime_phase(); + if(performance) { + performance->send("pre_post_start"); + } + + if(network_settings.is_last) { + ArenaMessage<cmix_proto::PrePost> arena; + auto& n_prepost = arena.get(); + fill_precomputation_post_message(cmix_ctx, n_prepost, prepost.r_epirs(), prepost.m_epirs(), prepost.decryption_commitments()); + + ArenaMessage<cmix_proto::Commitments> arena2; + auto& commits = arena2.get(); + fill_commitments_message(cmix_ctx, commits, n_prepost.m_epirs(), n_prepost.decryption_commitments()); + next_node.async_send(commits); } else { - if(performance) { - performance->send("pre_post_start"); - } - ArenaMessage<cmix_proto::PrePost> arena; auto& n_prepost = arena.get(); - fill_precomputation_post_message(cmix_ctx, n_prepost, prepost.r_epirs(), prepost.m_epirs()); + fill_precomputation_post_message(cmix_ctx, n_prepost, prepost.r_epirs(), prepost.m_epirs(), prepost.decryption_commitments()); next_node.async_send(n_prepost); - - if(performance) { - performance->send("pre_post_end"); - } + } + if(performance) { + performance->send("pre_post_end"); + } +} + +void Node::handle_node_commitments(cmix_proto::Commitments const& comm) { + + //Do your commitments check/storage. + + if(!network_settings.is_first && !network_settings.is_last) { + next_node.async_send(comm); + } + if(network_settings.is_first) { + next_node.async_send(comm, [this]{start_realtime_phase();}); } } @@ -312,23 +395,64 @@ void Node::handle_node_realmix(cmix_proto::RealMix const& realmix) { auto& n_realmix = arena.get(); fill_realtime_mix_message(cmix_ctx, n_realmix, realmix.m()); + ArenaMessage<cmix_proto::RealPost> arena2; + auto& realpost = arena2.get(); + fill_realtime_post_message(cmix_ctx, realpost, n_realmix); + + next_node.async_send(realpost); + if(performance) { performance->send("real_mix_end"); } + } else { + if(performance) { + performance->send("real_mix_start"); + } + + ArenaMessage<cmix_proto::RealMix> arena; + auto& n_realmix = arena.get(); + fill_realtime_mix_message(cmix_ctx, n_realmix, realmix.m()); + next_node.async_send(n_realmix); + + if(performance) { + performance->send("real_mix_end"); + } + } +} + +void Node::handle_node_realpost(cmix_proto::RealPost const& realpost) { + if(network_settings.is_last) { if(performance) { performance->send("real_post_start"); } + ArenaMessage<cmix_proto::RealPost> arena; + auto& n_realpost = arena.get(); + fill_realtime_post_message(cmix_ctx, n_realpost, realpost); + size_t len = get_group_element_array_size(&cmix_ctx); - std::string str; - str.resize(len); + std::vector<std::string> messages(cmix_ctx.nr_participants); + std::vector<const char*> pirs(cmix_ctx.nr_participants, nullptr); + std::vector<char*> msgs(cmix_ctx.nr_participants, nullptr); + for(size_t i = 0; i < cmix_ctx.nr_participants; ++i) { + messages[i].resize(len); + msgs[i] = &messages[i][0]; + + pirs[i] = n_realpost.m_epirs(i).data(); + } + + remove_pirs ( + &cmix_ctx, + msgs.data(), + pirs.data() + ); - for(int i = 0; i < n_realmix.m_size(); i++) { - remove_r_and_s(&cmix_ctx, &str[0], n_realmix.m(i).data(), i); + + for(auto i = 0u; i < cmix_ctx.nr_participants; i++) { { std::stringstream ss; - for(auto&& c : str) { + for(auto&& c : messages[i]) { ss << "\\" << std::setw(3) << std::setfill('0') << std::oct << (unsigned int) c; } BOOST_LOG_TRIVIAL(trace) << ss.str(); @@ -340,7 +464,7 @@ void Node::handle_node_realmix(cmix_proto::RealMix const& realmix) { char* payload; size_t payload_len; - split_message(&cmix_ctx, &dest, &dest_len, &payload, &payload_len, str.data()); + split_message(&cmix_ctx, &dest, &dest_len, &payload, &payload_len, messages[i].data()); std::string dest_s = std::string(dest, dest_len); @@ -355,19 +479,18 @@ void Node::handle_node_realmix(cmix_proto::RealMix const& realmix) { if(performance) { performance->send("real_post_end"); } - } else { if(performance) { - performance->send("real_mix_start"); + performance->send("real_post_start"); } - - ArenaMessage<cmix_proto::RealMix> arena; - auto& n_realmix = arena.get(); - fill_realtime_mix_message(cmix_ctx, n_realmix, realmix.m()); - next_node.async_send(n_realmix); + + ArenaMessage<cmix_proto::RealPost> arena; + auto& n_realpost = arena.get(); + fill_realtime_post_message(cmix_ctx, n_realpost, realpost); + next_node.async_send(n_realpost); if(performance) { - performance->send("real_mix_end"); + performance->send("real_post_end"); } } } @@ -409,6 +532,11 @@ void Node::handle_node_message(cmix_proto::CMixMessage message) handle_node_prepost(message.prepost()); break; } + case cmix_proto::CMixMessage::ContentsCase::kCommitments: { + BOOST_LOG_TRIVIAL(trace) << "Handling PrePost"; + handle_node_commitments(message.commitments()); + break; + } case cmix_proto::CMixMessage::ContentsCase::kRealpre: { BOOST_LOG_TRIVIAL(trace) << "Handling RealPre"; handle_node_realpre(message.realpre()); @@ -419,6 +547,11 @@ void Node::handle_node_message(cmix_proto::CMixMessage message) handle_node_realmix(message.realmix()); break; } + case cmix_proto::CMixMessage::ContentsCase::kRealpost: { + BOOST_LOG_TRIVIAL(trace) << "Handling RealPost"; + handle_node_realpost(message.realpost()); + break; + } default: { BOOST_LOG_TRIVIAL(error) << "handle_node_message: CMixMessage contains unknown contents."; } |
