Blame doc/man3/BIO_f_ssl.pod

Packit Service 084de1
=pod
Packit Service 084de1
Packit Service 084de1
=head1 NAME
Packit Service 084de1
Packit Service 084de1
BIO_do_handshake,
Packit Service 084de1
BIO_f_ssl, BIO_set_ssl, BIO_get_ssl, BIO_set_ssl_mode,
Packit Service 084de1
BIO_set_ssl_renegotiate_bytes,
Packit Service 084de1
BIO_get_num_renegotiates, BIO_set_ssl_renegotiate_timeout, BIO_new_ssl,
Packit Service 084de1
BIO_new_ssl_connect, BIO_new_buffer_ssl_connect, BIO_ssl_copy_session_id,
Packit Service 084de1
BIO_ssl_shutdown - SSL BIO
Packit Service 084de1
Packit Service 084de1
=head1 SYNOPSIS
Packit Service 084de1
Packit Service 084de1
=for comment multiple includes
Packit Service 084de1
Packit Service 084de1
 #include <openssl/bio.h>
Packit Service 084de1
 #include <openssl/ssl.h>
Packit Service 084de1
Packit Service 084de1
 const BIO_METHOD *BIO_f_ssl(void);
Packit Service 084de1
Packit Service 084de1
 long BIO_set_ssl(BIO *b, SSL *ssl, long c);
Packit Service 084de1
 long BIO_get_ssl(BIO *b, SSL **sslp);
Packit Service 084de1
 long BIO_set_ssl_mode(BIO *b, long client);
Packit Service 084de1
 long BIO_set_ssl_renegotiate_bytes(BIO *b, long num);
Packit Service 084de1
 long BIO_set_ssl_renegotiate_timeout(BIO *b, long seconds);
Packit Service 084de1
 long BIO_get_num_renegotiates(BIO *b);
Packit Service 084de1
Packit Service 084de1
 BIO *BIO_new_ssl(SSL_CTX *ctx, int client);
Packit Service 084de1
 BIO *BIO_new_ssl_connect(SSL_CTX *ctx);
Packit Service 084de1
 BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx);
Packit Service 084de1
 int BIO_ssl_copy_session_id(BIO *to, BIO *from);
Packit Service 084de1
 void BIO_ssl_shutdown(BIO *bio);
Packit Service 084de1
Packit Service 084de1
 long BIO_do_handshake(BIO *b);
