diff options
| author | jsing <> | 2021-04-25 13:15:23 +0000 |
|---|---|---|
| committer | jsing <> | 2021-04-25 13:15:23 +0000 |
| commit | 8b55d917f6299f185307b9010616350e6d6a3d93 (patch) | |
| tree | 0d77df32f82a4eb3addc8531055c43c868f52f5e /src/lib/libssl/ssl_both.c | |
| parent | d60aa154d161a3c7b893fdc97ab31d9b375a42aa (diff) | |
| download | openbsd-8b55d917f6299f185307b9010616350e6d6a3d93.tar.gz openbsd-8b55d917f6299f185307b9010616350e6d6a3d93.tar.bz2 openbsd-8b55d917f6299f185307b9010616350e6d6a3d93.zip | |
Clean up derivation of finished/peer finished.
Make this process more readable by having specific client/server functions,
calling the correct one based on s->server. This allows to remove various
SSL_ST_ACCEPT/SSL_ST_CONNECT checks, along with duplicate code.
ok inoguchi@ tb@
Diffstat (limited to 'src/lib/libssl/ssl_both.c')
| -rw-r--r-- | src/lib/libssl/ssl_both.c | 77 |
1 files changed, 25 insertions, 52 deletions
diff --git a/src/lib/libssl/ssl_both.c b/src/lib/libssl/ssl_both.c index ad9b0ee257..fe04f809b0 100644 --- a/src/lib/libssl/ssl_both.c +++ b/src/lib/libssl/ssl_both.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl_both.c,v 1.28 2021/04/19 16:51:56 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_both.c,v 1.29 2021/04/25 13:15:22 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 | * |
| @@ -164,42 +164,39 @@ ssl3_do_write(SSL *s, int type) | |||
| 164 | } | 164 | } |
| 165 | 165 | ||
| 166 | int | 166 | int |
| 167 | ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen) | 167 | ssl3_send_finished(SSL *s, int state_a, int state_b) |
| 168 | { | 168 | { |
| 169 | CBB cbb, finished; | 169 | CBB cbb, finished; |
| 170 | int md_len; | ||
| 171 | 170 | ||
| 172 | memset(&cbb, 0, sizeof(cbb)); | 171 | memset(&cbb, 0, sizeof(cbb)); |
| 173 | 172 | ||
| 174 | if (S3I(s)->hs.state == a) { | 173 | if (S3I(s)->hs.state == state_a) { |
| 175 | md_len = TLS1_FINISH_MAC_LENGTH; | 174 | if (!tls12_derive_finished(s)) |
| 176 | OPENSSL_assert(md_len <= EVP_MAX_MD_SIZE); | 175 | goto err; |
| 177 | |||
| 178 | if (tls1_final_finish_mac(s, sender, slen, | ||
| 179 | S3I(s)->hs.finished) != md_len) | ||
| 180 | return (0); | ||
| 181 | S3I(s)->hs.finished_len = md_len; | ||
| 182 | 176 | ||
| 183 | /* Copy finished so we can use it for renegotiation checks. */ | 177 | /* Copy finished so we can use it for renegotiation checks. */ |
| 184 | if (!s->server) { | 178 | if (!s->server) { |
| 185 | memcpy(S3I(s)->previous_client_finished, | 179 | memcpy(S3I(s)->previous_client_finished, |
| 186 | S3I(s)->hs.finished, md_len); | 180 | S3I(s)->hs.finished, S3I(s)->hs.finished_len); |
| 187 | S3I(s)->previous_client_finished_len = md_len; | 181 | S3I(s)->previous_client_finished_len = |
| 182 | S3I(s)->hs.finished_len; | ||
| 188 | } else { | 183 | } else { |
| 189 | memcpy(S3I(s)->previous_server_finished, | 184 | memcpy(S3I(s)->previous_server_finished, |
| 190 | S3I(s)->hs.finished, md_len); | 185 | S3I(s)->hs.finished, S3I(s)->hs.finished_len); |
| 191 | S3I(s)->previous_server_finished_len = md_len; | 186 | S3I(s)->previous_server_finished_len = |
| 187 | S3I(s)->hs.finished_len; | ||
| 192 | } | 188 | } |
| 193 | 189 | ||
| 194 | if (!ssl3_handshake_msg_start(s, &cbb, &finished, | 190 | if (!ssl3_handshake_msg_start(s, &cbb, &finished, |
| 195 | SSL3_MT_FINISHED)) | 191 | SSL3_MT_FINISHED)) |
| 196 | goto err; | 192 | goto err; |
| 197 | if (!CBB_add_bytes(&finished, S3I(s)->hs.finished, md_len)) | 193 | if (!CBB_add_bytes(&finished, S3I(s)->hs.finished, |
| 194 | S3I(s)->hs.finished_len)) | ||
| 198 | goto err; | 195 | goto err; |
| 199 | if (!ssl3_handshake_msg_finish(s, &cbb)) | 196 | if (!ssl3_handshake_msg_finish(s, &cbb)) |
| 200 | goto err; | 197 | goto err; |
| 201 | 198 | ||
| 202 | S3I(s)->hs.state = b; | 199 | S3I(s)->hs.state = state_b; |
| 203 | } | 200 | } |
| 204 | 201 | ||
| 205 | return (ssl3_handshake_write(s)); | 202 | return (ssl3_handshake_write(s)); |
| @@ -210,36 +207,6 @@ ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen) | |||
| 210 | return (-1); | 207 | return (-1); |
| 211 | } | 208 | } |
| 212 | 209 | ||
| 213 | /* | ||
| 214 | * ssl3_take_mac calculates the Finished MAC for the handshakes messages seen | ||
| 215 | * so far. | ||
| 216 | */ | ||
| 217 | static void | ||
| 218 | ssl3_take_mac(SSL *s) | ||
| 219 | { | ||
| 220 | const char *sender; | ||
| 221 | int slen; | ||
| 222 | |||
| 223 | /* | ||
| 224 | * If no new cipher setup return immediately: other functions will | ||
| 225 | * set the appropriate error. | ||
| 226 | */ | ||
| 227 | if (S3I(s)->hs.cipher == NULL) | ||
| 228 | return; | ||
| 229 | |||
| 230 | if (S3I(s)->hs.state & SSL_ST_CONNECT) { | ||
| 231 | sender = TLS_MD_SERVER_FINISH_CONST; | ||
| 232 | slen = TLS_MD_SERVER_FINISH_CONST_SIZE; | ||
| 233 | } else { | ||
| 234 | sender = TLS_MD_CLIENT_FINISH_CONST; | ||
| 235 | slen = TLS_MD_CLIENT_FINISH_CONST_SIZE; | ||
| 236 | } | ||
| 237 | |||
| 238 | S3I(s)->hs.peer_finished_len = | ||
| 239 | tls1_final_finish_mac(s, sender, slen, | ||
| 240 | S3I(s)->hs.peer_finished); | ||
| 241 | } | ||
| 242 | |||
| 243 | int | 210 | int |
| 244 | ssl3_get_finished(SSL *s, int a, int b) | 211 | ssl3_get_finished(SSL *s, int a, int b) |
| 245 | { | 212 | { |
| @@ -544,10 +511,16 @@ ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok) | |||
| 544 | n -= i; | 511 | n -= i; |
| 545 | } | 512 | } |
| 546 | 513 | ||
| 547 | /* If receiving Finished, record MAC of prior handshake messages for | 514 | /* |
| 548 | * Finished verification. */ | 515 | * If receiving Finished, record MAC of prior handshake messages for |
| 549 | if (*s->internal->init_buf->data == SSL3_MT_FINISHED) | 516 | * Finished verification. |
| 550 | ssl3_take_mac(s); | 517 | */ |
| 518 | if (*s->internal->init_buf->data == SSL3_MT_FINISHED) { | ||
| 519 | if (S3I(s)->hs.cipher != NULL) { | ||
| 520 | if (!tls12_derive_peer_finished(s)) | ||
| 521 | goto err; | ||
| 522 | } | ||
| 523 | } | ||
| 551 | 524 | ||
| 552 | /* Feed this message into MAC computation. */ | 525 | /* Feed this message into MAC computation. */ |
| 553 | if (s->internal->mac_packet) { | 526 | if (s->internal->mac_packet) { |
| @@ -566,7 +539,7 @@ ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok) | |||
| 566 | 539 | ||
| 567 | fatal_err: | 540 | fatal_err: |
| 568 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 541 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 569 | err: | 542 | err: |
| 570 | *ok = 0; | 543 | *ok = 0; |
| 571 | return (-1); | 544 | return (-1); |
| 572 | } | 545 | } |
