[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r33074 - gnunet/src/secretsharing
From: |
gnunet |
Subject: |
[GNUnet-SVN] r33074 - gnunet/src/secretsharing |
Date: |
Tue, 15 Apr 2014 01:07:14 +0200 |
Author: dold
Date: 2014-04-15 01:07:14 +0200 (Tue, 15 Apr 2014)
New Revision: 33074
Modified:
gnunet/src/secretsharing/gnunet-service-secretsharing.c
gnunet/src/secretsharing/secretsharing_common.c
gnunet/src/secretsharing/test_secretsharing.conf
Log:
fix lots of memory leaks in secretsharing key generation
Modified: gnunet/src/secretsharing/gnunet-service-secretsharing.c
===================================================================
--- gnunet/src/secretsharing/gnunet-service-secretsharing.c 2014-04-14
22:48:46 UTC (rev 33073)
+++ gnunet/src/secretsharing/gnunet-service-secretsharing.c 2014-04-14
23:07:14 UTC (rev 33074)
@@ -574,7 +574,27 @@
GNUNET_free (ds);
}
+static void
+keygen_info_destroy (struct KeygenPeerInfo *info)
+{
+ if (NULL != info->sigma)
+ {
+ gcry_mpi_release (info->sigma);
+ info->sigma = NULL;
+ }
+ if (NULL != info->presecret_commitment)
+ {
+ gcry_mpi_release (info->presecret_commitment);
+ info->presecret_commitment = NULL;
+ }
+ if (NULL != info->preshare_commitment)
+ {
+ gcry_mpi_release (info->preshare_commitment);
+ info->presecret_commitment = NULL;
+ }
+}
+
static void
keygen_session_destroy (struct KeygenSession *ks)
{
@@ -582,12 +602,34 @@
GNUNET_CONTAINER_DLL_remove (keygen_sessions_head, keygen_sessions_tail, ks);
+ if (NULL != ks->info)
+ {
+ unsigned int i;
+ for (i = 0; i < ks->num_peers; i++)
+ keygen_info_destroy (&ks->info[i]);
+ GNUNET_free (ks->info);
+ ks->info = NULL;
+ }
+
if (NULL != ks->consensus)
{
GNUNET_CONSENSUS_destroy (ks->consensus);
ks->consensus = NULL;
}
+ if (NULL != ks->presecret_polynomial)
+ {
+ unsigned int i;
+ for (i = 0; i < ks->threshold; i++)
+ {
+ GNUNET_assert (NULL != ks->presecret_polynomial[i]);
+ gcry_mpi_release (ks->presecret_polynomial[i]);
+ ks->presecret_polynomial[i] = NULL;
+ }
+ GNUNET_free (ks->presecret_polynomial);
+ ks->presecret_polynomial = NULL;
+ }
+
if (NULL != ks->client_mq)
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "destroying keygen MQ\n");
@@ -595,6 +637,24 @@
ks->client_mq = NULL;
}
+ if (NULL != ks->my_share)
+ {
+ gcry_mpi_release (ks->my_share);
+ ks->my_share = NULL;
+ }
+
+ if (NULL != ks->public_key)
+ {
+ gcry_mpi_release (ks->public_key);
+ ks->public_key = NULL;
+ }
+
+ if (NULL != ks->peers)
+ {
+ GNUNET_free (ks->peers);
+ ks->peers = NULL;
+ }
+
if (NULL != ks->client)
{
GNUNET_SERVER_client_disconnect (ks->client);
@@ -802,9 +862,6 @@
/* Write the share. If 0 peers completed the dkg, an empty
* share will be sent. */
- m = GNUNET_malloc (sizeof (struct GNUNET_SECRETSHARING_SecretReadyMessage) +
- ks->num_peers * sizeof (struct GNUNET_PeerIdentity));
-
GNUNET_assert (GNUNET_OK == GNUNET_SECRETSHARING_share_write (share, NULL,
0, &share_size));
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "writing share of size %u\n",
@@ -815,6 +872,9 @@
GNUNET_assert (GNUNET_OK == GNUNET_SECRETSHARING_share_write (share, &m[1],
share_size, NULL));
+ GNUNET_SECRETSHARING_share_destroy (share);
+ share = NULL;
+
GNUNET_MQ_send (ks->client_mq, ev);
}
@@ -840,14 +900,12 @@
unsigned int i;
gcry_mpi_t idx;
gcry_mpi_t v;
- gcry_mpi_t c;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "P%u: Inserting round2 element\n",
ks->local_peer_idx);
GNUNET_assert (NULL != (v = gcry_mpi_new
(GNUNET_SECRETSHARING_ELGAMAL_BITS)));
GNUNET_assert (NULL != (idx = gcry_mpi_new
(GNUNET_SECRETSHARING_ELGAMAL_BITS)));
- GNUNET_assert (NULL != (c = gcry_mpi_new
(GNUNET_SECRETSHARING_ELGAMAL_BITS)));
element_size = (sizeof (struct GNUNET_SECRETSHARING_KeygenRevealData) +
GNUNET_SECRETSHARING_ELGAMAL_BITS / 8 * ks->num_peers +
@@ -941,8 +999,6 @@
GNUNET_assert (idx < ks->num_peers);
- GNUNET_assert (NULL != (exp_preshare = gcry_mpi_new (0)));
-
pos = (void *) &d[1];
// skip exponentiated pre-shares we don't want
pos += GNUNET_SECRETSHARING_ELGAMAL_BITS / 8 * idx;
@@ -959,7 +1015,6 @@
gcry_mpi_t exp_coeff;
GNUNET_assert (idx < ks->threshold);
- GNUNET_assert (NULL != (exp_coeff = gcry_mpi_new (0)));
pos = (void *) &d[1];
// skip exponentiated pre-shares
@@ -1001,6 +1056,7 @@
struct KeygenPeerInfo *info;
size_t expected_element_size;
unsigned int j;
+ int cmp_result;
gcry_mpi_t tmp;
gcry_mpi_t public_key_share;
gcry_mpi_t preshare;
@@ -1077,6 +1133,9 @@
gcry_mpi_set_ui (ks->public_key, 1);
}
gcry_mpi_mulm (ks->public_key, ks->public_key, public_key_share, elgamal_p);
+
+ gcry_mpi_release (public_key_share);
+ public_key_share = NULL;
GNUNET_assert (NULL != (preshare = gcry_mpi_new (0)));
GNUNET_CRYPTO_paillier_decrypt (&ks->paillier_private_key,
@@ -1088,7 +1147,10 @@
gcry_mpi_powm (tmp, elgamal_g, preshare, elgamal_p);
// TODO: restore a valid secret from the decryption (the hard part, solving
SVP with gauss)
- if (0 != gcry_mpi_cmp (tmp, info->preshare_commitment))
+ cmp_result = gcry_mpi_cmp (tmp, info->preshare_commitment);
+ gcry_mpi_release (tmp);
+ tmp = NULL;
+ if (0 != cmp_result)
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "P%u: Got invalid presecret from
P%u\n",
(unsigned int) ks->local_peer_idx, (unsigned int) (info -
ks->info));
@@ -1111,6 +1173,7 @@
}
presigma = keygen_reveal_get_exp_preshare (ks, d, j);
gcry_mpi_mulm (ks->info[j].sigma, ks->info[j].sigma, presigma, elgamal_p);
+ gcry_mpi_release (presigma);
}
gcry_mpi_t prod;
@@ -1121,21 +1184,26 @@
for (j = 0; j < ks->num_peers; j++)
{
unsigned int k;
- gcry_mpi_t tmp;
+ int cmp_result;
gcry_mpi_t exp_preshare;
gcry_mpi_set_ui (prod, 1);
for (k = 0; k < ks->threshold; k++)
{
// Using pow(double,double) is a bit sketchy.
// We count players from 1, but shares from 0.
+ gcry_mpi_t tmp;
gcry_mpi_set_ui (j_to_k, (unsigned int) pow(j+1, k));
tmp = keygen_reveal_get_exp_coeff (ks, d, k);
gcry_mpi_powm (tmp, tmp, j_to_k, elgamal_p);
gcry_mpi_mulm (prod, prod, tmp, elgamal_p);
+ gcry_mpi_release (tmp);
}
exp_preshare = keygen_reveal_get_exp_preshare (ks, d, j);
gcry_mpi_mod (exp_preshare, exp_preshare, elgamal_p);
- if (0 != gcry_mpi_cmp (prod, exp_preshare))
+ cmp_result = gcry_mpi_cmp (prod, exp_preshare);
+ gcry_mpi_release (exp_preshare);
+ exp_preshare = NULL;
+ if (0 != cmp_result)
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "P%u: reveal data from P%u
incorrect\n",
ks->local_peer_idx, j);
@@ -1147,6 +1215,10 @@
// TODO: verify proof of fair encryption (once implemented)
info->round2_valid = GNUNET_YES;
+
+ gcry_mpi_release (preshare);
+ gcry_mpi_release (prod);
+ gcry_mpi_release (j_to_k);
}
Modified: gnunet/src/secretsharing/secretsharing_common.c
===================================================================
--- gnunet/src/secretsharing/secretsharing_common.c 2014-04-14 22:48:46 UTC
(rev 33073)
+++ gnunet/src/secretsharing/secretsharing_common.c 2014-04-14 23:07:14 UTC
(rev 33074)
@@ -135,3 +135,16 @@
}
+void
+GNUNET_SECRETSHARING_share_destroy (struct GNUNET_SECRETSHARING_Share *share)
+{
+ GNUNET_free (share->original_indices);
+ share->original_indices = NULL;
+ GNUNET_free (share->sigmas);
+ share->sigmas = NULL;
+ GNUNET_free (share->peers);
+ share->peers = NULL;
+ GNUNET_free (share);
+}
+
+
Modified: gnunet/src/secretsharing/test_secretsharing.conf
===================================================================
--- gnunet/src/secretsharing/test_secretsharing.conf 2014-04-14 22:48:46 UTC
(rev 33073)
+++ gnunet/src/secretsharing/test_secretsharing.conf 2014-04-14 23:07:14 UTC
(rev 33074)
@@ -1,6 +1,6 @@
[secretsharing]
AUTOSTART = YES
-#PREFIX = valgrind
+PREFIX = valgrind --leak-check=full
#OPTIONS = -LINFO
[consensus]
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r33074 - gnunet/src/secretsharing,
gnunet <=