=pod

=head1 NAME

SSL_client_version, SSL_get_version, SSL_is_dtls, SSL_version - get the
protocol information of a connection

=head1 SYNOPSIS

 #include <openssl/ssl.h>

 int SSL_client_version(const SSL *s);

 const char *SSL_get_version(const SSL *ssl);

 int SSL_is_dtls(const SSL *ssl);

 int SSL_version(const SSL *s);

=head1 DESCRIPTION

SSL_client_version() returns the numeric protocol version advertised by the
client in the legacy_version field of the ClientHello when initiating the
connection. Note that, for TLS, this value will never indicate a version greater
than TLSv1.2 even if TLSv1.3 is subsequently negotiated. SSL_get_version()
returns the name of the protocol used for the connection. SSL_version() returns
the numeric protocol version used for the connection. They should only be called
after the initial handshake has been completed. Prior to that the results
returned from these functions may be unreliable.

SSL_is_dtls() returns one if the connection is using DTLS, zero if not.

=head1 RETURN VALUES


SSL_get_version() returns one of the following strings:

=over 4

=item SSLv3

The connection uses the SSLv3 protocol.

=item TLSv1

The connection uses the TLSv1.0 protocol.

=item TLSv1.1

The connection uses the TLSv1.1 protocol.

=item TLSv1.2

The connection uses the TLSv1.2 protocol.

=item TLSv1.3

The connection uses the TLSv1.3 protocol.

=item unknown

This indicates an unknown protocol version.

=back

SSL_version() and SSL_client_version() return an integer which could include any
of the following:

=over 4

=item SSL3_VERSION

The connection uses the SSLv3 protocol.

=item TLS1_VERSION

The connection uses the TLSv1.0 protocol.

=item TLS1_1_VERSION

The connection uses the TLSv1.1 protocol.

=item TLS1_2_VERSION

The connection uses the TLSv1.2 protocol.

=item TLS1_3_VERSION

The connection uses the TLSv1.3 protocol (never returned for
SSL_client_version()).

=back

=head1 SEE ALSO

L<ssl(7)>

=head1 HISTORY

The SSL_is_dtls() function was added in OpenSSL 1.1.0.

=head1 COPYRIGHT

Copyright 2001-2018 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the Apache License 2.0 (the "License").  You may not use
this file except in compliance with the License.  You can obtain a copy
in the file LICENSE in the source distribution or at
L<https://www.openssl.org/source/license.html>.

=cut
