From 623dffe2c054d1639dbf9c8f21ddfb088c7950fb Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Sat, 11 Feb 2017 14:48:52 +0100 Subject: Working Ed25519 Implementation of libcmix. --- libcmix/cmix.c | 66 +++++++++++++++++++++++++++++++++++----------------------- libcmix/cmix.h | 18 +++++++++++++++- 2 files changed, 57 insertions(+), 27 deletions(-) (limited to 'libcmix') 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; } - diff --git a/libcmix/cmix.h b/libcmix/cmix.h index 5c6a4c1..54df573 100644 --- a/libcmix/cmix.h +++ b/libcmix/cmix.h @@ -206,10 +206,17 @@ enum cmix_error generate_random_message(struct CMixContext* ctx, char* buffer); /*! * \brief get_group_element_array_size Get the minimum size required to store an array representation of a group element. * \param ctx The relevant context. - * \return A cmix_error + * \return The group element array size */ size_t get_group_element_array_size(struct CMixContext const* ctx); +/*! + * \brief get_message_size How large a message can be. + * \param ctx The relevant context + * \return The message size + */ +size_t get_message_size(struct CMixContext const* ctx); + /*! * \brief encrypt_r Encrypts r with the network key * \param ctx The relevant context. @@ -321,6 +328,15 @@ enum cmix_error decrypt_epirs(struct CMixContext const* ctx, char** out_buffer, */ enum cmix_error remove_pirs(struct CMixContext const* ctx, char** out_buffer, const char** pirs); +/*! + * \brief element_to_message + * \param ctx + * \param buffer + * \param el + * \return + */ +enum cmix_error element_to_message(struct CMixContext const* ctx, unsigned char** buffer, char const* el); + /*! * \brief split_message Splits a message in its destination and payload components. * \param ctx The relevant context. -- cgit v1.2.3-70-g09d2