diff options
Diffstat (limited to 'src')
| -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); |