Packit Service 084de1
Packit Service 084de1
=head1 DESCRIPTION
Packit Service 084de1
Packit Service 084de1
BIO_f_ssl() returns the SSL BIO method. This is a filter BIO which
Packit Service 084de1
is a wrapper round the OpenSSL SSL routines adding a BIO "flavour" to
Packit Service 084de1
SSL I/O.
Packit Service 084de1
Packit Service 084de1
I/O performed on an SSL BIO communicates using the SSL protocol with
Packit Service 084de1
the SSLs read and write BIOs. If an SSL connection is not established
Packit Service 084de1
then an attempt is made to establish one on the first I/O call.
Packit Service 084de1
Packit Service 084de1
If a BIO is appended to an SSL BIO using BIO_push() it is automatically
Packit Service 084de1
used as the SSL BIOs read and write BIOs.
Packit Service 084de1
Packit Service 084de1
Calling BIO_reset() on an SSL BIO closes down any current SSL connection
Packit Service 084de1
by calling SSL_shutdown(). BIO_reset() is then sent to the next BIO in
Packit Service 084de1
the chain: this will typically disconnect the underlying transport.
Packit Service 084de1
The SSL BIO is then reset to the initial accept or connect state.
Packit Service 084de1
Packit Service 084de1
If the close flag is set when an SSL BIO is freed then the internal
Packit Service 084de1
SSL structure is also freed using SSL_free().
Packit Service 084de1
Packit Service 084de1
BIO_set_ssl() sets the internal SSL pointer of BIO B to B<ssl> using
Packit Service 084de1
the close flag B<c>.
Packit Service 084de1
Packit Service 084de1
BIO_get_ssl() retrieves the SSL pointer of BIO B, it can then be
Packit Service 084de1
manipulated using the standard SSL library functions.
Packit Service 084de1
Packit Service 084de1
BIO_set_ssl_mode() sets the SSL BIO mode to B<client>. If B<client>
Packit Service 084de1
is 1 client mode is set. If B<client> is 0 server mode is set.
Packit Service 084de1
Packit Service 084de1
BIO_set_ssl_renegotiate_bytes() sets the renegotiate byte count
Packit Service 084de1
to B<num>. When set after every B<num> bytes of I/O (read and write)
Packit Service 084de1
the SSL session is automatically renegotiated. B<num> must be at
Packit Service 084de1
least 512 bytes.
Packit Service 084de1
Packit Service 084de1
BIO_set_ssl_renegotiate_timeout() sets the renegotiate timeout to
Packit Service 084de1
B<seconds>. When the renegotiate timeout elapses the session is
Packit Service 084de1
automatically renegotiated.
Packit Service 084de1
Packit Service 084de1
BIO_get_num_renegotiates() returns the total number of session
Packit Service 084de1
renegotiations due to I/O or timeout.
Packit Service 084de1
Packit Service 084de1
BIO_new_ssl() allocates an SSL BIO using SSL_CTX B<ctx> and using
Packit Service 084de1
client mode if B<client> is non zero.
Packit Service 084de1
Packit Service 084de1
BIO_new_ssl_connect() creates a new BIO chain consisting of an
Packit Service 084de1
SSL BIO (using B<ctx>) followed by a connect BIO.
Packit Service 084de1
Packit Service 084de1
BIO_new_buffer_ssl_connect() creates a new BIO chain consisting
Packit Service 084de1
of a buffering BIO, an SSL BIO (using B<ctx>) and a connect
Packit Service 084de1
BIO.
Packit Service 084de1
Packit Service 084de1
BIO_ssl_copy_session_id() copies an SSL session id between
Packit Service 084de1
BIO chains B<from> and B<to>. It does this by locating the
Packit Service 084de1
SSL BIOs in each chain and calling SSL_copy_session_id() on
Packit Service 084de1
the internal SSL pointer.
Packit Service 084de1
Packit Service 084de1
BIO_ssl_shutdown() closes down an SSL connection on BIO
Packit Service 084de1
chain B<bio>. It does this by locating the SSL BIO in the
Packit Service 084de1
chain and calling SSL_shutdown() on its internal SSL
Packit Service 084de1
pointer.
Packit Service 084de1
Packit Service 084de1
BIO_do_handshake() attempts to complete an SSL handshake on the
Packit Service 084de1
supplied BIO and establish the SSL connection. It returns 1
Packit Service 084de1
if the connection was established successfully. A zero or negative
Packit Service 084de1
value is returned if the connection could not be established, the
Packit Service 084de1
call BIO_should_retry() should be used for non blocking connect BIOs
Packit Service 084de1
to determine if the call should be retried. If an SSL connection has
Packit Service 084de1
already been established this call has no effect.
Packit Service 084de1
Packit Service 084de1
=head1 NOTES
Packit Service 084de1
Packit Service 084de1
SSL BIOs are exceptional in that if the underlying transport
Packit Service 084de1
is non blocking they can still request a retry in exceptional
Packit Service 084de1
circumstances. Specifically this will happen if a session
Packit Service 084de1
renegotiation takes place during a BIO_read_ex() operation, one
Packit Service 084de1
case where this happens is when step up occurs.
Packit Service 084de1
Packit Service 084de1
The SSL flag SSL_AUTO_RETRY can be
Packit Service 084de1
set to disable this behaviour. That is when this flag is set
Packit Service 084de1
an SSL BIO using a blocking transport will never request a
Packit Service 084de1
retry.
Packit Service 084de1
Packit Service 084de1
Since unknown BIO_ctrl() operations are sent through filter
Packit Service 084de1
BIOs the servers name and port can be set using BIO_set_host()
Packit Service 084de1
on the BIO returned by BIO_new_ssl_connect() without having
Packit Service 084de1
to locate the connect BIO first.
Packit Service 084de1
Packit Service 084de1
Applications do not have to call BIO_do_handshake() but may wish
Packit Service 084de1
to do so to separate the handshake process from other I/O
Packit Service 084de1
processing.
Packit Service 084de1
Packit Service 084de1
BIO_set_ssl(), BIO_get_ssl(), BIO_set_ssl_mode(),
Packit Service 084de1
BIO_set_ssl_renegotiate_bytes(), BIO_set_ssl_renegotiate_timeout(),
Packit Service 084de1
BIO_get_num_renegotiates(), and BIO_do_handshake() are implemented as macros.
Packit Service 084de1
Packit Service 084de1
=head1 RETURN VALUES
Packit Service 084de1
Packit Service 084de1
BIO_f_ssl() returns the SSL B<BIO_METHOD> structure.
Packit Service 084de1
Packit Service 084de1
BIO_set_ssl(), BIO_get_ssl(), BIO_set_ssl_mode(), BIO_set_ssl_renegotiate_bytes(),
Packit Service 084de1
BIO_set_ssl_renegotiate_timeout() and BIO_get_num_renegotiates() return 1 on
Packit Service 084de1
success or a value which is less than or equal to 0 if an error occurred.
Packit Service 084de1
Packit Service 084de1
BIO_new_ssl(), BIO_new_ssl_connect() and BIO_new_buffer_ssl_connect() return
Packit Service 084de1
a valid B<BIO> structure on success or B<NULL> if an error occurred.
Packit Service 084de1
Packit Service 084de1
BIO_ssl_copy_session_id() returns 1 on success or 0 on error.
Packit Service 084de1
Packit Service 084de1
BIO_do_handshake() returns 1 if the connection was established successfully.
Packit Service 084de1
A zero or negative value is returned if the connection could not be established.
Packit Service 084de1
Packit Service 084de1
=head1 EXAMPLES
Packit Service 084de1
Packit Service 084de1
This SSL/TLS client example attempts to retrieve a page from an
Packit Service 084de1
SSL/TLS web server. The I/O routines are identical to those of the
Packit Service 084de1
unencrypted example in L<BIO_s_connect(3)>.
Packit Service 084de1
Packit Service 084de1
 BIO *sbio, *out;
