diff options
| author | Dennis Brentjes <d.brentjes@gmail.com> | 2016-11-18 13:36:53 +0100 |
|---|---|---|
| committer | Dennis Brentjes <d.brentjes@gmail.com> | 2016-11-18 13:52:09 +0100 |
| commit | 7f2ae6e37f6e78d7edd561e7c2f91e69e93be85b (patch) | |
| tree | f63b119f19e19cc6252bc0a9079679acc46ed6fb | |
| parent | 39fa834e6f88ca68015eb5f91915ba681a7ce7ed (diff) | |
| download | cmix-7f2ae6e37f6e78d7edd561e7c2f91e69e93be85b.tar.gz cmix-7f2ae6e37f6e78d7edd561e7c2f91e69e93be85b.tar.bz2 cmix-7f2ae6e37f6e78d7edd561e7c2f91e69e93be85b.zip | |
The Precomputation precomputation step is now done on batch level.
| -rw-r--r-- | libcmix/cmix.c | 63 | ||||
| -rw-r--r-- | libcmix/cmix.h | 4 | ||||
| -rw-r--r-- | node/node.cpp | 39 | ||||
| -rw-r--r-- | node/node_node.cpp | 52 |
4 files changed, 83 insertions, 75 deletions
diff --git a/libcmix/cmix.c b/libcmix/cmix.c index 149bc7d..9c983f0 100644 --- a/libcmix/cmix.c +++ b/libcmix/cmix.c @@ -138,41 +138,50 @@ enum cmix_error set_network_key(struct CMixContext* ctx, char const* buffer, siz return no_error; } -enum cmix_error encrypt_r(struct CMixContext const* ctx, char* random_buffer, char* message_buffer, size_t index) { - GroupElement random_element; - GroupElement message_element; +enum cmix_error encrypt_r(struct CMixContext const* ctx, char** random_buffer, char** message_buffer, size_t nr_elements) { - ctx->api.encrypt(&random_element, &message_element, ctx->r[index], ctx->network_key); + for(size_t i = 0; i < nr_elements; ++i) { + GroupElement random_element; + GroupElement message_element; + + ctx->api.encrypt(&random_element, &message_element, ctx->r[i], ctx->network_key); - element_to_buffer(ctx, random_buffer, random_element); - element_to_buffer(ctx, message_buffer, message_element); + element_to_buffer(ctx, random_buffer[i], random_element); + element_to_buffer(ctx, message_buffer[i], message_element); + + ctx->api.free_group_element(random_element); + ctx->api.free_group_element(message_element); + } return no_error; } -enum cmix_error encrypt_r_and_multiply(struct CMixContext const* ctx, char* random_buffer, char* message_buffer, const char* random_element, const char* message_element, size_t index) { - GroupElement enc_random_element; - GroupElement enc_message_element; - - ctx->api.encrypt(&enc_random_element, &enc_message_element, ctx->r[index], ctx->network_key); - - size_t el_size = get_group_element_array_size(ctx); - - GroupElement other_random_element = ctx->api.array_to_element(random_element, el_size, true); - GroupElement other_message_element = ctx->api.array_to_element(message_element, el_size, true); +enum cmix_error encrypt_r_and_multiply(struct CMixContext const* ctx, char** random_buffer, char** message_buffer, const char** random_element, const char** message_element, size_t nr_elements) { - GroupElement new_random_element = ctx->api.multiply(enc_random_element, other_random_element, true); - GroupElement new_message_element = ctx->api.multiply(enc_message_element, other_message_element, true); - - element_to_buffer(ctx, random_buffer, new_random_element); - element_to_buffer(ctx, message_buffer, new_message_element); + for(size_t i = 0; i < nr_elements; ++i) { + GroupElement enc_random_element; + GroupElement enc_message_element; + + ctx->api.encrypt(&enc_random_element, &enc_message_element, ctx->r[i], ctx->network_key); + + size_t el_size = get_group_element_array_size(ctx); - ctx->api.free_group_element(enc_random_element); - ctx->api.free_group_element(enc_message_element); - ctx->api.free_group_element(other_random_element); - ctx->api.free_group_element(other_message_element); - ctx->api.free_group_element(new_random_element); - ctx->api.free_group_element(new_message_element); + GroupElement other_random_element = ctx->api.array_to_element(random_element[i], el_size, true); + GroupElement other_message_element = ctx->api.array_to_element(message_element[i], el_size, true); + + GroupElement new_random_element = ctx->api.multiply(enc_random_element, other_random_element, true); + GroupElement new_message_element = ctx->api.multiply(enc_message_element, other_message_element, true); + + element_to_buffer(ctx, random_buffer[i], new_random_element); + element_to_buffer(ctx, message_buffer[i], new_message_element); + + ctx->api.free_group_element(enc_random_element); + ctx->api.free_group_element(enc_message_element); + ctx->api.free_group_element(other_random_element); + ctx->api.free_group_element(other_message_element); + ctx->api.free_group_element(new_random_element); + ctx->api.free_group_element(new_message_element); + } return no_error; } diff --git a/libcmix/cmix.h b/libcmix/cmix.h index 689906c..53a3d99 100644 --- a/libcmix/cmix.h +++ b/libcmix/cmix.h @@ -81,9 +81,9 @@ size_t get_group_element_array_size(struct CMixContext const* ctx); enum cmix_error set_network_key(struct CMixContext* ctx, char const* buffer, size_t len); -enum cmix_error encrypt_r(struct CMixContext const* ctx, char* random_buffer, char* message_buffer, size_t index); +enum cmix_error encrypt_r(struct CMixContext const* ctx, char** random_buffer, char** message_buffer, size_t nr_elements); -enum cmix_error encrypt_r_and_multiply(struct CMixContext const* ctx, char* random_buffer, char* message_buffer, char const* random_element, char const* message_element, size_t index); +enum cmix_error encrypt_r_and_multiply(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 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); diff --git a/node/node.cpp b/node/node.cpp index a6ad1e1..b29a873 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -176,28 +176,27 @@ void Node::start_precomputation() { cmix_proto::PrePre prepre; - for(size_t i = 0; i < cmix_ctx.nr_participants; ++i) { - prepre.add_m_er(); - prepre.add_r_er(); + size_t len = get_group_element_array_size(&cmix_ctx); + std::vector<char*> r_er(cmix_ctx.nr_participants, nullptr); + std::vector<char*> m_er(cmix_ctx.nr_participants, nullptr); - size_t len = get_group_element_array_size(&cmix_ctx); - - prepre.mutable_r_er(i)->resize(len); - prepre.mutable_m_er(i)->resize(len); - - { - std::stringstream ss; - ss << "r: "; - std::string r = to_string(cmix_ctx.r[i], cmix_ctx); - for(auto&& c : r) { - ss << "\\" << std::setw(3) << std::setfill('0') << std::oct << (unsigned int) c; - } - BOOST_LOG_TRIVIAL(trace) << ss.str(); - } + for(size_t i = 0; i < cmix_ctx.nr_participants; ++i) { + std::string* r = prepre.add_r_er(); + r->resize(len); + r_er[i] = &(*r)[0]; - if(encrypt_r(&cmix_ctx, &(*prepre.mutable_r_er(i))[0], &(*prepre.mutable_m_er(i))[0], i) != no_error) { - exit(-1); - } + std::string* m = prepre.add_m_er(); + m->resize(len); + m_er[i] = &(*m)[0]; + } + + if(encrypt_r( + &cmix_ctx, + r_er.data(), + m_er.data(), + cmix_ctx.nr_participants + ) != no_error) { + exit(-1); } BOOST_LOG_TRIVIAL(trace) << "Sending prepre message: " << prepre.ShortDebugString(); diff --git a/node/node_node.cpp b/node/node_node.cpp index 8faa4cf..f6e5071 100644 --- a/node/node_node.cpp +++ b/node/node_node.cpp @@ -20,36 +20,36 @@ cmix_proto::PrePre fill_precomputation_pre_message(CMixContext& ctx, T const& rs cmix_proto::PrePre prepre; + size_t len = get_group_element_array_size(&ctx); + std::vector<char*> r_ers(ms.size(), nullptr); + std::vector<char*> m_ers(ms.size(), nullptr); + std::vector<char const*> rsv(ms.size(), nullptr); + std::vector<char const*> msv(ms.size(), nullptr); + for(size_t i = 0; i < ms.size(); ++i) { - prepre.add_m_er(); - prepre.add_r_er(); + std::string* r = prepre.add_r_er(); + r->resize(len); + r_ers[i] = &(*r)[0]; - size_t len = get_group_element_array_size(&ctx); - - prepre.mutable_m_er(i)->resize(len); - prepre.mutable_r_er(i)->resize(len); - - { - std::stringstream ss; - ss << "r: "; - std::string r = to_string(ctx.r[i], ctx); - for(auto&& c : r) { - ss << "\\" << std::setw(3) << std::setfill('0') << std::oct << (unsigned int) c; - } - BOOST_LOG_TRIVIAL(trace) << ss.str(); - } + std::string* m = prepre.add_m_er(); + m->resize(len); + m_ers[i] = &(*m)[0]; - 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); - } + rsv[i] = rs.Get(i).data(); + msv[i] = ms.Get(i).data(); } + + if(encrypt_r_and_multiply( + &ctx, + r_ers.data(), + m_ers.data(), + rsv.data(), + msv.data(), + ms.size() + ) != no_error) { + exit(-1); + } + return prepre; } |
