QUIC Dummy Handshake Layer: Allow transport parameters to be set later

Server mode not implemented yet.

Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/19703)
This commit is contained in:
Hugo Landau 2022-11-17 14:19:08 +00:00
parent cda88bafe7
commit 462d81dd73
2 changed files with 43 additions and 20 deletions

View File

@ -95,12 +95,8 @@ typedef struct quic_dhs_args_st {
int (*alert_cb)(void *arg, unsigned char alert_code);
void *alert_cb_arg;
/*
* Transport parameters which client should send. Buffer lifetime must
* exceed the lifetime of the DHS.
*/
const unsigned char *transport_params;
size_t transport_params_len;
/* Set to 1 if we are running in the server role. */
int is_server;
} QUIC_DHS_ARGS;
QUIC_DHS *ossl_quic_dhs_new(const QUIC_DHS_ARGS *args);
@ -118,4 +114,16 @@ void ossl_quic_dhs_free(QUIC_DHS *dhs);
*/
int ossl_quic_dhs_tick(QUIC_DHS *dhs);
/*
* Set the transport parameters buffer. The lifetime of the buffer must last
* until either the DHS is freed or the handshake complete callback is called.
* This must be called before the transport parameters are needed by the DHS.
* For a client, this means before ossl_quic_dhs_tick() is first called; for a
* server, this should generally be immediately after the
* got_transport_params_cb callback is called.
*/
int ossl_quic_dhs_set_transport_params(QUIC_DHS *dhs,
const unsigned char *transport_params,
size_t transport_params_len);
#endif

View File

@ -33,8 +33,10 @@
struct quic_dhs_st {
QUIC_DHS_ARGS args;
unsigned char state;
unsigned char *server_transport_params;
size_t server_transport_params_len;
unsigned char *remote_transport_params;
size_t remote_transport_params_len;
const unsigned char *local_transport_params;
size_t local_transport_params_len;
unsigned char rx_hdr[4];
size_t rx_hdr_bytes_read;
size_t rx_ee_bytes_read;
@ -62,7 +64,7 @@ void ossl_quic_dhs_free(QUIC_DHS *dhs)
if (dhs == NULL)
return;
OPENSSL_free(dhs->server_transport_params);
OPENSSL_free(dhs->remote_transport_params);
OPENSSL_free(dhs);
}
@ -146,6 +148,17 @@ static const unsigned char default_handshake_write[32] = {42, 1};
static const unsigned char default_1rtt_read[32] = {43, 2};
static const unsigned char default_1rtt_write[32] = {43, 1};
int ossl_quic_dhs_set_transport_params(QUIC_DHS *dhs, const unsigned char *transport_params,
size_t transport_params_len)
{
if (!dhs->args.is_server && dhs->state != QUIC_DHS_STATE_INITIAL)
return 0;
dhs->local_transport_params = transport_params;
dhs->local_transport_params_len = transport_params_len;
return 1;
}
int ossl_quic_dhs_tick(QUIC_DHS *dhs)
{
int ret;
@ -157,8 +170,8 @@ int ossl_quic_dhs_tick(QUIC_DHS *dhs)
case QUIC_DHS_STATE_INITIAL:
/* We need to send a CH */
if (!dhs_send(dhs, QUIC_DHS_MSG_TYPE_CH,
dhs->args.transport_params,
dhs->args.transport_params_len))
dhs->local_transport_params,
dhs->local_transport_params_len))
return 0;
dhs->state = QUIC_DHS_STATE_SENT_CH;
@ -204,10 +217,10 @@ int ossl_quic_dhs_tick(QUIC_DHS *dhs)
if (type == QUIC_DHS_MSG_TYPE_EE) {
dhs->state = QUIC_DHS_STATE_RECEIVED_EE_HDR;
dhs->rx_ee_bytes_read = 0;
dhs->server_transport_params_len = frame_len;
dhs->server_transport_params
= OPENSSL_malloc(dhs->server_transport_params_len);
if (dhs->server_transport_params == NULL)
dhs->remote_transport_params_len = frame_len;
dhs->remote_transport_params
= OPENSSL_malloc(dhs->remote_transport_params_len);
if (dhs->remote_transport_params == NULL)
return 0;
} else {
return 0; /* error state, unexpected type */
@ -220,14 +233,14 @@ int ossl_quic_dhs_tick(QUIC_DHS *dhs)
break;
case QUIC_DHS_STATE_RECEIVED_EE_HDR:
ret = dhs_recv_body(dhs, dhs->server_transport_params + dhs->rx_ee_bytes_read,
dhs->server_transport_params_len - dhs->rx_ee_bytes_read,
ret = dhs_recv_body(dhs, dhs->remote_transport_params + dhs->rx_ee_bytes_read,
dhs->remote_transport_params_len - dhs->rx_ee_bytes_read,
&bytes_read);
if (ret == 1) {
dhs->rx_ee_bytes_read += bytes_read;
if (bytes_read == dhs->server_transport_params_len) {
if (!dhs->args.got_transport_params_cb(dhs->server_transport_params,
dhs->server_transport_params_len,
if (bytes_read == dhs->remote_transport_params_len) {
if (!dhs->args.got_transport_params_cb(dhs->remote_transport_params,
dhs->remote_transport_params_len,
dhs->args.got_transport_params_cb_arg))
return 0;
@ -313,6 +326,8 @@ int ossl_quic_dhs_tick(QUIC_DHS *dhs)
if (!dhs->args.handshake_complete_cb(dhs->args.handshake_complete_cb_arg))
return 0;
dhs->local_transport_params = NULL;
dhs->local_transport_params_len = 0;
break;
case QUIC_DHS_STATE_SENT_FINISHED: