From 39fa834e6f88ca68015eb5f91915ba681a7ce7ed Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Fri, 18 Nov 2016 13:01:34 +0100 Subject: Made permutation a responsibility of cmix in the realtime phase. --- libcmix/cmix.c | 19 +++++++++++++++++++ libcmix/cmix.h | 2 +- node/node_node.cpp | 28 +++++++++++++--------------- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/libcmix/cmix.c b/libcmix/cmix.c index 2ba5fd9..149bc7d 100644 --- a/libcmix/cmix.c +++ b/libcmix/cmix.c @@ -205,6 +205,25 @@ enum cmix_error permute_and_multiply_encrypted_s(struct CMixContext const* ctx, return no_error; } +enum cmix_error permute_and_multiply_s(struct CMixContext const* ctx, char** out_buffer, char const** message, size_t nr_elements) { + size_t el_size = get_group_element_array_size(ctx); + + for(size_t i = 0; i < nr_elements; ++i) { + unsigned int new_pos = ctx->permutation[i]; + + GroupElement message_el = ctx->api.array_to_element(message[i], el_size, false); + GroupElement mult = ctx->api.multiply(message_el, ctx->s[new_pos], false); + + element_to_buffer(ctx, out_buffer[new_pos], mult); + + ctx->api.free_group_element(message_el); + ctx->api.free_group_element(mult); + } + + return no_error; +} + + enum cmix_error multiply_s(struct CMixContext const* ctx, char* out_buffer, char const* message, size_t index) { size_t el_size = get_group_element_array_size(ctx); diff --git a/libcmix/cmix.h b/libcmix/cmix.h index f3d071d..689906c 100644 --- a/libcmix/cmix.h +++ b/libcmix/cmix.h @@ -87,7 +87,7 @@ enum cmix_error encrypt_r_and_multiply(struct CMixContext const* ctx, char* rand enum cmix_error permute_and_multiply_encrypted_s(struct CMixContext const* ctx, char** random_buffer, char** message_buffer, char const** random_element, char const** message_element, size_t nr_elements); -enum cmix_error multiply_s(struct CMixContext const* ctx, char* out_buffer, char const* message, size_t index); +enum cmix_error permute_and_multiply_s(struct CMixContext const* ctx, char** out_buffer, char const** message, size_t nr_elements); enum cmix_error get_key_exchange_value(struct CMixContext const* ctx, char* buffer, GroupElement priv_element); diff --git a/node/node_node.cpp b/node/node_node.cpp index 1742035..8faa4cf 100644 --- a/node/node_node.cpp +++ b/node/node_node.cpp @@ -160,25 +160,23 @@ cmix_proto::RealMix fill_realtime_mix_message(CMixContext& ctx, T const& ms) { cmix_proto::RealMix realmix; size_t len = get_group_element_array_size(&ctx); - - for(int i = 0; i < ms.size(); ++i) { - realmix.add_m(); - } - + std::vector mv(ms.size(), nullptr); + std::vector msv(ms.size(), nullptr); for(int i = 0; i < ms.size(); ++i) { - auto new_pos = ctx.permutation[i]; - - realmix.mutable_m(new_pos)->resize(len); - - multiply_s( - &ctx, - &(*realmix.mutable_m(new_pos))[0], - ms.Get(i).data(), - i - ); + std::string* m = realmix.add_m(); + m->resize(len); + mv[i] = &(*m)[0]; + msv[i] = ms.Get(i).data(); } + permute_and_multiply_s( + &ctx, + mv.data(), + msv.data(), + ms.size() + ); + return realmix; } -- cgit v1.2.3-70-g09d2