diff options
author | miod <> | 2014-08-07 19:46:31 +0000 |
---|---|---|
committer | miod <> | 2014-08-07 19:46:31 +0000 |
commit | 15e8f255e119bc9bcc3d331677007d5263431e63 (patch) | |
tree | f63319cf5456a29e9fa85ebbd2f5e44de3fb4043 /src/lib/libssl/s3_both.c | |
parent | 4bcdac8281676ec72b23bb5dbfa6716fc392dfc1 (diff) | |
download | openbsd-15e8f255e119bc9bcc3d331677007d5263431e63.tar.gz openbsd-15e8f255e119bc9bcc3d331677007d5263431e63.tar.bz2 openbsd-15e8f255e119bc9bcc3d331677007d5263431e63.zip |
When you expect a function to return a particular value, don't put a comment
saying that you expect it to return that value and compare it against zero
because it is supposedly faster, for this leads to bugs (especially given the
high rate of sloppy cut'n'paste within ssl3 and dtls1 routines in this
library).
Instead, compare for the exact value it ought to return upon success.
ok deraadt@
Diffstat (limited to '')
-rw-r--r-- | src/lib/libssl/s3_both.c | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/src/lib/libssl/s3_both.c b/src/lib/libssl/s3_both.c index 500387e372..afcaca3c43 100644 --- a/src/lib/libssl/s3_both.c +++ b/src/lib/libssl/s3_both.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: s3_both.c,v 1.26 2014/07/10 08:51:14 tedu Exp $ */ | 1 | /* $OpenBSD: s3_both.c,v 1.27 2014/08/07 19:46:31 miod 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 | * |
@@ -161,7 +161,7 @@ ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen) | |||
161 | p = &(d[4]); | 161 | p = &(d[4]); |
162 | 162 | ||
163 | i = s->method->ssl3_enc->final_finish_mac(s, | 163 | i = s->method->ssl3_enc->final_finish_mac(s, |
164 | sender, slen, s->s3->tmp.finish_md); | 164 | sender, slen, s->s3->tmp.finish_md); |
165 | if (i == 0) | 165 | if (i == 0) |
166 | return 0; | 166 | return 0; |
167 | s->s3->tmp.finish_md_len = i; | 167 | s->s3->tmp.finish_md_len = i; |
@@ -171,15 +171,14 @@ ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen) | |||
171 | 171 | ||
172 | /* Copy the finished so we can use it for | 172 | /* Copy the finished so we can use it for |
173 | renegotiation checks */ | 173 | renegotiation checks */ |
174 | OPENSSL_assert(i <= EVP_MAX_MD_SIZE); | ||
174 | if (s->type == SSL_ST_CONNECT) { | 175 | if (s->type == SSL_ST_CONNECT) { |
175 | OPENSSL_assert(i <= EVP_MAX_MD_SIZE); | ||
176 | memcpy(s->s3->previous_client_finished, | 176 | memcpy(s->s3->previous_client_finished, |
177 | s->s3->tmp.finish_md, i); | 177 | s->s3->tmp.finish_md, i); |
178 | s->s3->previous_client_finished_len = i; | 178 | s->s3->previous_client_finished_len = i; |
179 | } else { | 179 | } else { |
180 | OPENSSL_assert(i <= EVP_MAX_MD_SIZE); | ||
181 | memcpy(s->s3->previous_server_finished, | 180 | memcpy(s->s3->previous_server_finished, |
182 | s->s3->tmp.finish_md, i); | 181 | s->s3->tmp.finish_md, i); |
183 | s->s3->previous_server_finished_len = i; | 182 | s->s3->previous_server_finished_len = i; |
184 | } | 183 | } |
185 | 184 | ||
@@ -216,7 +215,7 @@ ssl3_take_mac(SSL *s) | |||
216 | } | 215 | } |
217 | 216 | ||
218 | s->s3->tmp.peer_finish_md_len = s->method->ssl3_enc->final_finish_mac(s, | 217 | s->s3->tmp.peer_finish_md_len = s->method->ssl3_enc->final_finish_mac(s, |
219 | sender, slen, s->s3->tmp.peer_finish_md); | 218 | sender, slen, s->s3->tmp.peer_finish_md); |
220 | } | 219 | } |
221 | #endif | 220 | #endif |
222 | 221 | ||
@@ -250,7 +249,7 @@ ssl3_get_finished(SSL *s, int a, int b) | |||
250 | p = (unsigned char *)s->init_msg; | 249 | p = (unsigned char *)s->init_msg; |
251 | i = s->s3->tmp.peer_finish_md_len; | 250 | i = s->s3->tmp.peer_finish_md_len; |
252 | 251 | ||
253 | if (i != n) { | 252 | if (i != n || i > EVP_MAX_MD_SIZE) { |
254 | al = SSL_AD_DECODE_ERROR; | 253 | al = SSL_AD_DECODE_ERROR; |
255 | SSLerr(SSL_F_SSL3_GET_FINISHED, SSL_R_BAD_DIGEST_LENGTH); | 254 | SSLerr(SSL_F_SSL3_GET_FINISHED, SSL_R_BAD_DIGEST_LENGTH); |
256 | goto f_err; | 255 | goto f_err; |
@@ -265,14 +264,12 @@ ssl3_get_finished(SSL *s, int a, int b) | |||
265 | /* Copy the finished so we can use it for | 264 | /* Copy the finished so we can use it for |
266 | renegotiation checks */ | 265 | renegotiation checks */ |
267 | if (s->type == SSL_ST_ACCEPT) { | 266 | if (s->type == SSL_ST_ACCEPT) { |
268 | OPENSSL_assert(i <= EVP_MAX_MD_SIZE); | ||
269 | memcpy(s->s3->previous_client_finished, | 267 | memcpy(s->s3->previous_client_finished, |
270 | s->s3->tmp.peer_finish_md, i); | 268 | s->s3->tmp.peer_finish_md, i); |
271 | s->s3->previous_client_finished_len = i; | 269 | s->s3->previous_client_finished_len = i; |
272 | } else { | 270 | } else { |
273 | OPENSSL_assert(i <= EVP_MAX_MD_SIZE); | ||
274 | memcpy(s->s3->previous_server_finished, | 271 | memcpy(s->s3->previous_server_finished, |
275 | s->s3->tmp.peer_finish_md, i); | 272 | s->s3->tmp.peer_finish_md, i); |
276 | s->s3->previous_server_finished_len = i; | 273 | s->s3->previous_server_finished_len = i; |
277 | } | 274 | } |
278 | 275 | ||