=pod

=head1 NAME

BIO_s_core, BIO_new_from_core_bio - OSSL_CORE_BIO functions

=head1 SYNOPSIS

 #include <openssl/bio.h>

 const BIO_METHOD *BIO_s_core(void);

 BIO *BIO_new_from_core_bio(OSSL_LIB_CTX *libctx, OSSL_CORE_BIO *corebio);

=head1 DESCRIPTION

BIO_s_core() returns the core BIO method function.

A core BIO is treated as source/sink BIO which communicates to some external
BIO. This is primarily useful to provider authors. A number of calls from
libcrypto into a provider supply an OSSL_CORE_BIO parameter. This represents
a BIO within libcrypto, but cannot be used directly by a provider. Instead it
should be wrapped using a BIO_s_core().

Once a BIO is constructed based on BIO_s_core(), the associated OSSL_CORE_BIO
object should be set on it using BIO_set_data(3). Note that the BIO will only
operate correctly if it is associated with a library context constructed using
OSSL_LIB_CTX_new_from_dispatch(3). To associate the BIO with a library context
construct it using BIO_new_ex(3).

BIO_new_from_core_bio() is a convenience function that constructs a new BIO
based on BIO_s_core() and that is associated with the given library context. It
then also sets the OSSL_CORE_BIO object on the BIO using BIO_set_data(3).

=head1 RETURN VALUES

BIO_s_core() return a core BIO B<BIO_METHOD> structure.

BIO_new_from_core_bio() returns a BIO structure on success or NULL on failure.
A failure will most commonly be because the library context was not constructed
using OSSL_LIB_CTX_new_from_dispatch(3).

=head1 HISTORY

BIO_s_core() and BIO_new_from_core_bio() were added in OpenSSL 3.0.

=head1 EXAMPLES

Create a core BIO and write some data to it:

 int some_function(OSSL_LIB_CTX *libctx, OSSL_CORE_BIO *corebio) {
     BIO *cbio = BIO_new_from_core_bio(libctx, corebio);

     if (cbio == NULL)
         return 0;

     BIO_puts(cbio, "Hello World\n");

     BIO_free(cbio);
     return 1;
 }

=head1 COPYRIGHT

Copyright 2021 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the Apache License 2.0 (the "License").  You may not use
this file except in compliance with the License.  You can obtain a copy
in the file LICENSE in the source distribution or at
L<https://www.openssl.org/source/license.html>.

=cut
