
=pod

=head1 NAME

SSL - OpenSSL SSL/TLS library

=head1 SYNOPSIS

=head1 DESCRIPTION

The OpenSSL B<ssl> library implements the Secure Sockets Layer (SSL v2/v3) and
Transport Layer Security (TLS v1) protocols. It provides a rich API which is
documented here.

At first the library must be initialized; see
L<SSL_library_init(3)>.

Then an B<SSL_CTX> object is created as a framework to establish
TLS/SSL enabled connections (see L<SSL_CTX_new(3)>).
Various options regarding certificates, algorithms etc. can be set
in this object.

When a network connection has been created, it can be assigned to an
B<SSL> object. After the B<SSL> object has been created using
L<SSL_new(3)>, L<SSL_set_fd(3)> or
L<SSL_set_bio(3)> can be used to associate the network
connection with the object.

Then the TLS/SSL handshake is performed using
L<SSL_accept(3)> or L<SSL_connect(3)>
respectively.
L<SSL_read(3)> and L<SSL_write(3)> are used
to read and write data on the TLS/SSL connection.
L<SSL_shutdown(3)> can be used to shut down the
TLS/SSL connection.

=head1 DATA STRUCTURES

Currently the OpenSSL B<ssl> library functions deals with the following data
structures:

=over 4

=item B<SSL_METHOD> (SSL Method)

That's a dispatch structure describing the internal B<ssl> library
methods/functions which implement the various protocol versions (SSLv3
TLSv1, ...). It's needed to create an B<SSL_CTX>.

=item B<SSL_CIPHER> (SSL Cipher)

This structure holds the algorithm information for a particular cipher which
are a core part of the SSL/TLS protocol. The available ciphers are configured
on a B<SSL_CTX> basis and the actually used ones are then part of the
B<SSL_SESSION>.

=item B<SSL_CTX> (SSL Context)

That's the global context structure which is created by a server or client
once per program life-time and which holds mainly default values for the
B<SSL> structures which are later created for the connections.

=item B<SSL_SESSION> (SSL Session)

This is a structure containing the current TLS/SSL session details for a
connection: B<SSL_CIPHER>s, client and server certificates, keys, etc.

=item B<SSL> (SSL Connection)

That's the main SSL/TLS structure which is created by a server or client per
established connection. This actually is the core structure in the SSL API.
Under run-time the application usually deals with this structure which has
links to mostly all other structures.

=back


=head1 HEADER FILES

Currently the OpenSSL B<ssl> library provides the following C header files
containing the prototypes for the data structures and and functions:

=over 4

=item B<ssl.h>

That's the common header file for the SSL/TLS API.  Include it into your
program to make the API of the B<ssl> library available. It internally
includes both more private SSL headers and headers from the B<crypto> library.
Whenever you need hard-core details on the internals of the SSL API, look
inside this header file.

=item B<ssl2.h>

That's the sub header file dealing with the SSLv2 protocol only.
I<Usually you don't have to include it explicitly because
it's already included by ssl.h>.

=item B<ssl3.h>

That's the sub header file dealing with the SSLv3 protocol only.
I<Usually you don't have to include it explicitly because
it's already included by ssl.h>.

=item B<tls1.h>

That's the sub header file dealing with the TLSv1 protocol only.
I<Usually you don't have to include it explicitly because
it's already included by ssl.h>.

=back

=head1 API FUNCTIONS

Currently the OpenSSL B<ssl> library exports 214 API functions.
They are documented in the following:

=head2 DEALING WITH PROTOCOL METHODS

Here we document the various API functions which deal with the SSL/TLS
protocol methods defined in B<SSL_METHOD> structures.

=over 4

=item const SSL_METHOD *B<SSLv3_client_method>(void);

Constructor for the SSLv3 SSL_METHOD structure for a dedicated client.

=item const SSL_METHOD *B<SSLv3_server_method>(void);

Constructor for the SSLv3 SSL_METHOD structure for a dedicated server.

=item const SSL_METHOD *B<SSLv3_method>(void);

