Fix for leak in wolfSSL_X509_print, where the RsaKey is not free'd. Cleanup of formatting.

This commit is contained in:
David Garske
2018-10-04 16:51:51 -07:00
parent d473fd38ab
commit cec61ac3c9

View File

@@ -16436,13 +16436,13 @@ WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509)
return WOLFSSL_FAILURE;
}
if (wolfSSL_BIO_write(bio, "Certificate:\n", sizeof("Certificate:\n"))
<= 0) {
if (wolfSSL_BIO_write(bio, "Certificate:\n",
sizeof("Certificate:\n")) <= 0) {
return WOLFSSL_FAILURE;
}
if (wolfSSL_BIO_write(bio, " Data:\n", sizeof(" Data:\n"))
<= 0) {
if (wolfSSL_BIO_write(bio, " Data:\n",
sizeof(" Data:\n")) <= 0) {
return WOLFSSL_FAILURE;
}
@@ -16690,17 +16690,21 @@ WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509)
if (wc_RsaPublicKeyDecode(x509->pubKey.buffer,
&idx, &rsa, x509->pubKey.length) != 0) {
WOLFSSL_MSG("Error decoding RSA key");
wc_FreeRsaKey(&rsa);
return WOLFSSL_FAILURE;
}
if ((sz = wc_RsaEncryptSize(&rsa)) < 0) {
WOLFSSL_MSG("Error getting RSA key size");
wc_FreeRsaKey(&rsa);
return WOLFSSL_FAILURE;
}
XSNPRINTF(tmp, sizeof(tmp) - 1, "%s%s: (%d bit)\n%s\n",
" ", "Public-Key", 8 * sz,
" Modulus:");
tmp[sizeof(tmp) - 1] = '\0';
if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
if (wolfSSL_BIO_write(bio, tmp,
(int)XSTRLEN(tmp)) <= 0) {
wc_FreeRsaKey(&rsa);
return WOLFSSL_FAILURE;
}
@@ -16717,6 +16721,7 @@ WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509)
DYNAMIC_TYPE_TMP_BUFFER);
if (rawKey == NULL) {
WOLFSSL_MSG("Memory error");
wc_FreeRsaKey(&rsa);
return WOLFSSL_FAILURE;
}
mp_to_unsigned_bin(&rsa.n, rawKey);
@@ -16729,9 +16734,11 @@ WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509)
}
else if ((idx != 0) && (((idx + lbit) % 15) == 0)) {
tmp[sizeof(tmp) - 1] = '\0';
if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp))
<= 0) {
XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
if (wolfSSL_BIO_write(bio, tmp,
(int)XSTRLEN(tmp)) <= 0) {
XFREE(rawKey, NULL,
DYNAMIC_TYPE_TMP_BUFFER);
wc_FreeRsaKey(&rsa);
return WOLFSSL_FAILURE;
}
XSNPRINTF(tmp, sizeof(tmp) - 1,
@@ -16748,8 +16755,8 @@ WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509)
/* print out remaning modulus values */
if ((idx > 0) && (((idx - 1 + lbit) % 15) != 0)) {
tmp[sizeof(tmp) - 1] = '\0';
if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp))
<= 0) {
if (wolfSSL_BIO_write(bio, tmp,
(int)XSTRLEN(tmp)) <= 0) {
return WOLFSSL_FAILURE;
}
}
@@ -16758,6 +16765,7 @@ WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509)
rawLen = mp_unsigned_bin_size(&rsa.e);
if (rawLen < 0) {
WOLFSSL_MSG("Error getting exponent size");
wc_FreeRsaKey(&rsa);
return WOLFSSL_FAILURE;
}
@@ -16768,6 +16776,7 @@ WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509)
DYNAMIC_TYPE_TMP_BUFFER);
if (rawKey == NULL) {
WOLFSSL_MSG("Memory error");
wc_FreeRsaKey(&rsa);
return WOLFSSL_FAILURE;
}
XMEMSET(rawKey, 0, rawLen);
@@ -16777,11 +16786,14 @@ WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509)
}
XSNPRINTF(tmp, sizeof(tmp) - 1,
"\n Exponent: %d\n", idx);
if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
if (wolfSSL_BIO_write(bio, tmp,
(int)XSTRLEN(tmp)) <= 0) {
XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
wc_FreeRsaKey(&rsa);
return WOLFSSL_FAILURE;
}
XFREE(rawKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
wc_FreeRsaKey(&rsa);
}
#endif /* HAVE_USER_RSA */
break;
@@ -16814,7 +16826,8 @@ WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509)
8 * wc_ecc_size(&ecc),
" pub:");
tmp[sizeof(tmp) - 1] = '\0';
if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
if (wolfSSL_BIO_write(bio, tmp,
(int)XSTRLEN(tmp)) <= 0) {
wc_ecc_free(&ecc);
return WOLFSSL_FAILURE;
}
@@ -16865,8 +16878,8 @@ WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509)
/* print out remaning modulus values */
if ((i > 0) && (((i - 1) % 15) != 0)) {
tmp[sizeof(tmp) - 1] = '\0';
if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp))
<= 0) {
if (wolfSSL_BIO_write(bio, tmp,
(int)XSTRLEN(tmp)) <= 0) {
wc_ecc_free(&ecc);
XFREE(der, x509->heap,
DYNAMIC_TYPE_TMP_BUFFER);
@@ -16879,7 +16892,8 @@ WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509)
XSNPRINTF(tmp, sizeof(tmp) - 1, "\n%s%s: %s\n",
" ", "ASN1 OID",
ecc.dp->name);
if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) {
if (wolfSSL_BIO_write(bio, tmp,
(int)XSTRLEN(tmp)) <= 0) {
wc_ecc_free(&ecc);
return WOLFSSL_FAILURE;
}
@@ -28392,7 +28406,8 @@ int wolfSSL_PEM_write_RSA_PUBKEY(XFILE fp, WOLFSSL_RSA *x)
#endif /* NO_FILESYSTEM */
WOLFSSL_RSA *wolfSSL_d2i_RSAPublicKey(WOLFSSL_RSA **r, const unsigned char **pp, long len)
WOLFSSL_RSA *wolfSSL_d2i_RSAPublicKey(WOLFSSL_RSA **r, const unsigned char **pp,
long len)
{
WOLFSSL_RSA *rsa = NULL;
@@ -28415,11 +28430,12 @@ WOLFSSL_RSA *wolfSSL_d2i_RSAPublicKey(WOLFSSL_RSA **r, const unsigned char **pp,
}
if (r != NULL)
*r = rsa;
return rsa;
}
/* Converts an rsa private key from der format to an rsa structure.
Returns pointer to the rsa structure on succcess and NULL if error. */
/* Converts an RSA private key from DER format to an RSA structure.
Returns pointer to the RSA structure on success and NULL if error. */
WOLFSSL_RSA *wolfSSL_d2i_RSAPrivateKey(WOLFSSL_RSA **r,
const unsigned char **derBuf, long derSz)
{
@@ -28450,8 +28466,8 @@ WOLFSSL_RSA *wolfSSL_d2i_RSAPrivateKey(WOLFSSL_RSA **r,
}
#if !defined(HAVE_FAST_RSA)
/* Converts an internal rsa structure to der format.
Returns size of der on success and WOLFSSL_FAILURE if error */
/* Converts an internal RSA structure to DER format.
Returns size of DER on success and WOLFSSL_FAILURE if error */
int wolfSSL_i2d_RSAPrivateKey(WOLFSSL_RSA *rsa, unsigned char **pp)
{
#if defined(WOLFSSL_KEY_GEN)
@@ -28494,14 +28510,14 @@ int wolfSSL_i2d_RSAPrivateKey(WOLFSSL_RSA *rsa, unsigned char **pp)
return ret;
}
/* ret is the size of the der buffer */
/* ret is the size of the DER buffer */
for (i = 0; i < ret; i++) {
*(*pp + i) = *(der + i);
}
*pp += ret;
XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
return ret; /* returns size of der if successful */
return ret; /* returns size of DER if successful */
#else
(void)rsa;
(void)pp;