Do not ignore SSL_TLSEXT_ERR_FATAL from the ALPN callback
authortb <tb@openbsd.org>
Fri, 10 Sep 2021 09:25:29 +0000 (09:25 +0000)
committertb <tb@openbsd.org>
Fri, 10 Sep 2021 09:25:29 +0000 (09:25 +0000)
commit715d5aefa6ef8d68edfb816a5a8900b9fb5a3bb3
tree929eafb105fcb05fc5485d8141cf589bbfb67798
parenta096d42e2ef6d92064a8ee5211e80718e4895236
Do not ignore SSL_TLSEXT_ERR_FATAL from the ALPN callback

As reported by Jeremy Harris, we inherited a strange behavior from
OpenSSL, in that we ignore the SSL_TLSEXT_ERR_FATAL return from the
ALPN callback. RFC 7301, 3.2 states: 'In the event that the server
supports no protocols that the client advertises, then the server
SHALL respond with a fatal "no_application_protocol" alert.'

Honor this requirement and succeed only on SSL_TLSEXT_ERR_{OK,NOACK}
which is the current behavior of OpenSSL. The documentation change
is taken from OpenSSL 1.1.1 as well.

As pointed out by jsing, there is more to be fixed here:
- ensure that the same protocol is selected on session resumption
- should the callback be called even if no ALPN extension was sent?
- ensure for TLSv1.2 and earlier that the SNI has already been processed

ok beck jsing
lib/libssl/man/SSL_CTX_set_alpn_select_cb.3
lib/libssl/ssl.h
lib/libssl/ssl_err.c
lib/libssl/ssl_tlsext.c