@@ -13494,36 +13494,35 @@ WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_REQ(WOLFSSL_BIO *bp, WOLFSSL_X509 **x,
1349413494 WOLFSSL_X509_CRL **x, wc_pem_password_cb *cb, void *u)
1349513495 {
1349613496#if defined(WOLFSSL_PEM_TO_DER) && defined(HAVE_CRL)
13497- unsigned char* pem = NULL;
13498- int pemSz = 0;
13499- int derSz = 0;
13500- DerBuffer* der = NULL;
1350113497 WOLFSSL_X509_CRL* crl = NULL;
1350213498
1350313499 WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509_CRL");
1350413500
13505- if ((pem = ReadPemFromBioToBuffer(bp, &pemSz)) == NULL) {
13506- goto err;
13507- }
13508-
13509- if ((PemToDer(pem, pemSz, CRL_TYPE, &der, NULL, NULL, NULL)) < 0) {
13510- goto err;
13511- }
13512- derSz = (int)der->length;
13513- if ((crl = wolfSSL_d2i_X509_CRL(x, der->buffer, derSz)) == NULL) {
13514- goto err;
13501+ /* OpenSSL's PEM_read_bio_X509_CRL skips intervening cert/key blocks
13502+ * and returns the next CRL in the stream (NULL only at EOF). Mirror
13503+ * that by looping over the per-block reader until we get a CRL or
13504+ * the BIO has nothing left to parse. */
13505+ for (;;) {
13506+ WOLFSSL_X509* x509 = NULL;
13507+ WOLFSSL_X509_PKEY* x_pkey = NULL;
13508+ if (wolfSSL_PEM_X509_X509_CRL_X509_PKEY_read_bio(bp, cb,
13509+ &x509, &crl, &x_pkey) != WOLFSSL_SUCCESS) {
13510+ break;
13511+ }
13512+ if (crl != NULL) {
13513+ break;
13514+ }
13515+ wolfSSL_X509_free(x509);
13516+ wolfSSL_X509_PKEY_free(x_pkey);
1351513517 }
1351613518
13517- err:
13518- if (pemSz == 0) {
13519- WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
13520- }
13521- XFREE(pem, 0, DYNAMIC_TYPE_PEM);
13522- if (der != NULL) {
13523- FreeDer(&der);
13519+ if (x != NULL) {
13520+ if (*x != NULL && *x != crl) {
13521+ wolfSSL_X509_CRL_free(*x);
13522+ }
13523+ *x = crl;
1352413524 }
1352513525
13526- (void)cb;
1352713526 (void)u;
1352813527
1352913528 return crl;
@@ -13686,7 +13685,7 @@ int wolfSSL_write_X509_CRL(WOLFSSL_X509_CRL* crl, const char* path, int type)
1368613685#endif /* !NO_FILESYSTEM */
1368713686
1368813687#endif /* OPENSSL_EXTRA || OPENSSL_ALL */
13689- #ifdef OPENSSL_ALL
13688+ #if defined(OPENSSL_EXTRA) || defined( OPENSSL_ALL)
1369013689
1369113690#ifndef NO_BIO
1369213691 /* create and return a new WOLFSSL_X509_PKEY structure or NULL on failure */
@@ -13706,7 +13705,7 @@ int wolfSSL_write_X509_CRL(WOLFSSL_X509_CRL* crl, const char* path, int type)
1370613705
1370713706
1370813707 /* free up all memory used by "xPkey" passed in */
13709- static void wolfSSL_X509_PKEY_free(WOLFSSL_X509_PKEY* xPkey)
13708+ void wolfSSL_X509_PKEY_free(WOLFSSL_X509_PKEY* xPkey)
1371013709 {
1371113710 if (xPkey != NULL) {
1371213711 wolfSSL_EVP_PKEY_free(xPkey->dec_pkey);
@@ -13732,7 +13731,7 @@ int wolfSSL_write_X509_CRL(WOLFSSL_X509_CRL* crl, const char* path, int type)
1373213731 * @param x_pkey Output
1373313732 * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE otherwise
1373413733 */
13735- static int wolfSSL_PEM_X509_X509_CRL_X509_PKEY_read_bio(
13734+ int wolfSSL_PEM_X509_X509_CRL_X509_PKEY_read_bio(
1373613735 WOLFSSL_BIO* bio, wc_pem_password_cb* cb, WOLFSSL_X509** x509,
1373713736 WOLFSSL_X509_CRL** crl, WOLFSSL_X509_PKEY** x_pkey)
1373813737 {
@@ -13762,7 +13761,11 @@ int wolfSSL_write_X509_CRL(WOLFSSL_X509_CRL* crl, const char* path, int type)
1376213761 return WOLFSSL_FAILURE;
1376313762 }
1376413763
13765- if (l <= pem_struct_min_sz) {
13764+ if (l == 0) {
13765+ /* Streaming BIO (pipe/FIFO/socket): size unknown, use the cap. */
13766+ l = MAX_BIO_READ_BUFFER;
13767+ }
13768+ else if (l <= pem_struct_min_sz) {
1376613769 /* No certificate in buffer */
1376713770 WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
1376813771 return WOLFSSL_FAILURE;
@@ -13916,6 +13919,9 @@ int wolfSSL_write_X509_CRL(WOLFSSL_X509_CRL* crl, const char* path, int type)
1391613919#endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
1391713920 }
1391813921
13922+ #endif /* OPENSSL_EXTRA || OPENSSL_ALL */
13923+ #ifdef OPENSSL_ALL
13924+
1391913925#ifndef NO_FILESYSTEM
1392013926 WOLF_STACK_OF(WOLFSSL_X509_INFO)* wolfSSL_PEM_X509_INFO_read(
1392113927 XFILE fp, WOLF_STACK_OF(WOLFSSL_X509_INFO)* sk,
@@ -14053,7 +14059,7 @@ int wolfSSL_write_X509_CRL(WOLFSSL_X509_CRL* crl, const char* path, int type)
1405314059 return localSk;
1405414060 }
1405514061#endif /* !NO_BIO */
14056- #endif /* OPENSSL_ALL */
14062+ #endif /* OPENSSL_EXTRA || OPENSSL_ALL */
1405714063
1405814064 void wolfSSL_X509_NAME_ENTRY_free(WOLFSSL_X509_NAME_ENTRY* ne)
1405914065 {
0 commit comments