summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@crystal.(none)>2008-09-28 10:59:26 +0300
committerNikos Mavrogiannopoulos <nmav@crystal.(none)>2008-09-28 10:59:26 +0300
commit3b39d296d802e3aa42c08f8d02db6e81d99a7e90 (patch)
tree2885c784d91593c5b7088c3659c01c199b6fb061
parent4a38f7b0d4576548204480b609e0949e5ad399df (diff)
downloadgnutls-3b39d296d802e3aa42c08f8d02db6e81d99a7e90.tar.gz
changed crypto API to reduce probability of memory leaks during usage of pk_params.
-rw-r--r--includes/gnutls/crypto.h4
-rw-r--r--lib/gnutls_pk.c31
-rw-r--r--lib/opencdk/pubkey.c4
-rw-r--r--lib/pk-libgcrypt.c10
-rw-r--r--lib/x509/privkey.c28
-rw-r--r--lib/x509/x509_int.h2
6 files changed, 25 insertions, 54 deletions
diff --git a/includes/gnutls/crypto.h b/includes/gnutls/crypto.h
index 1ed2fd1204..24813c0935 100644
--- a/includes/gnutls/crypto.h
+++ b/includes/gnutls/crypto.h
@@ -168,8 +168,10 @@ typedef struct gnutls_crypto_bigint {
gnutls_bigint_format_t format);
} gnutls_crypto_bigint_st;
+#define GNUTLS_MAX_PK_PARAMS 6
+
typedef struct {
- bigint_t *params;
+ bigint_t params[GNUTLS_MAX_PK_PARAMS];
unsigned int params_nr; /* the number of parameters */
unsigned int flags;
} gnutls_pk_params_st;
diff --git a/lib/gnutls_pk.c b/lib/gnutls_pk.c
index 5c84c5a881..c6a27a503b 100644
--- a/lib/gnutls_pk.c
+++ b/lib/gnutls_pk.c
@@ -55,7 +55,8 @@ _gnutls_pkcs1_rsa_encrypt (gnutls_datum_t * ciphertext,
gnutls_pk_params_st pk_params;
gnutls_datum to_encrypt, encrypted;
- pk_params.params = params;
+ for (i=0;i<params_len;i++)
+ pk_params.params[i] = params[i];
pk_params.params_nr = params_len;
mod_bits = _gnutls_mpi_get_nbits (params[0]);
@@ -209,12 +210,13 @@ _gnutls_pkcs1_rsa_decrypt (gnutls_datum_t * plaintext,
bigint_t * params, unsigned params_len,
unsigned btype)
{
- unsigned k, i;
+ unsigned int k, i;
int ret;
size_t esize, mod_bits;
gnutls_pk_params_st pk_params;
- pk_params.params = params;
+ for (i=0;i<params_len;i++)
+ pk_params.params[i] = params[i];
pk_params.params_nr = params_len;
mod_bits = _gnutls_mpi_get_nbits (params[0]);
@@ -407,13 +409,14 @@ _gnutls_encode_ber_rs (gnutls_datum_t * sig_value, bigint_t r, bigint_t s)
int
_gnutls_dsa_sign (gnutls_datum_t * signature,
const gnutls_datum_t * hash, bigint_t * params,
- unsigned params_len)
+ unsigned int params_len)
{
- int ret;
+ int ret, i;
size_t k;
gnutls_pk_params_st pk_params;
- pk_params.params = params;
+ for (i=0;i<params_len;i++)
+ pk_params.params[i] = params[i];
pk_params.params_nr = params_len;
k = hash->size;
@@ -491,10 +494,11 @@ _gnutls_dsa_verify (const gnutls_datum_t * vdata,
int params_len)
{
- int ret;
+ int ret, i;
gnutls_pk_params_st pk_params;
- pk_params.params = params;
+ for (i=0;i<params_len;i++)
+ pk_params.params[i] = params[i];
pk_params.params_nr = params_len;
if (vdata->size != 20)
@@ -537,11 +541,9 @@ _generate_params (int algo, bigint_t * resarr, unsigned int *resarr_len,
*resarr_len = params.params_nr;
for (i = 0; i < params.params_nr; i++)
resarr[i] = params.params[i];
- gnutls_free(params.params);
}
else
{
- gnutls_free(params.params);
gnutls_assert ();
return GNUTLS_E_INVALID_REQUEST;
}
@@ -577,13 +579,6 @@ _gnutls_pk_params_copy (gnutls_pk_params_st * dst, bigint_t * params,
return GNUTLS_E_INVALID_REQUEST;
}
- dst->params = gnutls_malloc (sizeof (bigint_t) * params_len);
- if (dst->params == NULL)
- {
- gnutls_assert ();
- return GNUTLS_E_MEMORY_ERROR;
- }
-
for (i = 0; i < params_len; i++)
{
dst->params[i] = _gnutls_mpi_set (NULL, params[i]);
@@ -613,6 +608,4 @@ gnutls_pk_params_release (gnutls_pk_params_st * p)
{
_gnutls_mpi_release (&p->params[i]);
}
- gnutls_free (p->params);
- p->params = NULL;
}
diff --git a/lib/opencdk/pubkey.c b/lib/opencdk/pubkey.c
index 7ac32a9d64..d4ad65f83f 100644
--- a/lib/opencdk/pubkey.c
+++ b/lib/opencdk/pubkey.c
@@ -77,6 +77,7 @@ cdk_pk_verify (cdk_pubkey_t pk, cdk_pkt_signature_t sig, const byte * md)
size_t enclen;
cdk_error_t rc;
int ret, algo;
+ unsigned int i;
gnutls_datum data;
gnutls_pk_params_st params;
@@ -114,8 +115,9 @@ cdk_pk_verify (cdk_pubkey_t pk, cdk_pkt_signature_t sig, const byte * md)
data.data = encmd;
data.size = enclen;
- params.params = pk->mpi;
params.params_nr = cdk_pk_get_npkey (pk->pubkey_algo);
+ for (i=0;i<params.params_nr;i++)
+ params.params[i] = pk->mpi[i];
params.flags = 0;
ret = _gnutls_pk_verify (algo, &data, &s_sig, &params);
diff --git a/lib/pk-libgcrypt.c b/lib/pk-libgcrypt.c
index ac0c0f9f75..a7bcd8e19b 100644
--- a/lib/pk-libgcrypt.c
+++ b/lib/pk-libgcrypt.c
@@ -763,21 +763,19 @@ wrap_gcry_pk_generate_params (gnutls_pk_algorithm_t algo,
case GNUTLS_PK_DSA:
params->params_nr = DSA_PRIVATE_PARAMS;
- params->params = gnutls_malloc (sizeof (bigint_t) * params->params_nr);
- if (params->params == NULL)
+ if (params->params_nr > GNUTLS_MAX_PK_PARAMS)
{
gnutls_assert ();
- return GNUTLS_E_MEMORY_ERROR;
+ return GNUTLS_E_INTERNAL_ERROR;
}
return _dsa_generate_params (params->params, &params->params_nr, level);
case GNUTLS_PK_RSA:
params->params_nr = RSA_PRIVATE_PARAMS;
- params->params = gnutls_malloc (sizeof (bigint_t) * params->params_nr);
- if (params->params == NULL)
+ if (params->params_nr > GNUTLS_MAX_PK_PARAMS)
{
gnutls_assert ();
- return GNUTLS_E_MEMORY_ERROR;
+ return GNUTLS_E_INTERNAL_ERROR;
}
return _rsa_generate_params (params->params, &params->params_nr, level);
diff --git a/lib/x509/privkey.c b/lib/x509/privkey.c
index 7e6cfa437a..6ff61147ad 100644
--- a/lib/x509/privkey.c
+++ b/lib/x509/privkey.c
@@ -156,12 +156,9 @@ _gnutls_privkey_decode_pkcs1_rsa_key (const gnutls_datum_t * raw_key,
{
int result;
ASN1_TYPE pkey_asn;
- bigint_t temp_params[RSA_PRIVATE_PARAMS];
gnutls_pk_params_st pk_params;
- memset( temp_params, 0, sizeof(temp_params));
-
- pk_params.params = temp_params;
+ memset( &pk_params, 0, sizeof(pk_params));
pk_params.params_nr = RSA_PRIVATE_PARAMS;
if ((result =
@@ -173,13 +170,6 @@ _gnutls_privkey_decode_pkcs1_rsa_key (const gnutls_datum_t * raw_key,
return NULL;
}
- if ((sizeof (pkey->params) / sizeof (bigint_t)) < RSA_PRIVATE_PARAMS)
- {
- gnutls_assert ();
- /* internal error. Increase the bigint_ts in params */
- return NULL;
- }
-
result = asn1_der_decoding (&pkey_asn, raw_key->data, raw_key->size, NULL);
if (result != ASN1_SUCCESS)
{
@@ -251,14 +241,7 @@ _gnutls_privkey_decode_pkcs1_rsa_key (const gnutls_datum_t * raw_key,
error:
asn1_delete_structure (&pkey_asn);
- /* we cannot use pk_params_release() since pk_params.params
- * is not allocated */
- _gnutls_mpi_release (&pk_params.params[0]);
- _gnutls_mpi_release (&pk_params.params[1]);
- _gnutls_mpi_release (&pk_params.params[2]);
- _gnutls_mpi_release (&pk_params.params[3]);
- _gnutls_mpi_release (&pk_params.params[4]);
- _gnutls_mpi_release (&pk_params.params[5]);
+ gnutls_pk_params_release (&pk_params);
return NULL;
}
@@ -278,13 +261,6 @@ decode_dsa_key (const gnutls_datum_t * raw_key, gnutls_x509_privkey_t pkey)
return NULL;
}
- if ((sizeof (pkey->params) / sizeof (bigint_t)) < DSA_PRIVATE_PARAMS)
- {
- gnutls_assert ();
- /* internal error. Increase the bigint_ts in params */
- return NULL;
- }
-
result = asn1_der_decoding (&dsa_asn, raw_key->data, raw_key->size, NULL);
if (result != ASN1_SUCCESS)
{
diff --git a/lib/x509/x509_int.h b/lib/x509/x509_int.h
index bfaffa4770..141cfcae9f 100644
--- a/lib/x509/x509_int.h
+++ b/lib/x509/x509_int.h
@@ -56,7 +56,7 @@ typedef struct gnutls_pkcs7_int
ASN1_TYPE pkcs7;
} gnutls_pkcs7_int;
-#define MAX_PRIV_PARAMS_SIZE 6 /* ok for RSA and DSA */
+#define MAX_PRIV_PARAMS_SIZE GNUTLS_MAX_PK_PARAMS /* ok for RSA and DSA */
/* parameters should not be larger than this limit */
#define DSA_PRIVATE_PARAMS 5