summaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/lib/libssl/tls13_client.c28
-rw-r--r--src/lib/libssl/tls13_internal.h3
-rw-r--r--src/lib/libssl/tls13_record_layer.c8
3 files changed, 30 insertions, 9 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;
diff --git a/src/lib/libssl/tls13_internal.h b/src/lib/libssl/tls13_internal.h
index 530ace41af..3ee73782ec 100644
--- a/src/lib/libssl/tls13_internal.h
+++ b/src/lib/libssl/tls13_internal.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_internal.h,v 1.38 2020/01/21 03:40:05 beck Exp $ */ 1/* $OpenBSD: tls13_internal.h,v 1.39 2020/01/21 12:08:04 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018 Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2018 Bob Beck <beck@openbsd.org>
4 * Copyright (c) 2018 Theo Buehler <tb@openbsd.org> 4 * Copyright (c) 2018 Theo Buehler <tb@openbsd.org>
@@ -116,6 +116,7 @@ struct tls13_record_layer *tls13_record_layer_new(tls13_read_cb wire_read,
116 tls13_phh_recv_cb phh_recv_cb, 116 tls13_phh_recv_cb phh_recv_cb,
117 tls13_phh_sent_cb phh_sent_cb, void *cb_arg); 117 tls13_phh_sent_cb phh_sent_cb, void *cb_arg);
118void tls13_record_layer_free(struct tls13_record_layer *rl); 118void tls13_record_layer_free(struct tls13_record_layer *rl);
119void tls13_record_layer_rbuf(struct tls13_record_layer *rl, CBS *cbs);
119void tls13_record_layer_set_aead(struct tls13_record_layer *rl, 120void tls13_record_layer_set_aead(struct tls13_record_layer *rl,
120 const EVP_AEAD *aead); 121 const EVP_AEAD *aead);
121void tls13_record_layer_set_hash(struct tls13_record_layer *rl, 122void tls13_record_layer_set_hash(struct tls13_record_layer *rl,
diff --git a/src/lib/libssl/tls13_record_layer.c b/src/lib/libssl/tls13_record_layer.c
index e1007b3f7b..a6b00a83b3 100644
--- a/src/lib/libssl/tls13_record_layer.c
+++ b/src/lib/libssl/tls13_record_layer.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_record_layer.c,v 1.17 2020/01/20 22:04:17 beck Exp $ */ 1/* $OpenBSD: tls13_record_layer.c,v 1.18 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 *
@@ -154,6 +154,12 @@ tls13_record_layer_free(struct tls13_record_layer *rl)
154 freezero(rl, sizeof(struct tls13_record_layer)); 154 freezero(rl, sizeof(struct tls13_record_layer));
155} 155}
156 156
157void
158tls13_record_layer_rbuf(struct tls13_record_layer *rl, CBS *cbs)
159{
160 CBS_dup(&rl->rbuf_cbs, cbs);
161}
162
157static int 163static int
158tls13_record_layer_inc_seq_num(uint8_t *seq_num) 164tls13_record_layer_inc_seq_num(uint8_t *seq_num)
159{ 165{