Constructor for the SSLv3 SSL_METHOD structure for combined client and server.

=item const SSL_METHOD *B<TLSv1_client_method>(void);

Constructor for the TLSv1 SSL_METHOD structure for a dedicated client.

=item const SSL_METHOD *B<TLSv1_server_method>(void);

Constructor for the TLSv1 SSL_METHOD structure for a dedicated server.

=item const SSL_METHOD *B<TLSv1_method>(void);

Constructor for the TLSv1 SSL_METHOD structure for combined client and server.

=back

=head2 DEALING WITH CIPHERS

Here we document the various API functions which deal with the SSL/TLS
ciphers defined in B<SSL_CIPHER> structures.

=over 4

=item char *B<SSL_CIPHER_description>(SSL_CIPHER *cipher, char *buf, int len);

Write a string to I<buf> (with a maximum size of I<len>) containing a human
readable description of I<cipher>. Returns I<buf>.

=item int B<SSL_CIPHER_get_bits>(SSL_CIPHER *cipher, int *alg_bits);

Determine the number of bits in I<cipher>. Because of export crippled ciphers
there are two bits: The bits the algorithm supports in general (stored to
I<alg_bits>) and the bits which are actually used (the return value).

=item const char *B<SSL_CIPHER_get_name>(SSL_CIPHER *cipher);

Return the internal name of I<cipher> as a string. These are the various
strings defined by the I<SSL3_TXT_xxx> and I<TLS1_TXT_xxx>
definitions in the header files.

=item char *B<SSL_CIPHER_get_version>(SSL_CIPHER *cipher);

Returns a string like "C<TLSv1/SSLv3>" or "C<SSLv2>" which indicates the
SSL/TLS protocol version to which I<cipher> belongs (i.e. where it was defined
in the specification the first time).

=back

=head2 DEALING WITH PROTOCOL CONTEXTS

Here we document the various API functions which deal with the SSL/TLS
protocol context defined in the B<SSL_CTX> structure.

=over 4

=item int B<SSL_CTX_add_client_CA>(SSL_CTX *ctx, X509 *x);

=item long B<SSL_CTX_add_extra_chain_cert>(SSL_CTX *ctx, X509 *x509);

=item int B<SSL_CTX_add_session>(SSL_CTX *ctx, SSL_SESSION *c);

=item int B<SSL_CTX_check_private_key>(const SSL_CTX *ctx);

=item long B<SSL_CTX_ctrl>(SSL_CTX *ctx, int cmd, long larg, char *parg);

=item void B<SSL_CTX_flush_sessions>(SSL_CTX *s, long t);

=item void B<SSL_CTX_free>(SSL_CTX *a);

=item char *B<SSL_CTX_get_app_data>(SSL_CTX *ctx);

=item X509_STORE *B<SSL_CTX_get_cert_store>(SSL_CTX *ctx);

=item STACK *B<SSL_CTX_get_client_CA_list>(const SSL_CTX *ctx);

=item int (*B<SSL_CTX_get_client_cert_cb>(SSL_CTX *ctx))(SSL *ssl, X509 **x509, EVP_PKEY **pkey);

=item void B<SSL_CTX_get_default_read_ahead>(SSL_CTX *ctx);

=item char *B<SSL_CTX_get_ex_data>(const SSL_CTX *s, int idx);

=item int B<SSL_CTX_get_ex_new_index>(long argl, char *argp, int (*new_func);(void), int (*dup_func)(void), void (*free_func)(void))

=item void (*B<SSL_CTX_get_info_callback>(SSL_CTX *ctx))(SSL *ssl, int cb, int ret);

=item int B<SSL_CTX_get_quiet_shutdown>(const SSL_CTX *ctx);

=item void B<SSL_CTX_get_read_ahead>(SSL_CTX *ctx);

=item int B<SSL_CTX_get_session_cache_mode>(SSL_CTX *ctx);

=item long B<SSL_CTX_get_timeout>(const SSL_CTX *ctx);

