diff options
author | Nikos Mavrogiannopoulos <nmav@crystal.(none)> | 2008-09-28 10:59:26 +0300 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@crystal.(none)> | 2008-09-28 10:59:26 +0300 |
commit | 3b39d296d802e3aa42c08f8d02db6e81d99a7e90 (patch) | |
tree | 2885c784d91593c5b7088c3659c01c199b6fb061 | |
parent | 4a38f7b0d4576548204480b609e0949e5ad399df (diff) | |
download | gnutls-3b39d296d802e3aa42c08f8d02db6e81d99a7e90.tar.gz |
changed crypto API to reduce probability of memory leaks during usage of pk_params.
-rw-r--r-- | includes/gnutls/crypto.h | 4 | ||||
-rw-r--r-- | lib/gnutls_pk.c | 31 | ||||
-rw-r--r-- | lib/opencdk/pubkey.c | 4 | ||||
-rw-r--r-- | lib/pk-libgcrypt.c | 10 | ||||
-rw-r--r-- | lib/x509/privkey.c | 28 | ||||
-rw-r--r-- | lib/x509/x509_int.h | 2 |
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, ¶ms); 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, ¶ms->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, ¶ms->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 |