From 98d37116f1dc542010b2d65dcda71871eeca8c87 Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Thu, 3 Nov 2016 14:10:59 +0100 Subject: Fixed the permutation step and reduced some code duplication. --- libcmix/cmix.c | 2 +- node/node.cpp | 95 ++++++++++++++++++++++++++++++++++------------------------ 2 files changed, 57 insertions(+), 40 deletions(-) diff --git a/libcmix/cmix.c b/libcmix/cmix.c index 6a39767..4893c6c 100644 --- a/libcmix/cmix.c +++ b/libcmix/cmix.c @@ -184,7 +184,7 @@ enum cmix_error multiply_s(struct CMixContext const* ctx, char* r_out_buffer, ch GroupElement random_s; GroupElement message_s; - ctx->api.encrypt(&random_s, &message_s, ctx->s[index], ctx->network_key); + ctx->api.encrypt(&random_s, &message_s, ctx->s[ctx->permutation[index]], ctx->network_key); GroupElement random_pirs = ctx->api.multiply(random_r, random_s, true); GroupElement message_pirs = ctx->api.multiply(message_r, message_s, true); 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 +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 +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); } } -- cgit v1.2.3-70-g09d2