diff options
author | jsing <> | 2020-07-30 16:53:01 +0000 |
---|---|---|
committer | jsing <> | 2020-07-30 16:53:01 +0000 |
commit | 8ff4976278b8287ec84e713ef782be6f4989ce06 (patch) | |
tree | 2261e7d086b3d5261d8ee4bae427be3d75698dd4 /src/lib/libssl/d1_pkt.c | |
parent | c83de9bf1a5deaa83030eac8eb7a2ce4749d120d (diff) | |
download | openbsd-8ff4976278b8287ec84e713ef782be6f4989ce06.tar.gz openbsd-8ff4976278b8287ec84e713ef782be6f4989ce06.tar.bz2 openbsd-8ff4976278b8287ec84e713ef782be6f4989ce06.zip |
Clean up and simplify some of the SSL3/DTLS1 record writing code.
This will allow for further changes to be made with less complexity and
easier review.
In particular, decide if we need an empty fragment early on and only do
the alignment calculation once (rather than in two separate parts of the
function.
ok tb@ inoguchi@
Diffstat (limited to 'src/lib/libssl/d1_pkt.c')
-rw-r--r-- | src/lib/libssl/d1_pkt.c | 33 |
1 files changed, 14 insertions, 19 deletions
diff --git a/src/lib/libssl/d1_pkt.c b/src/lib/libssl/d1_pkt.c index 36090533aa..d6b1506119 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.73 2020/03/13 16:40:42 jsing Exp $ */ | 1 | /* $OpenBSD: d1_pkt.c,v 1.74 2020/07/30 16:53:01 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. |
@@ -1175,28 +1175,29 @@ int | |||
1175 | do_dtls1_write(SSL *s, int type, const unsigned char *buf, unsigned int len) | 1175 | do_dtls1_write(SSL *s, int type, const unsigned char *buf, unsigned int len) |
1176 | { | 1176 | { |
1177 | unsigned char *p; | 1177 | unsigned char *p; |
1178 | int i, mac_size, clear = 0; | ||
1179 | SSL3_RECORD_INTERNAL *wr; | 1178 | SSL3_RECORD_INTERNAL *wr; |
1180 | SSL3_BUFFER_INTERNAL *wb; | 1179 | SSL3_BUFFER_INTERNAL *wb; |
1181 | SSL_SESSION *sess; | 1180 | SSL_SESSION *sess; |
1182 | int bs; | 1181 | int mac_size = 0; |
1182 | int bs, ret; | ||
1183 | CBB cbb; | 1183 | CBB cbb; |
1184 | 1184 | ||
1185 | memset(&cbb, 0, sizeof(cbb)); | 1185 | memset(&cbb, 0, sizeof(cbb)); |
1186 | 1186 | ||
1187 | /* first check if there is a SSL3_BUFFER_INTERNAL still being written | 1187 | /* |
1188 | * out. This will happen with non blocking IO */ | 1188 | * First check if there is a SSL3_BUFFER_INTERNAL still being written |
1189 | * out. This will happen with non blocking IO. | ||
1190 | */ | ||
1189 | if (S3I(s)->wbuf.left != 0) { | 1191 | if (S3I(s)->wbuf.left != 0) { |
1190 | OPENSSL_assert(0); /* XDTLS: want to see if we ever get here */ | 1192 | OPENSSL_assert(0); /* XDTLS: want to see if we ever get here */ |
1191 | return (ssl3_write_pending(s, type, buf, len)); | 1193 | return (ssl3_write_pending(s, type, buf, len)); |
1192 | } | 1194 | } |
1193 | 1195 | ||
1194 | /* If we have an alert to send, lets send it */ | 1196 | /* If we have an alert to send, let's send it */ |
1195 | if (S3I(s)->alert_dispatch) { | 1197 | if (S3I(s)->alert_dispatch) { |
1196 | i = s->method->ssl_dispatch_alert(s); | 1198 | if ((ret = s->method->ssl_dispatch_alert(s)) <= 0) |
1197 | if (i <= 0) | 1199 | return (ret); |
1198 | return (i); | 1200 | /* If it went, fall through and send more stuff. */ |
1199 | /* if it went, fall through and send more stuff */ | ||
1200 | } | 1201 | } |
1201 | 1202 | ||
1202 | if (len == 0) | 1203 | if (len == 0) |
@@ -1206,15 +1207,9 @@ do_dtls1_write(SSL *s, int type, const unsigned char *buf, unsigned int len) | |||
1206 | wb = &(S3I(s)->wbuf); | 1207 | wb = &(S3I(s)->wbuf); |
1207 | sess = s->session; | 1208 | sess = s->session; |
1208 | 1209 | ||
1209 | if ((sess == NULL) || (s->internal->enc_write_ctx == NULL) || | 1210 | if (sess != NULL && s->internal->enc_write_ctx != NULL && |
1210 | (EVP_MD_CTX_md(s->internal->write_hash) == NULL)) | 1211 | EVP_MD_CTX_md(s->internal->write_hash) != NULL) { |
1211 | clear = 1; | 1212 | if ((mac_size = EVP_MD_CTX_size(s->internal->write_hash)) < 0) |
1212 | |||
1213 | if (clear) | ||
1214 | mac_size = 0; | ||
1215 | else { | ||
1216 | mac_size = EVP_MD_CTX_size(s->internal->write_hash); | ||
1217 | if (mac_size < 0) | ||
1218 | goto err; | 1213 | goto err; |
1219 | } | 1214 | } |
1220 | 1215 | ||