=item int (*B<SSL_CTX_get_verify_callback>(const SSL_CTX *ctx))(int ok, X509_STORE_CTX *ctx);

=item int B<SSL_CTX_get_verify_mode>(SSL_CTX *ctx);

=item int B<SSL_CTX_load_verify_locations>(SSL_CTX *ctx, char *CAfile, char *CApath);

=item long B<SSL_CTX_need_tmp_RSA>(SSL_CTX *ctx);

=item SSL_CTX *B<SSL_CTX_new>(const SSL_METHOD *meth);

=item int B<SSL_CTX_remove_session>(SSL_CTX *ctx, SSL_SESSION *c);

=item int B<SSL_CTX_sess_accept>(SSL_CTX *ctx);

=item int B<SSL_CTX_sess_accept_good>(SSL_CTX *ctx);

=item int B<SSL_CTX_sess_accept_renegotiate>(SSL_CTX *ctx);

=item int B<SSL_CTX_sess_cache_full>(SSL_CTX *ctx);

=item int B<SSL_CTX_sess_cb_hits>(SSL_CTX *ctx);

=item int B<SSL_CTX_sess_connect>(SSL_CTX *ctx);

=item int B<SSL_CTX_sess_connect_good>(SSL_CTX *ctx);

=item int B<SSL_CTX_sess_connect_renegotiate>(SSL_CTX *ctx);

=item int B<SSL_CTX_sess_get_cache_size>(SSL_CTX *ctx);

=item SSL_SESSION *(*B<SSL_CTX_sess_get_get_cb>(SSL_CTX *ctx))(SSL *ssl, unsigned char *data, int len, int *copy);

