Implement RSA key exchange in constant time.
authorjsing <jsing@openbsd.org>
Tue, 25 Jun 2024 14:10:45 +0000 (14:10 +0000)
committerjsing <jsing@openbsd.org>
Tue, 25 Jun 2024 14:10:45 +0000 (14:10 +0000)
commitb9e57b4b81ec7fe86a6dbf7b3b1bd36cdc3b0190
tree1e4e5d86d2e1faa80ff9c1a234b4a3157091f816
parenta48c3ad520a06455cd53ecf8a67a6b70290f8f52
Implement RSA key exchange in constant time.

RSA key exchange is known to have multiple security weaknesses,
including being potentially susceptible to padding oracle and timing
attacks.

The RSA key exchange code that we inherited from OpenSSL was riddled
with timing leaks, many of which we fixed (or minimised) early on.
However, a number of issues still remained, particularly those
related to libcrypto's RSA decryption and padding checks.

Rework the RSA key exchange code such that we decrypt with
RSA_NO_PADDING and then check the padding ourselves in constant
time. In this case, the pre-master secret is of a known length,
hence the padding is also a known length based on the size of the
RSA key. This makes it easy to implement a check that is much safer
than having RSA_private_decrypt() depad for us.

Regardless, we still strongly recommend disabling RSA key exchange
and using other key exchange methods that provide perfect forward
secrecy and do not depend on client generated keys.

Thanks to Marcel Maehren, Nurullah Erinola, Robert Merget, Juraj
Somorovsky, Joerg Schwenk and Hubert Kario for raising these issues
with us at various points in time.

ok tb@
lib/libssl/Makefile
lib/libssl/ssl_local.h
lib/libssl/ssl_srvr.c