
=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.

=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<ssl23.h>

That's the sub header file dealing with the combined use of the SSLv2 and
SSLv3 protocols.
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 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 (SSLv1, SSLv2
and 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 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 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 SSL_METHOD *B<SSLv2_client_method>(void);

Constructor for the SSLv2 SSL_METHOD structure for a dedicated client.

=item SSL_METHOD *B<SSLv2_server_method>(void);

Constructor for the SSLv2 SSL_METHOD structure for a dedicated server.

=item SSL_METHOD *B<SSLv2_method>(void);

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

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

Constructor for the SSLv3 SSL_METHOD structure for a dedicated client.

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

Constructor for the SSLv3 SSL_METHOD structure for a dedicated server.

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

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

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

Constructor for the TLSv1 SSL_METHOD structure for a dedicated client.

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

Constructor for the TLSv1 SSL_METHOD structure for a dedicated server.

=item 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 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<SSL2_TXT_xxx>, 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>(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>(SSL_CTX *ctx);

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

=item char *B<SSL_CTX_get_ex_data>(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>(SSL_CTX *ctx);

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

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

=item int (*B<SSL_CTX_get_verify_callback>(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>(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)(SSL_CTX *), 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);

=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_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_session_cache_mode>(SSL_CTX *ctx, int mode);

=item int B<SSL_CTX_set_ssl_version>(SSL_CTX *ctx, 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 L<"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);

=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>(SSL_SESSION *a, 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>(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>(SSL_SESSION *s);

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

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

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

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

=item int B<SSL_SESSION_print_fp>(FILE *fp, 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>(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 void B<SSL_copy_session_id>(SSL *t, SSL *f);

=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>(SSL *ssl);

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

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

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

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

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

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

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

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

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

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

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

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

=item char *B<SSL_get_ex_data>(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>(SSL *ssl);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

=item BIO *B<SSL_get_wbio>(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, char *buf, int num);

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

=item int B<SSL_read>(SSL *ssl, char *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_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, 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 int B<SSL_state>(SSL *ssl);

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

=item char *B<SSL_state_string_long>(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>(SSL *ssl);

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

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

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

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

=item int B<SSL_want_x509_lookup>(s);

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

=back

=head1 SEE ALSO

L<openssl(1)|openssl(1)>, L<crypto(3)|crypto(3)>,
L<SSL_get_error(3)|SSL_get_error(3)>

=head1 HISTORY

The L<ssl(3)|ssl(3)> document appeared in OpenSSL 0.9.2

=cut

