aboutsummaryrefslogtreecommitdiff
path: root/libcmix/cmix.c
diff options
context:
space:
mode:
Diffstat (limited to 'libcmix/cmix.c')
-rw-r--r--libcmix/cmix.c122
1 files changed, 98 insertions, 24 deletions
diff --git a/libcmix/cmix.c b/libcmix/cmix.c
index 0255f42..a4fba6f 100644
--- a/libcmix/cmix.c
+++ b/libcmix/cmix.c
@@ -14,7 +14,9 @@ struct CMixContext initialize_cmix_context(struct Api api) {
.r = NULL,
.s = NULL,
.permutation = NULL,
- .pirs = NULL,
+ .decryption_shares = NULL,
+ .EPiRS = NULL,
+ .PiMRS = NULL
};
}
@@ -22,8 +24,10 @@ enum cmix_error alloc_mix(struct CMixContext* ctx) {
ctx->r = (GroupElement*) calloc(ctx->nr_participants, sizeof(GroupElement));
ctx->s = (GroupElement*) calloc(ctx->nr_participants, sizeof(GroupElement));
ctx->permutation = (unsigned int*) calloc(ctx->nr_participants, sizeof(unsigned int));
- ctx->pirs = (GroupElement*) calloc(ctx->nr_participants, sizeof(GroupElement));
- if(!ctx->r || !ctx->s || !ctx->permutation || !ctx->pirs) {
+ ctx->decryption_shares = (GroupElement*) calloc(ctx->nr_participants, sizeof(GroupElement));
+ ctx->EPiRS = (GroupElement*) calloc(ctx->nr_participants, sizeof(GroupElement));
+ ctx->PiMRS = (GroupElement*) calloc(ctx->nr_participants, sizeof(GroupElement));
+ if(!ctx->r || !ctx->s || !ctx->permutation || !ctx->decryption_shares || !ctx->EPiRS || !ctx->PiMRS ) {
return out_of_memory;
}
return no_error;
@@ -33,7 +37,9 @@ void release_mix(struct CMixContext* ctx) {
for(size_t i = 0; i < ctx->nr_participants; ++i) {
ctx->api.free_group_element(ctx->r[i]);
ctx->api.free_group_element(ctx->s[i]);
- ctx->api.free_group_element(ctx->pirs[i]);
+ ctx->api.free_group_element(ctx->decryption_shares[i]);
+ ctx->api.free_group_element(ctx->EPiRS[i]);
+ ctx->api.free_group_element(ctx->PiMRS[i]);
}
free(ctx->r);
ctx->r = NULL;
@@ -44,8 +50,14 @@ void release_mix(struct CMixContext* ctx) {
free(ctx->permutation);
ctx->permutation = NULL;
- free(ctx->pirs);
- ctx->pirs = NULL;
+ free(ctx->decryption_shares);
+ ctx->decryption_shares = NULL;
+
+ free(ctx->EPiRS);
+ ctx->EPiRS = NULL;
+
+ free(ctx->PiMRS);
+ ctx->PiMRS = NULL;
ctx->nr_participants = 0;
}
@@ -186,7 +198,7 @@ enum cmix_error encrypt_r_and_multiply(struct CMixContext const* ctx, char** ran
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);
@@ -228,21 +240,22 @@ 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) {
+enum cmix_error permute_and_multiply_s(struct CMixContext* ctx, char** out_buffer, char const** message) {
size_t el_size = get_group_element_array_size(ctx);
for(size_t i = 0; i < ctx->nr_participants; ++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);
+ ctx->PiMRS[new_pos] = ctx->api.multiply(message_el, ctx->s[new_pos], false);
- element_to_buffer(ctx, out_buffer[new_pos], mult);
+ element_to_buffer(ctx, out_buffer[new_pos], ctx->PiMRS[new_pos]);
ctx->api.free_group_element(message_el);
- ctx->api.free_group_element(mult);
}
+
+
return no_error;
}
@@ -298,7 +311,8 @@ 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, const char** r_epirs, const char** m_epirs) {
+/*
+enum cmix_error precomputation_post_process_unsafe(struct CMixContext* ctx, char** r_out, char** m_out, const char** r_epirs, const char** m_epirs) {
for(size_t i = 0; i < ctx->nr_participants; ++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);
@@ -318,6 +332,37 @@ enum cmix_error post_process(struct CMixContext* ctx, char** r_out, char** m_out
return no_error;
}
+*/
+
+size_t get_commitment_length(struct CMixContext const* ctx) {
+ return 1;
+}
+
+enum cmix_error precomputation_post_process(struct CMixContext* ctx, char* commitment, const char** r_epirs, const char** m_epirs) {
+ size_t len = get_group_element_array_size(ctx);
+
+ for(size_t i = 0; i < ctx->nr_participants; ++i) {
+ GroupElement x = ctx->api.array_to_element(r_epirs[i], get_group_element_array_size(ctx), true);
+ ctx->decryption_shares[i] = ctx->api.get_decryption_share(x, ctx->keypair.sec);
+
+ ctx->EPiRS[i] = ctx->api.array_to_element(m_epirs[i], len, true);
+
+ ctx->api.free_group_element(x);
+ }
+
+ //ToDo: actually calculate commitment.
+
+ memset(commitment, 0, get_commitment_length(ctx));
+
+ return no_error;
+}
+
+enum cmix_error commit_precomputation_ciphertext(struct CMixContext* ctx, char* commitment, const char** m_epirs) {
+ //ToDo: actually calculate commitment.
+ memset(commitment, 0, get_commitment_length(ctx));
+
+ return no_error;
+}
enum cmix_error blind_message(struct CMixContext const* ctx, char* m_out, char const* message, GroupElement const* keys, size_t const nr_nodes) {
size_t len = get_group_element_array_size(ctx);
@@ -363,19 +408,48 @@ enum cmix_error swap_k_for_r(struct CMixContext const* ctx, char** out_buffer, c
return no_error;
}
-enum cmix_error remove_r_and_s(struct CMixContext const* ctx, char* out_buffer, char const* message, size_t index) {
- size_t len = get_group_element_array_size(ctx);
-
- GroupElement mes = ctx->api.array_to_element(message, len, false);
- GroupElement inv_pirs = ctx->api.invert(ctx->pirs[index]);
-
- GroupElement mult = ctx->api.multiply(mes, inv_pirs, false);
-
- element_to_buffer(ctx, out_buffer, mult);
+
+enum cmix_error get_epirs(struct CMixContext const* ctx, char** out_buffer) {
+ for(size_t i = 0; i < ctx->nr_participants; ++i) {
+ element_to_buffer(ctx, out_buffer[i], ctx->EPiRS[i]);
+ }
+ return no_error;
+}
+
+enum cmix_error get_pimrs_commitment(struct CMixContext const* ctx, char* out_buffer, const char** pimrss) {
+ (void) pimrss;
+ memset(out_buffer, '\0', get_commitment_length(ctx));
+ return no_error;
+}
+
+enum cmix_error decrypt_epirs(struct CMixContext const* ctx, char** out_buffer, const char** epirs) {
+ for(size_t i = 0; i < ctx->nr_participants; ++i) {
+ GroupElement msg = ctx->api.array_to_element(epirs[i], get_group_element_array_size(ctx), true);
+ GroupElement pirs = ctx->api.multiply(ctx->decryption_shares[i], msg, true);
+ element_to_buffer(ctx, out_buffer[i], pirs);
+
+ ctx->api.free_group_element(msg);
+ ctx->api.free_group_element(pirs);
+ }
- ctx->api.free_group_element(mes);
- ctx->api.free_group_element(inv_pirs);
- ctx->api.free_group_element(mult);
+ return no_error;
+}
+
+enum cmix_error remove_pirs(struct CMixContext const* ctx, char** out_buffer, const char** pirs) {
+ size_t len = get_group_element_array_size(ctx);
+
+ for(size_t i = 0; i < ctx->nr_participants; ++i) {
+ GroupElement g_pirs = ctx->api.array_to_element(pirs[i], len, false);
+ GroupElement inv_pirs = ctx->api.invert(g_pirs);
+
+ GroupElement mult = ctx->api.multiply(ctx->PiMRS[i], inv_pirs, false);
+
+ element_to_buffer(ctx, out_buffer[i], mult);
+
+ ctx->api.free_group_element(g_pirs);
+ ctx->api.free_group_element(inv_pirs);
+ ctx->api.free_group_element(mult);
+ }
return no_error;
}