diff options
| author | Dennis Brentjes <d.brentjes@gmail.com> | 2016-11-22 12:57:51 +0100 |
|---|---|---|
| committer | Dennis Brentjes <d.brentjes@gmail.com> | 2016-11-22 12:57:51 +0100 |
| commit | fa7a48172a3c9d9c2f96d6f9c05d80f497bc304d (patch) | |
| tree | 2c56890a3c0f12ca68ec16e120474ab6b0366bf9 | |
| parent | 4471b16ee9961f55086841204f91f5c172d917f6 (diff) | |
| download | cmix-fa7a48172a3c9d9c2f96d6f9c05d80f497bc304d.tar.gz cmix-fa7a48172a3c9d9c2f96d6f9c05d80f497bc304d.tar.bz2 cmix-fa7a48172a3c9d9c2f96d6f9c05d80f497bc304d.zip | |
Added pointer tracing, and fixes memeory leaks within a single run of cmix.
| -rw-r--r-- | client/cmixclient.cpp | 4 | ||||
| -rw-r--r-- | libcmix-common/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | libcmix-crypto/elgamal/gcrypt/CMakeLists.txt | 8 | ||||
| -rw-r--r-- | libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c | 88 | ||||
| -rw-r--r-- | libcmix-network/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | libcmix/cmix.c | 7 | ||||
| -rw-r--r-- | node/node.cpp | 5 | ||||
| -rw-r--r-- | node/node_node.cpp | 3 | ||||
| -rwxr-xr-x | run.sh | 2 |
9 files changed, 95 insertions, 29 deletions
diff --git a/client/cmixclient.cpp b/client/cmixclient.cpp index 958715c..861a6ac 100644 --- a/client/cmixclient.cpp +++ b/client/cmixclient.cpp @@ -142,6 +142,10 @@ CMixClient::CMixClient(NetworkDetails details) CMixClient::~CMixClient() { + for(auto&& v : shared_values) { + cmix_ctx.api.free_group_element(v); + v = nullptr; + } deinitialize(&cmix_ctx); } diff --git a/libcmix-common/CMakeLists.txt b/libcmix-common/CMakeLists.txt index 71aa472..defc00f 100644 --- a/libcmix-common/CMakeLists.txt +++ b/libcmix-common/CMakeLists.txt @@ -6,6 +6,8 @@ add_library(cmix-common senderreceiver.hpp ) +set_target_properties(cmix-common PROPERTIES LINKER_LANGUAGE CXX) + target_include_directories(cmix-common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ) diff --git a/libcmix-crypto/elgamal/gcrypt/CMakeLists.txt b/libcmix-crypto/elgamal/gcrypt/CMakeLists.txt index cbd49ec..85d532b 100644 --- a/libcmix-crypto/elgamal/gcrypt/CMakeLists.txt +++ b/libcmix-crypto/elgamal/gcrypt/CMakeLists.txt @@ -4,10 +4,18 @@ get_target_name(target_name) find_package(Gcrypt REQUIRED) +option(trace_pointers "trace alloced pointers by gcrypt" OFF) + add_library(${target_name} SHARED gcrypt_elgamal.c ) +if(trace_pointers) + target_compile_definitions(${target_name} + PRIVATE "POINTER_TRACING" + ) +endif(trace_pointers) + target_compile_options(${target_name} PUBLIC ${Gcrypt_CFLAGS} ) diff --git a/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c b/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c index 4e96466..c9db28c 100644 --- a/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c +++ b/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c @@ -6,10 +6,18 @@ #include <stddef.h> #include <stdbool.h> +#ifdef POINTER_TRACING + #define TRACE(FILE, LINE, PTR) \ + fprintf(stderr, "%s %d %p\n", FILE, LINE, PTR); +#else + #define TRACE(FILE, LINE, PTR) +#endif + static gcry_mpi_t p; static gcry_mpi_t q; static gcry_mpi_t g; -static unsigned int nr_bytes = 256; +static const unsigned int nr_bytes = 256; +static const unsigned int nr_bits = 256*8; void check(gcry_error_t error) { if (error) { @@ -64,6 +72,10 @@ void gcrypt_elgamal_initialize(void) { error = gcry_mpi_scan(&g, GCRYMPI_FMT_HEX, g_hex, 0, &nr_bytes_scanned); check(error); + + TRACE(__FILE__, __LINE__, p); + TRACE(__FILE__, __LINE__, q); + TRACE(__FILE__, __LINE__, g); } struct KeyPair gcrypt_elgamal_create_keypair() { @@ -75,11 +87,12 @@ struct KeyPair gcrypt_elgamal_create_keypair() { do { gcry_mpi_release(x); void* bytes = gcry_random_bytes_secure(nr_bytes, GCRY_VERY_STRONG_RANDOM); + TRACE(__FILE__, __LINE__, bytes); error = gcry_mpi_scan(&x, GCRYMPI_FMT_USG, bytes, nr_bytes, &parse_error_offset); gcry_free(bytes); check(error); } while(gcry_mpi_cmp_ui(x, 0) == 0 || gcry_mpi_cmp(x, p) != -1); - gcry_mpi_t y = gcry_mpi_new(0); + gcry_mpi_t y = gcry_mpi_new(nr_bits); gcry_mpi_powm(y, g, x, p); gcry_sexp_t priv_key; @@ -91,6 +104,9 @@ struct KeyPair gcrypt_elgamal_create_keypair() { gcry_sexp_release(priv_key); + TRACE(__FILE__, __LINE__, x); + TRACE(__FILE__, __LINE__, y); + return (struct KeyPair){ x, y, @@ -105,10 +121,9 @@ void gcrypt_elgamal_delete_keypair(struct KeyPair* p) { } void gcrypt_elgamal_element_to_array(unsigned char** buffer, size_t* len, void* key) { - gcry_mpi_t mpi = (gcry_mpi_t) key; - gcry_error_t error; - error = gcry_mpi_aprint(GCRYMPI_FMT_USG, buffer, len, mpi); + error = gcry_mpi_aprint(GCRYMPI_FMT_USG, buffer, len, (gcry_mpi_t) key); + TRACE(__FILE__, __LINE__, *buffer); check(error); } @@ -124,6 +139,8 @@ void* gcrypt_elgamal_array_to_element(char const* buffer, size_t len, bool secur error = gcry_mpi_scan(&mpi, GCRYMPI_FMT_USG, buffer, len, &error_pos); check(error); + TRACE(__FILE__, __LINE__, mpi); + return mpi; } @@ -136,7 +153,9 @@ void gcrypt_elgamal_get_pub_key_hash(char** buffer, size_t* len, GroupElement co check(error); *buffer = (char*) gcry_pk_get_keygrip(pubkey, NULL); + TRACE(__FILE__, __LINE__, *buffer); *len = 20; + gcry_sexp_release(pubkey); } void* gcrypt_elgamal_get_group_element(bool secure) { @@ -147,6 +166,7 @@ void* gcrypt_elgamal_get_group_element(bool secure) { do { gcry_mpi_release(a); void* bytes = gcry_random_bytes_secure(nr_bytes, GCRY_VERY_STRONG_RANDOM); + TRACE(__FILE__, __LINE__, bytes); error = gcry_mpi_scan(&a, GCRYMPI_FMT_USG, bytes, nr_bytes, &parse_error_offset); check(error); gcry_free(bytes); @@ -158,27 +178,31 @@ void* gcrypt_elgamal_get_group_element(bool secure) { } GroupElement gcrypt_elgamal_get_key_exchange_value(GroupElement group_el) { - gcry_mpi_t el = (gcry_mpi_t) group_el; + gcry_mpi_t val = gcry_mpi_new(nr_bits); + gcry_mpi_powm(val, g, (gcry_mpi_t) group_el, p); - gcry_mpi_t val = gcry_mpi_new(0); - gcry_mpi_powm(val, g, el, p); + TRACE(__FILE__, __LINE__, val); return val; } GroupElement gcrypt_elgamal_multiply(GroupElement lh, GroupElement rh, bool secure) { gcry_mpi_t ret = secure ? gcry_mpi_snew(0) : gcry_mpi_new(0); + TRACE(__FILE__, __LINE__, ret); gcry_mpi_mulm(ret, (gcry_mpi_t) lh, (gcry_mpi_t) rh, p); return ret; } GroupElement gcrypt_elgamal_get_decryption_share(GroupElement r, GroupElement e) { - gcry_mpi_t inv_d = gcry_mpi_snew(0); + gcry_mpi_t inv_d = gcry_mpi_snew(nr_bits); gcry_mpi_powm(inv_d, (gcry_mpi_t)r, (gcry_mpi_t)e, p); - gcry_mpi_t d = gcry_mpi_snew(0); + gcry_mpi_t d = gcry_mpi_snew(nr_bits); gcry_mpi_invm(d, inv_d, p); + TRACE(__FILE__, __LINE__, inv_d); + TRACE(__FILE__, __LINE__, d); + gcry_mpi_release(inv_d); return d; } @@ -196,14 +220,15 @@ void gcrypt_elgamal_add_public_share(GroupElement* el, char const* share, size_t gcry_error_t error; size_t parse_error_pos; - gcry_mpi_t y = (gcry_mpi_t) pubkey; - gcry_mpi_t mpi_share; error = gcry_mpi_scan(&mpi_share, GCRYMPI_FMT_USG, share, in_len, &parse_error_pos); check(error); - gcry_mpi_t result = gcry_mpi_new(0); - gcry_mpi_mulm(result, mpi_share, y, p); + gcry_mpi_t result = gcry_mpi_new(nr_bits); + gcry_mpi_mulm(result, mpi_share, (gcry_mpi_t) pubkey, p); + + TRACE(__FILE__, __LINE__, result); + TRACE(__FILE__, __LINE__, mpi_share); *el = result; @@ -220,9 +245,13 @@ GroupElement gcrypt_elgamal_derive_shared_key(struct KeyPair keypair, unsigned c check(error); gcry_mpi_t b = (gcry_mpi_t) priv_value; - gcry_mpi_t gab = gcry_mpi_snew(0); + gcry_mpi_t gab = gcry_mpi_snew(nr_bits); gcry_mpi_powm(gab, ga, b, p); + TRACE(__FILE__, __LINE__, ga); + TRACE(__FILE__, __LINE__, b); + TRACE(__FILE__, __LINE__, gab); + gcry_mpi_release(ga); return gab; @@ -237,22 +266,30 @@ void gcrypt_elgamal_encrypt(GroupElement* random_element, GroupElement* message_ GroupElement random = gcrypt_elgamal_get_group_element(true); - *random_element = gcry_mpi_new(0); + *random_element = gcry_mpi_new(nr_bits); gcry_mpi_powm((gcry_mpi_t) *random_element, g, (gcry_mpi_t) random, p); - gcry_mpi_t key_pow_random = gcry_mpi_snew(0); + gcry_mpi_t key_pow_random = gcry_mpi_snew(nr_bits); gcry_mpi_powm(key_pow_random, (gcry_mpi_t) key, (gcry_mpi_t) random, p); - *message_element = gcry_mpi_snew(0); + TRACE(__FILE__, __LINE__, *random_element); + TRACE(__FILE__, __LINE__, key_pow_random); + + *message_element = gcry_mpi_snew(nr_bits); gcry_mpi_mulm((gcry_mpi_t)*message_element, (gcry_mpi_t) value, key_pow_random, p); + TRACE(__FILE__, __LINE__, *message_element); + TRACE(__FILE__, __LINE__, random); + TRACE(__FILE__, __LINE__, key_pow_random); gcry_mpi_release((gcry_mpi_t) random); gcry_mpi_release(key_pow_random); } GroupElement gcrypt_elgamal_invert(GroupElement const x) { - gcry_mpi_t inv_x = gcry_mpi_new(0); + gcry_mpi_t inv_x = gcry_mpi_new(nr_bits); gcry_mpi_invm(inv_x, (gcry_mpi_t)x, p); + + TRACE(__FILE__, __LINE__, inv_x); return inv_x; } @@ -260,24 +297,25 @@ unsigned int gcrypt_elgamal_get_uniform_int(unsigned int upper) { unsigned int random_value; if(upper == 0) { - void* buffer = gcry_random_bytes_secure(nr_bytes, GCRY_STRONG_RANDOM); - + void* buffer = gcry_random_bytes_secure(sizeof(unsigned int), GCRY_STRONG_RANDOM); + TRACE(__FILE__, __LINE__, buffer); memcpy(&random_value, buffer, sizeof(unsigned int)); - gcry_free(buffer); + return random_value; } unsigned int lower = -upper % upper; do { - void* buffer = gcry_random_bytes_secure(nr_bytes, GCRY_STRONG_RANDOM); - + void* buffer = gcry_random_bytes_secure(sizeof(unsigned int), GCRY_STRONG_RANDOM); + TRACE(__FILE__, __LINE__, buffer); memcpy(&random_value, buffer, sizeof(unsigned int)); + gcry_free(buffer); if (random_value >= lower) return random_value % upper; - gcry_free(buffer); + } while(true); } diff --git a/libcmix-network/CMakeLists.txt b/libcmix-network/CMakeLists.txt index 6a2f519..f8567dd 100644 --- a/libcmix-network/CMakeLists.txt +++ b/libcmix-network/CMakeLists.txt @@ -43,6 +43,11 @@ if(WIN32) PUBLIC ws2_32 PUBLIC ${OPENSSL_LIBRARIES} ) + + target_compile_definitions(cmix-network + PUBLIC BOOST_ASIO_ENABLE_CANCELIO + ) + else(WIN32) target_link_libraries(cmix-network PUBLIC OpenSSL::SSL diff --git a/libcmix/cmix.c b/libcmix/cmix.c index c60f441..00b080f 100644 --- a/libcmix/cmix.c +++ b/libcmix/cmix.c @@ -17,6 +17,7 @@ struct CMixContext initialize_cmix_context(struct Api api) { return (struct CMixContext){ .api = api, .nr_participants = 0, + .network_key = NULL, .r = NULL, .s = NULL, .permutation = NULL, @@ -59,6 +60,10 @@ void release_mix(struct CMixContext* ctx) { void deinitialize(struct CMixContext* ctx) { ctx->api.free_keypair(&ctx->keypair); + if(ctx->network_key != NULL) { + ctx->api.free_group_element(ctx->network_key); + ctx->network_key = NULL; + } release_mix(ctx); ctx->api.deinitialize(); } @@ -221,6 +226,8 @@ enum cmix_error permute_and_multiply_encrypted_s(struct CMixContext const* ctx, ctx->api.free_group_element(message_r); ctx->api.free_group_element(random_s); ctx->api.free_group_element(message_s); + ctx->api.free_group_element(random_pirs); + ctx->api.free_group_element(message_pirs); } return no_error; diff --git a/node/node.cpp b/node/node.cpp index cc5e47a..2310bc1 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -53,6 +53,10 @@ Node::Node(ListenSettings const& listen_settings, NodeNetworkSettings network_se } Node::~Node() { + for(auto pair : data) { + cmix_ctx.api.free_group_element(pair.second.shared_value); + pair.second.shared_value = nullptr; + } deinitialize(&cmix_ctx); } @@ -267,7 +271,6 @@ bool Node::send_bye(bool got_bye) if(!shutting_down) { next_node.async_send(cmix_proto::Bye()); } - io_service.stop(); return true; } else { next_node.async_send(cmix_proto::Bye()); diff --git a/node/node_node.cpp b/node/node_node.cpp index 0614914..f68b496 100644 --- a/node/node_node.cpp +++ b/node/node_node.cpp @@ -204,14 +204,13 @@ void Node::handle_node_secretkey(cmix_proto::SecretKey const& secret) { std::string share = secret.secret_key(); - set_network_key(&cmix_ctx, secret.secret_key().data(), secret.secret_key().size()); - if(network_settings.is_first) { timer.expires_from_now(boost::posix_time::seconds(4)); timer.async_wait([this](boost::system::error_code const& ec) { start_precomputation(); }); } else { + set_network_key(&cmix_ctx, secret.secret_key().data(), secret.secret_key().size()); next_node.async_send(secret); } } @@ -3,7 +3,7 @@ build_dir=/home/dennis/projects/cmix/build-cmix-Desktop-Default tmux new-session -s cmix -d -tmux send-keys -t cmix:0 "cd ${build_dir} && LSAN_OPTIONS=report_objects=1 node/node -f -n node2.local:9201 -c ../certs/cert1.pem -k ../certs/key1.pem -d ../certs/dh.pem --certdir ../certs" Enter +tmux send-keys -t cmix:0 "cd ${build_dir} && LSAN_OPTIONS=report_objects=1 node/node -f -n node2.local:9201 -c ../certs/cert1.pem -k ../certs/key1.pem -d ../certs/dh.pem --certdir ../certs/" Enter #tmux send-keys -t cmix:0 "r" Enter tmux new-window -t cmix:1 |