=item int (*B<SSL_CTX_sess_get_new_cb>(SSL_CTX *ctx)(SSL *ssl, SSL_SESSION *sess);

=item void (*B<SSL_CTX_sess_get_remove_cb>(SSL_CTX *ctx)(SSL_CTX *ctx, SSL_SESSION *sess);

=item int B<SSL_CTX_sess_hits>(SSL_CTX *ctx);

=item int B<SSL_CTX_sess_misses>(SSL_CTX *ctx);

=item int B<SSL_CTX_sess_number>(SSL_CTX *ctx);

=item void B<SSL_CTX_sess_set_cache_size>(SSL_CTX *ctx,t);

=item void B<SSL_CTX_sess_set_get_cb>(SSL_CTX *ctx, SSL_SESSION *(*cb)(SSL *ssl, unsigned char *data, int len, int *copy));

=item void B<SSL_CTX_sess_set_new_cb>(SSL_CTX *ctx, int (*cb)(SSL *ssl, SSL_SESSION *sess));

=item void B<SSL_CTX_sess_set_remove_cb>(SSL_CTX *ctx, void (*cb)(SSL_CTX *ctx, SSL_SESSION *sess));

=item int B<SSL_CTX_sess_timeouts>(SSL_CTX *ctx);

=item LHASH *B<SSL_CTX_sessions>(SSL_CTX *ctx);

=item void B<SSL_CTX_set_app_data>(SSL_CTX *ctx, void *arg);

=item void B<SSL_CTX_set_cert_store>(SSL_CTX *ctx, X509_STORE *cs);

=item void B<SSL_CTX_set_cert_verify_cb>(SSL_CTX *ctx, int (*cb)(), char *arg)

=item int B<SSL_CTX_set_cipher_list>(SSL_CTX *ctx, char *str);

=item void B<SSL_CTX_set_client_CA_list>(SSL_CTX *ctx, STACK *list);

=item void B<SSL_CTX_set_client_cert_cb>(SSL_CTX *ctx, int (*cb)(SSL *ssl, X509 **x509, EVP_PKEY **pkey));

=item void B<SSL_CTX_set_default_passwd_cb>(SSL_CTX *ctx, int (*cb);(void))

=item void B<SSL_CTX_set_default_read_ahead>(SSL_CTX *ctx, int m);

=item int B<SSL_CTX_set_default_verify_paths>(SSL_CTX *ctx);

Use the default paths to locate trusted CA certificates. There is one default
directory path and one default file path. Both are set via this call.

=item int B<SSL_CTX_set_default_verify_dir>(SSL_CTX *ctx)

Use the default directory path to locate trusted CA certficates.

=item int B<SSL_CTX_set_default_verify_file>(SSL_CTX *ctx)

Use the file path to locate trusted CA certficates.

=item int B<SSL_CTX_set_ex_data>(SSL_CTX *s, int idx, char *arg);

=item void B<SSL_CTX_set_info_callback>(SSL_CTX *ctx, void (*cb)(SSL *ssl, int cb, int ret));

=item void B<SSL_CTX_set_msg_callback>(SSL_CTX *ctx, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg));

=item void B<SSL_CTX_set_msg_callback_arg>(SSL_CTX *ctx, void *arg);

=item void B<SSL_CTX_set_options>(SSL_CTX *ctx, unsigned long op);

=item void B<SSL_CTX_set_quiet_shutdown>(SSL_CTX *ctx, int mode);

=item void B<SSL_CTX_set_read_ahead>(SSL_CTX *ctx, int m);

=item void B<SSL_CTX_set_session_cache_mode>(SSL_CTX *ctx, int mode);

=item int B<SSL_CTX_set_ssl_version>(SSL_CTX *ctx, const SSL_METHOD *meth);

=item void B<SSL_CTX_set_timeout>(SSL_CTX *ctx, long t);

=item long B<SSL_CTX_set_tmp_dh>(SSL_CTX* ctx, DH *dh);

=item long B<SSL_CTX_set_tmp_dh_callback>(SSL_CTX *ctx, DH *(*cb)(void));

=item long B<SSL_CTX_set_tmp_rsa>(SSL_CTX *ctx, RSA *rsa);

=item SSL_CTX_set_tmp_rsa_callback

C<long B<SSL_CTX_set_tmp_rsa_callback>(SSL_CTX *B<ctx>, RSA *(*B<cb>)(SSL *B<ssl>, int B<export>, int B<keylength>));>

Sets the callback which will be called when a temporary private key is
required. The B<C<export>> flag will be set if the reason for needing
a temp key is that an export ciphersuite is in use, in which case,
B<C<keylength>> will contain the required keylength in bits. Generate a key of
appropriate size (using ???) and return it.

=item SSL_set_tmp_rsa_callback

long B<SSL_set_tmp_rsa_callback>(SSL *ssl, RSA *(*cb)(SSL *ssl, int export, int keylength));

The same as B<SSL_CTX_set_tmp_rsa_callback>, except it operates on an SSL
session instead of a context.

=item void B<SSL_CTX_set_verify>(SSL_CTX *ctx, int mode, int (*cb);(void))

=item int B<SSL_CTX_use_PrivateKey>(SSL_CTX *ctx, EVP_PKEY *pkey);

=item int B<SSL_CTX_use_PrivateKey_ASN1>(int type, SSL_CTX *ctx, unsigned char *d, long len);

=item int B<SSL_CTX_use_PrivateKey_file>(SSL_CTX *ctx, char *file, int type);

=item int B<SSL_CTX_use_RSAPrivateKey>(SSL_CTX *ctx, RSA *rsa);

=item int B<SSL_CTX_use_RSAPrivateKey_ASN1>(SSL_CTX *ctx, unsigned char *d, long len);

=item int B<SSL_CTX_use_RSAPrivateKey_file>(SSL_CTX *ctx, char *file, int type);

=item int B<SSL_CTX_use_certificate>(SSL_CTX *ctx, X509 *x);

=item int B<SSL_CTX_use_certificate_ASN1>(SSL_CTX *ctx, int len, unsigned char *d);

=item int B<SSL_CTX_use_certificate_file>(SSL_CTX *ctx, char *file, int type);

=item X509 *B<SSL_CTX_get0_certificate>(const SSL_CTX *ctx);

=item EVP_PKEY *B<SSL_CTX_get0_privatekey>(const SSL_CTX *ctx);

=item void B<SSL_CTX_set_psk_client_callback>(SSL_CTX *ctx, unsigned int (*callback)(SSL *ssl, const char *hint, char *identity, unsigned int max_identity_len, unsigned char *psk, unsigned int max_psk_len));

=item int B<SSL_CTX_use_psk_identity_hint>(SSL_CTX *ctx, const char *hint);

=item void B<SSL_CTX_set_psk_server_callback>(SSL_CTX *ctx, unsigned int (*callback)(SSL *ssl, const char *identity, unsigned char *psk, int max_psk_len));




=back

=head2 DEALING WITH SESSIONS

Here we document the various API functions which deal with the SSL/TLS
sessions defined in the B<SSL_SESSION> structures.

=over 4

=item int B<SSL_SESSION_cmp>(const SSL_SESSION *a, const SSL_SESSION *b);

=item void B<SSL_SESSION_free>(SSL_SESSION *ss);

=item char *B<SSL_SESSION_get_app_data>(SSL_SESSION *s);

=item char *B<SSL_SESSION_get_ex_data>(const SSL_SESSION *s, int idx);

=item int B<SSL_SESSION_get_ex_new_index>(long argl, char *argp, int (*new_func);(void), int (*dup_func)(void), void (*free_func)(void))

=item long B<SSL_SESSION_get_time>(const SSL_SESSION *s);

=item long B<SSL_SESSION_get_timeout>(const SSL_SESSION *s);

=item unsigned long B<SSL_SESSION_hash>(const SSL_SESSION *a);

=item SSL_SESSION *B<SSL_SESSION_new>(void);

=item int B<SSL_SESSION_print>(BIO *bp, const SSL_SESSION *x);

=item int B<SSL_SESSION_print_fp>(FILE *fp, const SSL_SESSION *x);

=item void B<SSL_SESSION_set_app_data>(SSL_SESSION *s, char *a);

=item int B<SSL_SESSION_set_ex_data>(SSL_SESSION *s, int idx, char *arg);

=item long B<SSL_SESSION_set_time>(SSL_SESSION *s, long t);

=item long B<SSL_SESSION_set_timeout>(SSL_SESSION *s, long t);

=back

=head2 DEALING WITH CONNECTIONS

Here we document the various API functions which deal with the SSL/TLS
connection defined in the B<SSL> structure.

=over 4

=item int B<SSL_accept>(SSL *ssl);

=item int B<SSL_add_dir_cert_subjects_to_stack>(STACK *stack, const char *dir);

=item int B<SSL_add_file_cert_subjects_to_stack>(STACK *stack, const char *file);

=item int B<SSL_add_client_CA>(SSL *ssl, X509 *x);

=item char *B<SSL_alert_desc_string>(int value);

=item char *B<SSL_alert_desc_string_long>(int value);

=item char *B<SSL_alert_type_string>(int value);

=item char *B<SSL_alert_type_string_long>(int value);

=item int B<SSL_check_private_key>(const SSL *ssl);

=item void B<SSL_clear>(SSL *ssl);

=item long B<SSL_clear_num_renegotiations>(SSL *ssl);

=item int B<SSL_connect>(SSL *ssl);

=item int B<SSL_copy_session_id>(SSL *t, const SSL *f);

Sets the session details for B<t> to be the same as in B<f>. Returns 1 on
success or 0 on failure.

=item long B<SSL_ctrl>(SSL *ssl, int cmd, long larg, char *parg);

=item int B<SSL_do_handshake>(SSL *ssl);

=item SSL *B<SSL_dup>(SSL *ssl);

=item STACK *B<SSL_dup_CA_list>(STACK *sk);

=item void B<SSL_free>(SSL *ssl);

=item SSL_CTX *B<SSL_get_SSL_CTX>(const SSL *ssl);

=item char *B<SSL_get_app_data>(SSL *ssl);

=item X509 *B<SSL_get_certificate>(const SSL *ssl);

=item const char *B<SSL_get_cipher>(const SSL *ssl);

=item int B<SSL_get_cipher_bits>(const SSL *ssl, int *alg_bits);

=item char *B<SSL_get_cipher_list>(const SSL *ssl, int n);

=item char *B<SSL_get_cipher_name>(const SSL *ssl);

=item char *B<SSL_get_cipher_version>(const SSL *ssl);

=item STACK *B<SSL_get_ciphers>(const SSL *ssl);

=item STACK *B<SSL_get_client_CA_list>(const SSL *ssl);

=item SSL_CIPHER *B<SSL_get_current_cipher>(SSL *ssl);

=item long B<SSL_get_default_timeout>(const SSL *ssl);

=item int B<SSL_get_error>(const SSL *ssl, int i);

=item char *B<SSL_get_ex_data>(const SSL *ssl, int idx);

=item int B<SSL_get_ex_data_X509_STORE_CTX_idx>(void);

=item int B<SSL_get_ex_new_index>(long argl, char *argp, int (*new_func);(void), int (*dup_func)(void), void (*free_func)(void))

=item int B<SSL_get_fd>(const SSL *ssl);

=item void (*B<SSL_get_info_callback>(const SSL *ssl);)()

=item STACK *B<SSL_get_peer_cert_chain>(const SSL *ssl);

=item X509 *B<SSL_get_peer_certificate>(const SSL *ssl);

=item EVP_PKEY *B<SSL_get_privatekey>(const SSL *ssl);

=item int B<SSL_get_quiet_shutdown>(const SSL *ssl);

=item BIO *B<SSL_get_rbio>(const SSL *ssl);

=item int B<SSL_get_read_ahead>(const SSL *ssl);

=item SSL_SESSION *B<SSL_get_session>(const SSL *ssl);

=item char *B<SSL_get_shared_ciphers>(const SSL *ssl, char *buf, int len);

=item int B<SSL_get_shutdown>(const SSL *ssl);

=item const SSL_METHOD *B<SSL_get_ssl_method>(SSL *ssl);

=item int B<SSL_get_state>(const SSL *ssl);

=item long B<SSL_get_time>(const SSL *ssl);

=item long B<SSL_get_timeout>(const SSL *ssl);

=item int (*B<SSL_get_verify_callback>(const SSL *ssl))(int,X509_STORE_CTX *)

=item int B<SSL_get_verify_mode>(const SSL *ssl);

=item long B<SSL_get_verify_result>(const SSL *ssl);

=item char *B<SSL_get_version>(const SSL *ssl);

=item BIO *B<SSL_get_wbio>(const SSL *ssl);

=item int B<SSL_in_accept_init>(SSL *ssl);

=item int B<SSL_in_before>(SSL *ssl);

=item int B<SSL_in_connect_init>(SSL *ssl);

=item int B<SSL_in_init>(SSL *ssl);

=item int B<SSL_is_init_finished>(SSL *ssl);

=item STACK *B<SSL_load_client_CA_file>(char *file);

=item void B<SSL_load_error_strings>(void);

=item SSL *B<SSL_new>(SSL_CTX *ctx);

=item long B<SSL_num_renegotiations>(SSL *ssl);

=item int B<SSL_peek>(SSL *ssl, void *buf, int num);

=item int B<SSL_pending>(const SSL *ssl);

=item int B<SSL_read>(SSL *ssl, void *buf, int num);

=item int B<SSL_renegotiate>(SSL *ssl);

=item char *B<SSL_rstate_string>(SSL *ssl);

=item char *B<SSL_rstate_string_long>(SSL *ssl);

=item long B<SSL_session_reused>(SSL *ssl);

=item void B<SSL_set_accept_state>(SSL *ssl);

=item void B<SSL_set_app_data>(SSL *ssl, char *arg);

=item void B<SSL_set_bio>(SSL *ssl, BIO *rbio, BIO *wbio);

=item int B<SSL_set_cipher_list>(SSL *ssl, char *str);

=item void B<SSL_set_client_CA_list>(SSL *ssl, STACK *list);

=item void B<SSL_set_connect_state>(SSL *ssl);

=item int B<SSL_set_ex_data>(SSL *ssl, int idx, char *arg);

=item int B<SSL_set_fd>(SSL *ssl, int fd);

=item void B<SSL_set_info_callback>(SSL *ssl, void (*cb);(void))

=item void B<SSL_set_msg_callback>(SSL *ctx, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg));

