Fix SSL_VERIFY_CLIENT_ONCE
authorMatt Caswell <matt@openssl.org>
Tue, 22 Nov 2016 16:23:22 +0000 (16:23 +0000)
committerMatt Caswell <matt@openssl.org>
Mon, 23 Jan 2017 14:09:10 +0000 (14:09 +0000)
commitc25d172a5845824e225db91ef87c7f8d0ea803e6
tree6b85f0e966b3aa75ed63dadbedd948ce0c93daeb
parentf31917afc4fbc9061a1dc41f9a660dcb5537bf78
Fix SSL_VERIFY_CLIENT_ONCE

The flag SSL_VERIFY_CLIENT_ONCE is documented as follows:

  B<Server mode:> only request a client certificate on the initial TLS/SSL
  handshake. Do not ask for a client certificate again in case of a
  renegotiation. This flag must be used together with SSL_VERIFY_PEER.

  B<Client mode:> ignored

But the implementation actually did nothing. After the server sends its
ServerKeyExchange message, the code was checking s->session->peer to see if
it is NULL. If it was set then it did not ask for another client
certificate. However s->session->peer will only be set in the event of a
resumption, but a ServerKeyExchange message is only sent in the event of a
full handshake (i.e. no resumption).

The documentation suggests that the original intention was for this to
have an effect on renegotiation, and resumption doesn't come into it.

The fix is to properly check for renegotiation, not whether there is already
a client certificate in the session.

As far as I can tell this has been broken for a *long* time.

Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/1983)
ssl/statem/statem_srvr.c