forked from wolfSSL/wolfssl
Fix memory leak with EncryptDerKey
This commit is contained in:
57
src/ssl.c
57
src/ssl.c
@@ -30958,7 +30958,8 @@ void *wolfSSL_OPENSSL_malloc(size_t a)
|
|||||||
#if defined(WOLFSSL_KEY_GEN) && defined(WOLFSSL_PEM_TO_DER)
|
#if defined(WOLFSSL_KEY_GEN) && defined(WOLFSSL_PEM_TO_DER)
|
||||||
|
|
||||||
static int EncryptDerKey(byte *der, int *derSz, const EVP_CIPHER* cipher,
|
static int EncryptDerKey(byte *der, int *derSz, const EVP_CIPHER* cipher,
|
||||||
unsigned char* passwd, int passwdSz, byte **cipherInfo)
|
unsigned char* passwd, int passwdSz, byte **cipherInfo,
|
||||||
|
int maxDerSz)
|
||||||
{
|
{
|
||||||
int ret, paddingSz;
|
int ret, paddingSz;
|
||||||
word32 idx, cipherInfoSz;
|
word32 idx, cipherInfoSz;
|
||||||
@@ -31011,6 +31012,13 @@ static int EncryptDerKey(byte *der, int *derSz, const EVP_CIPHER* cipher,
|
|||||||
paddingSz = ((*derSz)/info->ivSz + 1) * info->ivSz - (*derSz);
|
paddingSz = ((*derSz)/info->ivSz + 1) * info->ivSz - (*derSz);
|
||||||
if (paddingSz == 0)
|
if (paddingSz == 0)
|
||||||
paddingSz = info->ivSz;
|
paddingSz = info->ivSz;
|
||||||
|
if (maxDerSz < *derSz + paddingSz) {
|
||||||
|
WOLFSSL_MSG("not enough DER buffer allocated");
|
||||||
|
#ifdef WOLFSSL_SMALL_STACK
|
||||||
|
XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
|
||||||
|
#endif
|
||||||
|
return WOLFSSL_FAILURE;
|
||||||
|
}
|
||||||
XMEMSET(der+(*derSz), (byte)paddingSz, paddingSz);
|
XMEMSET(der+(*derSz), (byte)paddingSz, paddingSz);
|
||||||
(*derSz) += paddingSz;
|
(*derSz) += paddingSz;
|
||||||
|
|
||||||
@@ -31456,9 +31464,20 @@ int wolfSSL_PEM_write_mem_RSAPrivateKey(RSA* rsa, const EVP_CIPHER* cipher,
|
|||||||
/* encrypt DER buffer if required */
|
/* encrypt DER buffer if required */
|
||||||
if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
|
if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
|
||||||
int ret;
|
int ret;
|
||||||
|
int blockSz = wolfSSL_EVP_CIPHER_block_size(cipher);
|
||||||
|
byte *tmpBuf;
|
||||||
|
|
||||||
|
/* Add space for padding */
|
||||||
|
if (!(tmpBuf = XREALLOC(derBuf, derSz + blockSz, NULL,
|
||||||
|
DYNAMIC_TYPE_TMP_BUFFER))) {
|
||||||
|
WOLFSSL_MSG("Extending DER buffer failed");
|
||||||
|
XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
|
||||||
|
return WOLFSSL_FAILURE;
|
||||||
|
}
|
||||||
|
derBuf = tmpBuf;
|
||||||
|
|
||||||
ret = EncryptDerKey(derBuf, &derSz, cipher,
|
ret = EncryptDerKey(derBuf, &derSz, cipher,
|
||||||
passwd, passwdSz, &cipherInfo);
|
passwd, passwdSz, &cipherInfo, derSz + blockSz);
|
||||||
if (ret != WOLFSSL_SUCCESS) {
|
if (ret != WOLFSSL_SUCCESS) {
|
||||||
WOLFSSL_MSG("EncryptDerKey failed");
|
WOLFSSL_MSG("EncryptDerKey failed");
|
||||||
XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
|
XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
|
||||||
@@ -31687,7 +31706,7 @@ int SetECKeyExternal(WOLFSSL_EC_KEY* eckey)
|
|||||||
|
|
||||||
/* set group (OID, nid and idx) */
|
/* set group (OID, nid and idx) */
|
||||||
eckey->group->curve_oid = ecc_sets[key->idx].oidSum;
|
eckey->group->curve_oid = ecc_sets[key->idx].oidSum;
|
||||||
eckey->group->curve_nid = ecc_sets[key->idx].id;
|
eckey->group->curve_nid = EccEnumToNID(ecc_sets[key->idx].id);
|
||||||
eckey->group->curve_idx = key->idx;
|
eckey->group->curve_idx = key->idx;
|
||||||
|
|
||||||
if (eckey->pub_key->internal != NULL) {
|
if (eckey->pub_key->internal != NULL) {
|
||||||
@@ -31855,6 +31874,7 @@ WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new_by_curve_name(int nid)
|
|||||||
{
|
{
|
||||||
WOLFSSL_EC_KEY *key;
|
WOLFSSL_EC_KEY *key;
|
||||||
int x;
|
int x;
|
||||||
|
int eccEnum = NIDToEccEnum(nid);
|
||||||
|
|
||||||
WOLFSSL_ENTER("wolfSSL_EC_KEY_new_by_curve_name");
|
WOLFSSL_ENTER("wolfSSL_EC_KEY_new_by_curve_name");
|
||||||
|
|
||||||
@@ -31867,13 +31887,15 @@ WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new_by_curve_name(int nid)
|
|||||||
/* set the nid of the curve */
|
/* set the nid of the curve */
|
||||||
key->group->curve_nid = nid;
|
key->group->curve_nid = nid;
|
||||||
|
|
||||||
/* search and set the corresponding internal curve idx */
|
if (eccEnum != -1) {
|
||||||
for (x = 0; ecc_sets[x].size != 0; x++)
|
/* search and set the corresponding internal curve idx */
|
||||||
if (ecc_sets[x].id == key->group->curve_nid) {
|
for (x = 0; ecc_sets[x].size != 0; x++)
|
||||||
key->group->curve_idx = x;
|
if (ecc_sets[x].id == eccEnum) {
|
||||||
key->group->curve_oid = ecc_sets[x].oidSum;
|
key->group->curve_idx = x;
|
||||||
break;
|
key->group->curve_oid = ecc_sets[x].oidSum;
|
||||||
}
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
@@ -32111,7 +32133,7 @@ int wolfSSL_EC_KEY_generate_key(WOLFSSL_EC_KEY *key)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NIDToEccEnum return -1 for invalid NID so if key->group->curve_nid
|
/* NIDToEccEnum returns -1 for invalid NID so if key->group->curve_nid
|
||||||
* is 0 then pass 0 as arg */
|
* is 0 then pass 0 as arg */
|
||||||
if (wc_ecc_make_key_ex(rng, 0, (ecc_key*)key->internal,
|
if (wc_ecc_make_key_ex(rng, 0, (ecc_key*)key->internal,
|
||||||
key->group->curve_nid ? NIDToEccEnum(key->group->curve_nid) : 0
|
key->group->curve_nid ? NIDToEccEnum(key->group->curve_nid) : 0
|
||||||
@@ -32476,9 +32498,6 @@ WOLFSSL_EC_GROUP *wolfSSL_EC_GROUP_new_by_curve_name(int nid)
|
|||||||
|
|
||||||
/* If NID passed in is OpenSSL type, convert it to ecc_curve_id enum */
|
/* If NID passed in is OpenSSL type, convert it to ecc_curve_id enum */
|
||||||
eccEnum = NIDToEccEnum(nid);
|
eccEnum = NIDToEccEnum(nid);
|
||||||
if (eccEnum == -1)
|
|
||||||
eccEnum = nid;
|
|
||||||
|
|
||||||
|
|
||||||
/* curve group */
|
/* curve group */
|
||||||
g = (WOLFSSL_EC_GROUP*) XMALLOC(sizeof(WOLFSSL_EC_GROUP), NULL,
|
g = (WOLFSSL_EC_GROUP*) XMALLOC(sizeof(WOLFSSL_EC_GROUP), NULL,
|
||||||
@@ -32490,12 +32509,12 @@ WOLFSSL_EC_GROUP *wolfSSL_EC_GROUP_new_by_curve_name(int nid)
|
|||||||
XMEMSET(g, 0, sizeof(WOLFSSL_EC_GROUP));
|
XMEMSET(g, 0, sizeof(WOLFSSL_EC_GROUP));
|
||||||
|
|
||||||
/* set the nid of the curve */
|
/* set the nid of the curve */
|
||||||
g->curve_nid = eccEnum;
|
g->curve_nid = nid;
|
||||||
|
|
||||||
if (eccEnum > ECC_CURVE_DEF) {
|
if (eccEnum != -1) {
|
||||||
/* search and set the corresponding internal curve idx */
|
/* search and set the corresponding internal curve idx */
|
||||||
for (x = 0; ecc_sets[x].size != 0; x++)
|
for (x = 0; ecc_sets[x].size != 0; x++)
|
||||||
if (ecc_sets[x].id == g->curve_nid) {
|
if (ecc_sets[x].id == eccEnum) {
|
||||||
g->curve_idx = x;
|
g->curve_idx = x;
|
||||||
g->curve_oid = ecc_sets[x].oidSum;
|
g->curve_oid = ecc_sets[x].oidSum;
|
||||||
break;
|
break;
|
||||||
@@ -33942,7 +33961,7 @@ int wolfSSL_PEM_write_mem_ECPrivateKey(WOLFSSL_EC_KEY* ecc,
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = EncryptDerKey(derBuf, &derSz, cipher,
|
ret = EncryptDerKey(derBuf, &derSz, cipher,
|
||||||
passwd, passwdSz, &cipherInfo);
|
passwd, passwdSz, &cipherInfo, der_max_len);
|
||||||
if (ret != WOLFSSL_SUCCESS) {
|
if (ret != WOLFSSL_SUCCESS) {
|
||||||
WOLFSSL_MSG("EncryptDerKey failed");
|
WOLFSSL_MSG("EncryptDerKey failed");
|
||||||
XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
|
XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
|
||||||
@@ -34252,7 +34271,7 @@ int wolfSSL_PEM_write_mem_DSAPrivateKey(WOLFSSL_DSA* dsa,
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = EncryptDerKey(derBuf, &derSz, cipher,
|
ret = EncryptDerKey(derBuf, &derSz, cipher,
|
||||||
passwd, passwdSz, &cipherInfo);
|
passwd, passwdSz, &cipherInfo, der_max_len);
|
||||||
if (ret != WOLFSSL_SUCCESS) {
|
if (ret != WOLFSSL_SUCCESS) {
|
||||||
WOLFSSL_MSG("EncryptDerKey failed");
|
WOLFSSL_MSG("EncryptDerKey failed");
|
||||||
XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
|
XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
|
||||||
|
Reference in New Issue
Block a user