A BIO is an I/O stream abstraction; essentially OpenSSL's answer to the C library's
FILE *. OpenSSL comes with a number of useful BIO types predefined, or you can create your own.
BIOs come in two flavors: source/sink, or filter. BIOs can be chained together. Each chain always has exactly one source/sink, but can have any number (zero or more) of filters.
Reading from a BIO can be done with Manual:BIO_read(3) and
Writing to a BIO can be done with
implementation of those bio are within bio/bss_xxx.c bss stading for Bio Source Sink
Combining Filters and Source Sink BIOs
new_head = BIO_push(BIO * local_head, BIO * tail)
will connect tail at end of local_head chain.
WARNING BIO_push will never fail, but can create invalid chains.
In standard usage end of a chain is a source sink, and all other elements are filters.
two separated BIOs can then be connected with BIO_make_bio_pair() into a connected pair.