aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2016-11-22 12:57:51 +0100
committerDennis Brentjes <d.brentjes@gmail.com>2016-11-22 12:57:51 +0100
commitfa7a48172a3c9d9c2f96d6f9c05d80f497bc304d (patch)
tree2c56890a3c0f12ca68ec16e120474ab6b0366bf9
parent4471b16ee9961f55086841204f91f5c172d917f6 (diff)
downloadcmix-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.cpp4
-rw-r--r--libcmix-common/CMakeLists.txt2
-rw-r--r--libcmix-crypto/elgamal/gcrypt/CMakeLists.txt8
-rw-r--r--libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c88
-rw-r--r--libcmix-network/CMakeLists.txt5
-rw-r--r--libcmix/cmix.c7
-rw-r--r--node/node.cpp5
-rw-r--r--node/node_node.cpp3
-rwxr-xr-xrun.sh2
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);
}
}
diff --git a/run.sh b/run.sh
index 317b366..2d6b8ac 100755
--- a/run.sh
+++ b/run.sh
@@ -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