aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2016-11-18 13:36:53 +0100
committerDennis Brentjes <d.brentjes@gmail.com>2016-11-18 13:52:09 +0100
commit7f2ae6e37f6e78d7edd561e7c2f91e69e93be85b (patch)
treef63b119f19e19cc6252bc0a9079679acc46ed6fb
parent39fa834e6f88ca68015eb5f91915ba681a7ce7ed (diff)
downloadcmix-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.c63
-rw-r--r--libcmix/cmix.h4
-rw-r--r--node/node.cpp39
-rw-r--r--node/node_node.cpp52
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;
}