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 /libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c | |
| 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.
Diffstat (limited to 'libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c')
| -rw-r--r-- | libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c | 88 |
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); } |
