summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libssl/tls13_server.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/src/lib/libssl/tls13_server.c b/src/lib/libssl/tls13_server.c
index 8f225433f0..b1612a86e5 100644
--- a/src/lib/libssl/tls13_server.c
+++ b/src/lib/libssl/tls13_server.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_server.c,v 1.101 2022/08/17 07:39:19 jsing Exp $ */ 1/* $OpenBSD: tls13_server.c,v 1.102 2022/09/11 14:39:44 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org>
4 * Copyright (c) 2020 Bob Beck <beck@openbsd.org> 4 * Copyright (c) 2020 Bob Beck <beck@openbsd.org>
@@ -174,6 +174,15 @@ tls13_client_hello_process(struct tls13_ctx *ctx, CBS *cbs)
174 /* Ensure we send subsequent alerts with the correct record version. */ 174 /* Ensure we send subsequent alerts with the correct record version. */
175 tls13_record_layer_set_legacy_version(ctx->rl, TLS1_2_VERSION); 175 tls13_record_layer_set_legacy_version(ctx->rl, TLS1_2_VERSION);
176 176
177 /*
178 * Ensure that the client has not requested middlebox compatibility mode
179 * if it is prohibited from doing so.
180 */
181 if (!ctx->middlebox_compat && CBS_len(&session_id) != 0) {
182 ctx->alert = TLS13_ALERT_ILLEGAL_PARAMETER;
183 goto err;
184 }
185
177 /* Add decoded values to the current ClientHello hash */ 186 /* Add decoded values to the current ClientHello hash */
178 if (!tls13_clienthello_hash_init(ctx)) { 187 if (!tls13_clienthello_hash_init(ctx)) {
179 ctx->alert = TLS13_ALERT_INTERNAL_ERROR; 188 ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
@@ -234,8 +243,14 @@ tls13_client_hello_process(struct tls13_ctx *ctx, CBS *cbs)
234 goto err; 243 goto err;
235 } 244 }
236 245
237 /* Store legacy session identifier so we can echo it. */ 246 /*
238 if (CBS_len(&session_id) > sizeof(ctx->hs->tls13.legacy_session_id)) { 247 * The legacy session identifier must either be zero length or a 32 byte
248 * value (in which case the client is requesting middlebox compatibility
249 * mode), as per RFC 8446 section 4.1.2. If it is valid, store the value
250 * so that we can echo it back to the client.
251 */
252 if (CBS_len(&session_id) != 0 &&
253 CBS_len(&session_id) != sizeof(ctx->hs->tls13.legacy_session_id)) {
239 ctx->alert = TLS13_ALERT_ILLEGAL_PARAMETER; 254 ctx->alert = TLS13_ALERT_ILLEGAL_PARAMETER;
240 goto err; 255 goto err;
241 } 256 }
@@ -303,8 +318,9 @@ tls13_client_hello_recv(struct tls13_ctx *ctx, CBS *cbs)
303 if (ctx->hs->key_share != NULL) 318 if (ctx->hs->key_share != NULL)
304 ctx->handshake_stage.hs_type |= NEGOTIATED | WITHOUT_HRR; 319 ctx->handshake_stage.hs_type |= NEGOTIATED | WITHOUT_HRR;
305 320
306 /* XXX - check this is the correct point */ 321 /* Only allow CCS if client requested middlebox compatibility mode. */
307 tls13_record_layer_allow_ccs(ctx->rl, 1); 322 if (ctx->hs->tls13.legacy_session_id_len > 0)
323 tls13_record_layer_allow_ccs(ctx->rl, 1);
308 324
309 return 1; 325 return 1;
310 326