BIO_do_handshake (3)
Leading comments
Automatically generated by Pod::Man 4.09 (Pod::Simple 3.35) Standard preamble: ========================================================================
NAME
BIO_do_handshake, BIO_f_ssl, BIO_set_ssl, BIO_get_ssl, BIO_set_ssl_mode, BIO_set_ssl_renegotiate_bytes, BIO_get_num_renegotiates, BIO_set_ssl_renegotiate_timeout, BIO_new_ssl, BIO_new_ssl_connect, BIO_new_buffer_ssl_connect, BIO_ssl_copy_session_id, BIO_ssl_shutdown - SSL BIOSYNOPSIS
#include <openssl/bio.h> #include <openssl/ssl.h> const BIO_METHOD *BIO_f_ssl(void); long BIO_set_ssl(BIO *b, SSL *ssl, long c); long BIO_get_ssl(BIO *b, SSL **sslp); long BIO_set_ssl_mode(BIO *b, long client); long BIO_set_ssl_renegotiate_bytes(BIO *b, long num); long BIO_set_ssl_renegotiate_timeout(BIO *b, long seconds); long BIO_get_num_renegotiates(BIO *b); BIO *BIO_new_ssl(SSL_CTX *ctx, int client); BIO *BIO_new_ssl_connect(SSL_CTX *ctx); BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx); int BIO_ssl_copy_session_id(BIO *to, BIO *from); void BIO_ssl_shutdown(BIO *bio); long BIO_do_handshake(BIO *b);
DESCRIPTION
BIO_f_ssl() returns theI/O performed on an
If a
Calling BIO_reset() on an
If the close flag is set when an
BIO_set_ssl() sets the internal
BIO_get_ssl() retrieves the
BIO_set_ssl_mode() sets the
BIO_set_ssl_renegotiate_bytes() sets the renegotiate byte count to num. When set after every num bytes of I/O (read and write) the
BIO_set_ssl_renegotiate_timeout() sets the renegotiate timeout to seconds. When the renegotiate timeout elapses the session is automatically renegotiated.
BIO_get_num_renegotiates() returns the total number of session renegotiations due to I/O or timeout.
BIO_new_ssl() allocates an
BIO_new_ssl_connect() creates a new
BIO_new_buffer_ssl_connect() creates a new
BIO_ssl_copy_session_id() copies an
BIO_ssl_shutdown() closes down an
BIO_do_handshake() attempts to complete an
NOTES
The
Since unknown BIO_ctrl() operations are sent through filter BIOs the servers name and port can be set using BIO_set_host() on the
Applications do not have to call BIO_do_handshake() but may wish to do so to separate the handshake process from other I/O processing.
BIO_set_ssl(), BIO_get_ssl(), BIO_set_ssl_mode(), BIO_set_ssl_renegotiate_bytes(), BIO_set_ssl_renegotiate_timeout(), BIO_get_num_renegotiates(), and BIO_do_handshake() are implemented as macros.
EXAMPLE
This
BIO *sbio, *out; int len; char tmpbuf[1024]; SSL_CTX *ctx; SSL *ssl; /* XXX Seed the PRNG if needed. */ ctx = SSL_CTX_new(TLS_client_method()); /* XXX Set verify paths and mode here. */ sbio = BIO_new_ssl_connect(ctx); BIO_get_ssl(sbio, &ssl); if (ssl == NULL) { fprintf(stderr, "Can't locate SSL pointer\n"); ERR_print_errors_fp(stderr); exit(1); } /* Don't want any retries */ SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); /* XXX We might want to do other things with ssl here */ /* An empty host part means the loopback address */ BIO_set_conn_hostname(sbio, ":https"); out = BIO_new_fp(stdout, BIO_NOCLOSE); if (BIO_do_connect(sbio) <= 0) { fprintf(stderr, "Error connecting to server\n"); ERR_print_errors_fp(stderr); exit(1); } if (BIO_do_handshake(sbio) <= 0) { fprintf(stderr, "Error establishing SSL connection\n"); ERR_print_errors_fp(stderr); exit(1); } /* XXX Could examine ssl here to get connection info */ BIO_puts(sbio, "GET / HTTP/1.0\n\n"); for ( ; ; ) { len = BIO_read(sbio, tmpbuf, 1024); if (len <= 0) break; BIO_write(out, tmpbuf, len); } BIO_free_all(sbio); BIO_free(out);
Here is a simple server example. It makes use of a buffering
BIO *sbio, *bbio, *acpt, *out; int len; char tmpbuf[1024]; SSL_CTX *ctx; SSL *ssl; /* XXX Seed the PRNG if needed. */ ctx = SSL_CTX_new(TLS_server_method()); if (!SSL_CTX_use_certificate_file(ctx, "server.pem", SSL_FILETYPE_PEM) || !SSL_CTX_use_PrivateKey_file(ctx, "server.pem", SSL_FILETYPE_PEM) || !SSL_CTX_check_private_key(ctx)) { fprintf(stderr, "Error setting up SSL_CTX\n"); ERR_print_errors_fp(stderr); exit(1); } /* XXX Other things like set verify locations, EDH temp callbacks. */ /* New SSL BIO setup as server */ sbio = BIO_new_ssl(ctx, 0); BIO_get_ssl(sbio, &ssl); if (ssl == NULL) { fprintf(stderr, "Can't locate SSL pointer\n"); ERR_print_errors_fp(stderr); exit(1); } SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); bbio = BIO_new(BIO_f_buffer()); sbio = BIO_push(bbio, sbio); acpt = BIO_new_accept("4433"); /* * By doing this when a new connection is established * we automatically have sbio inserted into it. The * BIO chain is now 'swallowed' by the accept BIO and * will be freed when the accept BIO is freed. */ BIO_set_accept_bios(acpt, sbio); out = BIO_new_fp(stdout, BIO_NOCLOSE); /* Setup accept BIO */ if (BIO_do_accept(acpt) <= 0) { fprintf(stderr, "Error setting up accept BIO\n"); ERR_print_errors_fp(stderr); exit(1); } if (BIO_do_accept(acpt) <= 0) { fprintf(stderr, "Error in connection\n"); ERR_print_errors_fp(stderr); exit(1); } /* We only want one connection so remove and free accept BIO */ sbio = BIO_pop(acpt); BIO_free_all(acpt); if (BIO_do_handshake(sbio) <= 0) { fprintf(stderr, "Error in SSL handshake\n"); ERR_print_errors_fp(stderr); exit(1); } BIO_puts(sbio, "HTTP/1.0 200 OK\r\nContent-type: text/plain\r\n\r\n"); BIO_puts(sbio, "\r\nConnection Established\r\nRequest headers:\r\n"); BIO_puts(sbio, "--------------------------------------------------\r\n"); for ( ; ; ) { len = BIO_gets(sbio, tmpbuf, 1024); if (len <= 0) break; BIO_write(sbio, tmpbuf, len); BIO_write(out, tmpbuf, len); /* Look for blank line signifying end of headers*/ if (tmpbuf[0] == '\r' || tmpbuf[0] == '\n') break; } BIO_puts(sbio, "--------------------------------------------------\r\n"); BIO_puts(sbio, "\r\n"); BIO_flush(sbio); BIO_free_all(sbio);
BUGS
In OpenSSL versions before 1.0.0 the BIO_pop() call was handled incorrectly, the I/OCOPYRIGHT
Copyright 2000-2016 The OpenSSL Project Authors. All Rights Reserved.Licensed under the OpenSSL license (the ``License''). You may not use this file except in compliance with the License. You can obtain a copy in the file