diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libssl/d1_both.c | 22 | ||||
| -rw-r--r-- | src/lib/libssl/ssl_locl.h | 4 | ||||
| -rw-r--r-- | src/lib/libssl/tls12_record_layer.c | 29 |
3 files changed, 38 insertions, 17 deletions
diff --git a/src/lib/libssl/d1_both.c b/src/lib/libssl/d1_both.c index ae5ebfacb4..d6bf6dfd1b 100644 --- a/src/lib/libssl/d1_both.c +++ b/src/lib/libssl/d1_both.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: d1_both.c,v 1.63 2020/12/05 19:34:57 tb Exp $ */ | 1 | /* $OpenBSD: d1_both.c,v 1.64 2021/01/19 18:51:08 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. |
| @@ -218,7 +218,8 @@ dtls1_do_write(SSL *s, int type) | |||
| 218 | { | 218 | { |
| 219 | int ret; | 219 | int ret; |
| 220 | int curr_mtu; | 220 | int curr_mtu; |
| 221 | unsigned int len, frag_off, mac_size, blocksize; | 221 | unsigned int len, frag_off; |
| 222 | size_t overhead; | ||
| 222 | 223 | ||
| 223 | /* AHA! Figure out the MTU, and stick to the right size */ | 224 | /* AHA! Figure out the MTU, and stick to the right size */ |
| 224 | if (D1I(s)->mtu < dtls1_min_mtu() && | 225 | if (D1I(s)->mtu < dtls1_min_mtu() && |
| @@ -246,21 +247,13 @@ dtls1_do_write(SSL *s, int type) | |||
| 246 | OPENSSL_assert(s->internal->init_num == | 247 | OPENSSL_assert(s->internal->init_num == |
| 247 | (int)D1I(s)->w_msg_hdr.msg_len + DTLS1_HM_HEADER_LENGTH); | 248 | (int)D1I(s)->w_msg_hdr.msg_len + DTLS1_HM_HEADER_LENGTH); |
| 248 | 249 | ||
| 249 | if (s->internal->write_hash) | 250 | if (!tls12_record_layer_write_overhead(s->internal->rl, &overhead)) |
| 250 | mac_size = EVP_MD_CTX_size(s->internal->write_hash); | 251 | return -1; |
| 251 | else | ||
| 252 | mac_size = 0; | ||
| 253 | |||
| 254 | if (s->internal->enc_write_ctx && | ||
| 255 | (EVP_CIPHER_mode( s->internal->enc_write_ctx->cipher) & EVP_CIPH_CBC_MODE)) | ||
| 256 | blocksize = 2 * EVP_CIPHER_block_size(s->internal->enc_write_ctx->cipher); | ||
| 257 | else | ||
| 258 | blocksize = 0; | ||
| 259 | 252 | ||
| 260 | frag_off = 0; | 253 | frag_off = 0; |
| 261 | while (s->internal->init_num) { | 254 | while (s->internal->init_num) { |
| 262 | curr_mtu = D1I(s)->mtu - BIO_wpending(SSL_get_wbio(s)) - | 255 | curr_mtu = D1I(s)->mtu - BIO_wpending(SSL_get_wbio(s)) - |
| 263 | DTLS1_RT_HEADER_LENGTH - mac_size - blocksize; | 256 | DTLS1_RT_HEADER_LENGTH - overhead; |
| 264 | 257 | ||
| 265 | if (curr_mtu <= DTLS1_HM_HEADER_LENGTH) { | 258 | if (curr_mtu <= DTLS1_HM_HEADER_LENGTH) { |
| 266 | /* grr.. we could get an error if MTU picked was wrong */ | 259 | /* grr.. we could get an error if MTU picked was wrong */ |
| @@ -268,7 +261,7 @@ dtls1_do_write(SSL *s, int type) | |||
| 268 | if (ret <= 0) | 261 | if (ret <= 0) |
| 269 | return ret; | 262 | return ret; |
| 270 | curr_mtu = D1I(s)->mtu - DTLS1_RT_HEADER_LENGTH - | 263 | curr_mtu = D1I(s)->mtu - DTLS1_RT_HEADER_LENGTH - |
| 271 | mac_size - blocksize; | 264 | overhead; |
| 272 | } | 265 | } |
| 273 | 266 | ||
| 274 | if (s->internal->init_num > curr_mtu) | 267 | if (s->internal->init_num > curr_mtu) |
| @@ -276,7 +269,6 @@ dtls1_do_write(SSL *s, int type) | |||
| 276 | else | 269 | else |
| 277 | len = s->internal->init_num; | 270 | len = s->internal->init_num; |
| 278 | 271 | ||
| 279 | |||
| 280 | /* XDTLS: this function is too long. split out the CCS part */ | 272 | /* XDTLS: this function is too long. split out the CCS part */ |
| 281 | if (type == SSL3_RT_HANDSHAKE) { | 273 | if (type == SSL3_RT_HANDSHAKE) { |
| 282 | if (s->internal->init_off != 0) { | 274 | if (s->internal->init_off != 0) { |
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h index 560fcdc1a4..e09f668121 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.312 2021/01/13 18:20:54 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_locl.h,v 1.313 2021/01/19 18:51:08 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 | * |
| @@ -477,6 +477,8 @@ struct tls12_record_layer *tls12_record_layer_new(void); | |||
| 477 | void tls12_record_layer_free(struct tls12_record_layer *rl); | 477 | void tls12_record_layer_free(struct tls12_record_layer *rl); |
| 478 | void tls12_record_layer_alert(struct tls12_record_layer *rl, | 478 | void tls12_record_layer_alert(struct tls12_record_layer *rl, |
| 479 | uint8_t *alert_desc); | 479 | uint8_t *alert_desc); |
| 480 | int tls12_record_layer_write_overhead(struct tls12_record_layer *rl, | ||
| 481 | size_t *overhead); | ||
| 480 | void tls12_record_layer_set_version(struct tls12_record_layer *rl, | 482 | void tls12_record_layer_set_version(struct tls12_record_layer *rl, |
| 481 | uint16_t version); | 483 | uint16_t version); |
| 482 | void tls12_record_layer_set_write_epoch(struct tls12_record_layer *rl, | 484 | void tls12_record_layer_set_write_epoch(struct tls12_record_layer *rl, |
diff --git a/src/lib/libssl/tls12_record_layer.c b/src/lib/libssl/tls12_record_layer.c index 04699f9a83..7fa31707d3 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.10 2021/01/19 18:34:02 jsing Exp $ */ | 1 | /* $OpenBSD: tls12_record_layer.c,v 1.11 2021/01/19 18:51:08 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -168,6 +168,33 @@ tls12_record_layer_alert(struct tls12_record_layer *rl, uint8_t *alert_desc) | |||
| 168 | *alert_desc = rl->alert_desc; | 168 | *alert_desc = rl->alert_desc; |
| 169 | } | 169 | } |
| 170 | 170 | ||
| 171 | int | ||
| 172 | tls12_record_layer_write_overhead(struct tls12_record_layer *rl, | ||
| 173 | size_t *overhead) | ||
| 174 | { | ||
| 175 | size_t block_size, eiv_len, mac_len; | ||
| 176 | |||
| 177 | *overhead = 0; | ||
| 178 | |||
| 179 | if (rl->write->aead_ctx != NULL) { | ||
| 180 | *overhead = rl->write->aead_ctx->tag_len; | ||
| 181 | } else if (rl->write->cipher_ctx != NULL) { | ||
| 182 | eiv_len = 0; | ||
| 183 | if (rl->version != TLS1_VERSION) { | ||
| 184 | if (!tls12_record_protection_eiv_len(rl->write, &eiv_len)) | ||
| 185 | return 0; | ||
| 186 | } | ||
| 187 | if (!tls12_record_protection_block_size(rl->write, &block_size)) | ||
| 188 | return 0; | ||
| 189 | if (!tls12_record_protection_mac_len(rl->write, &mac_len)) | ||
| 190 | return 0; | ||
| 191 | |||
| 192 | *overhead = eiv_len + block_size + mac_len; | ||
| 193 | } | ||
| 194 | |||
| 195 | return 1; | ||
| 196 | } | ||
| 197 | |||
| 171 | void | 198 | void |
| 172 | tls12_record_layer_set_version(struct tls12_record_layer *rl, uint16_t version) | 199 | tls12_record_layer_set_version(struct tls12_record_layer *rl, uint16_t version) |
| 173 | { | 200 | { |
