Fix key share negotiation in HRR case
authortb <tb@openbsd.org>
Tue, 16 Apr 2024 17:46:30 +0000 (17:46 +0000)
committertb <tb@openbsd.org>
Tue, 16 Apr 2024 17:46:30 +0000 (17:46 +0000)
commit5829f96efa11f059e99ec190377c21b0d1c6d273
treec55ef6df73a56ba3f1ed0eee570c99ee4872e0f4
parentdb87a26fba663e62a178a3feb0b334b857c5b5e6
Fix key share negotiation in HRR case

In the ClientHello retrying the handshake after a HelloRetryRequest, the
client must send a single key share matching the group selected by the
server in the HRR. This is not necessarily the mutually preferred group.
Incorrect logic added in ssl_tlsect.c r1.134 would potentially reject
such a key share because of that.

Instead, add logic to ensure on the server side that there is a single
share matching the group we selected in the HRR.

Fixes a regress test in p5-IO-Socket-SSL where server is configured
with P-521:P-384 and the client with P-256:P-384:P-521. Since the
client sends an initial P-256 key share, a HRR is triggered which
the faulty logic rejected because it was not the mutually preferred
P-384 but rather matching the server-selected P-521.

This will need some deduplication in subsequent commits. We may also
want to consider honoring the mutual preference and request a key
accordingly in the HRR.

reported by bluhm, fix suggested by jsing
ok beck jsing
lib/libssl/ssl_tlsext.c