summaryrefslogtreecommitdiff
path: root/src/lib/libssl/tls13_client.c
diff options
context:
space:
mode:
authorjsing <>2020-01-21 12:08:04 +0000
committerjsing <>2020-01-21 12:08:04 +0000
commit6e568c664abbc564bc3a97d549d37155632d79a5 (patch)
treeddf5742f7e036ce4aa194b92e0b226d1ae3f9564 /src/lib/libssl/tls13_client.c
parent59792af6ba04f21a2d45c97fccc72ac33f22cc48 (diff)
downloadopenbsd-6e568c664abbc564bc3a97d549d37155632d79a5.tar.gz
openbsd-6e568c664abbc564bc3a97d549d37155632d79a5.tar.bz2
openbsd-6e568c664abbc564bc3a97d549d37155632d79a5.zip
Correct legacy fallback for TLSv1.3 client.
When falling back to the legacy TLS client, in the case where a server has sent a TLS record that contains more than one handshake message, we also need to stash the unprocessed record data for later processing. Otherwise we end up with missing handshake data. ok beck@ tb@
Diffstat (limited to 'src/lib/libssl/tls13_client.c')
-rw-r--r--src/lib/libssl/tls13_client.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/lib/libssl/tls13_client.c b/src/lib/libssl/tls13_client.c
index b842cbd39c..4ec29ea956 100644
--- a/src/lib/libssl/tls13_client.c
+++ b/src/lib/libssl/tls13_client.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_client.c,v 1.21 2020/01/21 03:40:05 beck Exp $ */ 1/* $OpenBSD: tls13_client.c,v 1.22 2020/01/21 12:08:04 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 *
@@ -115,14 +115,28 @@ tls13_use_legacy_client(struct tls13_ctx *ctx)
115 if (s->bbio != s->wbio) 115 if (s->bbio != s->wbio)
116 s->wbio = BIO_push(s->bbio, s->wbio); 116 s->wbio = BIO_push(s->bbio, s->wbio);
117 117
118 if (!tls13_handshake_msg_content(ctx->hs_msg, &cbs)) 118 /* Stash any unprocessed data from the last record. */
119 goto err; 119 tls13_record_layer_rbuf(ctx->rl, &cbs);
120 if (CBS_len(&cbs) > 0) {
121 if (!CBS_write_bytes(&cbs,
122 S3I(s)->rbuf.buf + SSL3_RT_HEADER_LENGTH,
123 S3I(s)->rbuf.len - SSL3_RT_HEADER_LENGTH, NULL))
124 goto err;
120 125
121 if (!BUF_MEM_grow_clean(s->internal->init_buf, CBS_len(&cbs) + 4)) 126 S3I(s)->rbuf.offset = SSL3_RT_HEADER_LENGTH;
122 goto err; 127 S3I(s)->rbuf.left = CBS_len(&cbs);
128 S3I(s)->rrec.type = SSL3_RT_HANDSHAKE;
129 S3I(s)->rrec.length = CBS_len(&cbs);
130 s->internal->rstate = SSL_ST_READ_BODY;
131 s->internal->packet = S3I(s)->rbuf.buf;
132 s->internal->packet_length = SSL3_RT_HEADER_LENGTH;
133 s->internal->mac_packet = 1;
134 }
123 135
124 if (!CBS_write_bytes(&cbs, s->internal->init_buf->data + 4, 136 /* Stash the current handshake message. */
125 s->internal->init_buf->length - 4, NULL)) 137 tls13_handshake_msg_data(ctx->hs_msg, &cbs);
138 if (!CBS_write_bytes(&cbs, s->internal->init_buf->data,
139 s->internal->init_buf->length, NULL))
126 goto err; 140 goto err;
127 141
128 S3I(s)->tmp.reuse_message = 1; 142 S3I(s)->tmp.reuse_message = 1;