diff options
Diffstat (limited to 'node/node.cpp')
| -rw-r--r-- | node/node.cpp | 95 |
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); } } |
