diff options
author | Hugo Landau <hlandau@openssl.org> | 2022-11-17 14:19:08 +0000 |
---|---|---|
committer | Hugo Landau <hlandau@openssl.org> | 2023-01-13 13:20:12 +0000 |
commit | 462d81dd73480fe349594d2b65698ddc84583d32 (patch) | |
tree | 2eafbbbf12374b07351c409471238a8bfefbb330 | |
parent | cda88bafe7532083a1e7c5bc08a9971735724c10 (diff) |
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)
-rw-r--r-- | include/internal/quic_dummy_handshake.h | 20 | ||||
-rw-r--r-- | ssl/quic/quic_dummy_handshake.c | 43 |
2 files changed, 43 insertions, 20 deletions
diff --git a/include/internal/quic_dummy_handshake.h b/include/internal/quic_dummy_handshake.h index 3a424a6db6..a43df4ed09 100644 --- a/include/internal/quic_dummy_handshake.h +++ b/include/internal/quic_dummy_handshake.h @@ -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 diff --git a/ssl/quic/quic_dummy_handshake.c b/ssl/quic/quic_dummy_handshake.c index b14979d223..f3e5bcee2b 100644 --- a/ssl/quic/quic_dummy_handshake.c +++ b/ssl/quic/quic_dummy_handshake.c @@ -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: |