aboutsummaryrefslogtreecommitdiff
path: root/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c
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 /libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c
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.
Diffstat (limited to 'libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c')
-rw-r--r--libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c88
1 files changed, 63 insertions, 25 deletions
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);
}