=item void B<SSL_set_msg_callback_arg>(SSL *ctx, void *arg);

=item void B<SSL_set_options>(SSL *ssl, unsigned long op);

=item void B<SSL_set_quiet_shutdown>(SSL *ssl, int mode);

=item void B<SSL_set_read_ahead>(SSL *ssl, int yes);

=item int B<SSL_set_rfd>(SSL *ssl, int fd);

=item int B<SSL_set_session>(SSL *ssl, SSL_SESSION *session);

=item void B<SSL_set_shutdown>(SSL *ssl, int mode);

=item int B<SSL_set_ssl_method>(SSL *ssl, const SSL_METHOD *meth);

=item void B<SSL_set_time>(SSL *ssl, long t);

=item void B<SSL_set_timeout>(SSL *ssl, long t);

=item void B<SSL_set_verify>(SSL *ssl, int mode, int (*callback);(void))

=item void B<SSL_set_verify_result>(SSL *ssl, long arg);

=item int B<SSL_set_wfd>(SSL *ssl, int fd);

=item int B<SSL_shutdown>(SSL *ssl);

=item OSSL_HANDSHAKE_STATE B<SSL_get_state>(const SSL *ssl);

Returns the current handshake state.

=item char *B<SSL_state_string>(const SSL *ssl);

