aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2016-11-18 14:34:20 +0100
committerDennis Brentjes <d.brentjes@gmail.com>2016-11-18 14:34:20 +0100
commit5a3f32ff25e7672ebc453818e7aa01ae84598ce7 (patch)
tree6279bd29963ed82d4442fd42784b61313dedaea8
parent7f2ae6e37f6e78d7edd561e7c2f91e69e93be85b (diff)
downloadcmix-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.c32
-rw-r--r--libcmix/cmix.h2
-rw-r--r--node/node_node.cpp47
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;
}