[#PEM_X509_INFO_read_bio_ex]
= PEM&lowbar;X509&lowbar;INFO&lowbar;read&lowbar;bio&lowbar;ex
:mrdocs:

Read successive PEM X509&lowbar;INFO objects (cert, CRL, and&sol;or key) from a BIO with an explicit library context&period;

== Synopsis

Declared in `&lt;openssl&sol;pem&period;h&gt;`

[source,cpp,subs="verbatim,replacements,macros,-callouts"]
----
stack&lowbar;st&lowbar;X509&lowbar;INFO*
PEM&lowbar;X509&lowbar;INFO&lowbar;read&lowbar;bio&lowbar;ex(
    xref:BIO.adoc[BIO]* bp,
    stack&lowbar;st&lowbar;X509&lowbar;INFO* sk,
    xref:pem_password_cb.adoc[pem&lowbar;password&lowbar;cb]* cb,
    void* u,
    xref:OSSL_LIB_CTX.adoc[OSSL&lowbar;LIB&lowbar;CTX]* libctx,
    char const* propq);
----

== Return Value

Stack of X509&lowbar;INFO groups, or NULL on failure&period;

== Parameters

[cols="1,4"]
|===
| Name| Description
| *bp*
| BIO to read from&period;
| *sk*
| Existing stack to append to, or NULL to allocate a new stack&period;
| *cb*
| Password callback for encrypted private keys, or NULL&period;
| *u*
| Application data passed to `cb&period;`
| *libctx*
| Library context for provider&hyphen;backed key decoding, or NULL for the default&period;
| *propq*
| Property query for algorithm fetches, or NULL&period;
|===


[.small]#Created with https://www.mrdocs.com[MrDocs]#
