diff options
| author | Dennis Brentjes <d.brentjes@gmail.com> | 2016-10-30 19:58:50 +0100 |
|---|---|---|
| committer | Dennis Brentjes <d.brentjes@gmail.com> | 2016-10-30 20:00:49 +0100 |
| commit | 6d4efd424682f90896d5237ede4326416b6fa97d (patch) | |
| tree | 3d535f5f3a1c148e465a51ee0afa027832d0b6e9 | |
| parent | 7ecf4ae11df97efa2113dad8855eb8d9cb1a9498 (diff) | |
| download | cmix-6d4efd424682f90896d5237ede4326416b6fa97d.tar.gz cmix-6d4efd424682f90896d5237ede4326416b6fa97d.tar.bz2 cmix-6d4efd424682f90896d5237ede4326416b6fa97d.zip | |
Fixes some memory leaks and consequent incorrect frees.
| -rw-r--r-- | client/cmixclient.cpp | 10 | ||||
| -rw-r--r-- | client/cmixclient.hpp | 2 | ||||
| -rw-r--r-- | libcmix-crypto/api.h | 6 | ||||
| -rw-r--r-- | libcmix-crypto/curve25519/curve25519.c | 1 | ||||
| -rw-r--r-- | libcmix-crypto/elgamal/elgamal.c | 1 | ||||
| -rw-r--r-- | libcmix-crypto/elgamal/elgamal.h | 2 | ||||
| -rw-r--r-- | libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c | 19 | ||||
| -rw-r--r-- | node/node.cpp | 18 |
8 files changed, 39 insertions, 20 deletions
diff --git a/client/cmixclient.cpp b/client/cmixclient.cpp index f05b200..3abe1eb 100644 --- a/client/cmixclient.cpp +++ b/client/cmixclient.cpp @@ -16,17 +16,17 @@ void CMixClient::key_exchange(size_t node_id) { cmix_proto::KeyExchange ke; ke.set_public_key(buffer, len); - - free(buffer); + api.free_buffer(buffer); data.at(node_id).secret_value = api.get_group_element(true); - void* shared_value = api.get_key_exchange_value(data.at(node_id).secret_value); - api.element_to_array(&buffer, &len, shared_value); + GroupElement shared_value = api.get_key_exchange_value(data.at(node_id).secret_value); + api.element_to_array(&buffer, &len, shared_value); ke.set_value(buffer, len); + api.free_buffer(buffer); - free(buffer); + api.free_group_element(shared_value); network_connections.at(node_id).async_send(ke); network_connections.at(node_id).async_receive([node_id, this](cmix_proto::CMixMessage message) { diff --git a/client/cmixclient.hpp b/client/cmixclient.hpp index 2df754b..f1c726d 100644 --- a/client/cmixclient.hpp +++ b/client/cmixclient.hpp @@ -37,7 +37,7 @@ struct NetworkDetails { class CMixClient { struct NodeData { - void* secret_value; + GroupElement secret_value; SharedKey shared_value; }; diff --git a/libcmix-crypto/api.h b/libcmix-crypto/api.h index f50cee0..8c40d23 100644 --- a/libcmix-crypto/api.h +++ b/libcmix-crypto/api.h @@ -53,6 +53,11 @@ typedef void(*ElementToArray)(unsigned char**, size_t* size, GroupElement); /*! * */ +typedef void(*BufferDeleter)(void*); + +/*! + * + */ typedef GroupElement(*ArrayToElement)(char const*, size_t size, bool); /*! @@ -93,6 +98,7 @@ struct Api { KeyPairCreator create_key_pair; ///< Pointer to keypair creation function KeyPairDeleter free_key_pair; ///< Pointer to keypair deletor function ElementToArray element_to_array; ///< Get the array representation of a public key + BufferDeleter free_buffer; ///< frees library allocated buffers. ArrayToElement array_to_element; ///< The the GroupElement representation of this array; GroupElementGetter get_group_element; ///< get group element GroupElementDeleter free_group_element; ///< frees a base type of the cryptolibrary. diff --git a/libcmix-crypto/curve25519/curve25519.c b/libcmix-crypto/curve25519/curve25519.c index 1a83308..6eaaafc 100644 --- a/libcmix-crypto/curve25519/curve25519.c +++ b/libcmix-crypto/curve25519/curve25519.c @@ -14,6 +14,7 @@ struct Api get_curve25519_implementation() NULL, NULL, NULL, + NULL, &curve25519_add_public_share, &curve25519_derive_shared_key, &curve25519_shared_key_deleter, diff --git a/libcmix-crypto/elgamal/elgamal.c b/libcmix-crypto/elgamal/elgamal.c index 3ee86d7..336d974 100644 --- a/libcmix-crypto/elgamal/elgamal.c +++ b/libcmix-crypto/elgamal/elgamal.c @@ -8,6 +8,7 @@ struct Api get_elgamal_implementation() elgamal_create_keypair, elgamal_delete_keypair, elgamal_element_to_array, + elgamal_free_buffer, elgamal_array_to_element, elgamal_get_group_element, elgamal_delete_group_element, diff --git a/libcmix-crypto/elgamal/elgamal.h b/libcmix-crypto/elgamal/elgamal.h index 746b726..71046c5 100644 --- a/libcmix-crypto/elgamal/elgamal.h +++ b/libcmix-crypto/elgamal/elgamal.h @@ -18,6 +18,8 @@ extern KeyPairDeleter elgamal_delete_keypair; extern ElementToArray elgamal_element_to_array; +extern BufferDeleter elgamal_free_buffer; + extern ArrayToElement elgamal_array_to_element; extern GroupElementGetter elgamal_get_group_element; diff --git a/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c b/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c index 1dd0690..a0512dd 100644 --- a/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c +++ b/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c @@ -67,7 +67,7 @@ struct KeyPair gcrypt_elgamal_create_keypair() { gcry_error_t error; void* bytes = gcry_random_bytes_secure(2048/8, GCRY_VERY_STRONG_RANDOM); - gcry_mpi_t x = gcry_mpi_snew(2048); + gcry_mpi_t x; error = gcry_mpi_scan(&x, GCRYMPI_FMT_USG, bytes, 2048/8, &parse_error_offset); check(error); @@ -105,12 +105,17 @@ void gcrypt_elgamal_element_to_array(unsigned char** buffer, size_t* len, void* check(error); } +void gcrypt_elgamal_free_buffer(void* buffer) { + gcry_free(buffer); +} + void* gcrypt_elgamal_array_to_element(char const* buffer, size_t len, bool secure) { size_t error_pos; gcry_error_t error; - gcry_mpi_t mpi = secure ? gcry_mpi_snew(0) : gcry_mpi_new(0); + gcry_mpi_t mpi; error = gcry_mpi_scan(&mpi, GCRYMPI_FMT_USG, buffer, len, &error_pos); + gcry_mpi_set_flag(mpi, GCRYMPI_FLAG_SECURE); check(error); return mpi; @@ -121,8 +126,10 @@ void* gcrypt_elgamal_get_group_element(bool secure) { gcry_error_t error; void* bytes = gcry_random_bytes_secure(2048/8, GCRY_VERY_STRONG_RANDOM); - gcry_mpi_t a = secure ? gcry_mpi_snew(2048) : gcry_mpi_new(2048); + gcry_mpi_t a; error = gcry_mpi_scan(&a, GCRYMPI_FMT_USG, bytes, 2048/8, &parse_error_offset); + //random bytes generated with GCRY{,_VERY}_STRONG_RANDOM are generated in "secure memory" + //so secure is unused. check(error); gcry_free(bytes); @@ -149,8 +156,6 @@ void gcrypt_elgamal_delete_group_element(void* el) { gcry_mpi_release((gcry_mpi_t) el); } - - void gcrypt_elgamal_add_public_share(char** buffer, size_t* out_len, char const* share, size_t in_len, void* pubkey) { gcry_error_t error; @@ -167,6 +172,9 @@ void gcrypt_elgamal_add_public_share(char** buffer, size_t* out_len, char const* error = gcry_mpi_aprint(GCRYMPI_FMT_USG, (unsigned char**) buffer, out_len, result); check(error); + + gcry_mpi_release(mpi_share); + gcry_mpi_release(result); } struct SharedKey gcrypt_elgamal_derive_shared_key(struct KeyPair keypair, unsigned char const* other_pub, size_t pub_len, unsigned char const* value, size_t value_len, void* priv_value, bool swap) { @@ -227,6 +235,7 @@ Initializer elgamal_initialize = &gcrypt_elgamal_initialize; KeyPairCreator elgamal_create_keypair = &gcrypt_elgamal_create_keypair; KeyPairDeleter elgamal_delete_keypair = &gcrypt_elgamal_delete_keypair; ElementToArray elgamal_element_to_array = &gcrypt_elgamal_element_to_array; +BufferDeleter elgamal_free_buffer = &gcrypt_elgamal_free_buffer; ArrayToElement elgamal_array_to_element = &gcrypt_elgamal_array_to_element; GroupElementGetter elgamal_get_group_element = &gcrypt_elgamal_get_group_element; GroupElementDeleter elgamal_delete_group_element = &gcrypt_elgamal_delete_group_element; diff --git a/node/node.cpp b/node/node.cpp index f5c8dbe..2e5fd32 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -93,7 +93,8 @@ void Node::handle_node_initialization(const cmix_proto::Initialization& init) api.element_to_array(&data, &len, network_key); sec.set_secret_key(data, len); - free(data); + + api.free_buffer(data); next_node.async_send(sec); } else { @@ -104,7 +105,7 @@ void Node::handle_node_initialization(const cmix_proto::Initialization& init) cmix_proto::Initialization init; init.set_public_share(buffer, len); - free(buffer); + api.free_buffer(buffer); BOOST_LOG_TRIVIAL(trace) << "Sending intialization"; next_node.async_send(init); @@ -156,11 +157,11 @@ void Node::handle_node_prepre(cmix_proto::PrePre const& pre) { api.element_to_array(&buffer, &len, new_random_element); prepre.add_r_er(buffer, len); - free(buffer); + api.free_buffer(buffer); api.element_to_array(&buffer, &len, new_message_element); prepre.add_m_er(buffer, len); - free(buffer); + api.free_buffer(buffer); api.free_group_element(random_element); api.free_group_element(message_element); @@ -224,11 +225,11 @@ void Node::handle_client_keyexchange(ClientConnections::key_type handle, cmix_pr api.element_to_array(&buffer, &len, keypair.pub); exchange.set_public_key(buffer, len); - free(buffer); + api.free_buffer(buffer); api.element_to_array(&buffer, &len, ex_val); exchange.set_value(buffer, len); - free(buffer); + api.free_buffer(buffer); api.free_group_element(ex_val); @@ -339,15 +340,14 @@ void Node::start_precomputation() { api.element_to_array(&buffer, &len, random_element); prepre.add_m_er(buffer, len); - free(buffer); + api.free_buffer(buffer); api.element_to_array(&buffer, &len, message_element); prepre.add_m_er(buffer, len); - free(buffer); + api.free_buffer(buffer); next_node.async_send(prepre); - //ToDo generate permutation. precomputation_data.emplace_back(MixData{r, s, pair.first, *perm_it++}); api.free_group_element(random_element); |
