aboutsummaryrefslogtreecommitdiff
path: root/node/node.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'node/node.cpp')
-rw-r--r--node/node.cpp95
1 files changed, 56 insertions, 39 deletions
diff --git a/node/node.cpp b/node/node.cpp
index fc41656..98b5873 100644
--- a/node/node.cpp
+++ b/node/node.cpp
@@ -114,50 +114,66 @@ void Node::handle_node_secretkey(cmix_proto::SecretKey const& secret)
}
}
-void Node::handle_node_prepre(cmix_proto::PrePre const& pre) {
- if(network_settings.is_first) {
+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);
- cmix_proto::PreMix premix;
- for(int i = 0; i < cmix_ctx.nr_participants; ++i) {
- auto new_pos = cmix_ctx.permutation[i];
- size_t el_len = get_group_element_array_size(&cmix_ctx);
-
- premix.mutable_r_epirs(new_pos)->resize(el_len);
- premix.mutable_m_epirs(new_pos)->resize(el_len);
-
- multiply_s(
- &cmix_ctx,
- &(*premix.mutable_r_epirs(new_pos))[0],
- &(*premix.mutable_m_epirs(new_pos))[0],
- pre.r_er(i).data(),
- pre.m_er(i).data(),
- i
- );
- }
+ premix.mutable_r_epirs(new_pos)->resize(el_len);
+ premix.mutable_m_epirs(new_pos)->resize(el_len);
- next_node.async_send(premix);
+ 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::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(int i = 0; i < rs.size(); ++i) {
+ size_t len = get_group_element_array_size(&ctx);
- } else {
- if(start_mix(&cmix_ctx, pre.r_er_size()) != no_error) {
- exit(-1);
- }
+ prepre.mutable_m_er(i)->resize(len);
+ prepre.mutable_r_er(i)->resize(len);
- if(initialize_mix_randomness(&cmix_ctx) != no_error) {
+ 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);
}
-
- cmix_proto::PrePre prepre;
-
- for(int i = 0; i < pre.m_er_size(); ++i) {
- size_t len = get_group_element_array_size(&cmix_ctx);
-
- prepre.mutable_m_er(i)->resize(len);
- prepre.mutable_r_er(i)->resize(len);
-
- if(encrypt_r_and_multiply(&cmix_ctx, &(*prepre.mutable_r_er(i))[0], &(*prepre.mutable_m_er(i))[0], pre.r_er(i).data(), pre.m_er(i).data(), i) != no_error) {
- exit(-1);
- }
- }
+ }
+ return prepre;
+}
+
+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);
}
}
@@ -166,7 +182,8 @@ void Node::handle_node_premix(cmix_proto::PreMix const& premix) {
if(network_settings.is_first) {
} else {
-
+ cmix_proto::PreMix n_premix = fill_precomputation_mix_message(cmix_ctx, premix.r_epirs(), premix.m_epirs());
+ next_node.async_send(n_premix);
}
}