Forcibly update the EVP_PKEY's internal key
authorop <op@openbsd.org>
Thu, 25 May 2023 07:46:21 +0000 (07:46 +0000)
committerop <op@openbsd.org>
Thu, 25 May 2023 07:46:21 +0000 (07:46 +0000)
commit508824d40368da803a3da7e0c87c1127f6c01f6b
treea44ca242c2305a1e4b40589f3b240d643c2366aa
parent4f92c6a3f15930d91b3488d8bb79d1e128fa5386
Forcibly update the EVP_PKEY's internal key

To aid privilege separation, libtls maintains application-specific data
on the key inside the EVP_PKEY abstraction because the EVP API doesn't
provide a way to do that on the EVP_PKEY itself.

OpenSSL 3 changed behavior of EVP_PKEY_get1_RSA() and related functions.
These now return a struct from some cache.  Thus, modifying the RSA will
no longer modify the EVP_PKEY like it did previously, which was clearly
implied to be the case in the older documentation.
This is a subtle breaking change that affects several applications.

While this is documented, no real solution is provided.  The transition
plan from one OpenSSL major version to the next one tends to involve
many #ifdef in the ecosystem, and the only suggestion provided by the
new documentation is to switch to a completely unrelated, new API.

Instead, forcibly reset the internal key on EVP_PKEY after modification,
this way the change is picked up also by OpenSSL 3.

Fixes issue 1171 in OpenSMTPD-portable

ok tb@, jsing@
lib/libtls/tls.c