diff options
Diffstat (limited to 'libcmix/cmix.c')
| -rw-r--r-- | libcmix/cmix.c | 91 |
1 files changed, 34 insertions, 57 deletions
diff --git a/libcmix/cmix.c b/libcmix/cmix.c index 50fee36..4aba927 100644 --- a/libcmix/cmix.c +++ b/libcmix/cmix.c @@ -22,21 +22,12 @@ struct CMixContext initialize_cmix_context(struct Api api, unsigned int nr_mixes } 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->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*)); - - for(size_t m = 0; m < ctx->nr_participants; ++m) { - ctx->r[m] = (GroupElement*) calloc(ctx->nr_mixes, sizeof(GroupElement)); - ctx->s[m] = (GroupElement*) calloc(ctx->nr_mixes, sizeof(GroupElement)); - ctx->permutation[m] = (unsigned int*) calloc(ctx->nr_mixes, sizeof(unsigned int)); - ctx->decryption_shares[m] = (GroupElement*) calloc(ctx->nr_mixes, sizeof(GroupElement)); - ctx->EPiRS[m] = (GroupElement*) calloc(ctx->nr_mixes, sizeof(GroupElement)); - ctx->PiMRS[m] = (GroupElement*) calloc(ctx->nr_mixes, sizeof(GroupElement)); - } + ctx->r = (GroupElement*) calloc(ctx->nr_participants * ctx->nr_mixes, sizeof(GroupElement)); + ctx->s = (GroupElement*) calloc(ctx->nr_participants * ctx->nr_mixes, sizeof(GroupElement)); + ctx->permutation = (unsigned int*) calloc(ctx->nr_participants * ctx->nr_mixes, sizeof(unsigned int)); + ctx->decryption_shares = (GroupElement*) calloc(ctx->nr_participants * ctx->nr_mixes, sizeof(GroupElement)); + ctx->EPiRS = (GroupElement*) calloc(ctx->nr_participants * ctx->nr_mixes, sizeof(GroupElement)); + ctx->PiMRS = (GroupElement*) calloc(ctx->nr_participants * ctx->nr_mixes, sizeof(GroupElement)); if(!ctx->r || !ctx->s || !ctx->permutation || !ctx->decryption_shares || !ctx->EPiRS || !ctx->PiMRS ) { return out_of_memory; @@ -47,39 +38,25 @@ enum cmix_error alloc_mix(struct CMixContext* ctx) { void release_mix(struct CMixContext* ctx) { if(ctx->r && ctx->s && ctx->permutation && ctx->decryption_shares && ctx->EPiRS) { - for(size_t m = 0; m < ctx->nr_participants; ++m) { + for(size_t m = 0; m < ctx->nr_participants * ctx->nr_mixes; ++m) { if(ctx->r[m]) { - for(size_t i = 0; i < ctx->nr_mixes; ++i) { - ctx->api.free_group_element(ctx->r[m][i]); - } - free(ctx->r[m]); + ctx->api.free_group_element(ctx->r[m]); } if(ctx->s[m]){ - for(size_t i = 0; i < ctx->nr_mixes; ++i) { - ctx->api.free_group_element(ctx->s[m][i]); - } + ctx->api.free_group_element(ctx->s[m]); } - free(ctx->permutation[m]); - if(ctx->decryption_shares[m]){ - for(size_t i = 0; i < ctx->nr_mixes; ++i) { - ctx->api.free_group_element(ctx->decryption_shares[m][i]); - } + ctx->api.free_group_element(ctx->decryption_shares[m]); } if(ctx->EPiRS[m]) { - for(size_t i = 0; i < ctx->nr_mixes; ++i) { - ctx->api.free_group_element(ctx->EPiRS[m][i]); - } + ctx->api.free_group_element(ctx->EPiRS[m]); + } + if(ctx->PiMRS[m]) { + ctx->api.free_group_element(ctx->PiMRS[m]); } } } - - for(size_t i = 0; i < ctx->nr_participants; ++i) { - - ctx->api.free_group_element(ctx->PiMRS[i]); - } - free(ctx->r); ctx->r = NULL; @@ -162,16 +139,16 @@ enum cmix_error generate_permutation(struct CMixContext* ctx) { for(size_t m = 0; m < ctx->nr_mixes; ++m) { for(unsigned int i = 0; i < ctx->nr_participants; ++i) { - ctx->permutation[i][m] = i; + ctx->permutation[i * ctx->nr_mixes + m] = i; } //Fisher-Yates shuffle unsigned int temp = 0; for(unsigned int i = ctx->nr_participants - 1; i > 0; --i) { unsigned int rand = ctx->api.get_uniform_int(i+1); - temp = ctx->permutation[i][m]; - ctx->permutation[i][m] = ctx->permutation[rand][m]; - ctx->permutation[rand][m] = temp; + temp = ctx->permutation[i * ctx->nr_mixes + m]; + ctx->permutation[i * ctx->nr_mixes + m] = ctx->permutation[rand * ctx->nr_mixes + m]; + ctx->permutation[rand * ctx->nr_mixes + m] = temp; } } @@ -183,8 +160,8 @@ enum cmix_error initialize_mix_randomness(struct CMixContext* ctx) { for(size_t i = 0; i < ctx->nr_participants; ++i) { for(size_t m = 0; m < ctx->nr_mixes; ++m) { - ctx->r[i][m] = ctx->api.get_group_element(true); - ctx->s[i][m] = ctx->api.get_group_element(true); + ctx->r[i * ctx->nr_mixes + m] = ctx->api.get_group_element(true); + ctx->s[i * ctx->nr_mixes + m] = ctx->api.get_group_element(true); } } @@ -223,7 +200,7 @@ enum cmix_error encrypt_r(struct CMixContext const* ctx, char** random_buffer, c GroupElement random_element; GroupElement message_element; - ctx->api.encrypt(&random_element, &message_element, ctx->r[i][m], ctx->network_key); + ctx->api.encrypt(&random_element, &message_element, ctx->r[i * ctx->nr_mixes + m], ctx->network_key); element_to_buffer(ctx, random_buffer[i] + offset, random_element); element_to_buffer(ctx, message_buffer[i] + offset, message_element); @@ -244,7 +221,7 @@ enum cmix_error encrypt_r_and_multiply(struct CMixContext const* ctx, char** ran size_t offset = m * get_group_element_array_size(ctx); - ctx->api.encrypt(&enc_random_element, &enc_message_element, ctx->r[i][m], ctx->network_key); + ctx->api.encrypt(&enc_random_element, &enc_message_element, ctx->r[i * ctx->nr_mixes + m], ctx->network_key); size_t el_size = get_group_element_array_size(ctx); @@ -274,7 +251,7 @@ enum cmix_error permute_and_multiply_encrypted_s(struct CMixContext const* ctx, for(size_t i = 0; i < ctx->nr_participants; ++i) { for(size_t m = 0; m < ctx->nr_mixes; ++m) { - unsigned int new_pos = ctx->permutation[i][m]; + unsigned int new_pos = ctx->permutation[i * ctx->nr_mixes + m]; size_t offset = m * get_group_element_array_size(ctx); GroupElement random_r = ctx->api.array_to_element(random_element[i] + offset, el_size, true); @@ -283,7 +260,7 @@ enum cmix_error permute_and_multiply_encrypted_s(struct CMixContext const* ctx, GroupElement random_s; GroupElement message_s; - ctx->api.encrypt(&random_s, &message_s, ctx->s[new_pos][m], ctx->network_key); + ctx->api.encrypt(&random_s, &message_s, ctx->s[new_pos * ctx->nr_mixes + m], ctx->network_key); GroupElement random_pirs = ctx->api.combine(random_r, random_s, true); GroupElement message_pirs = ctx->api.combine(message_r, message_s, true); @@ -309,12 +286,12 @@ enum cmix_error permute_and_multiply_s(struct CMixContext* ctx, char** out_buffe for(size_t i = 0; i < ctx->nr_participants; ++i) { for(size_t m = 0; m < ctx->nr_mixes; ++m) { size_t offset = m * get_group_element_array_size(ctx); - unsigned int new_pos = ctx->permutation[i][m]; + unsigned int new_pos = ctx->permutation[i * ctx->nr_mixes + m]; GroupElement message_el = ctx->api.array_to_element(message[i] + offset, el_size, false); - ctx->PiMRS[new_pos][m] = ctx->api.combine(message_el, ctx->s[new_pos][m], false); + ctx->PiMRS[new_pos * ctx->nr_mixes + m] = ctx->api.combine(message_el, ctx->s[new_pos * ctx->nr_mixes + m], false); - element_to_buffer(ctx, out_buffer[new_pos] + offset, ctx->PiMRS[new_pos][m]); + element_to_buffer(ctx, out_buffer[new_pos] + offset, ctx->PiMRS[new_pos * ctx->nr_mixes + m]); ctx->api.free_group_element(message_el); } @@ -330,7 +307,7 @@ enum cmix_error multiply_s(struct CMixContext const* ctx, char* out_buffer, char size_t offset = get_group_element_array_size(ctx); GroupElement message_el = ctx->api.array_to_element(message + offset, el_size, false); - GroupElement mult = ctx->api.combine(message_el, ctx->s[m][ctx->permutation[m][index]], false); + GroupElement mult = ctx->api.combine(message_el, ctx->s[m * ctx->nr_mixes + ctx->permutation[m * ctx->nr_mixes + index]], false); element_to_buffer(ctx, out_buffer + offset, mult); @@ -414,9 +391,9 @@ enum cmix_error precomputation_post_process(struct CMixContext* ctx, char* commi size_t offset = m * ctx->api.get_group_element_array_size(); GroupElement x = ctx->api.array_to_element(r_epirs[i] + offset, get_group_element_array_size(ctx), true); - ctx->decryption_shares[i][m] = ctx->api.get_decryption_share(x, ctx->keypair.sec); + ctx->decryption_shares[i * ctx->nr_mixes + m] = ctx->api.get_decryption_share(x, ctx->keypair.sec); - ctx->EPiRS[i][m] = ctx->api.array_to_element(m_epirs[i] + offset, len, true); + ctx->EPiRS[i * ctx->nr_mixes + m] = ctx->api.array_to_element(m_epirs[i] + offset, len, true); ctx->api.free_group_element(x); } @@ -476,7 +453,7 @@ enum cmix_error swap_k_for_r(struct CMixContext const* ctx, char** out_buffer, c GroupElement mes = ctx->api.array_to_element(message[i] + offset, len, false); GroupElement unblinded = ctx->api.uncombine(mes, key[i], false); - GroupElement blinded = ctx->api.combine(unblinded, ctx->r[i][m], false); + GroupElement blinded = ctx->api.combine(unblinded, ctx->r[i * ctx->nr_mixes + m], false); element_to_buffer(ctx, out_buffer[i] + offset, blinded); ctx->api.free_group_element(mes); @@ -493,7 +470,7 @@ enum cmix_error get_epirs(struct CMixContext const* ctx, char** out_buffer) { for(size_t i = 0; i < ctx->nr_participants; ++i) { for(size_t m = 0; m < ctx->nr_mixes; ++m) { size_t offset = m * get_group_element_array_size(ctx); - element_to_buffer(ctx, out_buffer[i] + offset, ctx->EPiRS[i][m]); + element_to_buffer(ctx, out_buffer[i] + offset, ctx->EPiRS[i * ctx->nr_mixes + m]); } } @@ -512,7 +489,7 @@ enum cmix_error decrypt_epirs(struct CMixContext const* ctx, char** out_buffer, size_t offset = m * get_group_element_array_size(ctx); GroupElement msg = ctx->api.array_to_element(epirs[i] + offset, get_group_element_array_size(ctx), true); - GroupElement pirs = ctx->api.combine(ctx->decryption_shares[i][m], msg, true); + GroupElement pirs = ctx->api.combine(ctx->decryption_shares[i * ctx->nr_mixes + m], msg, true); element_to_buffer(ctx, out_buffer[i] + offset, pirs); ctx->api.free_group_element(msg); @@ -531,7 +508,7 @@ enum cmix_error remove_pirs(struct CMixContext const* ctx, char** out_buffer, co size_t offset = m * get_group_element_array_size(ctx); GroupElement g_pirs = ctx->api.array_to_element(pirs[i] + offset, len, false); - GroupElement mult = ctx->api.uncombine(ctx->PiMRS[i][m], g_pirs, false); + GroupElement mult = ctx->api.uncombine(ctx->PiMRS[i * ctx->nr_mixes + m], g_pirs, false); element_to_buffer(ctx, out_buffer[i] + offset, mult); |