=item char *B<SSL_state_string_long>(const SSL *ssl);

=item long B<SSL_total_renegotiations>(SSL *ssl);

=item int B<SSL_use_PrivateKey>(SSL *ssl, EVP_PKEY *pkey);

=item int B<SSL_use_PrivateKey_ASN1>(int type, SSL *ssl, unsigned char *d, long len);

=item int B<SSL_use_PrivateKey_file>(SSL *ssl, char *file, int type);

=item int B<SSL_use_RSAPrivateKey>(SSL *ssl, RSA *rsa);

=item int B<SSL_use_RSAPrivateKey_ASN1>(SSL *ssl, unsigned char *d, long len);

=item int B<SSL_use_RSAPrivateKey_file>(SSL *ssl, char *file, int type);

=item int B<SSL_use_certificate>(SSL *ssl, X509 *x);

=item int B<SSL_use_certificate_ASN1>(SSL *ssl, int len, unsigned char *d);

=item int B<SSL_use_certificate_file>(SSL *ssl, char *file, int type);

=item int B<SSL_version>(const SSL *ssl);

=item int B<SSL_want>(const SSL *ssl);

=item int B<SSL_want_nothing>(const SSL *ssl);

=item int B<SSL_want_read>(const SSL *ssl);

=item int B<SSL_want_write>(const SSL *ssl);

