Dynamically allocate memory in wolfSSL_i2d_PKCS7_bio

This commit is contained in:
Juliusz Sosinowicz
2020-09-18 18:40:30 +02:00
parent c405c3477f
commit acf3156fac
2 changed files with 36 additions and 3 deletions

View File

@ -50697,7 +50697,7 @@ PKCS7* wolfSSL_d2i_PKCS7_bio(WOLFSSL_BIO* bio, PKCS7** p7)
int wolfSSL_i2d_PKCS7_bio(WOLFSSL_BIO *bio, PKCS7 *p7)
{
byte output[4096];
byte* output;
int len;
WOLFSSL_ENTER("wolfSSL_i2d_PKCS7_bio");
@ -50706,16 +50706,30 @@ int wolfSSL_i2d_PKCS7_bio(WOLFSSL_BIO *bio, PKCS7 *p7)
return WOLFSSL_FAILURE;
}
if ((len = wc_PKCS7_EncodeSignedData(p7, output, sizeof(output))) < 0) {
if ((len = wc_PKCS7_EncodeSignedData(p7, NULL, 0)) < 0) {
WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error");
return WOLFSSL_FAILURE;
}
output = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
if (!output) {
WOLFSSL_MSG("malloc error");
return WOLFSSL_FAILURE;
}
if ((len = wc_PKCS7_EncodeSignedData(p7, output, len)) < 0) {
WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error");
XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER);
return WOLFSSL_FAILURE;
}
if (wolfSSL_BIO_write(bio, output, len) <= 0) {
WOLFSSL_MSG("wolfSSL_BIO_write error");
XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER);
return WOLFSSL_FAILURE;
}
XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER);
return WOLFSSL_SUCCESS;
}

View File

@ -2235,6 +2235,7 @@ static int wc_PKCS7_SignedDataBuildSignature(PKCS7* pkcs7,
/* build PKCS#7 signedData content type */
/* To get the output size then set output = 0 and *outputSz = 0 */
static int PKCS7_EncodeSigned(PKCS7* pkcs7, ESD* esd,
const byte* hashBuf, word32 hashSz, byte* output, word32* outputSz,
byte* output2, word32* output2Sz)
@ -2270,7 +2271,7 @@ static int PKCS7_EncodeSigned(PKCS7* pkcs7, ESD* esd,
byte signingTime[MAX_TIME_STRING_SZ];
if (pkcs7 == NULL || pkcs7->hashOID == 0 ||
output == NULL || outputSz == NULL || *outputSz == 0 || hashSz == 0 ||
outputSz == NULL || hashSz == 0 ||
hashBuf == NULL) {
return BAD_FUNC_ARG;
}
@ -2511,6 +2512,11 @@ static int PKCS7_EncodeSigned(PKCS7* pkcs7, ESD* esd,
#ifdef WOLFSSL_SMALL_STACK
XFREE(esd, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER);
#endif
if (*outputSz == 0 && *output2Sz == 0) {
*outputSz = totalSz;
*output2Sz = total2Sz;
return 0;
}
return BUFFER_E;
}
@ -2528,6 +2534,19 @@ static int PKCS7_EncodeSigned(PKCS7* pkcs7, ESD* esd,
XFREE(flatSignedAttribs, pkcs7->heap, DYNAMIC_TYPE_PKCS7);
#ifdef WOLFSSL_SMALL_STACK
XFREE(esd, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER);
#endif
if (*outputSz == 0) {
*outputSz = totalSz;
return totalSz;
}
return BUFFER_E;
}
if (output == NULL) {
if (pkcs7->signedAttribsSz != 0)
XFREE(flatSignedAttribs, pkcs7->heap, DYNAMIC_TYPE_PKCS7);
#ifdef WOLFSSL_SMALL_STACK
XFREE(esd, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER);
#endif
return BUFFER_E;
}