Fixup tests to properly check version negotiation

Currently the quic_multistream_test tests version negotiation..sort of.

It uses a packet injector to force the tserver to send a version
negotiation packet back to the client.  Thats no longer needed as the
server will respond to an invalid version properly.

So alter script_74 to, instead of using the injector, use a quic channel
mutator to invalidate the version provided in the initial packet.  Then
we attempt to connect.  If the server responds with a version
negotiation packet and the client restarts with the proper version, then
the test passes, as the connection is extablished.

Also, while we're in here, update the gen_version_neg function to
properly insert a 0 version into the packet header for script_75, as
version negotiation packets require that to be set, otherwise script_75
will fail now when the server notices this discrepancy.

Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Saša Nedvědický <sashan@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/25968)
This commit is contained in:
Neil Horman 2024-11-15 14:32:56 -05:00
parent 78702fb7d6
commit c7b82a7250
1 changed files with 58 additions and 3 deletions

View File

@ -4919,6 +4919,7 @@ static int generate_version_neg(WPACKET *wpkt, uint32_t version)
QUIC_PKT_HDR hdr = {0};
hdr.type = QUIC_PKT_TYPE_VERSION_NEG;
hdr.version = 0;
hdr.fixed = 1;
hdr.dst_conn_id.id_len = 0;
hdr.src_conn_id.id_len = 8;
@ -4980,10 +4981,64 @@ err:
return rc;
}
static const struct script_op script_74[] = {
OP_S_SET_INJECT_DATAGRAM (server_gen_version_neg)
OP_SET_INJECT_WORD (1, 0)
static int do_mutation = 0;
static QUIC_PKT_HDR *hdr_to_free = NULL;
/*
* Check packets to transmit, if we have an initial packet
* Modify the version number to something incorrect
* so that we trigger a version negotiation
* Note, this is a use once function, it will only modify the
* first INITIAL packet it sees, after which it needs to be
* armed again
*/
static int script_74_alter_version(const QUIC_PKT_HDR *hdrin,
const OSSL_QTX_IOVEC *iovecin, size_t numin,
QUIC_PKT_HDR **hdrout,
const OSSL_QTX_IOVEC **iovecout,
size_t *numout,
void *arg)
{
*hdrout = OPENSSL_memdup(hdrin, sizeof(QUIC_PKT_HDR));
*iovecout = iovecin;
*numout = numin;
hdr_to_free = *hdrout;
if (do_mutation == 0)
return 1;
do_mutation = 0;
if (hdrin->type == QUIC_PKT_TYPE_INITIAL)
(*hdrout)->version = 0xdeadbeef;
return 1;
}
static void script_74_finish_mutation(void *arg)
{
OPENSSL_free(hdr_to_free);
}
/*
* Enable the packet mutator for the client channel
* So that when we send a Initial packet
* We modify the version to be something invalid
* to force a version negotiation
*/
static int script_74_arm_packet_mutator(struct helper *h,
struct helper_local *hl)
{
QUIC_CHANNEL *ch = ossl_quic_conn_get_channel(h->c_conn);
do_mutation = 1;
if (!ossl_quic_channel_set_mutator(ch, script_74_alter_version,
script_74_finish_mutation,
NULL))
return 0;
return 1;
}
static const struct script_op script_74[] = {
OP_CHECK (script_74_arm_packet_mutator, 0)
OP_C_SET_ALPN ("ossltest")
OP_C_CONNECT_WAIT ()