diff options
Diffstat (limited to 'src/lib/libssl/ssl_pkt.c')
-rw-r--r-- | src/lib/libssl/ssl_pkt.c | 103 |
1 files changed, 6 insertions, 97 deletions
diff --git a/src/lib/libssl/ssl_pkt.c b/src/lib/libssl/ssl_pkt.c index 5c9b3be2ff..c9c86471d3 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.30 2020/08/09 16:54:16 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_pkt.c,v 1.31 2020/08/30 15:40:20 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 | * |
@@ -617,100 +617,6 @@ ssl3_write_bytes(SSL *s, int type, const void *buf_, int len) | |||
617 | } | 617 | } |
618 | 618 | ||
619 | static int | 619 | static int |
620 | ssl3_create_record(SSL *s, CBB *cbb, uint16_t version, uint8_t type, | ||
621 | const unsigned char *buf, unsigned int len) | ||
622 | { | ||
623 | SSL3_RECORD_INTERNAL *wr = &(S3I(s)->wrec); | ||
624 | SSL_SESSION *sess = s->session; | ||
625 | int block_size = 0, eivlen = 0, mac_size = 0; | ||
626 | size_t pad_len, record_len; | ||
627 | CBB fragment; | ||
628 | uint8_t *p; | ||
629 | |||
630 | if (sess != NULL && s->internal->enc_write_ctx != NULL && | ||
631 | EVP_MD_CTX_md(s->internal->write_hash) != NULL) { | ||
632 | if ((mac_size = EVP_MD_CTX_size(s->internal->write_hash)) < 0) | ||
633 | goto err; | ||
634 | } | ||
635 | |||
636 | /* Explicit IV length. */ | ||
637 | if (s->internal->enc_write_ctx && SSL_USE_EXPLICIT_IV(s)) { | ||
638 | int mode = EVP_CIPHER_CTX_mode(s->internal->enc_write_ctx); | ||
639 | if (mode == EVP_CIPH_CBC_MODE) { | ||
640 | eivlen = EVP_CIPHER_CTX_iv_length(s->internal->enc_write_ctx); | ||
641 | if (eivlen <= 1) | ||
642 | eivlen = 0; | ||
643 | } | ||
644 | } else if (s->internal->aead_write_ctx != NULL && | ||
645 | s->internal->aead_write_ctx->variable_nonce_in_record) { | ||
646 | eivlen = s->internal->aead_write_ctx->variable_nonce_len; | ||
647 | } | ||
648 | |||
649 | /* Determine length of record fragment. */ | ||
650 | record_len = eivlen + len + mac_size; | ||
651 | if (s->internal->enc_write_ctx != NULL) { | ||
652 | block_size = EVP_CIPHER_CTX_block_size(s->internal->enc_write_ctx); | ||
653 | if (block_size <= 0 || block_size > EVP_MAX_BLOCK_LENGTH) | ||
654 | goto err; | ||
655 | if (block_size > 1) { | ||
656 | pad_len = block_size - (record_len % block_size); | ||
657 | record_len += pad_len; | ||
658 | } | ||
659 | } else if (s->internal->aead_write_ctx != NULL) { | ||
660 | record_len += s->internal->aead_write_ctx->tag_len; | ||
661 | } | ||
662 | |||
663 | /* Write the header. */ | ||
664 | if (!CBB_add_u8(cbb, type)) | ||
665 | goto err; | ||
666 | if (!CBB_add_u16(cbb, version)) | ||
667 | goto err; | ||
668 | if (!CBB_add_u16_length_prefixed(cbb, &fragment)) | ||
669 | goto err; | ||
670 | if (!CBB_add_space(&fragment, &p, record_len)) | ||
671 | goto err; | ||
672 | |||
673 | /* Set up the record. */ | ||
674 | wr->type = type; | ||
675 | wr->data = p + eivlen; | ||
676 | wr->length = (int)len; | ||
677 | wr->input = wr->data; | ||
678 | |||
679 | memcpy(wr->data, buf, len); | ||
680 | |||
681 | if (mac_size != 0) { | ||
682 | if (tls1_mac(s, &(p[wr->length + eivlen]), 1) < 0) | ||
683 | goto err; | ||
684 | wr->length += mac_size; | ||
685 | } | ||
686 | |||
687 | wr->data = p; | ||
688 | wr->input = p; | ||
689 | wr->length += eivlen; | ||
690 | |||
691 | if (tls1_enc(s, 1) != 1) | ||
692 | goto err; | ||
693 | |||
694 | if (wr->length != record_len) | ||
695 | goto err; | ||
696 | |||
697 | if (!CBB_flush(cbb)) | ||
698 | goto err; | ||
699 | |||
700 | /* | ||
701 | * We should now have wr->data pointing to the encrypted data, | ||
702 | * which is wr->length long. | ||
703 | */ | ||
704 | wr->type = type; /* not needed but helps for debugging */ | ||
705 | wr->length += SSL3_RT_HEADER_LENGTH; | ||
706 | |||
707 | return 1; | ||
708 | |||
709 | err: | ||
710 | return 0; | ||
711 | } | ||
712 | |||
713 | static int | ||
714 | do_ssl3_write(SSL *s, int type, const unsigned char *buf, unsigned int len) | 620 | do_ssl3_write(SSL *s, int type, const unsigned char *buf, unsigned int len) |
715 | { | 621 | { |
716 | SSL3_BUFFER_INTERNAL *wb = &(S3I(s)->wbuf); | 622 | SSL3_BUFFER_INTERNAL *wb = &(S3I(s)->wbuf); |
@@ -785,13 +691,16 @@ do_ssl3_write(SSL *s, int type, const unsigned char *buf, unsigned int len) | |||
785 | if (!CBB_init_fixed(&cbb, wb->buf + align, wb->len - align)) | 691 | if (!CBB_init_fixed(&cbb, wb->buf + align, wb->len - align)) |
786 | goto err; | 692 | goto err; |
787 | 693 | ||
694 | tls12_record_layer_set_version(s->internal->rl, version); | ||
695 | |||
788 | if (need_empty_fragment) { | 696 | if (need_empty_fragment) { |
789 | if (!ssl3_create_record(s, &cbb, version, type, buf, 0)) | 697 | if (!tls12_record_layer_seal_record(s->internal->rl, type, |
698 | buf, 0, &cbb)) | ||
790 | goto err; | 699 | goto err; |
791 | S3I(s)->empty_fragment_done = 1; | 700 | S3I(s)->empty_fragment_done = 1; |
792 | } | 701 | } |
793 | 702 | ||
794 | if (!ssl3_create_record(s, &cbb, version, type, buf, len)) | 703 | if (!tls12_record_layer_seal_record(s->internal->rl, type, buf, len, &cbb)) |
795 | goto err; | 704 | goto err; |
796 | 705 | ||
797 | if (!CBB_finish(&cbb, NULL, &out_len)) | 706 | if (!CBB_finish(&cbb, NULL, &out_len)) |