summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2021-09-04 16:26:12 +0000
committerjsing <>2021-09-04 16:26:12 +0000
commitcae6ba899a9344e719ed96e6afdb8958b891efb0 (patch)
tree44332845387994e621a09d6d1451fd9e6a3c865d
parent5f9c147b857183086592529152aa63fc86fa2e56 (diff)
downloadopenbsd-cae6ba899a9344e719ed96e6afdb8958b891efb0.tar.gz
openbsd-cae6ba899a9344e719ed96e6afdb8958b891efb0.tar.bz2
openbsd-cae6ba899a9344e719ed96e6afdb8958b891efb0.zip
Factor out the TLSv1.3 code that handles content from TLS records.
Currently, the plaintext content from opened TLS records is handled via the rbuf code in the TLSv1.3 record layer. Factor this out and provide a separate struct tls_content, which knows how to track and manipulate the content. This makes the TLSv1.3 code cleaner, however it will also soon also be used to untangle parts of the legacy record layer. ok beck@ tb@
-rw-r--r--src/lib/libssl/Makefile5
-rw-r--r--src/lib/libssl/tls13_internal.h4
-rw-r--r--src/lib/libssl/tls13_legacy.c4
-rw-r--r--src/lib/libssl/tls13_record_layer.c108
-rw-r--r--src/lib/libssl/tls_content.c149
-rw-r--r--src/lib/libssl/tls_content.h48
6 files changed, 238 insertions, 80 deletions
diff --git a/src/lib/libssl/Makefile b/src/lib/libssl/Makefile
index 6171194629..d468308c7e 100644
--- a/src/lib/libssl/Makefile
+++ b/src/lib/libssl/Makefile
@@ -1,4 +1,4 @@
1# $OpenBSD: Makefile,v 1.70 2021/05/05 10:05:27 jsing Exp $ 1# $OpenBSD: Makefile,v 1.71 2021/09/04 16:26:12 jsing Exp $
2 2
3.include <bsd.own.mk> 3.include <bsd.own.mk>
4.ifndef NOMAN 4.ifndef NOMAN
@@ -81,7 +81,8 @@ SRCS= \
81 tls13_lib.c \ 81 tls13_lib.c \
82 tls13_record.c \ 82 tls13_record.c \
83 tls13_record_layer.c \ 83 tls13_record_layer.c \
84 tls13_server.c 84 tls13_server.c \
85 tls_content.c
85 86
86HDRS= dtls1.h srtp.h ssl.h ssl2.h ssl23.h ssl3.h tls1.h 87HDRS= dtls1.h srtp.h ssl.h ssl2.h ssl23.h ssl3.h tls1.h
87 88
diff --git a/src/lib/libssl/tls13_internal.h b/src/lib/libssl/tls13_internal.h
index 30ef7dd931..12ed733f2b 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.90 2021/06/28 15:35:14 tb Exp $ */ 1/* $OpenBSD: tls13_internal.h,v 1.91 2021/09/04 16:26:12 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>
@@ -209,7 +209,7 @@ struct tls13_record_layer *tls13_record_layer_new(
209void tls13_record_layer_free(struct tls13_record_layer *rl); 209void tls13_record_layer_free(struct tls13_record_layer *rl);
210void tls13_record_layer_allow_ccs(struct tls13_record_layer *rl, int allow); 210void tls13_record_layer_allow_ccs(struct tls13_record_layer *rl, int allow);
211void tls13_record_layer_allow_legacy_alerts(struct tls13_record_layer *rl, int allow); 211void tls13_record_layer_allow_legacy_alerts(struct tls13_record_layer *rl, int allow);
212void tls13_record_layer_rbuf(struct tls13_record_layer *rl, CBS *cbs); 212void tls13_record_layer_rcontent(struct tls13_record_layer *rl, CBS *cbs);
213void tls13_record_layer_set_aead(struct tls13_record_layer *rl, 213void tls13_record_layer_set_aead(struct tls13_record_layer *rl,
214 const EVP_AEAD *aead); 214 const EVP_AEAD *aead);
215void tls13_record_layer_set_hash(struct tls13_record_layer *rl, 215void tls13_record_layer_set_hash(struct tls13_record_layer *rl,
diff --git a/src/lib/libssl/tls13_legacy.c b/src/lib/libssl/tls13_legacy.c
index 477d09d63e..df4408d903 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.28 2021/09/03 13:16:54 jsing Exp $ */ 1/* $OpenBSD: tls13_legacy.c,v 1.29 2021/09/04 16:26:12 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 *
@@ -304,7 +304,7 @@ tls13_use_legacy_stack(struct tls13_ctx *ctx)
304 goto err; 304 goto err;
305 305
306 /* Stash any unprocessed data from the last record. */ 306 /* Stash any unprocessed data from the last record. */
307 tls13_record_layer_rbuf(ctx->rl, &cbs); 307 tls13_record_layer_rcontent(ctx->rl, &cbs);
308 if (CBS_len(&cbs) > 0) { 308 if (CBS_len(&cbs) > 0) {
309 if (!CBB_init_fixed(&cbb, S3I(s)->rbuf.buf, 309 if (!CBB_init_fixed(&cbb, S3I(s)->rbuf.buf,
310 S3I(s)->rbuf.len)) 310 S3I(s)->rbuf.len))
diff --git a/src/lib/libssl/tls13_record_layer.c b/src/lib/libssl/tls13_record_layer.c
index 6556547353..2e32cb8a37 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.62 2021/06/08 18:05:47 tb Exp $ */ 1/* $OpenBSD: tls13_record_layer.c,v 1.63 2021/09/04 16:26:12 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 *
@@ -17,6 +17,7 @@
17 17
18#include "tls13_internal.h" 18#include "tls13_internal.h"
19#include "tls13_record.h" 19#include "tls13_record.h"
20#include "tls_content.h"
20 21
21static ssize_t tls13_record_layer_write_chunk(struct tls13_record_layer *rl, 22static ssize_t tls13_record_layer_write_chunk(struct tls13_record_layer *rl,
22 uint8_t content_type, const uint8_t *buf, size_t n); 23 uint8_t content_type, const uint8_t *buf, size_t n);
@@ -99,11 +100,8 @@ struct tls13_record_layer {
99 uint8_t *phh_data; 100 uint8_t *phh_data;
100 size_t phh_len; 101 size_t phh_len;
101 102
102 /* Buffer containing plaintext from opened records. */ 103 /* Content from opened records. */
103 uint8_t rbuf_content_type; 104 struct tls_content *rcontent;
104 uint8_t *rbuf;
105 size_t rbuf_len;
106 CBS rbuf_cbs;
107 105
108 /* Record protection. */ 106 /* Record protection. */
109 const EVP_MD *hash; 107 const EVP_MD *hash;
@@ -117,16 +115,6 @@ struct tls13_record_layer {
117}; 115};
118 116
119static void 117static void
120tls13_record_layer_rbuf_free(struct tls13_record_layer *rl)
121{
122 CBS_init(&rl->rbuf_cbs, NULL, 0);
123 freezero(rl->rbuf, rl->rbuf_len);
124 rl->rbuf = NULL;
125 rl->rbuf_len = 0;
126 rl->rbuf_content_type = 0;
127}
128
129static void
130tls13_record_layer_rrec_free(struct tls13_record_layer *rl) 118tls13_record_layer_rrec_free(struct tls13_record_layer *rl)
131{ 119{
132 tls13_record_free(rl->rrec); 120 tls13_record_free(rl->rrec);
@@ -149,6 +137,9 @@ tls13_record_layer_new(const struct tls13_record_layer_callbacks *callbacks,
149 if ((rl = calloc(1, sizeof(struct tls13_record_layer))) == NULL) 137 if ((rl = calloc(1, sizeof(struct tls13_record_layer))) == NULL)
150 goto err; 138 goto err;
151 139
140 if ((rl->rcontent = tls_content_new()) == NULL)
141 goto err;
142
152 if ((rl->read = tls13_record_protection_new()) == NULL) 143 if ((rl->read = tls13_record_protection_new()) == NULL)
153 goto err; 144 goto err;
154 if ((rl->write = tls13_record_protection_new()) == NULL) 145 if ((rl->write = tls13_record_protection_new()) == NULL)
@@ -178,7 +169,7 @@ tls13_record_layer_free(struct tls13_record_layer *rl)
178 freezero(rl->alert_data, rl->alert_len); 169 freezero(rl->alert_data, rl->alert_len);
179 freezero(rl->phh_data, rl->phh_len); 170 freezero(rl->phh_data, rl->phh_len);
180 171
181 tls13_record_layer_rbuf_free(rl); 172 tls_content_free(rl->rcontent);
182 173
183 tls13_record_protection_free(rl->read); 174 tls13_record_protection_free(rl->read);
184 tls13_record_protection_free(rl->write); 175 tls13_record_protection_free(rl->write);
@@ -187,9 +178,9 @@ tls13_record_layer_free(struct tls13_record_layer *rl)
187} 178}
188 179
189void 180void
190tls13_record_layer_rbuf(struct tls13_record_layer *rl, CBS *cbs) 181tls13_record_layer_rcontent(struct tls13_record_layer *rl, CBS *cbs)
191{ 182{
192 CBS_dup(&rl->rbuf_cbs, cbs); 183 CBS_dup(tls_content_cbs(rl->rcontent), cbs);
193} 184}
194 185
195static const uint8_t tls13_max_seq_num[TLS13_RECORD_SEQ_NUM_LEN] = { 186static const uint8_t tls13_max_seq_num[TLS13_RECORD_SEQ_NUM_LEN] = {
@@ -292,22 +283,18 @@ tls13_record_layer_process_alert(struct tls13_record_layer *rl)
292 * will result in one of three things - continuation (user_cancelled), 283 * will result in one of three things - continuation (user_cancelled),
293 * read channel closure (close_notify) or termination (all others). 284 * read channel closure (close_notify) or termination (all others).
294 */ 285 */
295 if (rl->rbuf == NULL) 286 if (tls_content_type(rl->rcontent) != SSL3_RT_ALERT)
296 return TLS13_IO_FAILURE; 287 return TLS13_IO_FAILURE;
297 288
298 if (rl->rbuf_content_type != SSL3_RT_ALERT) 289 if (!CBS_get_u8(tls_content_cbs(rl->rcontent), &alert_level))
299 return TLS13_IO_FAILURE;
300
301 if (!CBS_get_u8(&rl->rbuf_cbs, &alert_level))
302 return tls13_send_alert(rl, TLS13_ALERT_DECODE_ERROR); 290 return tls13_send_alert(rl, TLS13_ALERT_DECODE_ERROR);
303 291 if (!CBS_get_u8(tls_content_cbs(rl->rcontent), &alert_desc))
304 if (!CBS_get_u8(&rl->rbuf_cbs, &alert_desc))
305 return tls13_send_alert(rl, TLS13_ALERT_DECODE_ERROR); 292 return tls13_send_alert(rl, TLS13_ALERT_DECODE_ERROR);
306 293
307 if (CBS_len(&rl->rbuf_cbs) != 0) 294 if (tls_content_remaining(rl->rcontent) != 0)
308 return tls13_send_alert(rl, TLS13_ALERT_DECODE_ERROR); 295 return tls13_send_alert(rl, TLS13_ALERT_DECODE_ERROR);
309 296
310 tls13_record_layer_rbuf_free(rl); 297 tls_content_clear(rl->rcontent);
311 298
312 /* 299 /*
313 * Alert level is ignored for closure alerts (RFC 8446 section 6.1), 300 * Alert level is ignored for closure alerts (RFC 8446 section 6.1),
@@ -531,15 +518,10 @@ tls13_record_layer_open_record_plaintext(struct tls13_record_layer *rl)
531 return 0; 518 return 0;
532 } 519 }
533 520
534 tls13_record_layer_rbuf_free(rl); 521 if (!tls_content_dup_data(rl->rcontent,
535 522 tls13_record_content_type(rl->rrec), CBS_data(&cbs), CBS_len(&cbs)))
536 if (!CBS_stow(&cbs, &rl->rbuf, &rl->rbuf_len))
537 return 0; 523 return 0;
538 524
539 rl->rbuf_content_type = tls13_record_content_type(rl->rrec);
540
541 CBS_init(&rl->rbuf_cbs, rl->rbuf, rl->rbuf_len);
542
543 return 1; 525 return 1;
544} 526}
545 527
@@ -604,13 +586,7 @@ tls13_record_layer_open_record_protected(struct tls13_record_layer *rl)
604 } 586 }
605 content_type = content[inner_len]; 587 content_type = content[inner_len];
606 588
607 tls13_record_layer_rbuf_free(rl); 589 tls_content_set_data(rl->rcontent, content_type, content, inner_len);
608
609 rl->rbuf_content_type = content_type;
610 rl->rbuf = content;
611 rl->rbuf_len = inner_len;
612
613 CBS_init(&rl->rbuf_cbs, rl->rbuf, rl->rbuf_len);
614 590
615 return 1; 591 return 1;
616 592
@@ -877,12 +853,12 @@ tls13_record_layer_read_record(struct tls13_record_layer *rl)
877 * we must terminate the connection with an unexpected_message alert. 853 * we must terminate the connection with an unexpected_message alert.
878 * See RFC 8446 section 5.4. 854 * See RFC 8446 section 5.4.
879 */ 855 */
880 if (CBS_len(&rl->rbuf_cbs) == 0 && 856 if (tls_content_remaining(rl->rcontent) == 0 &&
881 (rl->rbuf_content_type == SSL3_RT_ALERT || 857 (tls_content_type(rl->rcontent) == SSL3_RT_ALERT ||
882 rl->rbuf_content_type == SSL3_RT_HANDSHAKE)) 858 tls_content_type(rl->rcontent) == SSL3_RT_HANDSHAKE))
883 return tls13_send_alert(rl, TLS13_ALERT_UNEXPECTED_MESSAGE); 859 return tls13_send_alert(rl, TLS13_ALERT_UNEXPECTED_MESSAGE);
884 860
885 switch (rl->rbuf_content_type) { 861 switch (tls_content_type(rl->rcontent)) {
886 case SSL3_RT_ALERT: 862 case SSL3_RT_ALERT:
887 return tls13_record_layer_process_alert(rl); 863 return tls13_record_layer_process_alert(rl);
888 864
@@ -907,10 +883,10 @@ tls13_record_layer_read_record(struct tls13_record_layer *rl)
907static ssize_t 883static ssize_t
908tls13_record_layer_pending(struct tls13_record_layer *rl, uint8_t content_type) 884tls13_record_layer_pending(struct tls13_record_layer *rl, uint8_t content_type)
909{ 885{
910 if (rl->rbuf_content_type != content_type) 886 if (tls_content_type(rl->rcontent) != content_type)
911 return 0; 887 return 0;
912 888
913 return CBS_len(&rl->rbuf_cbs); 889 return tls_content_remaining(rl->rcontent);
914} 890}
915 891
916static ssize_t 892static ssize_t
@@ -929,9 +905,9 @@ tls13_record_layer_recv_phh(struct tls13_record_layer *rl)
929 * TLS13_IO_FAILURE something broke. 905 * TLS13_IO_FAILURE something broke.
930 */ 906 */
931 if (rl->cb.phh_recv != NULL) 907 if (rl->cb.phh_recv != NULL)
932 ret = rl->cb.phh_recv(rl->cb_arg, &rl->rbuf_cbs); 908 ret = rl->cb.phh_recv(rl->cb_arg, tls_content_cbs(rl->rcontent));
933 909
934 tls13_record_layer_rbuf_free(rl); 910 tls_content_clear(rl->rcontent);
935 911
936 /* Leave post handshake handshake mode unless we need more data. */ 912 /* Leave post handshake handshake mode unless we need more data. */
937 if (ret != TLS13_IO_WANT_POLLIN) 913 if (ret != TLS13_IO_WANT_POLLIN)
@@ -960,7 +936,7 @@ tls13_record_layer_read_internal(struct tls13_record_layer *rl,
960 return TLS13_IO_EOF; 936 return TLS13_IO_EOF;
961 937
962 /* If necessary, pull up the next record. */ 938 /* If necessary, pull up the next record. */
963 if (CBS_len(&rl->rbuf_cbs) == 0) { 939 if (tls_content_remaining(rl->rcontent) == 0) {
964 if ((ret = tls13_record_layer_read_record(rl)) <= 0) 940 if ((ret = tls13_record_layer_read_record(rl)) <= 0)
965 return ret; 941 return ret;
966 942
@@ -968,17 +944,15 @@ tls13_record_layer_read_internal(struct tls13_record_layer *rl,
968 * We may have read a valid 0-byte application data record, 944 * We may have read a valid 0-byte application data record,
969 * in which case we need to read the next record. 945 * in which case we need to read the next record.
970 */ 946 */
971 if (CBS_len(&rl->rbuf_cbs) == 0) { 947 if (tls_content_remaining(rl->rcontent) == 0)
972 tls13_record_layer_rbuf_free(rl);
973 return TLS13_IO_WANT_POLLIN; 948 return TLS13_IO_WANT_POLLIN;
974 }
975 } 949 }
976 950
977 /* 951 /*
978 * If we are in post handshake handshake mode, we must not see 952 * If we are in post handshake handshake mode, we must not see
979 * any record type that isn't a handshake until we are done. 953 * any record type that isn't a handshake until we are done.
980 */ 954 */
981 if (rl->phh && rl->rbuf_content_type != SSL3_RT_HANDSHAKE) 955 if (rl->phh && tls_content_type(rl->rcontent) != SSL3_RT_HANDSHAKE)
982 return tls13_send_alert(rl, TLS13_ALERT_UNEXPECTED_MESSAGE); 956 return tls13_send_alert(rl, TLS13_ALERT_UNEXPECTED_MESSAGE);
983 957
984 /* 958 /*
@@ -987,32 +961,18 @@ tls13_record_layer_read_internal(struct tls13_record_layer *rl,
987 * be trying to read application data and need to handle a 961 * be trying to read application data and need to handle a
988 * post-handshake handshake message instead... 962 * post-handshake handshake message instead...
989 */ 963 */
990 if (rl->rbuf_content_type != content_type) { 964 if (tls_content_type(rl->rcontent) != content_type) {
991 if (rl->rbuf_content_type == SSL3_RT_HANDSHAKE) { 965 if (tls_content_type(rl->rcontent) == SSL3_RT_HANDSHAKE) {
992 if (rl->handshake_completed) 966 if (rl->handshake_completed)
993 return tls13_record_layer_recv_phh(rl); 967 return tls13_record_layer_recv_phh(rl);
994 } 968 }
995 return tls13_send_alert(rl, TLS13_ALERT_UNEXPECTED_MESSAGE); 969 return tls13_send_alert(rl, TLS13_ALERT_UNEXPECTED_MESSAGE);
996 } 970 }
997 971
998 if (n > CBS_len(&rl->rbuf_cbs)) 972 if (peek)
999 n = CBS_len(&rl->rbuf_cbs); 973 return tls_content_peek(rl->rcontent, buf, n);
1000 974
1001 /* XXX - CBS_memcpy? CBS_copy_bytes? */ 975 return tls_content_read(rl->rcontent, buf, n);
1002 memcpy(buf, CBS_data(&rl->rbuf_cbs), n);
1003
1004 if (!peek) {
1005 if (!CBS_skip(&rl->rbuf_cbs, n))
1006 goto err;
1007 }
1008
1009 if (CBS_len(&rl->rbuf_cbs) == 0)
1010 tls13_record_layer_rbuf_free(rl);
1011
1012 return n;
1013
1014 err:
1015 return TLS13_IO_FAILURE;
1016} 976}
1017 977
1018static ssize_t 978static ssize_t
diff --git a/src/lib/libssl/tls_content.c b/src/lib/libssl/tls_content.c
new file mode 100644
index 0000000000..ede178f84c
--- /dev/null
+++ b/src/lib/libssl/tls_content.c
@@ -0,0 +1,149 @@
1/* $OpenBSD: tls_content.c,v 1.1 2021/09/04 16:26:12 jsing Exp $ */
2/*
3 * Copyright (c) 2020 Joel Sing <jsing@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <stdlib.h>
19#include <string.h>
20
21#include "tls_content.h"
22
23/* Content from a TLS record. */
24struct tls_content {
25 uint8_t type;
26 uint16_t epoch;
27
28 const uint8_t *data;
29 size_t len;
30 CBS cbs;
31};
32
33struct tls_content *
34tls_content_new(void)
35{
36 return calloc(1, sizeof(struct tls_content));
37}
38
39void
40tls_content_clear(struct tls_content *content)
41{
42 freezero((void *)content->data, content->len);
43 memset(content, 0, sizeof(*content));
44}
45
46void
47tls_content_free(struct tls_content *content)
48{
49 if (content == NULL)
50 return;
51
52 tls_content_clear(content);
53
54 freezero(content, sizeof(struct tls_content));
55}
56
57CBS *
58tls_content_cbs(struct tls_content *content)
59{
60 return &content->cbs;
61}
62
63int
64tls_content_equal(struct tls_content *content, const uint8_t *buf, size_t n)
65{
66 return CBS_mem_equal(&content->cbs, buf, n);
67}
68
69size_t
70tls_content_remaining(struct tls_content *content)
71{
72 return CBS_len(&content->cbs);
73}
74
75uint8_t
76tls_content_type(struct tls_content *content)
77{
78 return content->type;
79}
80
81int
82tls_content_dup_data(struct tls_content *content, uint8_t type,
83 const uint8_t *data, size_t data_len)
84{
85 uint8_t *dup;
86
87 if ((dup = calloc(1, data_len)) == NULL)
88 return 0;
89 memcpy(dup, data, data_len);
90
91 tls_content_set_data(content, type, dup, data_len);
92
93 return 1;
94}
95
96uint16_t
97tls_content_epoch(struct tls_content *content)
98{
99 return content->epoch;
100}
101
102void
103tls_content_set_epoch(struct tls_content *content, uint16_t epoch)
104{
105 content->epoch = epoch;
106}
107
108void
109tls_content_set_data(struct tls_content *content, uint8_t type,
110 const uint8_t *data, size_t data_len)
111{
112 tls_content_clear(content);
113
114 content->type = type;
115 content->data = data;
116 content->len = data_len;
117
118 CBS_init(&content->cbs, content->data, content->len);
119}
120
121static ssize_t
122tls_content_read_internal(struct tls_content *content, uint8_t *buf, size_t n,
123 int peek)
124{
125 if (n > CBS_len(&content->cbs))
126 n = CBS_len(&content->cbs);
127
128 /* XXX - CBS_memcpy? CBS_copy_bytes? */
129 memcpy(buf, CBS_data(&content->cbs), n);
130
131 if (!peek) {
132 if (!CBS_skip(&content->cbs, n))
133 return -1;
134 }
135
136 return n;
137}
138
139ssize_t
140tls_content_peek(struct tls_content *content, uint8_t *buf, size_t n)
141{
142 return tls_content_read_internal(content, buf, n, 1);
143}
144
145ssize_t
146tls_content_read(struct tls_content *content, uint8_t *buf, size_t n)
147{
148 return tls_content_read_internal(content, buf, n, 0);
149}
diff --git a/src/lib/libssl/tls_content.h b/src/lib/libssl/tls_content.h
new file mode 100644
index 0000000000..173af2a740
--- /dev/null
+++ b/src/lib/libssl/tls_content.h
@@ -0,0 +1,48 @@
1/* $OpenBSD: tls_content.h,v 1.1 2021/09/04 16:26:12 jsing Exp $ */
2/*
3 * Copyright (c) 2020 Joel Sing <jsing@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#ifndef HEADER_TLS_CONTENT_H
19#define HEADER_TLS_CONTENT_H
20
21#include "bytestring.h"
22
23__BEGIN_HIDDEN_DECLS
24
25struct tls_content;
26
27struct tls_content *tls_content_new(void);
28void tls_content_clear(struct tls_content *content);
29void tls_content_free(struct tls_content *content);
30
31CBS *tls_content_cbs(struct tls_content *content);
32int tls_content_equal(struct tls_content *content, const uint8_t *buf, size_t n);
33size_t tls_content_remaining(struct tls_content *content);
34uint8_t tls_content_type(struct tls_content *content);
35uint16_t tls_content_epoch(struct tls_content *content);
36
37int tls_content_dup_data(struct tls_content *content, uint8_t type,
38 const uint8_t *data, size_t data_len);
39void tls_content_set_data(struct tls_content *content, uint8_t type,
40 const uint8_t *data, size_t data_len);
41void tls_content_set_epoch(struct tls_content *content, uint16_t epoch);
42
43ssize_t tls_content_peek(struct tls_content *content, uint8_t *buf, size_t n);
44ssize_t tls_content_read(struct tls_content *content, uint8_t *buf, size_t n);
45
46__END_HIDDEN_DECLS
47
48#endif