aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2016-11-18 13:01:34 +0100
committerDennis Brentjes <d.brentjes@gmail.com>2016-11-18 13:01:34 +0100
commit39fa834e6f88ca68015eb5f91915ba681a7ce7ed (patch)
tree27bae91b6d7d21b36fa97f125c0d2b96071b8719
parent127b6d6d55456eb49104d380157a63ef1d1ac546 (diff)
downloadcmix-39fa834e6f88ca68015eb5f91915ba681a7ce7ed.tar.gz
cmix-39fa834e6f88ca68015eb5f91915ba681a7ce7ed.tar.bz2
cmix-39fa834e6f88ca68015eb5f91915ba681a7ce7ed.zip
Made permutation a responsibility of cmix in the realtime phase.
-rw-r--r--libcmix/cmix.c19
-rw-r--r--libcmix/cmix.h2
-rw-r--r--node/node_node.cpp28
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<char*> mv(ms.size(), nullptr);
+ std::vector<char const*> 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;
}