=pod

=head1 NAME

SSL_key_update,
SSL_get_key_update_type,
SSL_renegotiate,
SSL_renegotiate_abbreviated,
SSL_renegotiate_pending
- initiate and obtain information about updating connection keys

=head1 SYNOPSIS

 #include <openssl/ssl.h>

 int SSL_key_update(SSL *s, int updatetype);
 int SSL_get_key_update_type(SSL *s);

 int SSL_renegotiate(SSL *s);
 int SSL_renegotiate_abbreviated(SSL *s);
 int SSL_renegotiate_pending(SSL *s);

=head1 DESCRIPTION

SSL_key_update() schedules an update of the keys for the current TLS connection.
If the B<updatetype> parameter is set to B<SSL_KEY_UPDATE_NOT_REQUESTED> then
the sending keys for this connection will be updated and the peer will be
informed of the change. If the B<updatetype> parameter is set to
B<SSL_KEY_UPDATE_REQUESTED> then the sending keys for this connection will be
updated and the peer will be informed of the change along with a request for the
peer to additionally update its sending keys. It is an error if B<updatetype> is
set to B<SSL_KEY_UPDATE_NONE>.

SSL_key_update() must only be called after the initial handshake has been
completed and TLSv1.3 has been negotiated. The key update will not take place
until the next time an IO operation such as SSL_read_ex() or SSL_write_ex()
takes place on the connection. Alternatively SSL_do_handshake() can be called to
force the update to take place immediately.

SSL_get_key_update_type() can be used to determine whether a key update
operation has been scheduled but not yet performed. The type of the pending key
update operation will be returned if there is one, or SSL_KEY_UPDATE_NONE
otherwise.

SSL_renegotiate() and SSL_renegotiate_abbreviated() should only be called for
connections that have negotiated TLSv1.2 or less. Calling them on any other
connection will result in an error.

When called from the client side, SSL_renegotiate() schedules a completely new
handshake over an existing SSL/TLS connection. The next time an IO operation
such as SSL_read_ex() or SSL_write_ex() takes place on the connection a check
will be performed to confirm that it is a suitable time to start a
renegotiation. If so, then it will be initiated immediately. OpenSSL will not
attempt to resume any session associated with the connection in the new
handshake.

When called from the client side, SSL_renegotiate_abbreviated() works in the
same was as SSL_renegotiate() except that OpenSSL will attempt to resume the
session associated with the current connection in the new handshake.

When called from the server side, SSL_renegotiate() and
SSL_renegotiate_abbreviated() behave identically. They both schedule a request
for a new handshake to be sent to the client. The next time an IO operation is
performed then the same checks as on the client side are performed and then, if
appropriate, the request is sent. The client may or may not respond with a new
handshake and it may or may not attempt to resume an existing session. If
a new handshake is started then this will be handled transparently by calling
any OpenSSL IO function.

If an OpenSSL client receives a renegotiation request from a server then again
this will be handled transparently through calling any OpenSSL IO function. For
a TLS connection the client will attempt to resume the current session in the
new handshake. For historical reasons, DTLS clients will not attempt to resume
the session in the new handshake.

The SSL_renegotiate_pending() function returns 1 if a renegotiation or
rengotiation request has been scheduled but not yet acted on, or 0 otherwise.

=head1 RETURN VALUES

SSL_key_update(), SSL_renegotiate() and SSL_renegotiate_abbreviated() return 1
on success or 0 on error.

SSL_get_key_update_type() returns the update type of the pending key update
operation or SSL_KEY_UPDATE_NONE if there is none.

SSL_renegotiate_pending() returns 1 if a renegotiation or rengotiation request
has been scheduled but not yet acted on, or 0 otherwise.

=head1 SEE ALSO

L<ssl(7)>, L<SSL_read_ex(3)>,
L<SSL_write_ex(3)>,
L<SSL_do_handshake(3)>

=head1 HISTORY

The SSL_key_update() and SSL_get_key_update_type() functions were added in
OpenSSL 1.1.1.

=head1 COPYRIGHT

Copyright 2017 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 LICENSE in the source distribution or at
L<https://www.openssl.org/source/license.html>.

=cut
