Randomize the order of TLS extensions
authortb <tb@openbsd.org>
Sun, 23 Apr 2023 18:51:53 +0000 (18:51 +0000)
committertb <tb@openbsd.org>
Sun, 23 Apr 2023 18:51:53 +0000 (18:51 +0000)
commitf45f5ef68bf74d46542ab90686b4465a9d2c8bb7
tree08bcd278f63e858c1a6f039f2fbf1316a9ce2377
parentbe82246fa6d2ed41b36408de60ad9512878fa3a9
Randomize the order of TLS extensions

On creation of an SSL using SSL_new(), randomize the order in which the
extensions will be sent. There are several constraints: the PSK extension
must always come last. The order cannot be randomized on a per-message
basis as the strict interpretation of the standard chosen in the CH hashing
doesn't allow changing the order between first and second ClientHello.

Another constraint is that the current code calls callbacks directly on
parsing an extension, which means that the order callbacks are called
depends on the order in which the peer sent the extensions. This results
in breaking apache-httpd setups using virtual hosts with full ranomization
because virtual hosts don't work if the SNI is unknown at the time the
ALPN callback is called. So for the time being, we ensure that SNI always
precedes ALPN to avoid issues until this issue is fixed.

This is based on an idea by David Benjamin
https://boringssl-review.googlesource.com/c/boringssl/+/48045

Input & ok jsing
lib/libssl/ssl_lib.c
lib/libssl/ssl_local.h
lib/libssl/ssl_tlsext.c
lib/libssl/ssl_tlsext.h