mirror of https://github.com/openssl/openssl.git
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:
parent
78702fb7d6
commit
c7b82a7250
|
|
@ -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 ()
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue