diff options
| author | Dennis Brentjes <d.brentjes@gmail.com> | 2016-11-18 14:34:20 +0100 |
|---|---|---|
| committer | Dennis Brentjes <d.brentjes@gmail.com> | 2016-11-18 14:34:20 +0100 |
| commit | 5a3f32ff25e7672ebc453818e7aa01ae84598ce7 (patch) | |
| tree | 6279bd29963ed82d4442fd42784b61313dedaea8 | |
| parent | 7f2ae6e37f6e78d7edd561e7c2f91e69e93be85b (diff) | |
| download | cmix-5a3f32ff25e7672ebc453818e7aa01ae84598ce7.tar.gz cmix-5a3f32ff25e7672ebc453818e7aa01ae84598ce7.tar.bz2 cmix-5a3f32ff25e7672ebc453818e7aa01ae84598ce7.zip | |
The Precomputation postprocess step is now done on batch level.
| -rw-r--r-- | libcmix/cmix.c | 32 | ||||
| -rw-r--r-- | libcmix/cmix.h | 2 | ||||
| -rw-r--r-- | node/node_node.cpp | 47 |
3 files changed, 41 insertions, 40 deletions
diff --git a/libcmix/cmix.c b/libcmix/cmix.c index 9c983f0..1430532 100644 --- a/libcmix/cmix.c +++ b/libcmix/cmix.c @@ -284,21 +284,23 @@ enum cmix_error key_exchange_initiator(struct CMixContext const* ctx, GroupEleme return no_error; } -enum cmix_error post_process(struct CMixContext* ctx, char* r_out, char* m_out, char const* r_epirs, char const* m_epirs, size_t index) { - GroupElement x = ctx->api.array_to_element(r_epirs, get_group_element_array_size(ctx), true); - GroupElement D = ctx->api.get_decryption_share(x, ctx->keypair.sec); - - GroupElement msg = ctx->api.array_to_element(m_epirs, get_group_element_array_size(ctx), true); - GroupElement pirs = ctx->api.multiply(D, msg, true); - element_to_buffer(ctx, m_out, pirs); - - memcpy(r_out, r_epirs, get_group_element_array_size(ctx)); - - ctx->pirs[index] = pirs; // this is not always usable as only the last node will be able to use this effectively, but we store it anyways. - - ctx->api.free_group_element(x); - ctx->api.free_group_element(D); - ctx->api.free_group_element(msg); +enum cmix_error post_process(struct CMixContext* ctx, char** r_out, char** m_out, const char** r_epirs, const char** m_epirs, size_t nr_elements) { + for(size_t i = 0; i < nr_elements; ++i) { + GroupElement x = ctx->api.array_to_element(r_epirs[i], get_group_element_array_size(ctx), true); + GroupElement D = ctx->api.get_decryption_share(x, ctx->keypair.sec); + + GroupElement msg = ctx->api.array_to_element(m_epirs[i], get_group_element_array_size(ctx), true); + GroupElement pirs = ctx->api.multiply(D, msg, true); + element_to_buffer(ctx, m_out[i], pirs); + + memcpy(r_out[i], r_epirs[i], get_group_element_array_size(ctx)); + + ctx->pirs[i] = pirs; // this is not always usable as only the last node will be able to use this effectively, but we store it anyways. + + ctx->api.free_group_element(x); + ctx->api.free_group_element(D); + ctx->api.free_group_element(msg); + } return no_error; } diff --git a/libcmix/cmix.h b/libcmix/cmix.h index 53a3d99..390b28f 100644 --- a/libcmix/cmix.h +++ b/libcmix/cmix.h @@ -97,7 +97,7 @@ enum cmix_error key_exchange_responder(struct CMixContext const* ctx, GroupEleme enum cmix_error key_exchange_initiator(struct CMixContext const* ctx, GroupElement* shared_key, char const* pubkey, char const* value, GroupElement* priv_el); -enum cmix_error post_process(struct CMixContext* ctx, char* r_out, char* m_out, char const* r_epirs, char const* m_epirs, size_t index); +enum cmix_error post_process(struct CMixContext* ctx, char** r_out, char** m_out, char const** r_epirs, char const** m_epirs, size_t nr_elements); enum cmix_error blind_message(struct CMixContext const* ctx, char* m_out, char const* message, GroupElement const* keys, size_t const nr_nodes); diff --git a/node/node_node.cpp b/node/node_node.cpp index f6e5071..63a44df 100644 --- a/node/node_node.cpp +++ b/node/node_node.cpp @@ -90,35 +90,34 @@ template <typename T> cmix_proto::PrePost fill_precomputation_post_message(CMixContext& ctx, T const& rs, T const& ms) { cmix_proto::PrePost prepost; + size_t len = get_group_element_array_size(&ctx); + + std::vector<char*> r_epirs(ms.size(), nullptr); + std::vector<char*> m_epirs(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) { - prepost.add_r_epirs(); - prepost.add_m_epirs(); - - size_t el_len = get_group_element_array_size(&ctx); - - prepost.mutable_r_epirs(i)->resize(el_len); - prepost.mutable_m_epirs(i)->resize(el_len); + std::string* r = prepost.add_r_epirs(); + r->resize(len); + r_epirs[i] = &(*r)[0]; - post_process( - &ctx, - &(*prepost.mutable_r_epirs(i))[0], - &(*prepost.mutable_m_epirs(i))[0], - rs.Get(i).data(), - ms.Get(i).data(), - i - ); + std::string* m = prepost.add_m_epirs(); + m->resize(len); + m_epirs[i] = &(*m)[0]; - { - std::stringstream ss; - ss << "pirs: "; - std::string pirs = to_string(ctx.pirs[i], ctx); - for(auto&& c : pirs) { - ss << "\\" << std::setw(3) << std::setfill('0') << std::oct << (unsigned int) c; - } - BOOST_LOG_TRIVIAL(trace) << ss.str(); - } + rsv[i] = rs.Get(i).data(); + msv[i] = ms.Get(i).data(); } + post_process( + &ctx, + r_epirs.data(), + m_epirs.data(), + rsv.data(), + msv.data(), + ms.size() + ); + return prepost; } |
