aboutsummaryrefslogtreecommitdiff
path: root/node/node_node.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'node/node_node.cpp')
-rw-r--r--node/node_node.cpp217
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.";
}