diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libssl/tls12_record_layer.c | 98 |
1 files changed, 77 insertions, 21 deletions
diff --git a/src/lib/libssl/tls12_record_layer.c b/src/lib/libssl/tls12_record_layer.c index 50311a3d84..04699f9a83 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.9 2021/01/13 18:20:54 jsing Exp $ */ | 1 | /* $OpenBSD: tls12_record_layer.c,v 1.10 2021/01/19 18:34:02 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -58,6 +58,68 @@ tls12_record_protection_free(struct tls12_record_protection *rp) | |||
| 58 | freezero(rp, sizeof(struct tls12_record_protection)); | 58 | freezero(rp, sizeof(struct tls12_record_protection)); |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | static int | ||
| 62 | tls12_record_protection_eiv_len(struct tls12_record_protection *rp, | ||
| 63 | size_t *out_eiv_len) | ||
| 64 | { | ||
| 65 | int eiv_len; | ||
| 66 | |||
| 67 | *out_eiv_len = 0; | ||
| 68 | |||
| 69 | if (rp->cipher_ctx == NULL) | ||
| 70 | return 0; | ||
| 71 | |||
| 72 | eiv_len = 0; | ||
| 73 | if (EVP_CIPHER_CTX_mode(rp->cipher_ctx) == EVP_CIPH_CBC_MODE) | ||
| 74 | eiv_len = EVP_CIPHER_CTX_iv_length(rp->cipher_ctx); | ||
| 75 | if (eiv_len < 0 || eiv_len > EVP_MAX_IV_LENGTH) | ||
| 76 | return 0; | ||
| 77 | |||
| 78 | *out_eiv_len = eiv_len; | ||
| 79 | |||
| 80 | return 1; | ||
| 81 | } | ||
| 82 | |||
| 83 | static int | ||
| 84 | tls12_record_protection_block_size(struct tls12_record_protection *rp, | ||
| 85 | size_t *out_block_size) | ||
| 86 | { | ||
| 87 | int block_size; | ||
| 88 | |||
| 89 | *out_block_size = 0; | ||
| 90 | |||
| 91 | if (rp->cipher_ctx == NULL) | ||
| 92 | return 0; | ||
| 93 | |||
| 94 | block_size = EVP_CIPHER_CTX_block_size(rp->cipher_ctx); | ||
| 95 | if (block_size < 0 || block_size > EVP_MAX_BLOCK_LENGTH) | ||
| 96 | return 0; | ||
| 97 | |||
| 98 | *out_block_size = block_size; | ||
| 99 | |||
| 100 | return 1; | ||
| 101 | } | ||
| 102 | |||
| 103 | static int | ||
| 104 | tls12_record_protection_mac_len(struct tls12_record_protection *rp, | ||
| 105 | size_t *out_mac_len) | ||
| 106 | { | ||
| 107 | int mac_len; | ||
| 108 | |||
| 109 | *out_mac_len = 0; | ||
| 110 | |||
| 111 | if (rp->hash_ctx == NULL) | ||
| 112 | return 0; | ||
| 113 | |||
| 114 | mac_len = EVP_MD_CTX_size(rp->hash_ctx); | ||
| 115 | if (mac_len <= 0 || mac_len > EVP_MAX_MD_SIZE) | ||
| 116 | return 0; | ||
| 117 | |||
| 118 | *out_mac_len = mac_len; | ||
| 119 | |||
| 120 | return 1; | ||
| 121 | } | ||
| 122 | |||
| 61 | struct tls12_record_layer { | 123 | struct tls12_record_layer { |
| 62 | uint16_t version; | 124 | uint16_t version; |
| 63 | int dtls; | 125 | int dtls; |
| @@ -566,9 +628,9 @@ tls12_record_layer_open_record_protected_cipher(struct tls12_record_layer *rl, | |||
| 566 | { | 628 | { |
| 567 | EVP_CIPHER_CTX *enc = rl->read->cipher_ctx; | 629 | EVP_CIPHER_CTX *enc = rl->read->cipher_ctx; |
| 568 | SSL3_RECORD_INTERNAL rrec; | 630 | SSL3_RECORD_INTERNAL rrec; |
| 569 | int block_size, eiv_len; | 631 | size_t block_size, eiv_len; |
| 570 | uint8_t *mac = NULL; | 632 | uint8_t *mac = NULL; |
| 571 | int mac_len = 0; | 633 | size_t mac_len = 0; |
| 572 | uint8_t *out_mac = NULL; | 634 | uint8_t *out_mac = NULL; |
| 573 | size_t out_mac_len = 0; | 635 | size_t out_mac_len = 0; |
| 574 | uint8_t *plain; | 636 | uint8_t *plain; |
| @@ -579,22 +641,19 @@ tls12_record_layer_open_record_protected_cipher(struct tls12_record_layer *rl, | |||
| 579 | 641 | ||
| 580 | memset(&cbb_mac, 0, sizeof(cbb_mac)); | 642 | memset(&cbb_mac, 0, sizeof(cbb_mac)); |
| 581 | 643 | ||
| 582 | block_size = EVP_CIPHER_CTX_block_size(enc); | 644 | if (!tls12_record_protection_block_size(rl->read, &block_size)) |
| 583 | if (block_size < 0 || block_size > EVP_MAX_BLOCK_LENGTH) | ||
| 584 | goto err; | 645 | goto err; |
| 585 | 646 | ||
| 586 | /* Determine explicit IV length. */ | 647 | /* Determine explicit IV length. */ |
| 587 | eiv_len = 0; | 648 | eiv_len = 0; |
| 588 | if (rl->version != TLS1_VERSION && | 649 | if (rl->version != TLS1_VERSION) { |
| 589 | EVP_CIPHER_CTX_mode(enc) == EVP_CIPH_CBC_MODE) | 650 | if (!tls12_record_protection_eiv_len(rl->read, &eiv_len)) |
| 590 | eiv_len = EVP_CIPHER_CTX_iv_length(enc); | 651 | goto err; |
| 591 | if (eiv_len < 0 || eiv_len > EVP_MAX_IV_LENGTH) | 652 | } |
| 592 | goto err; | ||
| 593 | 653 | ||
| 594 | mac_len = 0; | 654 | mac_len = 0; |
| 595 | if (rl->read->hash_ctx != NULL) { | 655 | if (rl->read->hash_ctx != NULL) { |
| 596 | mac_len = EVP_MD_CTX_size(rl->read->hash_ctx); | 656 | if (!tls12_record_protection_mac_len(rl->read, &mac_len)) |
| 597 | if (mac_len <= 0 || mac_len > EVP_MAX_MD_SIZE) | ||
| 598 | goto err; | 657 | goto err; |
| 599 | } | 658 | } |
| 600 | 659 | ||
| @@ -808,8 +867,7 @@ tls12_record_layer_seal_record_protected_cipher(struct tls12_record_layer *rl, | |||
| 808 | size_t content_len, CBB *out) | 867 | size_t content_len, CBB *out) |
| 809 | { | 868 | { |
| 810 | EVP_CIPHER_CTX *enc = rl->write->cipher_ctx; | 869 | EVP_CIPHER_CTX *enc = rl->write->cipher_ctx; |
| 811 | size_t mac_len, pad_len; | 870 | size_t block_size, eiv_len, mac_len, pad_len; |
| 812 | int block_size, eiv_len; | ||
| 813 | uint8_t *enc_data, *eiv, *pad, pad_val; | 871 | uint8_t *enc_data, *eiv, *pad, pad_val; |
| 814 | uint8_t *plain = NULL; | 872 | uint8_t *plain = NULL; |
| 815 | size_t plain_len = 0; | 873 | size_t plain_len = 0; |
| @@ -821,11 +879,10 @@ tls12_record_layer_seal_record_protected_cipher(struct tls12_record_layer *rl, | |||
| 821 | 879 | ||
| 822 | /* Add explicit IV if necessary. */ | 880 | /* Add explicit IV if necessary. */ |
| 823 | eiv_len = 0; | 881 | eiv_len = 0; |
| 824 | if (rl->version != TLS1_VERSION && | 882 | if (rl->version != TLS1_VERSION) { |
| 825 | EVP_CIPHER_CTX_mode(enc) == EVP_CIPH_CBC_MODE) | 883 | if (!tls12_record_protection_eiv_len(rl->write, &eiv_len)) |
| 826 | eiv_len = EVP_CIPHER_CTX_iv_length(enc); | 884 | goto err; |
| 827 | if (eiv_len < 0 || eiv_len > EVP_MAX_IV_LENGTH) | 885 | } |
| 828 | goto err; | ||
| 829 | if (eiv_len > 0) { | 886 | if (eiv_len > 0) { |
| 830 | if (!CBB_add_space(&cbb, &eiv, eiv_len)) | 887 | if (!CBB_add_space(&cbb, &eiv, eiv_len)) |
| 831 | goto err; | 888 | goto err; |
| @@ -845,8 +902,7 @@ tls12_record_layer_seal_record_protected_cipher(struct tls12_record_layer *rl, | |||
| 845 | plain_len = (size_t)eiv_len + content_len + mac_len; | 902 | plain_len = (size_t)eiv_len + content_len + mac_len; |
| 846 | 903 | ||
| 847 | /* Add padding to block size, if necessary. */ | 904 | /* Add padding to block size, if necessary. */ |
| 848 | block_size = EVP_CIPHER_CTX_block_size(enc); | 905 | if (!tls12_record_protection_block_size(rl->write, &block_size)) |
| 849 | if (block_size < 0 || block_size > EVP_MAX_BLOCK_LENGTH) | ||
| 850 | goto err; | 906 | goto err; |
| 851 | if (block_size > 1) { | 907 | if (block_size > 1) { |
| 852 | pad_len = block_size - (plain_len % block_size); | 908 | pad_len = block_size - (plain_len % block_size); |
