summaryrefslogtreecommitdiff
path: root/src/lib/libssl
diff options
context:
space:
mode:
authorjsing <>2026-08-21 08:50:34 +0000
committerjsing <>2026-08-21 08:50:34 +0000
commitea42ca481749c4333ae227c2a07ca86a48e107a3 (patch)
treef8ddb88794c040894ab8580e5324680bd9473001 /src/lib/libssl
parentaadc1d67e4c39bc3840c965d12277e1d7f68e948 (diff)
downloadopenbsd-ea42ca481749c4333ae227c2a07ca86a48e107a3.tar.gz
openbsd-ea42ca481749c4333ae227c2a07ca86a48e107a3.tar.bz2
openbsd-ea42ca481749c4333ae227c2a07ca86a48e107a3.zip
Simplify handling of remaining record content on switch to legacy stack.
Now that the legacy stack uses struct tls_content, store any remaining record content directly, rather than fudging up a record that the legacy stack will process on the next read. ok kenjiro@ tb@
Diffstat (limited to 'src/lib/libssl')
-rw-r--r--src/lib/libssl/tls13_legacy.c48
1 files changed, 13 insertions, 35 deletions
diff --git a/src/lib/libssl/tls13_legacy.c b/src/lib/libssl/tls13_legacy.c
index 6a06330b22..e42600b2cd 100644
--- a/src/lib/libssl/tls13_legacy.c
+++ b/src/lib/libssl/tls13_legacy.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_legacy.c,v 1.45 2026/04/03 07:17:36 jsing Exp $ */ 1/* $OpenBSD: tls13_legacy.c,v 1.46 2026/08/21 08:50:34 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -317,51 +317,34 @@ static int
317tls13_use_legacy_stack(struct tls13_ctx *ctx) 317tls13_use_legacy_stack(struct tls13_ctx *ctx)
318{ 318{
319 SSL *s = ctx->ssl; 319 SSL *s = ctx->ssl;
320 CBB cbb, fragment;
321 CBS cbs; 320 CBS cbs;
322 321
323 memset(&cbb, 0, sizeof(cbb));
324
325 if (!ssl3_setup_init_buffer(s)) 322 if (!ssl3_setup_init_buffer(s))
326 goto err; 323 return 0;
327 if (!ssl3_setup_buffers(s)) 324 if (!ssl3_setup_buffers(s))
328 goto err; 325 return 0;
329 if (!ssl_init_wbio_buffer(s, 1)) 326 if (!ssl_init_wbio_buffer(s, 1))
330 goto err; 327 return 0;
331 328
332 /* Stash any unprocessed data from the last record. */ 329 /* Stash any unprocessed data from the last record. */
333 tls13_record_layer_rcontent(ctx->rl, &cbs); 330 tls13_record_layer_rcontent(ctx->rl, &cbs);
334 if (CBS_len(&cbs) > 0) { 331 if (CBS_len(&cbs) > 0) {
335 if (!CBB_init_fixed(&cbb, s->s3->rbuf.buf, 332 if (s->s3->rcontent != NULL)
336 s->s3->rbuf.len)) 333 return 0;
337 goto err; 334 if ((s->s3->rcontent = tls_content_new()) == NULL)
338 if (!CBB_add_u8(&cbb, SSL3_RT_HANDSHAKE)) 335 return 0;
339 goto err; 336 if (!tls_content_dup_data(s->s3->rcontent,
340 if (!CBB_add_u16(&cbb, TLS1_2_VERSION)) 337 SSL3_RT_HANDSHAKE, CBS_data(&cbs), CBS_len(&cbs)))
341 goto err; 338 return 0;
342 if (!CBB_add_u16_length_prefixed(&cbb, &fragment))
343 goto err;
344 if (!CBB_add_bytes(&fragment, CBS_data(&cbs), CBS_len(&cbs)))
345 goto err;
346 if (!CBB_finish(&cbb, NULL, NULL))
347 goto err;
348
349 s->s3->rbuf.offset = SSL3_RT_HEADER_LENGTH;
350 s->s3->rbuf.left = CBS_len(&cbs);
351 s->s3->rrec.type = SSL3_RT_HANDSHAKE;
352 s->s3->rrec.length = CBS_len(&cbs);
353 s->rstate = SSL_ST_READ_BODY;
354 s->packet = s->s3->rbuf.buf;
355 s->packet_length = SSL3_RT_HEADER_LENGTH;
356 } 339 }
357 340
358 /* Stash the current handshake message. */ 341 /* Stash the current handshake message. */
359 tls13_handshake_msg_data(ctx->hs_msg, &cbs); 342 tls13_handshake_msg_data(ctx->hs_msg, &cbs);
360 if (!BUF_MEM_grow_clean(s->init_buf, CBS_len(&cbs))) 343 if (!BUF_MEM_grow_clean(s->init_buf, CBS_len(&cbs)))
361 goto err; 344 return 0;
362 if (!CBS_write_bytes(&cbs, s->init_buf->data, 345 if (!CBS_write_bytes(&cbs, s->init_buf->data,
363 s->init_buf->length, NULL)) 346 s->init_buf->length, NULL))
364 goto err; 347 return 0;
365 348
366 s->s3->hs.tls12.reuse_message = 1; 349 s->s3->hs.tls12.reuse_message = 1;
367 s->s3->hs.tls12.message_type = tls13_handshake_msg_type(ctx->hs_msg); 350 s->s3->hs.tls12.message_type = tls13_handshake_msg_type(ctx->hs_msg);
@@ -374,11 +357,6 @@ tls13_use_legacy_stack(struct tls13_ctx *ctx)
374 s->method = tls_legacy_method(); 357 s->method = tls_legacy_method();
375 358
376 return 1; 359 return 1;
377
378 err:
379 CBB_cleanup(&cbb);
380
381 return 0;
382} 360}
383 361
384int 362int