diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libssl/d1_lib.c | 21 | ||||
-rw-r--r-- | src/lib/libssl/d1_pkt.c | 190 | ||||
-rw-r--r-- | src/lib/libssl/dtls_locl.h | 14 | ||||
-rw-r--r-- | src/lib/libssl/s3_lib.c | 15 | ||||
-rw-r--r-- | src/lib/libssl/ssl_locl.h | 11 | ||||
-rw-r--r-- | src/lib/libssl/ssl_pkt.c | 120 | ||||
-rw-r--r-- | src/lib/libssl/tls12_record_layer.c | 79 | ||||
-rw-r--r-- | src/lib/libssl/tls13_record_layer.c | 3 | ||||
-rw-r--r-- | src/lib/libssl/tls_content.c | 25 | ||||
-rw-r--r-- | src/lib/libssl/tls_content.h | 4 |
10 files changed, 292 insertions, 190 deletions
diff --git a/src/lib/libssl/d1_lib.c b/src/lib/libssl/d1_lib.c index cf4c5100d5..fe51769530 100644 --- a/src/lib/libssl/d1_lib.c +++ b/src/lib/libssl/d1_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: d1_lib.c,v 1.62 2022/10/02 16:36:41 jsing Exp $ */ | 1 | /* $OpenBSD: d1_lib.c,v 1.63 2022/11/11 17:15:26 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * DTLS implementation written by Nagendra Modadugu | 3 | * DTLS implementation written by Nagendra Modadugu |
4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. | 4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. |
@@ -105,6 +105,23 @@ dtls1_new(SSL *s) | |||
105 | } | 105 | } |
106 | 106 | ||
107 | static void | 107 | static void |
108 | dtls1_drain_rcontents(pqueue queue) | ||
109 | { | ||
110 | DTLS1_RCONTENT_DATA_INTERNAL *rdata; | ||
111 | pitem *item; | ||
112 | |||
113 | if (queue == NULL) | ||
114 | return; | ||
115 | |||
116 | while ((item = pqueue_pop(queue)) != NULL) { | ||
117 | rdata = (DTLS1_RCONTENT_DATA_INTERNAL *)item->data; | ||
118 | tls_content_free(rdata->rcontent); | ||
119 | free(item->data); | ||
120 | pitem_free(item); | ||
121 | } | ||
122 | } | ||
123 | |||
124 | static void | ||
108 | dtls1_drain_records(pqueue queue) | 125 | dtls1_drain_records(pqueue queue) |
109 | { | 126 | { |
110 | pitem *item; | 127 | pitem *item; |
@@ -141,7 +158,7 @@ dtls1_clear_queues(SSL *s) | |||
141 | dtls1_drain_records(s->d1->unprocessed_rcds.q); | 158 | dtls1_drain_records(s->d1->unprocessed_rcds.q); |
142 | dtls1_drain_fragments(s->d1->buffered_messages); | 159 | dtls1_drain_fragments(s->d1->buffered_messages); |
143 | dtls1_drain_fragments(s->d1->sent_messages); | 160 | dtls1_drain_fragments(s->d1->sent_messages); |
144 | dtls1_drain_records(s->d1->buffered_app_data.q); | 161 | dtls1_drain_rcontents(s->d1->buffered_app_data.q); |
145 | } | 162 | } |
146 | 163 | ||
147 | void | 164 | void |
diff --git a/src/lib/libssl/d1_pkt.c b/src/lib/libssl/d1_pkt.c index 1431434ba8..35d5d8ec6d 100644 --- a/src/lib/libssl/d1_pkt.c +++ b/src/lib/libssl/d1_pkt.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: d1_pkt.c,v 1.124 2022/10/02 16:36:41 jsing Exp $ */ | 1 | /* $OpenBSD: d1_pkt.c,v 1.125 2022/11/11 17:15:26 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * DTLS implementation written by Nagendra Modadugu | 3 | * DTLS implementation written by Nagendra Modadugu |
4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. | 4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. |
@@ -115,6 +115,7 @@ | |||
115 | 115 | ||
116 | #include <endian.h> | 116 | #include <endian.h> |
117 | #include <errno.h> | 117 | #include <errno.h> |
118 | #include <limits.h> | ||
118 | #include <stdio.h> | 119 | #include <stdio.h> |
119 | 120 | ||
120 | #include <openssl/buffer.h> | 121 | #include <openssl/buffer.h> |
@@ -124,6 +125,7 @@ | |||
124 | #include "dtls_locl.h" | 125 | #include "dtls_locl.h" |
125 | #include "pqueue.h" | 126 | #include "pqueue.h" |
126 | #include "ssl_locl.h" | 127 | #include "ssl_locl.h" |
128 | #include "tls_content.h" | ||
127 | 129 | ||
128 | /* mod 128 saturating subtract of two 64-bit values in big-endian order */ | 130 | /* mod 128 saturating subtract of two 64-bit values in big-endian order */ |
129 | static int | 131 | static int |
@@ -247,6 +249,44 @@ dtls1_buffer_record(SSL *s, record_pqueue *queue, unsigned char *priority) | |||
247 | return (-1); | 249 | return (-1); |
248 | } | 250 | } |
249 | 251 | ||
252 | static int | ||
253 | dtls1_buffer_rcontent(SSL *s, rcontent_pqueue *queue, unsigned char *priority) | ||
254 | { | ||
255 | DTLS1_RCONTENT_DATA_INTERNAL *rdata; | ||
256 | pitem *item; | ||
257 | |||
258 | /* Limit the size of the queue to prevent DOS attacks */ | ||
259 | if (pqueue_size(queue->q) >= 100) | ||
260 | return 0; | ||
261 | |||
262 | rdata = malloc(sizeof(DTLS1_RCONTENT_DATA_INTERNAL)); | ||
263 | item = pitem_new(priority, rdata); | ||
264 | if (rdata == NULL || item == NULL) | ||
265 | goto init_err; | ||
266 | |||
267 | rdata->rcontent = s->s3->rcontent; | ||
268 | s->s3->rcontent = NULL; | ||
269 | |||
270 | item->data = rdata; | ||
271 | |||
272 | /* insert should not fail, since duplicates are dropped */ | ||
273 | if (pqueue_insert(queue->q, item) == NULL) | ||
274 | goto err; | ||
275 | |||
276 | if ((s->s3->rcontent = tls_content_new()) == NULL) | ||
277 | goto err; | ||
278 | |||
279 | return (1); | ||
280 | |||
281 | err: | ||
282 | tls_content_free(rdata->rcontent); | ||
283 | |||
284 | init_err: | ||
285 | SSLerror(s, ERR_R_INTERNAL_ERROR); | ||
286 | free(rdata); | ||
287 | pitem_free(item); | ||
288 | return (-1); | ||
289 | } | ||
250 | 290 | ||
251 | static int | 291 | static int |
252 | dtls1_retrieve_buffered_record(SSL *s, record_pqueue *queue) | 292 | dtls1_retrieve_buffered_record(SSL *s, record_pqueue *queue) |
@@ -267,6 +307,29 @@ dtls1_retrieve_buffered_record(SSL *s, record_pqueue *queue) | |||
267 | } | 307 | } |
268 | 308 | ||
269 | static int | 309 | static int |
310 | dtls1_retrieve_buffered_rcontent(SSL *s, rcontent_pqueue *queue) | ||
311 | { | ||
312 | DTLS1_RCONTENT_DATA_INTERNAL *rdata; | ||
313 | pitem *item; | ||
314 | |||
315 | item = pqueue_pop(queue->q); | ||
316 | if (item) { | ||
317 | rdata = item->data; | ||
318 | |||
319 | tls_content_free(s->s3->rcontent); | ||
320 | s->s3->rcontent = rdata->rcontent; | ||
321 | s->s3->rrec.epoch = tls_content_epoch(s->s3->rcontent); | ||
322 | |||
323 | free(item->data); | ||
324 | pitem_free(item); | ||
325 | |||
326 | return (1); | ||
327 | } | ||
328 | |||
329 | return (0); | ||
330 | } | ||
331 | |||
332 | static int | ||
270 | dtls1_process_buffered_record(SSL *s) | 333 | dtls1_process_buffered_record(SSL *s) |
271 | { | 334 | { |
272 | /* Check if epoch is current. */ | 335 | /* Check if epoch is current. */ |
@@ -295,13 +358,11 @@ dtls1_process_record(SSL *s) | |||
295 | { | 358 | { |
296 | SSL3_RECORD_INTERNAL *rr = &(s->s3->rrec); | 359 | SSL3_RECORD_INTERNAL *rr = &(s->s3->rrec); |
297 | uint8_t alert_desc; | 360 | uint8_t alert_desc; |
298 | uint8_t *out; | ||
299 | size_t out_len; | ||
300 | 361 | ||
301 | tls12_record_layer_set_version(s->rl, s->version); | 362 | tls12_record_layer_set_version(s->rl, s->version); |
302 | 363 | ||
303 | if (!tls12_record_layer_open_record(s->rl, s->packet, | 364 | if (!tls12_record_layer_open_record(s->rl, s->packet, s->packet_length, |
304 | s->packet_length, &out, &out_len)) { | 365 | s->s3->rcontent)) { |
305 | tls12_record_layer_alert(s->rl, &alert_desc); | 366 | tls12_record_layer_alert(s->rl, &alert_desc); |
306 | 367 | ||
307 | if (alert_desc == 0) | 368 | if (alert_desc == 0) |
@@ -311,10 +372,8 @@ dtls1_process_record(SSL *s) | |||
311 | * DTLS should silently discard invalid records, including those | 372 | * DTLS should silently discard invalid records, including those |
312 | * with a bad MAC, as per RFC 6347 section 4.1.2.1. | 373 | * with a bad MAC, as per RFC 6347 section 4.1.2.1. |
313 | */ | 374 | */ |
314 | if (alert_desc == SSL_AD_BAD_RECORD_MAC) { | 375 | if (alert_desc == SSL_AD_BAD_RECORD_MAC) |
315 | out_len = 0; | ||
316 | goto done; | 376 | goto done; |
317 | } | ||
318 | 377 | ||
319 | if (alert_desc == SSL_AD_RECORD_OVERFLOW) | 378 | if (alert_desc == SSL_AD_RECORD_OVERFLOW) |
320 | SSLerror(s, SSL_R_ENCRYPTED_LENGTH_TOO_LONG); | 379 | SSLerror(s, SSL_R_ENCRYPTED_LENGTH_TOO_LONG); |
@@ -322,11 +381,10 @@ dtls1_process_record(SSL *s) | |||
322 | goto fatal_err; | 381 | goto fatal_err; |
323 | } | 382 | } |
324 | 383 | ||
325 | done: | 384 | /* XXX move to record layer. */ |
326 | rr->data = out; | 385 | tls_content_set_epoch(s->s3->rcontent, rr->epoch); |
327 | rr->length = out_len; | ||
328 | rr->off = 0; | ||
329 | 386 | ||
387 | done: | ||
330 | s->packet_length = 0; | 388 | s->packet_length = 0; |
331 | 389 | ||
332 | return (1); | 390 | return (1); |
@@ -485,7 +543,6 @@ dtls1_get_record(SSL *s) | |||
485 | static int | 543 | static int |
486 | dtls1_read_handshake_unexpected(SSL *s) | 544 | dtls1_read_handshake_unexpected(SSL *s) |
487 | { | 545 | { |
488 | SSL3_RECORD_INTERNAL *rr = &s->s3->rrec; | ||
489 | struct hm_header_st hs_msg_hdr; | 546 | struct hm_header_st hs_msg_hdr; |
490 | CBS cbs; | 547 | CBS cbs; |
491 | int ret; | 548 | int ret; |
@@ -495,19 +552,16 @@ dtls1_read_handshake_unexpected(SSL *s) | |||
495 | return -1; | 552 | return -1; |
496 | } | 553 | } |
497 | 554 | ||
498 | if (rr->off != 0) { | ||
499 | SSLerror(s, ERR_R_INTERNAL_ERROR); | ||
500 | return -1; | ||
501 | } | ||
502 | |||
503 | /* Parse handshake message header. */ | 555 | /* Parse handshake message header. */ |
504 | CBS_init(&cbs, rr->data, rr->length); | 556 | CBS_dup(&cbs, tls_content_cbs(s->s3->rcontent)); |
505 | if (!dtls1_get_message_header(&cbs, &hs_msg_hdr)) | 557 | if (!dtls1_get_message_header(&cbs, &hs_msg_hdr)) |
506 | return -1; /* XXX - probably should drop/continue. */ | 558 | return -1; /* XXX - probably should drop/continue. */ |
507 | 559 | ||
508 | /* This may just be a stale retransmit. */ | 560 | /* This may just be a stale retransmit. */ |
509 | if (rr->epoch != tls12_record_layer_read_epoch(s->rl)) { | 561 | if (tls_content_epoch(s->s3->rcontent) != |
510 | rr->length = 0; | 562 | tls12_record_layer_read_epoch(s->rl)) { |
563 | tls_content_clear(s->s3->rcontent); | ||
564 | s->s3->rrec.length = 0; | ||
511 | return 1; | 565 | return 1; |
512 | } | 566 | } |
513 | 567 | ||
@@ -532,10 +586,11 @@ dtls1_read_handshake_unexpected(SSL *s) | |||
532 | return -1; | 586 | return -1; |
533 | } | 587 | } |
534 | 588 | ||
535 | ssl_msg_callback(s, 0, SSL3_RT_HANDSHAKE, rr->data, | 589 | ssl_msg_callback_cbs(s, 0, SSL3_RT_HANDSHAKE, |
536 | DTLS1_HM_HEADER_LENGTH); | 590 | tls_content_cbs(s->s3->rcontent)); |
537 | 591 | ||
538 | rr->length = 0; | 592 | tls_content_clear(s->s3->rcontent); |
593 | s->s3->rrec.length = 0; | ||
539 | 594 | ||
540 | /* | 595 | /* |
541 | * It should be impossible to hit this, but keep the safety | 596 | * It should be impossible to hit this, but keep the safety |
@@ -624,7 +679,8 @@ dtls1_read_handshake_unexpected(SSL *s) | |||
624 | 679 | ||
625 | dtls1_retransmit_buffered_messages(s); | 680 | dtls1_retransmit_buffered_messages(s); |
626 | 681 | ||
627 | rr->length = 0; | 682 | tls_content_clear(s->s3->rcontent); |
683 | s->s3->rrec.length = 0; | ||
628 | 684 | ||
629 | return 1; | 685 | return 1; |
630 | 686 | ||
@@ -685,9 +741,8 @@ dtls1_read_handshake_unexpected(SSL *s) | |||
685 | int | 741 | int |
686 | dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) | 742 | dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) |
687 | { | 743 | { |
688 | SSL3_RECORD_INTERNAL *rr; | ||
689 | int rrcount = 0; | 744 | int rrcount = 0; |
690 | unsigned int n; | 745 | ssize_t ssret; |
691 | int ret; | 746 | int ret; |
692 | 747 | ||
693 | if (s->s3->rbuf.buf == NULL) { | 748 | if (s->s3->rbuf.buf == NULL) { |
@@ -695,6 +750,11 @@ dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) | |||
695 | return -1; | 750 | return -1; |
696 | } | 751 | } |
697 | 752 | ||
753 | if (s->s3->rcontent == NULL) { | ||
754 | if ((s->s3->rcontent = tls_content_new()) == NULL) | ||
755 | return -1; | ||
756 | } | ||
757 | |||
698 | if (len < 0) { | 758 | if (len < 0) { |
699 | SSLerror(s, ERR_R_INTERNAL_ERROR); | 759 | SSLerror(s, ERR_R_INTERNAL_ERROR); |
700 | return -1; | 760 | return -1; |
@@ -735,19 +795,18 @@ dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) | |||
735 | 795 | ||
736 | s->rwstate = SSL_NOTHING; | 796 | s->rwstate = SSL_NOTHING; |
737 | 797 | ||
738 | rr = &s->s3->rrec; | ||
739 | |||
740 | /* | 798 | /* |
741 | * We are not handshaking and have no data yet, so process data buffered | 799 | * We are not handshaking and have no data yet, so process data buffered |
742 | * during the last handshake in advance, if any. | 800 | * during the last handshake in advance, if any. |
743 | */ | 801 | */ |
744 | if (s->s3->hs.state == SSL_ST_OK && rr->length == 0) | 802 | if (s->s3->hs.state == SSL_ST_OK && |
745 | dtls1_retrieve_buffered_record(s, &s->d1->buffered_app_data); | 803 | tls_content_remaining(s->s3->rcontent) == 0) |
804 | dtls1_retrieve_buffered_rcontent(s, &s->d1->buffered_app_data); | ||
746 | 805 | ||
747 | if (dtls1_handle_timeout(s) > 0) | 806 | if (dtls1_handle_timeout(s) > 0) |
748 | goto start; | 807 | goto start; |
749 | 808 | ||
750 | if (rr->length == 0 || s->rstate == SSL_ST_READ_BODY) { | 809 | if (tls_content_remaining(s->s3->rcontent) == 0) { |
751 | if ((ret = dtls1_get_record(s)) <= 0) { | 810 | if ((ret = dtls1_get_record(s)) <= 0) { |
752 | /* Anything other than a timeout is an error. */ | 811 | /* Anything other than a timeout is an error. */ |
753 | if ((ret = dtls1_read_failed(s, ret)) <= 0) | 812 | if ((ret = dtls1_read_failed(s, ret)) <= 0) |
@@ -756,26 +815,30 @@ dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) | |||
756 | } | 815 | } |
757 | } | 816 | } |
758 | 817 | ||
759 | if (s->d1->listen && rr->type != SSL3_RT_HANDSHAKE) { | 818 | if (s->d1->listen && |
760 | rr->length = 0; | 819 | tls_content_type(s->s3->rcontent) != SSL3_RT_HANDSHAKE) { |
820 | tls_content_clear(s->s3->rcontent); | ||
821 | s->s3->rrec.length = 0; | ||
761 | goto start; | 822 | goto start; |
762 | } | 823 | } |
763 | 824 | ||
764 | /* We now have a packet which can be read and processed. */ | 825 | /* We now have a packet which can be read and processed. */ |
765 | 826 | ||
766 | if (s->s3->change_cipher_spec && rr->type != SSL3_RT_HANDSHAKE) { | 827 | if (s->s3->change_cipher_spec && |
828 | tls_content_type(s->s3->rcontent) != SSL3_RT_HANDSHAKE) { | ||
767 | /* | 829 | /* |
768 | * We now have application data between CCS and Finished. | 830 | * We now have application data between CCS and Finished. |
769 | * Most likely the packets were reordered on their way, so | 831 | * Most likely the packets were reordered on their way, so |
770 | * buffer the application data for later processing rather | 832 | * buffer the application data for later processing rather |
771 | * than dropping the connection. | 833 | * than dropping the connection. |
772 | */ | 834 | */ |
773 | if (dtls1_buffer_record(s, &s->d1->buffered_app_data, | 835 | if (dtls1_buffer_rcontent(s, &s->d1->buffered_app_data, |
774 | rr->seq_num) < 0) { | 836 | s->s3->rrec.seq_num) < 0) { |
775 | SSLerror(s, ERR_R_INTERNAL_ERROR); | 837 | SSLerror(s, ERR_R_INTERNAL_ERROR); |
776 | return (-1); | 838 | return (-1); |
777 | } | 839 | } |
778 | rr->length = 0; | 840 | tls_content_clear(s->s3->rcontent); |
841 | s->s3->rrec.length = 0; | ||
779 | goto start; | 842 | goto start; |
780 | } | 843 | } |
781 | 844 | ||
@@ -785,12 +848,13 @@ dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) | |||
785 | */ | 848 | */ |
786 | if (s->shutdown & SSL_RECEIVED_SHUTDOWN) { | 849 | if (s->shutdown & SSL_RECEIVED_SHUTDOWN) { |
787 | s->rwstate = SSL_NOTHING; | 850 | s->rwstate = SSL_NOTHING; |
788 | rr->length = 0; | 851 | tls_content_clear(s->s3->rcontent); |
852 | s->s3->rrec.length = 0; | ||
789 | return 0; | 853 | return 0; |
790 | } | 854 | } |
791 | 855 | ||
792 | /* SSL3_RT_APPLICATION_DATA or SSL3_RT_HANDSHAKE */ | 856 | /* SSL3_RT_APPLICATION_DATA or SSL3_RT_HANDSHAKE */ |
793 | if (type == rr->type) { | 857 | if (tls_content_type(s->s3->rcontent) == type) { |
794 | /* | 858 | /* |
795 | * Make sure that we are not getting application data when we | 859 | * Make sure that we are not getting application data when we |
796 | * are doing a handshake for the first time. | 860 | * are doing a handshake for the first time. |
@@ -806,31 +870,23 @@ dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) | |||
806 | if (len <= 0) | 870 | if (len <= 0) |
807 | return len; | 871 | return len; |
808 | 872 | ||
809 | if ((unsigned int)len > rr->length) | 873 | if (peek) { |
810 | n = rr->length; | 874 | ssret = tls_content_peek(s->s3->rcontent, buf, len); |
811 | else | 875 | } else { |
812 | n = (unsigned int)len; | 876 | ssret = tls_content_read(s->s3->rcontent, buf, len); |
813 | |||
814 | memcpy(buf, &rr->data[rr->off], n); | ||
815 | if (!peek) { | ||
816 | memset(&rr->data[rr->off], 0, n); | ||
817 | rr->length -= n; | ||
818 | rr->off += n; | ||
819 | if (rr->length == 0) { | ||
820 | s->rstate = SSL_ST_READ_HEADER; | ||
821 | rr->off = 0; | ||
822 | } | ||
823 | } | 877 | } |
878 | if (ssret < INT_MIN || ssret > INT_MAX) | ||
879 | return -1; | ||
880 | if (ssret < 0) | ||
881 | return (int)ssret; | ||
824 | 882 | ||
825 | return n; | 883 | if (tls_content_remaining(s->s3->rcontent) == 0) |
826 | } | 884 | s->rstate = SSL_ST_READ_HEADER; |
827 | 885 | ||
828 | /* | 886 | return (int)ssret; |
829 | * If we get here, then type != rr->type; if we have a handshake | 887 | } |
830 | * message, then it was unexpected (Hello Request or Client Hello). | ||
831 | */ | ||
832 | 888 | ||
833 | if (rr->type == SSL3_RT_ALERT) { | 889 | if (tls_content_type(s->s3->rcontent) == SSL3_RT_ALERT) { |
834 | if ((ret = ssl3_read_alert(s)) <= 0) | 890 | if ((ret = ssl3_read_alert(s)) <= 0) |
835 | return ret; | 891 | return ret; |
836 | goto start; | 892 | goto start; |
@@ -838,11 +894,12 @@ dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) | |||
838 | 894 | ||
839 | if (s->shutdown & SSL_SENT_SHUTDOWN) { | 895 | if (s->shutdown & SSL_SENT_SHUTDOWN) { |
840 | s->rwstate = SSL_NOTHING; | 896 | s->rwstate = SSL_NOTHING; |
841 | rr->length = 0; | 897 | tls_content_clear(s->s3->rcontent); |
898 | s->s3->rrec.length = 0; | ||
842 | return (0); | 899 | return (0); |
843 | } | 900 | } |
844 | 901 | ||
845 | if (rr->type == SSL3_RT_APPLICATION_DATA) { | 902 | if (tls_content_type(s->s3->rcontent) == SSL3_RT_APPLICATION_DATA) { |
846 | /* | 903 | /* |
847 | * At this point, we were expecting handshake data, but have | 904 | * At this point, we were expecting handshake data, but have |
848 | * application data. If the library was running inside | 905 | * application data. If the library was running inside |
@@ -868,13 +925,13 @@ dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) | |||
868 | } | 925 | } |
869 | } | 926 | } |
870 | 927 | ||
871 | if (rr->type == SSL3_RT_CHANGE_CIPHER_SPEC) { | 928 | if (tls_content_type(s->s3->rcontent) == SSL3_RT_CHANGE_CIPHER_SPEC) { |
872 | if ((ret = ssl3_read_change_cipher_spec(s)) <= 0) | 929 | if ((ret = ssl3_read_change_cipher_spec(s)) <= 0) |
873 | return ret; | 930 | return ret; |
874 | goto start; | 931 | goto start; |
875 | } | 932 | } |
876 | 933 | ||
877 | if (rr->type == SSL3_RT_HANDSHAKE) { | 934 | if (tls_content_type(s->s3->rcontent) == SSL3_RT_HANDSHAKE) { |
878 | if ((ret = dtls1_read_handshake_unexpected(s)) <= 0) | 935 | if ((ret = dtls1_read_handshake_unexpected(s)) <= 0) |
879 | return ret; | 936 | return ret; |
880 | goto start; | 937 | goto start; |
@@ -891,8 +948,7 @@ dtls1_write_app_data_bytes(SSL *s, int type, const void *buf_, int len) | |||
891 | { | 948 | { |
892 | int i; | 949 | int i; |
893 | 950 | ||
894 | if (SSL_in_init(s) && !s->in_handshake) | 951 | if (SSL_in_init(s) && !s->in_handshake) { |
895 | { | ||
896 | i = s->handshake_func(s); | 952 | i = s->handshake_func(s); |
897 | if (i < 0) | 953 | if (i < 0) |
898 | return (i); | 954 | return (i); |
diff --git a/src/lib/libssl/dtls_locl.h b/src/lib/libssl/dtls_locl.h index da5c259aff..784d397f7d 100644 --- a/src/lib/libssl/dtls_locl.h +++ b/src/lib/libssl/dtls_locl.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: dtls_locl.h,v 1.10 2021/10/23 13:45:44 jsing Exp $ */ | 1 | /* $OpenBSD: dtls_locl.h,v 1.11 2022/11/11 17:15:26 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * DTLS implementation written by Nagendra Modadugu | 3 | * DTLS implementation written by Nagendra Modadugu |
4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. | 4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. |
@@ -65,6 +65,7 @@ | |||
65 | #include <openssl/dtls1.h> | 65 | #include <openssl/dtls1.h> |
66 | 66 | ||
67 | #include "ssl_locl.h" | 67 | #include "ssl_locl.h" |
68 | #include "tls_content.h" | ||
68 | 69 | ||
69 | __BEGIN_HIDDEN_DECLS | 70 | __BEGIN_HIDDEN_DECLS |
70 | 71 | ||
@@ -109,6 +110,11 @@ typedef struct record_pqueue_st { | |||
109 | struct _pqueue *q; | 110 | struct _pqueue *q; |
110 | } record_pqueue; | 111 | } record_pqueue; |
111 | 112 | ||
113 | typedef struct rcontent_pqueue_st { | ||
114 | unsigned short epoch; | ||
115 | struct _pqueue *q; | ||
116 | } rcontent_pqueue; | ||
117 | |||
112 | typedef struct hm_fragment_st { | 118 | typedef struct hm_fragment_st { |
113 | struct hm_header_st msg_header; | 119 | struct hm_header_st msg_header; |
114 | unsigned char *fragment; | 120 | unsigned char *fragment; |
@@ -122,6 +128,10 @@ typedef struct dtls1_record_data_internal_st { | |||
122 | SSL3_RECORD_INTERNAL rrec; | 128 | SSL3_RECORD_INTERNAL rrec; |
123 | } DTLS1_RECORD_DATA_INTERNAL; | 129 | } DTLS1_RECORD_DATA_INTERNAL; |
124 | 130 | ||
131 | typedef struct dtls1_rcontent_data_internal_st { | ||
132 | struct tls_content *rcontent; | ||
133 | } DTLS1_RCONTENT_DATA_INTERNAL; | ||
134 | |||
125 | struct dtls1_state_st { | 135 | struct dtls1_state_st { |
126 | /* Buffered (sent) handshake records */ | 136 | /* Buffered (sent) handshake records */ |
127 | struct _pqueue *sent_messages; | 137 | struct _pqueue *sent_messages; |
@@ -160,7 +170,7 @@ struct dtls1_state_st { | |||
160 | * to prevent either protocol violation or | 170 | * to prevent either protocol violation or |
161 | * unnecessary message loss. | 171 | * unnecessary message loss. |
162 | */ | 172 | */ |
163 | record_pqueue buffered_app_data; | 173 | rcontent_pqueue buffered_app_data; |
164 | 174 | ||
165 | /* Is set when listening for new connections with dtls1_listen() */ | 175 | /* Is set when listening for new connections with dtls1_listen() */ |
166 | unsigned int listen; | 176 | unsigned int listen; |
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c index 68c6fc6324..87092069df 100644 --- a/src/lib/libssl/s3_lib.c +++ b/src/lib/libssl/s3_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: s3_lib.c,v 1.240 2022/11/10 18:06:37 jsing Exp $ */ | 1 | /* $OpenBSD: s3_lib.c,v 1.241 2022/11/11 17:15:26 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -163,6 +163,7 @@ | |||
163 | #include "ssl_locl.h" | 163 | #include "ssl_locl.h" |
164 | #include "ssl_sigalgs.h" | 164 | #include "ssl_sigalgs.h" |
165 | #include "ssl_tlsext.h" | 165 | #include "ssl_tlsext.h" |
166 | #include "tls_content.h" | ||
166 | 167 | ||
167 | #define SSL3_NUM_CIPHERS (sizeof(ssl3_ciphers) / sizeof(SSL_CIPHER)) | 168 | #define SSL3_NUM_CIPHERS (sizeof(ssl3_ciphers) / sizeof(SSL_CIPHER)) |
168 | 169 | ||
@@ -1441,11 +1442,12 @@ ssl3_cipher_get_value(const SSL_CIPHER *c) | |||
1441 | int | 1442 | int |
1442 | ssl3_pending(const SSL *s) | 1443 | ssl3_pending(const SSL *s) |
1443 | { | 1444 | { |
1444 | if (s->rstate == SSL_ST_READ_BODY) | 1445 | if (s->s3->rcontent == NULL) |
1446 | return 0; | ||
1447 | if (tls_content_type(s->s3->rcontent) != SSL3_RT_APPLICATION_DATA) | ||
1445 | return 0; | 1448 | return 0; |
1446 | 1449 | ||
1447 | return (s->s3->rrec.type == SSL3_RT_APPLICATION_DATA) ? | 1450 | return tls_content_remaining(s->s3->rcontent); |
1448 | s->s3->rrec.length : 0; | ||
1449 | } | 1451 | } |
1450 | 1452 | ||
1451 | int | 1453 | int |
@@ -1560,6 +1562,8 @@ ssl3_free(SSL *s) | |||
1560 | ssl3_release_read_buffer(s); | 1562 | ssl3_release_read_buffer(s); |
1561 | ssl3_release_write_buffer(s); | 1563 | ssl3_release_write_buffer(s); |
1562 | 1564 | ||
1565 | tls_content_free(s->s3->rcontent); | ||
1566 | |||
1563 | tls_buffer_free(s->s3->alert_fragment); | 1567 | tls_buffer_free(s->s3->alert_fragment); |
1564 | tls_buffer_free(s->s3->handshake_fragment); | 1568 | tls_buffer_free(s->s3->handshake_fragment); |
1565 | 1569 | ||
@@ -1637,6 +1641,9 @@ ssl3_clear(SSL *s) | |||
1637 | rlen = s->s3->rbuf.len; | 1641 | rlen = s->s3->rbuf.len; |
1638 | wlen = s->s3->wbuf.len; | 1642 | wlen = s->s3->wbuf.len; |
1639 | 1643 | ||
1644 | tls_content_free(s->s3->rcontent); | ||
1645 | s->s3->rcontent = NULL; | ||
1646 | |||
1640 | tls1_transcript_free(s); | 1647 | tls1_transcript_free(s); |
1641 | tls1_transcript_hash_free(s); | 1648 | tls1_transcript_hash_free(s); |
1642 | 1649 | ||
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h index 69546c0962..8387513d99 100644 --- a/src/lib/libssl/ssl_locl.h +++ b/src/lib/libssl/ssl_locl.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_locl.h,v 1.431 2022/11/10 18:06:37 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_locl.h,v 1.432 2022/11/11 17:15:26 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -162,6 +162,7 @@ | |||
162 | #include <openssl/stack.h> | 162 | #include <openssl/stack.h> |
163 | 163 | ||
164 | #include "bytestring.h" | 164 | #include "bytestring.h" |
165 | #include "tls_content.h" | ||
165 | #include "tls13_internal.h" | 166 | #include "tls13_internal.h" |
166 | 167 | ||
167 | __BEGIN_HIDDEN_DECLS | 168 | __BEGIN_HIDDEN_DECLS |
@@ -706,7 +707,7 @@ int tls12_record_layer_change_read_cipher_state(struct tls12_record_layer *rl, | |||
706 | int tls12_record_layer_change_write_cipher_state(struct tls12_record_layer *rl, | 707 | int tls12_record_layer_change_write_cipher_state(struct tls12_record_layer *rl, |
707 | CBS *mac_key, CBS *key, CBS *iv); | 708 | CBS *mac_key, CBS *key, CBS *iv); |
708 | int tls12_record_layer_open_record(struct tls12_record_layer *rl, | 709 | int tls12_record_layer_open_record(struct tls12_record_layer *rl, |
709 | uint8_t *buf, size_t buf_len, uint8_t **out, size_t *out_len); | 710 | uint8_t *buf, size_t buf_len, struct tls_content *out); |
710 | int tls12_record_layer_seal_record(struct tls12_record_layer *rl, | 711 | int tls12_record_layer_seal_record(struct tls12_record_layer *rl, |
711 | uint8_t content_type, const uint8_t *content, size_t content_len, | 712 | uint8_t content_type, const uint8_t *content, size_t content_len, |
712 | CBB *out); | 713 | CBB *out); |
@@ -1157,6 +1158,10 @@ typedef struct ssl3_state_st { | |||
1157 | SSL3_BUFFER_INTERNAL rbuf; /* read IO goes into here */ | 1158 | SSL3_BUFFER_INTERNAL rbuf; /* read IO goes into here */ |
1158 | SSL3_BUFFER_INTERNAL wbuf; /* write IO goes into here */ | 1159 | SSL3_BUFFER_INTERNAL wbuf; /* write IO goes into here */ |
1159 | 1160 | ||
1161 | SSL3_RECORD_INTERNAL rrec; /* each decoded record goes in here */ | ||
1162 | |||
1163 | struct tls_content *rcontent; /* Content from opened TLS records. */ | ||
1164 | |||
1160 | /* we allow one fatal and one warning alert to be outstanding, | 1165 | /* we allow one fatal and one warning alert to be outstanding, |
1161 | * send close alert via the warning alert */ | 1166 | * send close alert via the warning alert */ |
1162 | int alert_dispatch; | 1167 | int alert_dispatch; |
@@ -1166,8 +1171,6 @@ typedef struct ssl3_state_st { | |||
1166 | int need_empty_fragments; | 1171 | int need_empty_fragments; |
1167 | int empty_fragment_done; | 1172 | int empty_fragment_done; |
1168 | 1173 | ||
1169 | SSL3_RECORD_INTERNAL rrec; /* each decoded record goes in here */ | ||
1170 | |||
1171 | /* Unprocessed Alert/Handshake protocol data. */ | 1174 | /* Unprocessed Alert/Handshake protocol data. */ |
1172 | struct tls_buffer *alert_fragment; | 1175 | struct tls_buffer *alert_fragment; |
1173 | struct tls_buffer *handshake_fragment; | 1176 | struct tls_buffer *handshake_fragment; |
diff --git a/src/lib/libssl/ssl_pkt.c b/src/lib/libssl/ssl_pkt.c index 58d3ee1db2..4d79981484 100644 --- a/src/lib/libssl/ssl_pkt.c +++ b/src/lib/libssl/ssl_pkt.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_pkt.c,v 1.63 2022/11/10 18:06:37 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_pkt.c,v 1.64 2022/11/11 17:15:26 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -110,6 +110,7 @@ | |||
110 | */ | 110 | */ |
111 | 111 | ||
112 | #include <errno.h> | 112 | #include <errno.h> |
113 | #include <limits.h> | ||
113 | #include <stdio.h> | 114 | #include <stdio.h> |
114 | 115 | ||
115 | #include <openssl/buffer.h> | 116 | #include <openssl/buffer.h> |
@@ -118,6 +119,7 @@ | |||
118 | #include "bytestring.h" | 119 | #include "bytestring.h" |
119 | #include "dtls_locl.h" | 120 | #include "dtls_locl.h" |
120 | #include "ssl_locl.h" | 121 | #include "ssl_locl.h" |
122 | #include "tls_content.h" | ||
121 | 123 | ||
122 | static int do_ssl3_write(SSL *s, int type, const unsigned char *buf, | 124 | static int do_ssl3_write(SSL *s, int type, const unsigned char *buf, |
123 | unsigned int len); | 125 | unsigned int len); |
@@ -333,8 +335,6 @@ ssl3_get_record(SSL *s) | |||
333 | SSL3_BUFFER_INTERNAL *rb = &(s->s3->rbuf); | 335 | SSL3_BUFFER_INTERNAL *rb = &(s->s3->rbuf); |
334 | SSL3_RECORD_INTERNAL *rr = &(s->s3->rrec); | 336 | SSL3_RECORD_INTERNAL *rr = &(s->s3->rrec); |
335 | uint8_t alert_desc; | 337 | uint8_t alert_desc; |
336 | uint8_t *out; | ||
337 | size_t out_len; | ||
338 | int al, n; | 338 | int al, n; |
339 | int ret = -1; | 339 | int ret = -1; |
340 | 340 | ||
@@ -410,8 +410,8 @@ ssl3_get_record(SSL *s) | |||
410 | */ | 410 | */ |
411 | tls12_record_layer_set_version(s->rl, s->version); | 411 | tls12_record_layer_set_version(s->rl, s->version); |
412 | 412 | ||
413 | if (!tls12_record_layer_open_record(s->rl, s->packet, | 413 | if (!tls12_record_layer_open_record(s->rl, s->packet, s->packet_length, |
414 | s->packet_length, &out, &out_len)) { | 414 | s->s3->rcontent)) { |
415 | tls12_record_layer_alert(s->rl, &alert_desc); | 415 | tls12_record_layer_alert(s->rl, &alert_desc); |
416 | 416 | ||
417 | if (alert_desc == 0) | 417 | if (alert_desc == 0) |
@@ -426,14 +426,10 @@ ssl3_get_record(SSL *s) | |||
426 | goto fatal_err; | 426 | goto fatal_err; |
427 | } | 427 | } |
428 | 428 | ||
429 | rr->data = out; | ||
430 | rr->length = out_len; | ||
431 | rr->off = 0; | ||
432 | |||
433 | /* we have pulled in a full packet so zero things */ | 429 | /* we have pulled in a full packet so zero things */ |
434 | s->packet_length = 0; | 430 | s->packet_length = 0; |
435 | 431 | ||
436 | if (rr->length == 0) { | 432 | if (tls_content_remaining(s->s3->rcontent) == 0) { |
437 | /* | 433 | /* |
438 | * Zero-length fragments are only permitted for application | 434 | * Zero-length fragments are only permitted for application |
439 | * data, as per RFC 5246 section 6.2.1. | 435 | * data, as per RFC 5246 section 6.2.1. |
@@ -444,6 +440,8 @@ ssl3_get_record(SSL *s) | |||
444 | goto fatal_err; | 440 | goto fatal_err; |
445 | } | 441 | } |
446 | 442 | ||
443 | tls_content_clear(s->s3->rcontent); | ||
444 | |||
447 | /* | 445 | /* |
448 | * CBC countermeasures for known IV weaknesses can legitimately | 446 | * CBC countermeasures for known IV weaknesses can legitimately |
449 | * insert a single empty record, so we allow ourselves to read | 447 | * insert a single empty record, so we allow ourselves to read |
@@ -691,20 +689,9 @@ ssl3_write_pending(SSL *s, int type, const unsigned char *buf, unsigned int len) | |||
691 | static ssize_t | 689 | static ssize_t |
692 | ssl3_read_cb(void *buf, size_t n, void *cb_arg) | 690 | ssl3_read_cb(void *buf, size_t n, void *cb_arg) |
693 | { | 691 | { |
694 | SSL3_RECORD_INTERNAL *rr; | ||
695 | SSL *s = cb_arg; | 692 | SSL *s = cb_arg; |
696 | 693 | ||
697 | rr = &s->s3->rrec; | 694 | return tls_content_read(s->s3->rcontent, buf, n); |
698 | |||
699 | if (n > rr->length) | ||
700 | n = rr->length; | ||
701 | |||
702 | memcpy(buf, &rr->data[rr->off], n); | ||
703 | |||
704 | rr->off += n; | ||
705 | rr->length -= n; | ||
706 | |||
707 | return n; | ||
708 | } | 695 | } |
709 | 696 | ||
710 | #define SSL3_ALERT_LENGTH 2 | 697 | #define SSL3_ALERT_LENGTH 2 |
@@ -791,21 +778,18 @@ ssl3_read_alert(SSL *s) | |||
791 | int | 778 | int |
792 | ssl3_read_change_cipher_spec(SSL *s) | 779 | ssl3_read_change_cipher_spec(SSL *s) |
793 | { | 780 | { |
794 | SSL3_RECORD_INTERNAL *rr = &s->s3->rrec; | 781 | const uint8_t ccs[1] = { SSL3_MT_CCS }; |
795 | const uint8_t ccs[] = { SSL3_MT_CCS }; | ||
796 | CBS cbs; | ||
797 | 782 | ||
798 | /* | 783 | /* |
799 | * 'Change Cipher Spec' is just a single byte, so we know exactly what | 784 | * 'Change Cipher Spec' is just a single byte, so we know exactly what |
800 | * the record payload has to look like. | 785 | * the record payload has to look like. |
801 | */ | 786 | */ |
802 | CBS_init(&cbs, rr->data, rr->length); | 787 | if (tls_content_remaining(s->s3->rcontent) != sizeof(ccs)) { |
803 | if (rr->off != 0 || CBS_len(&cbs) != sizeof(ccs)) { | ||
804 | SSLerror(s, SSL_R_BAD_CHANGE_CIPHER_SPEC); | 788 | SSLerror(s, SSL_R_BAD_CHANGE_CIPHER_SPEC); |
805 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | 789 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); |
806 | return -1; | 790 | return -1; |
807 | } | 791 | } |
808 | if (!CBS_mem_equal(&cbs, ccs, sizeof(ccs))) { | 792 | if (!tls_content_equal(s->s3->rcontent, ccs, sizeof(ccs))) { |
809 | SSLerror(s, SSL_R_BAD_CHANGE_CIPHER_SPEC); | 793 | SSLerror(s, SSL_R_BAD_CHANGE_CIPHER_SPEC); |
810 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER); | 794 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER); |
811 | return -1; | 795 | return -1; |
@@ -813,7 +797,8 @@ ssl3_read_change_cipher_spec(SSL *s) | |||
813 | 797 | ||
814 | /* XDTLS: check that epoch is consistent */ | 798 | /* XDTLS: check that epoch is consistent */ |
815 | 799 | ||
816 | ssl_msg_callback_cbs(s, 0, SSL3_RT_CHANGE_CIPHER_SPEC, &cbs); | 800 | ssl_msg_callback_cbs(s, 0, SSL3_RT_CHANGE_CIPHER_SPEC, |
801 | tls_content_cbs(s->s3->rcontent)); | ||
817 | 802 | ||
818 | /* Check that we have a cipher to change to. */ | 803 | /* Check that we have a cipher to change to. */ |
819 | if (s->s3->hs.cipher == NULL) { | 804 | if (s->s3->hs.cipher == NULL) { |
@@ -830,7 +815,7 @@ ssl3_read_change_cipher_spec(SSL *s) | |||
830 | * handshake messages are still missing, so just | 815 | * handshake messages are still missing, so just |
831 | * drop it. | 816 | * drop it. |
832 | */ | 817 | */ |
833 | rr->length = 0; | 818 | tls_content_clear(s->s3->rcontent); |
834 | return 1; | 819 | return 1; |
835 | } | 820 | } |
836 | s->d1->change_cipher_spec_ok = 0; | 821 | s->d1->change_cipher_spec_ok = 0; |
@@ -844,7 +829,7 @@ ssl3_read_change_cipher_spec(SSL *s) | |||
844 | s->s3->flags &= ~SSL3_FLAGS_CCS_OK; | 829 | s->s3->flags &= ~SSL3_FLAGS_CCS_OK; |
845 | } | 830 | } |
846 | 831 | ||
847 | rr->length = 0; | 832 | tls_content_clear(s->s3->rcontent); |
848 | 833 | ||
849 | s->s3->change_cipher_spec = 1; | 834 | s->s3->change_cipher_spec = 1; |
850 | if (!ssl3_do_change_cipher_spec(s)) | 835 | if (!ssl3_do_change_cipher_spec(s)) |
@@ -1053,9 +1038,8 @@ ssl3_read_handshake_unexpected(SSL *s) | |||
1053 | int | 1038 | int |
1054 | ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) | 1039 | ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) |
1055 | { | 1040 | { |
1056 | SSL3_RECORD_INTERNAL *rr; | ||
1057 | int rrcount = 0; | 1041 | int rrcount = 0; |
1058 | unsigned int n; | 1042 | ssize_t ssret; |
1059 | int ret; | 1043 | int ret; |
1060 | 1044 | ||
1061 | if (s->s3->rbuf.buf == NULL) { | 1045 | if (s->s3->rbuf.buf == NULL) { |
@@ -1063,6 +1047,11 @@ ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) | |||
1063 | return -1; | 1047 | return -1; |
1064 | } | 1048 | } |
1065 | 1049 | ||
1050 | if (s->s3->rcontent == NULL) { | ||
1051 | if ((s->s3->rcontent = tls_content_new()) == NULL) | ||
1052 | return -1; | ||
1053 | } | ||
1054 | |||
1066 | if (len < 0) { | 1055 | if (len < 0) { |
1067 | SSLerror(s, ERR_R_INTERNAL_ERROR); | 1056 | SSLerror(s, ERR_R_INTERNAL_ERROR); |
1068 | return -1; | 1057 | return -1; |
@@ -1120,16 +1109,15 @@ ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) | |||
1120 | 1109 | ||
1121 | s->rwstate = SSL_NOTHING; | 1110 | s->rwstate = SSL_NOTHING; |
1122 | 1111 | ||
1123 | rr = &s->s3->rrec; | 1112 | if (tls_content_remaining(s->s3->rcontent) == 0) { |
1124 | |||
1125 | if (rr->length == 0 || s->rstate == SSL_ST_READ_BODY) { | ||
1126 | if ((ret = ssl3_get_record(s)) <= 0) | 1113 | if ((ret = ssl3_get_record(s)) <= 0) |
1127 | return ret; | 1114 | return ret; |
1128 | } | 1115 | } |
1129 | 1116 | ||
1130 | /* We now have a packet which can be read and processed. */ | 1117 | /* We now have a packet which can be read and processed. */ |
1131 | 1118 | ||
1132 | if (s->s3->change_cipher_spec && rr->type != SSL3_RT_HANDSHAKE) { | 1119 | if (s->s3->change_cipher_spec && |
1120 | tls_content_type(s->s3->rcontent) != SSL3_RT_HANDSHAKE) { | ||
1133 | SSLerror(s, SSL_R_DATA_BETWEEN_CCS_AND_FINISHED); | 1121 | SSLerror(s, SSL_R_DATA_BETWEEN_CCS_AND_FINISHED); |
1134 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE); | 1122 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE); |
1135 | return -1; | 1123 | return -1; |
@@ -1141,12 +1129,13 @@ ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) | |||
1141 | */ | 1129 | */ |
1142 | if (s->shutdown & SSL_RECEIVED_SHUTDOWN) { | 1130 | if (s->shutdown & SSL_RECEIVED_SHUTDOWN) { |
1143 | s->rwstate = SSL_NOTHING; | 1131 | s->rwstate = SSL_NOTHING; |
1144 | rr->length = 0; | 1132 | tls_content_clear(s->s3->rcontent); |
1133 | s->s3->rrec.length = 0; | ||
1145 | return 0; | 1134 | return 0; |
1146 | } | 1135 | } |
1147 | 1136 | ||
1148 | /* SSL3_RT_APPLICATION_DATA or SSL3_RT_HANDSHAKE */ | 1137 | /* SSL3_RT_APPLICATION_DATA or SSL3_RT_HANDSHAKE */ |
1149 | if (type == rr->type) { | 1138 | if (tls_content_type(s->s3->rcontent) == type) { |
1150 | /* | 1139 | /* |
1151 | * Make sure that we are not getting application data when we | 1140 | * Make sure that we are not getting application data when we |
1152 | * are doing a handshake for the first time. | 1141 | * are doing a handshake for the first time. |
@@ -1162,34 +1151,28 @@ ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) | |||
1162 | if (len <= 0) | 1151 | if (len <= 0) |
1163 | return len; | 1152 | return len; |
1164 | 1153 | ||
1165 | if ((unsigned int)len > rr->length) | 1154 | if (peek) { |
1166 | n = rr->length; | 1155 | ssret = tls_content_peek(s->s3->rcontent, buf, len); |
1167 | else | 1156 | } else { |
1168 | n = (unsigned int)len; | 1157 | ssret = tls_content_read(s->s3->rcontent, buf, len); |
1169 | |||
1170 | memcpy(buf, &rr->data[rr->off], n); | ||
1171 | if (!peek) { | ||
1172 | memset(&rr->data[rr->off], 0, n); | ||
1173 | rr->length -= n; | ||
1174 | rr->off += n; | ||
1175 | if (rr->length == 0) { | ||
1176 | s->rstate = SSL_ST_READ_HEADER; | ||
1177 | rr->off = 0; | ||
1178 | if (s->mode & SSL_MODE_RELEASE_BUFFERS && | ||
1179 | s->s3->rbuf.left == 0) | ||
1180 | ssl3_release_read_buffer(s); | ||
1181 | } | ||
1182 | } | 1158 | } |
1159 | if (ssret < INT_MIN || ssret > INT_MAX) | ||
1160 | return -1; | ||
1161 | if (ssret < 0) | ||
1162 | return (int)ssret; | ||
1183 | 1163 | ||
1184 | return n; | 1164 | if (tls_content_remaining(s->s3->rcontent) == 0) { |
1185 | } | 1165 | s->rstate = SSL_ST_READ_HEADER; |
1186 | 1166 | ||
1187 | /* | 1167 | if (s->mode & SSL_MODE_RELEASE_BUFFERS && |
1188 | * If we get here, then type != rr->type; if we have a handshake | 1168 | s->s3->rbuf.left == 0) |
1189 | * message, then it was unexpected (Hello Request or Client Hello). | 1169 | ssl3_release_read_buffer(s); |
1190 | */ | 1170 | } |
1171 | |||
1172 | return ssret; | ||
1173 | } | ||
1191 | 1174 | ||
1192 | if (rr->type == SSL3_RT_ALERT) { | 1175 | if (tls_content_type(s->s3->rcontent) == SSL3_RT_ALERT) { |
1193 | if ((ret = ssl3_read_alert(s)) <= 0) | 1176 | if ((ret = ssl3_read_alert(s)) <= 0) |
1194 | return ret; | 1177 | return ret; |
1195 | goto start; | 1178 | goto start; |
@@ -1197,11 +1180,12 @@ ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) | |||
1197 | 1180 | ||
1198 | if (s->shutdown & SSL_SENT_SHUTDOWN) { | 1181 | if (s->shutdown & SSL_SENT_SHUTDOWN) { |
1199 | s->rwstate = SSL_NOTHING; | 1182 | s->rwstate = SSL_NOTHING; |
1200 | rr->length = 0; | 1183 | tls_content_clear(s->s3->rcontent); |
1184 | s->s3->rrec.length = 0; | ||
1201 | return 0; | 1185 | return 0; |
1202 | } | 1186 | } |
1203 | 1187 | ||
1204 | if (rr->type == SSL3_RT_APPLICATION_DATA) { | 1188 | if (tls_content_type(s->s3->rcontent) == SSL3_RT_APPLICATION_DATA) { |
1205 | /* | 1189 | /* |
1206 | * At this point, we were expecting handshake data, but have | 1190 | * At this point, we were expecting handshake data, but have |
1207 | * application data. If the library was running inside | 1191 | * application data. If the library was running inside |
@@ -1227,13 +1211,13 @@ ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) | |||
1227 | } | 1211 | } |
1228 | } | 1212 | } |
1229 | 1213 | ||
1230 | if (rr->type == SSL3_RT_CHANGE_CIPHER_SPEC) { | 1214 | if (tls_content_type(s->s3->rcontent) == SSL3_RT_CHANGE_CIPHER_SPEC) { |
1231 | if ((ret = ssl3_read_change_cipher_spec(s)) <= 0) | 1215 | if ((ret = ssl3_read_change_cipher_spec(s)) <= 0) |
1232 | return ret; | 1216 | return ret; |
1233 | goto start; | 1217 | goto start; |
1234 | } | 1218 | } |
1235 | 1219 | ||
1236 | if (rr->type == SSL3_RT_HANDSHAKE) { | 1220 | if (tls_content_type(s->s3->rcontent) == SSL3_RT_HANDSHAKE) { |
1237 | if ((ret = ssl3_read_handshake_unexpected(s)) <= 0) | 1221 | if ((ret = ssl3_read_handshake_unexpected(s)) <= 0) |
1238 | return ret; | 1222 | return ret; |
1239 | goto start; | 1223 | goto start; |
@@ -1244,7 +1228,7 @@ ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) | |||
1244 | * earlier versions silently ignore the record. | 1228 | * earlier versions silently ignore the record. |
1245 | */ | 1229 | */ |
1246 | if (ssl_effective_tls_version(s) <= TLS1_1_VERSION) { | 1230 | if (ssl_effective_tls_version(s) <= TLS1_1_VERSION) { |
1247 | rr->length = 0; | 1231 | tls_content_clear(s->s3->rcontent); |
1248 | goto start; | 1232 | goto start; |
1249 | } | 1233 | } |
1250 | SSLerror(s, SSL_R_UNEXPECTED_RECORD); | 1234 | SSLerror(s, SSL_R_UNEXPECTED_RECORD); |
diff --git a/src/lib/libssl/tls12_record_layer.c b/src/lib/libssl/tls12_record_layer.c index 3568e1876a..a65906697d 100644 --- a/src/lib/libssl/tls12_record_layer.c +++ b/src/lib/libssl/tls12_record_layer.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls12_record_layer.c,v 1.36 2022/01/14 09:12:15 tb Exp $ */ | 1 | /* $OpenBSD: tls12_record_layer.c,v 1.37 2022/11/11 17:15:26 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -864,28 +864,25 @@ tls12_record_layer_aead_xored_nonce(struct tls12_record_layer *rl, | |||
864 | 864 | ||
865 | static int | 865 | static int |
866 | tls12_record_layer_open_record_plaintext(struct tls12_record_layer *rl, | 866 | tls12_record_layer_open_record_plaintext(struct tls12_record_layer *rl, |
867 | uint8_t content_type, CBS *fragment, uint8_t **out, size_t *out_len) | 867 | uint8_t content_type, CBS *fragment, struct tls_content *out) |
868 | { | 868 | { |
869 | if (tls12_record_protection_engaged(rl->read)) | 869 | if (tls12_record_protection_engaged(rl->read)) |
870 | return 0; | 870 | return 0; |
871 | 871 | ||
872 | /* XXX - decrypt/process in place for now. */ | 872 | return tls_content_dup_data(out, content_type, CBS_data(fragment), |
873 | *out = (uint8_t *)CBS_data(fragment); | 873 | CBS_len(fragment)); |
874 | *out_len = CBS_len(fragment); | ||
875 | |||
876 | return 1; | ||
877 | } | 874 | } |
878 | 875 | ||
879 | static int | 876 | static int |
880 | tls12_record_layer_open_record_protected_aead(struct tls12_record_layer *rl, | 877 | tls12_record_layer_open_record_protected_aead(struct tls12_record_layer *rl, |
881 | uint8_t content_type, CBS *seq_num, CBS *fragment, uint8_t **out, | 878 | uint8_t content_type, CBS *seq_num, CBS *fragment, struct tls_content *out) |
882 | size_t *out_len) | ||
883 | { | 879 | { |
884 | struct tls12_record_protection *rp = rl->read; | 880 | struct tls12_record_protection *rp = rl->read; |
885 | uint8_t *header = NULL; | 881 | uint8_t *header = NULL; |
886 | size_t header_len = 0; | 882 | size_t header_len = 0; |
887 | uint8_t *plain; | 883 | uint8_t *content = NULL; |
888 | size_t plain_len; | 884 | size_t content_len = 0; |
885 | size_t out_len = 0; | ||
889 | CBS var_nonce; | 886 | CBS var_nonce; |
890 | int ret = 0; | 887 | int ret = 0; |
891 | 888 | ||
@@ -913,43 +910,47 @@ tls12_record_layer_open_record_protected_aead(struct tls12_record_layer *rl, | |||
913 | goto err; | 910 | goto err; |
914 | } | 911 | } |
915 | 912 | ||
916 | /* XXX - decrypt/process in place for now. */ | 913 | content_len = CBS_len(fragment) - rp->aead_tag_len; |
917 | plain = (uint8_t *)CBS_data(fragment); | 914 | if ((content = calloc(1, CBS_len(fragment))) == NULL) { |
918 | plain_len = CBS_len(fragment) - rp->aead_tag_len; | 915 | content_len = 0; |
916 | goto err; | ||
917 | } | ||
919 | 918 | ||
920 | if (!tls12_record_layer_pseudo_header(rl, content_type, plain_len, | 919 | if (!tls12_record_layer_pseudo_header(rl, content_type, content_len, |
921 | seq_num, &header, &header_len)) | 920 | seq_num, &header, &header_len)) |
922 | goto err; | 921 | goto err; |
923 | 922 | ||
924 | if (!EVP_AEAD_CTX_open(rp->aead_ctx, plain, out_len, plain_len, | 923 | if (!EVP_AEAD_CTX_open(rp->aead_ctx, content, &out_len, content_len, |
925 | rp->aead_nonce, rp->aead_nonce_len, CBS_data(fragment), | 924 | rp->aead_nonce, rp->aead_nonce_len, CBS_data(fragment), |
926 | CBS_len(fragment), header, header_len)) { | 925 | CBS_len(fragment), header, header_len)) { |
927 | rl->alert_desc = SSL_AD_BAD_RECORD_MAC; | 926 | rl->alert_desc = SSL_AD_BAD_RECORD_MAC; |
928 | goto err; | 927 | goto err; |
929 | } | 928 | } |
930 | 929 | ||
931 | if (*out_len > SSL3_RT_MAX_PLAIN_LENGTH) { | 930 | if (out_len > SSL3_RT_MAX_PLAIN_LENGTH) { |
932 | rl->alert_desc = SSL_AD_RECORD_OVERFLOW; | 931 | rl->alert_desc = SSL_AD_RECORD_OVERFLOW; |
933 | goto err; | 932 | goto err; |
934 | } | 933 | } |
935 | 934 | ||
936 | if (*out_len != plain_len) | 935 | if (out_len != content_len) |
937 | goto err; | 936 | goto err; |
938 | 937 | ||
939 | *out = plain; | 938 | tls_content_set_data(out, content_type, content, content_len); |
939 | content = NULL; | ||
940 | content_len = 0; | ||
940 | 941 | ||
941 | ret = 1; | 942 | ret = 1; |
942 | 943 | ||
943 | err: | 944 | err: |
944 | freezero(header, header_len); | 945 | freezero(header, header_len); |
946 | freezero(content, content_len); | ||
945 | 947 | ||
946 | return ret; | 948 | return ret; |
947 | } | 949 | } |
948 | 950 | ||
949 | static int | 951 | static int |
950 | tls12_record_layer_open_record_protected_cipher(struct tls12_record_layer *rl, | 952 | tls12_record_layer_open_record_protected_cipher(struct tls12_record_layer *rl, |
951 | uint8_t content_type, CBS *seq_num, CBS *fragment, uint8_t **out, | 953 | uint8_t content_type, CBS *seq_num, CBS *fragment, struct tls_content *out) |
952 | size_t *out_len) | ||
953 | { | 954 | { |
954 | EVP_CIPHER_CTX *enc = rl->read->cipher_ctx; | 955 | EVP_CIPHER_CTX *enc = rl->read->cipher_ctx; |
955 | SSL3_RECORD_INTERNAL rrec; | 956 | SSL3_RECORD_INTERNAL rrec; |
@@ -958,8 +959,8 @@ tls12_record_layer_open_record_protected_cipher(struct tls12_record_layer *rl, | |||
958 | size_t mac_len = 0; | 959 | size_t mac_len = 0; |
959 | uint8_t *out_mac = NULL; | 960 | uint8_t *out_mac = NULL; |
960 | size_t out_mac_len = 0; | 961 | size_t out_mac_len = 0; |
961 | uint8_t *plain; | 962 | uint8_t *content = NULL; |
962 | size_t plain_len; | 963 | size_t content_len = 0; |
963 | size_t min_len; | 964 | size_t min_len; |
964 | CBB cbb_mac; | 965 | CBB cbb_mac; |
965 | int ret = 0; | 966 | int ret = 0; |
@@ -1001,16 +1002,16 @@ tls12_record_layer_open_record_protected_cipher(struct tls12_record_layer *rl, | |||
1001 | goto err; | 1002 | goto err; |
1002 | } | 1003 | } |
1003 | 1004 | ||
1004 | /* XXX - decrypt/process in place for now. */ | 1005 | if ((content = calloc(1, CBS_len(fragment))) == NULL) |
1005 | plain = (uint8_t *)CBS_data(fragment); | 1006 | goto err; |
1006 | plain_len = CBS_len(fragment); | 1007 | content_len = CBS_len(fragment); |
1007 | 1008 | ||
1008 | if (!EVP_Cipher(enc, plain, CBS_data(fragment), plain_len)) | 1009 | if (!EVP_Cipher(enc, content, CBS_data(fragment), CBS_len(fragment))) |
1009 | goto err; | 1010 | goto err; |
1010 | 1011 | ||
1011 | rrec.data = plain; | 1012 | rrec.data = content; |
1012 | rrec.input = plain; | 1013 | rrec.input = content; |
1013 | rrec.length = plain_len; | 1014 | rrec.length = content_len; |
1014 | 1015 | ||
1015 | /* | 1016 | /* |
1016 | * We now have to remove padding, extract MAC, calculate MAC | 1017 | * We now have to remove padding, extract MAC, calculate MAC |
@@ -1058,8 +1059,13 @@ tls12_record_layer_open_record_protected_cipher(struct tls12_record_layer *rl, | |||
1058 | goto err; | 1059 | goto err; |
1059 | } | 1060 | } |
1060 | 1061 | ||
1061 | *out = rrec.data; | 1062 | tls_content_set_data(out, content_type, content, content_len); |
1062 | *out_len = rrec.length; | 1063 | content = NULL; |
1064 | content_len = 0; | ||
1065 | |||
1066 | /* Actual content is after EIV, minus padding and MAC. */ | ||
1067 | if (!tls_content_set_bounds(out, eiv_len, rrec.length)) | ||
1068 | goto err; | ||
1063 | 1069 | ||
1064 | ret = 1; | 1070 | ret = 1; |
1065 | 1071 | ||
@@ -1067,13 +1073,14 @@ tls12_record_layer_open_record_protected_cipher(struct tls12_record_layer *rl, | |||
1067 | CBB_cleanup(&cbb_mac); | 1073 | CBB_cleanup(&cbb_mac); |
1068 | freezero(mac, mac_len); | 1074 | freezero(mac, mac_len); |
1069 | freezero(out_mac, out_mac_len); | 1075 | freezero(out_mac, out_mac_len); |
1076 | freezero(content, content_len); | ||
1070 | 1077 | ||
1071 | return ret; | 1078 | return ret; |
1072 | } | 1079 | } |
1073 | 1080 | ||
1074 | int | 1081 | int |
1075 | tls12_record_layer_open_record(struct tls12_record_layer *rl, uint8_t *buf, | 1082 | tls12_record_layer_open_record(struct tls12_record_layer *rl, uint8_t *buf, |
1076 | size_t buf_len, uint8_t **out, size_t *out_len) | 1083 | size_t buf_len, struct tls_content *out) |
1077 | { | 1084 | { |
1078 | CBS cbs, fragment, seq_num; | 1085 | CBS cbs, fragment, seq_num; |
1079 | uint16_t version; | 1086 | uint16_t version; |
@@ -1105,15 +1112,15 @@ tls12_record_layer_open_record(struct tls12_record_layer *rl, uint8_t *buf, | |||
1105 | 1112 | ||
1106 | if (rl->read->aead_ctx != NULL) { | 1113 | if (rl->read->aead_ctx != NULL) { |
1107 | if (!tls12_record_layer_open_record_protected_aead(rl, | 1114 | if (!tls12_record_layer_open_record_protected_aead(rl, |
1108 | content_type, &seq_num, &fragment, out, out_len)) | 1115 | content_type, &seq_num, &fragment, out)) |
1109 | return 0; | 1116 | return 0; |
1110 | } else if (rl->read->cipher_ctx != NULL) { | 1117 | } else if (rl->read->cipher_ctx != NULL) { |
1111 | if (!tls12_record_layer_open_record_protected_cipher(rl, | 1118 | if (!tls12_record_layer_open_record_protected_cipher(rl, |
1112 | content_type, &seq_num, &fragment, out, out_len)) | 1119 | content_type, &seq_num, &fragment, out)) |
1113 | return 0; | 1120 | return 0; |
1114 | } else { | 1121 | } else { |
1115 | if (!tls12_record_layer_open_record_plaintext(rl, | 1122 | if (!tls12_record_layer_open_record_plaintext(rl, |
1116 | content_type, &fragment, out, out_len)) | 1123 | content_type, &fragment, out)) |
1117 | return 0; | 1124 | return 0; |
1118 | } | 1125 | } |
1119 | 1126 | ||
diff --git a/src/lib/libssl/tls13_record_layer.c b/src/lib/libssl/tls13_record_layer.c index 423b405cbd..4ae4e298eb 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.71 2022/09/11 13:50:41 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_record_layer.c,v 1.72 2022/11/11 17:15:27 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 | * |
@@ -561,6 +561,7 @@ tls13_record_layer_open_record_protected(struct tls13_record_layer *rl) | |||
561 | if (!tls13_record_content(rl->rrec, &enc_record)) | 561 | if (!tls13_record_content(rl->rrec, &enc_record)) |
562 | goto err; | 562 | goto err; |
563 | 563 | ||
564 | /* XXX - minus tag len? */ | ||
564 | if ((content = calloc(1, CBS_len(&enc_record))) == NULL) | 565 | if ((content = calloc(1, CBS_len(&enc_record))) == NULL) |
565 | goto err; | 566 | goto err; |
566 | content_len = CBS_len(&enc_record); | 567 | content_len = CBS_len(&enc_record); |
diff --git a/src/lib/libssl/tls_content.c b/src/lib/libssl/tls_content.c index ede178f84c..726de0fdc4 100644 --- a/src/lib/libssl/tls_content.c +++ b/src/lib/libssl/tls_content.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls_content.c,v 1.1 2021/09/04 16:26:12 jsing Exp $ */ | 1 | /* $OpenBSD: tls_content.c,v 1.2 2022/11/11 17:15:27 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -26,7 +26,7 @@ struct tls_content { | |||
26 | uint16_t epoch; | 26 | uint16_t epoch; |
27 | 27 | ||
28 | const uint8_t *data; | 28 | const uint8_t *data; |
29 | size_t len; | 29 | size_t data_len; |
30 | CBS cbs; | 30 | CBS cbs; |
31 | }; | 31 | }; |
32 | 32 | ||
@@ -39,7 +39,7 @@ tls_content_new(void) | |||
39 | void | 39 | void |
40 | tls_content_clear(struct tls_content *content) | 40 | tls_content_clear(struct tls_content *content) |
41 | { | 41 | { |
42 | freezero((void *)content->data, content->len); | 42 | freezero((void *)content->data, content->data_len); |
43 | memset(content, 0, sizeof(*content)); | 43 | memset(content, 0, sizeof(*content)); |
44 | } | 44 | } |
45 | 45 | ||
@@ -113,9 +113,24 @@ tls_content_set_data(struct tls_content *content, uint8_t type, | |||
113 | 113 | ||
114 | content->type = type; | 114 | content->type = type; |
115 | content->data = data; | 115 | content->data = data; |
116 | content->len = data_len; | 116 | content->data_len = data_len; |
117 | 117 | ||
118 | CBS_init(&content->cbs, content->data, content->len); | 118 | CBS_init(&content->cbs, content->data, content->data_len); |
119 | } | ||
120 | |||
121 | int | ||
122 | tls_content_set_bounds(struct tls_content *content, size_t offset, size_t len) | ||
123 | { | ||
124 | size_t content_len; | ||
125 | |||
126 | content_len = offset + len; | ||
127 | if (content_len < len) | ||
128 | return 0; | ||
129 | if (content_len > content->data_len) | ||
130 | return 0; | ||
131 | |||
132 | CBS_init(&content->cbs, content->data, content_len); | ||
133 | return CBS_skip(&content->cbs, offset); | ||
119 | } | 134 | } |
120 | 135 | ||
121 | static ssize_t | 136 | static ssize_t |
diff --git a/src/lib/libssl/tls_content.h b/src/lib/libssl/tls_content.h index 173af2a740..b807248f60 100644 --- a/src/lib/libssl/tls_content.h +++ b/src/lib/libssl/tls_content.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls_content.h,v 1.1 2021/09/04 16:26:12 jsing Exp $ */ | 1 | /* $OpenBSD: tls_content.h,v 1.2 2022/11/11 17:15:27 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -38,6 +38,8 @@ int tls_content_dup_data(struct tls_content *content, uint8_t type, | |||
38 | const uint8_t *data, size_t data_len); | 38 | const uint8_t *data, size_t data_len); |
39 | void tls_content_set_data(struct tls_content *content, uint8_t type, | 39 | void tls_content_set_data(struct tls_content *content, uint8_t type, |
40 | const uint8_t *data, size_t data_len); | 40 | const uint8_t *data, size_t data_len); |
41 | int tls_content_set_bounds(struct tls_content *content, size_t offset, | ||
42 | size_t len); | ||
41 | void tls_content_set_epoch(struct tls_content *content, uint16_t epoch); | 43 | void tls_content_set_epoch(struct tls_content *content, uint16_t epoch); |
42 | 44 | ||
43 | ssize_t tls_content_peek(struct tls_content *content, uint8_t *buf, size_t n); | 45 | ssize_t tls_content_peek(struct tls_content *content, uint8_t *buf, size_t n); |