aboutsummaryrefslogtreecommitdiff
path: root/libcmix/cmix.c
diff options
context:
space:
mode:
Diffstat (limited to 'libcmix/cmix.c')
-rw-r--r--libcmix/cmix.c66
1 files changed, 40 insertions, 26 deletions
diff --git a/libcmix/cmix.c b/libcmix/cmix.c
index a4fba6f..f697dc0 100644
--- a/libcmix/cmix.c
+++ b/libcmix/cmix.c
@@ -80,6 +80,7 @@ void element_to_buffer(struct CMixContext const* ctx, char* out_buffer, GroupEle
size_t len;
ctx->api.element_to_array(&buffer, &len, element);
+
size_t diff = el_size - len;
memcpy(out_buffer + diff, buffer, len);
ctx->api.free_buffer(buffer);
@@ -157,6 +158,11 @@ size_t get_group_element_array_size(struct CMixContext const* ctx) {
return ctx->api.get_group_element_array_size();
}
+size_t get_message_size(struct CMixContext const* ctx)
+{
+ return ctx->api.get_message_size();
+}
+
enum cmix_error set_network_key(struct CMixContext* ctx, char const* buffer) {
ctx->network_key = ctx->api.array_to_element(buffer, get_group_element_array_size(ctx), true);
return no_error;
@@ -193,8 +199,8 @@ enum cmix_error encrypt_r_and_multiply(struct CMixContext const* ctx, char** ran
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);
+ GroupElement new_random_element = ctx->api.combine(enc_random_element, other_random_element, true);
+ GroupElement new_message_element = ctx->api.combine(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);
@@ -223,8 +229,8 @@ enum cmix_error permute_and_multiply_encrypted_s(struct CMixContext const* ctx,
ctx->api.encrypt(&random_s, &message_s, ctx->s[new_pos], ctx->network_key);
- GroupElement random_pirs = ctx->api.multiply(random_r, random_s, true);
- GroupElement message_pirs = ctx->api.multiply(message_r, message_s, true);
+ GroupElement random_pirs = ctx->api.combine(random_r, random_s, true);
+ GroupElement message_pirs = ctx->api.combine(message_r, message_s, true);
element_to_buffer(ctx, random_buffer[new_pos], random_pirs);
element_to_buffer(ctx, message_buffer[new_pos], message_pirs);
@@ -247,7 +253,7 @@ enum cmix_error permute_and_multiply_s(struct CMixContext* ctx, char** out_buffe
unsigned int new_pos = ctx->permutation[i];
GroupElement message_el = ctx->api.array_to_element(message[i], el_size, false);
- ctx->PiMRS[new_pos] = ctx->api.multiply(message_el, ctx->s[new_pos], false);
+ ctx->PiMRS[new_pos] = ctx->api.combine(message_el, ctx->s[new_pos], false);
element_to_buffer(ctx, out_buffer[new_pos], ctx->PiMRS[new_pos]);
@@ -264,7 +270,7 @@ enum cmix_error multiply_s(struct CMixContext const* ctx, char* out_buffer, char
size_t el_size = get_group_element_array_size(ctx);
GroupElement message_el = ctx->api.array_to_element(message, el_size, false);
- GroupElement mult = ctx->api.multiply(message_el, ctx->s[ctx->permutation[index]], false);
+ GroupElement mult = ctx->api.combine(message_el, ctx->s[ctx->permutation[index]], false);
element_to_buffer(ctx, out_buffer, mult);
@@ -290,7 +296,7 @@ enum cmix_error key_exchange_responder(struct CMixContext const* ctx, GroupEleme
GroupElement ex_val = ctx->api.get_key_exchange_value(priv_el);
size_t el_len = get_group_element_array_size(ctx);
- *shared_key = ctx->api.derive_shared_key(ctx->keypair, (unsigned char*)pubkey, el_len, (unsigned char*)value, el_len, priv_el, true);
+ *shared_key = ctx->api.derive_shared_key(ctx->keypair, (unsigned char const*)pubkey, el_len, (unsigned char const*)value, el_len, priv_el, true);
element_to_buffer(ctx, public_key_buffer, ctx->keypair.pub);
element_to_buffer(ctx, exchange_value_buffer, ex_val);
@@ -303,7 +309,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) {
size_t el_len = get_group_element_array_size(ctx);
- *shared_key = ctx->api.derive_shared_key(ctx->keypair, (unsigned char*)pubkey, el_len, (unsigned char*)value, el_len, *priv_el, false);
+ *shared_key = ctx->api.derive_shared_key(ctx->keypair, (unsigned char const*)pubkey, el_len, (unsigned char const*)value, el_len, *priv_el, false);
ctx->api.free_group_element(*priv_el);
*priv_el = NULL;
@@ -335,6 +341,7 @@ enum cmix_error precomputation_post_process_unsafe(struct CMixContext* ctx, char
*/
size_t get_commitment_length(struct CMixContext const* ctx) {
+ (void) ctx;
return 1;
}
@@ -358,6 +365,7 @@ enum cmix_error precomputation_post_process(struct CMixContext* ctx, char* commi
}
enum cmix_error commit_precomputation_ciphertext(struct CMixContext* ctx, char* commitment, const char** m_epirs) {
+ (void) m_epirs;
//ToDo: actually calculate commitment.
memset(commitment, 0, get_commitment_length(ctx));
@@ -365,17 +373,17 @@ enum cmix_error commit_precomputation_ciphertext(struct CMixContext* ctx, char*
}
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);
+ size_t len = get_message_size(ctx);
GroupElement* intermediates = (GroupElement*) calloc(nr_nodes + 1, sizeof(GroupElement));
if(intermediates == NULL) {
return out_of_memory;
}
- intermediates[0] = ctx->api.array_to_element(message, len, true);
+ intermediates[0] = ctx->api.message_to_element(message, len, true);
for(size_t i = 0; i < nr_nodes; ++i) {
- intermediates[i+1] = ctx->api.multiply(intermediates[i], keys[i], false);
+ intermediates[i+1] = ctx->api.combine(intermediates[i], keys[i], false);
}
element_to_buffer(ctx, m_out, intermediates[nr_nodes]);
@@ -395,8 +403,8 @@ enum cmix_error swap_k_for_r(struct CMixContext const* ctx, char** out_buffer, c
GroupElement mes = ctx->api.array_to_element(message[i], len, false);
GroupElement inv_key = ctx->api.invert(key[i]);
- GroupElement unblinded = ctx->api.multiply(mes, inv_key, false);
- GroupElement blinded = ctx->api.multiply(unblinded, ctx->r[i], false);
+ GroupElement unblinded = ctx->api.uncombine(mes, key[i], false);
+ GroupElement blinded = ctx->api.combine(unblinded, ctx->r[i], false);
element_to_buffer(ctx, out_buffer[i], blinded);
ctx->api.free_group_element(mes);
@@ -425,7 +433,7 @@ enum cmix_error get_pimrs_commitment(struct CMixContext const* ctx, char* out_bu
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);
+ GroupElement pirs = ctx->api.combine(ctx->decryption_shares[i], msg, true);
element_to_buffer(ctx, out_buffer[i], pirs);
ctx->api.free_group_element(msg);
@@ -440,20 +448,27 @@ enum cmix_error remove_pirs(struct CMixContext const* ctx, char** out_buffer, co
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);
+ GroupElement mult = ctx->api.uncombine(ctx->PiMRS[i], g_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;
}
+enum cmix_error element_to_message(struct CMixContext const* ctx, unsigned char** buffer, char const* element_buffer) {
+
+ GroupElement el = ctx->api.array_to_element(element_buffer, ctx->api.get_group_element_array_size(), true);
+ ctx->api.element_to_message(buffer, el);
+ ctx->api.free_group_element(el);
+
+ return no_error;
+}
+
enum cmix_error get_pub_key_hash(struct CMixContext const* ctx, char** buffer, size_t* len) {
ctx->api.get_pub_key_hash(buffer, len, ctx->keypair.pub);
@@ -467,35 +482,34 @@ size_t get_pub_key_hash_length(struct CMixContext const* ctx)
enum cmix_error create_message(struct CMixContext const* ctx, char* out_buffer, const char* dest, size_t dest_len, const char* payload, size_t payload_len)
{
- size_t el_arr_len = get_group_element_array_size(ctx);
+ size_t el_arr_len = get_message_size(ctx);
- memcpy(&out_buffer[1], dest, dest_len);
+ memcpy(out_buffer, dest, dest_len);
- size_t message_limit = el_arr_len - 1 -dest_len;
+ size_t message_limit = el_arr_len -dest_len;
- memcpy(&out_buffer[1] + dest_len, payload, (message_limit < payload_len ? message_limit : payload_len));
+ memcpy(out_buffer + dest_len, payload, (message_limit < payload_len ? message_limit : payload_len));
return no_error;
}
enum cmix_error split_message(struct CMixContext const* ctx, char** dest_buffer, size_t* dest_len, char** payload_buffer, size_t* payload_len, char const* message)
{
- size_t el_arr_len = get_group_element_array_size(ctx);
+ size_t message_len = get_message_size(ctx);
*dest_len = get_pub_key_hash_length(ctx);
*dest_buffer = (char*) calloc(*dest_len, sizeof(char));
if(*dest_buffer == NULL) {
return out_of_memory;
}
- memcpy(*dest_buffer, &message[1], *dest_len);
+ memcpy(*dest_buffer, message, *dest_len);
- *payload_len = el_arr_len - 1 - *dest_len;
+ *payload_len = message_len - *dest_len;
*payload_buffer = (char*) calloc(*payload_len, sizeof(char));
if(*payload_buffer == NULL) {
return out_of_memory;
}
- memcpy(*payload_buffer, &message[1 + *dest_len], *payload_len);
+ memcpy(*payload_buffer, &message[*dest_len], *payload_len);
return no_error;
}
-