=item int B<SSL_want_x509_lookup>(const SSL *ssl);

=item int B<SSL_write>(SSL *ssl, const void *buf, int num);

=item void B<SSL_set_psk_client_callback>(SSL *ssl, unsigned int (*callback)(SSL *ssl, const char *hint, char *identity, unsigned int max_identity_len, unsigned char *psk, unsigned int max_psk_len));

=item int B<SSL_use_psk_identity_hint>(SSL *ssl, const char *hint);

=item void B<SSL_set_psk_server_callback>(SSL *ssl, unsigned int (*callback)(SSL *ssl, const char *identity, unsigned char *psk, int max_psk_len));

=item const char *B<SSL_get_psk_identity_hint>(SSL *ssl);

=item const char *B<SSL_get_psk_identity>(SSL *ssl);

=back

=head1 SEE ALSO

L<openssl(1)>, L<crypto(3)>,
L<SSL_accept(3)>, L<SSL_clear(3)>,
L<SSL_connect(3)>,
L<SSL_CIPHER_get_name(3)>,
L<SSL_COMP_add_compression_method(3)>,
L<SSL_CTX_add_extra_chain_cert(3)>,
L<SSL_CTX_add_session(3)>,
L<SSL_CTX_ctrl(3)>,
L<SSL_CTX_flush_sessions(3)>,
L<SSL_CTX_get_ex_new_index(3)>,
L<SSL_CTX_get_verify_mode(3)>,
L<SSL_CTX_load_verify_locations(3)>
L<SSL_CTX_new(3)>,
L<SSL_CTX_sess_number(3)>,
L<SSL_CTX_sess_set_cache_size(3)>,
L<SSL_CTX_sess_set_get_cb(3)>,
L<SSL_CTX_sessions(3)>,
L<SSL_CTX_set_cert_store(3)>,
L<SSL_CTX_set_cert_verify_callback(3)>,
L<SSL_CTX_set_cipher_list(3)>,
L<SSL_CTX_set_client_CA_list(3)>,
L<SSL_CTX_set_client_cert_cb(3)>,
L<SSL_CTX_set_default_passwd_cb(3)>,
L<SSL_CTX_set_generate_session_id(3)>,
L<SSL_CTX_set_info_callback(3)>,
L<SSL_CTX_set_max_cert_list(3)>,
L<SSL_CTX_set_mode(3)>,
L<SSL_CTX_set_msg_callback(3)>,
L<SSL_CTX_set_options(3)>,
L<SSL_CTX_set_quiet_shutdown(3)>,
L<SSL_CTX_set_read_ahead(3)>,
L<SSL_CTX_set_session_cache_mode(3)>,
L<SSL_CTX_set_session_id_context(3)>,
L<SSL_CTX_set_ssl_version(3)>,
L<SSL_CTX_set_timeout(3)>,
L<SSL_CTX_set_tmp_rsa_callback(3)>,
L<SSL_CTX_set_tmp_dh_callback(3)>,
L<SSL_CTX_set_verify(3)>,
L<SSL_CTX_use_certificate(3)>,
L<SSL_alert_type_string(3)>,
L<SSL_do_handshake(3)>,
L<SSL_get_SSL_CTX(3)>,
L<SSL_get_ciphers(3)>,
L<SSL_get_client_CA_list(3)>,
L<SSL_get_default_timeout(3)>,
L<SSL_get_error(3)>,
L<SSL_get_ex_data_X509_STORE_CTX_idx(3)>,
L<SSL_get_ex_new_index(3)>,
L<SSL_get_fd(3)>,
L<SSL_get_peer_cert_chain(3)>,
L<SSL_get_rbio(3)>,
L<SSL_get_session(3)>,
L<SSL_get_verify_result(3)>,
L<SSL_get_version(3)>,
L<SSL_library_init(3)>,
L<SSL_load_client_CA_file(3)>,
L<SSL_new(3)>,
L<SSL_pending(3)>,
L<SSL_read(3)>,
L<SSL_rstate_string(3)>,
L<SSL_session_reused(3)>,
L<SSL_set_bio(3)>,
L<SSL_set_connect_state(3)>,
L<SSL_set_fd(3)>,
L<SSL_set_session(3)>,
L<SSL_set_shutdown(3)>,
L<SSL_shutdown(3)>,
L<SSL_state_string(3)>,
L<SSL_want(3)>,
L<SSL_write(3)>,
L<SSL_SESSION_free(3)>,
L<SSL_SESSION_get_ex_new_index(3)>,
L<SSL_SESSION_get_time(3)>,
L<d2i_SSL_SESSION(3)>,
L<SSL_CTX_set_psk_client_callback(3)>,
L<SSL_CTX_use_psk_identity_hint(3)>,
L<SSL_get_psk_identity(3)>,
L<DTLSv1_listen(3)|DTLSv1_listen(3)>

=head1 HISTORY

B<SSLv2_client_method>, B<SSLv2_server_method> and B<SSLv2_method> where removed
in OpenSSL 1.1.0.

The return type of B<SSL_copy_session_id> was changed from void to int in
OpenSSL 1.1.0.

=cut

