diff options
-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 | { |