Packit Service 084de1
 int len;
Packit Service 084de1
 char tmpbuf[1024];
Packit Service 084de1
 SSL_CTX *ctx;
Packit Service 084de1
 SSL *ssl;
Packit Service 084de1
Packit Service 084de1
 /* XXX Seed the PRNG if needed. */
Packit Service 084de1
Packit Service 084de1
 ctx = SSL_CTX_new(TLS_client_method());
Packit Service 084de1
Packit Service 084de1
 /* XXX Set verify paths and mode here. */
Packit Service 084de1
Packit Service 084de1
 sbio = BIO_new_ssl_connect(ctx);
Packit Service 084de1
 BIO_get_ssl(sbio, &ssl;;
Packit Service 084de1
 if (ssl == NULL) {
Packit Service 084de1
     fprintf(stderr, "Can't locate SSL pointer\n");
Packit Service 084de1
     ERR_print_errors_fp(stderr);
Packit Service 084de1
     exit(1);
Packit Service 084de1
 }
Packit Service 084de1
Packit Service 084de1
 /* Don't want any retries */
Packit Service 084de1
 SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
Packit Service 084de1
Packit Service 084de1
 /* XXX We might want to do other things with ssl here */
Packit Service 084de1
Packit Service 084de1
 /* An empty host part means the loopback address */
Packit Service 084de1
 BIO_set_conn_hostname(sbio, ":https");
Packit Service 084de1
Packit Service 084de1
 out = BIO_new_fp(stdout, BIO_NOCLOSE);
Packit Service 084de1
 if (BIO_do_connect(sbio) <= 0) {
Packit Service 084de1
     fprintf(stderr, "Error connecting to server\n");
Packit Service 084de1
     ERR_print_errors_fp(stderr);
Packit Service 084de1
     exit(1);
Packit Service 084de1
 }
Packit Service 084de1
 if (BIO_do_handshake(sbio) <= 0) {
Packit Service 084de1
     fprintf(stderr, "Error establishing SSL connection\n");
Packit Service 084de1
     ERR_print_errors_fp(stderr);
Packit Service 084de1
     exit(1);
Packit Service 084de1
 }
Packit Service 084de1
Packit Service 084de1
 /* XXX Could examine ssl here to get connection info */
Packit Service 084de1
Packit Service 084de1
 BIO_puts(sbio, "GET / HTTP/1.0\n\n");
Packit Service 084de1
 for (;;) {
Packit Service 084de1
     len = BIO_read(sbio, tmpbuf, 1024);
Packit Service 084de1
     if (len <= 0)
Packit Service 084de1
         break;
Packit Service 084de1
     BIO_write(out, tmpbuf, len);
Packit Service 084de1
 }
Packit Service 084de1
 BIO_free_all(sbio);
Packit Service 084de1
 BIO_free(out);
Packit Service 084de1
Packit Service 084de1
Here is a simple server example. It makes use of a buffering
Packit Service 084de1
BIO to allow lines to be read from the SSL BIO using BIO_gets.
Packit Service 084de1
It creates a pseudo web page containing the actual request from
Packit Service 084de1
a client and also echoes the request to standard output.
Packit Service 084de1
Packit Service 084de1
 BIO *sbio, *bbio, *acpt, *out;
Packit Service 084de1
 int len;
Packit Service 084de1
 char tmpbuf[1024];
Packit Service 084de1
 SSL_CTX *ctx;
Packit Service 084de1
 SSL *ssl;
Packit Service 084de1
Packit Service 084de1
 /* XXX Seed the PRNG if needed. */
Packit Service 084de1
Packit Service 084de1
 ctx = SSL_CTX_new(TLS_server_method());
Packit Service 084de1
 if (!SSL_CTX_use_certificate_file(ctx, "server.pem", SSL_FILETYPE_PEM)
Packit Service 084de1
         || !SSL_CTX_use_PrivateKey_file(ctx, "server.pem", SSL_FILETYPE_PEM)
Packit Service 084de1
         || !SSL_CTX_check_private_key(ctx)) {
Packit Service 084de1
     fprintf(stderr, "Error setting up SSL_CTX\n");
Packit Service 084de1
     ERR_print_errors_fp(stderr);
Packit Service 084de1
     exit(1);
Packit Service 084de1
 }
Packit Service 084de1
Packit Service 084de1
 /* XXX Other things like set verify locations, EDH temp callbacks. */
Packit Service 084de1
Packit Service 084de1
 /* New SSL BIO setup as server */
Packit Service 084de1
 sbio = BIO_new_ssl(ctx, 0);
Packit Service 084de1
 BIO_get_ssl(sbio, &ssl;;
Packit Service 084de1
 if (ssl == NULL) {
Packit Service 084de1
     fprintf(stderr, "Can't locate SSL pointer\n");
Packit Service 084de1
     ERR_print_errors_fp(stderr);
Packit Service 084de1
     exit(1);
Packit Service 084de1
 }
Packit Service 084de1
Packit Service 084de1
 SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
Packit Service 084de1
 bbio = BIO_new(BIO_f_buffer());
Packit Service 084de1
 sbio = BIO_push(bbio, sbio);
Packit Service 084de1
 acpt = BIO_new_accept("4433");
Packit Service 084de1
Packit Service 084de1
 /*
Packit Service 084de1
  * By doing this when a new connection is established
Packit Service 084de1
  * we automatically have sbio inserted into it. The
Packit Service 084de1
  * BIO chain is now 'swallowed' by the accept BIO and
Packit Service 084de1
  * will be freed when the accept BIO is freed.
Packit Service 084de1
  */
Packit Service 084de1
 BIO_set_accept_bios(acpt, sbio);
Packit Service 084de1
 out = BIO_new_fp(stdout, BIO_NOCLOSE);
Packit Service 084de1
Packit Service 084de1
 /* Setup accept BIO */
Packit Service 084de1
 if (BIO_do_accept(acpt) <= 0) {
Packit Service 084de1
     fprintf(stderr, "Error setting up accept BIO\n");
Packit Service 084de1
     ERR_print_errors_fp(stderr);
Packit Service 084de1
     exit(1);
Packit Service 084de1
 }
Packit Service 084de1
Packit Service 084de1
 /* We only want one connection so remove and free accept BIO */
Packit Service 084de1
 sbio = BIO_pop(acpt);
Packit Service 084de1
 BIO_free_all(acpt);
Packit Service 084de1
Packit Service 084de1
 if (BIO_do_handshake(sbio) <= 0) {
Packit Service 084de1
     fprintf(stderr, "Error in SSL handshake\n");
Packit Service 084de1
     ERR_print_errors_fp(stderr);
Packit Service 084de1
     exit(1);
Packit Service 084de1
 }
Packit Service 084de1
Packit Service 084de1
 BIO_puts(sbio, "HTTP/1.0 200 OK\r\nContent-type: text/plain\r\n\r\n");
Packit Service 084de1
 BIO_puts(sbio, "\r\nConnection Established\r\nRequest headers:\r\n");
Packit Service 084de1
 BIO_puts(sbio, "--------------------------------------------------\r\n");
Packit Service 084de1
Packit Service 084de1
 for (;;) {
Packit Service 084de1
     len = BIO_gets(sbio, tmpbuf, 1024);
Packit Service 084de1
     if (len <= 0)
Packit Service 084de1
         break;
Packit Service 084de1
     BIO_write(sbio, tmpbuf, len);
Packit Service 084de1
     BIO_write(out, tmpbuf, len);
Packit Service 084de1
     /* Look for blank line signifying end of headers*/
Packit Service 084de1
     if (tmpbuf[0] == '\r' || tmpbuf[0] == '\n')
Packit Service 084de1
         break;
Packit Service 084de1
 }
Packit Service 084de1
Packit Service 084de1
 BIO_puts(sbio, "--------------------------------------------------\r\n");
Packit Service 084de1
 BIO_puts(sbio, "\r\n");
Packit Service 084de1
 BIO_flush(sbio);
Packit Service 084de1
 BIO_free_all(sbio);
Packit Service 084de1
Packit Service 084de1
=head1 HISTORY
Packit Service 084de1
Packit Service 084de1
In OpenSSL before 1.0.0 the BIO_pop() call was handled incorrectly,
Packit Service 084de1
the I/O BIO reference count was incorrectly incremented (instead of
Packit Service 084de1
decremented) and dissociated with the SSL BIO even if the SSL BIO was not
Packit Service 084de1
explicitly being popped (e.g. a pop higher up the chain). Applications which
Packit Service 084de1
included workarounds for this bug (e.g. freeing BIOs more than once) should
Packit Service 084de1
be modified to handle this fix or they may free up an already freed BIO.
Packit Service 084de1
Packit Service 084de1
=head1 COPYRIGHT
Packit Service 084de1
Packit Service 084de1
Copyright 2000-2019 The OpenSSL Project Authors. All Rights Reserved.
Packit Service 084de1
Packit Service 084de1
Licensed under the OpenSSL license (the "License").  You may not use
Packit Service 084de1
this file except in compliance with the License.  You can obtain a copy
Packit Service 084de1
in the file LICENSE in the source distribution or at
Packit Service 084de1
L<https://www.openssl.org/source/license.html>.
Packit Service 084de1
Packit Service 084de1
=cut