diff options
-rw-r--r-- | src/lib/libssl/ssl_both.c | 148 | ||||
-rw-r--r-- | src/lib/libssl/ssl_clnt.c | 194 | ||||
-rw-r--r-- | src/lib/libssl/ssl_locl.h | 37 | ||||
-rw-r--r-- | src/lib/libssl/ssl_srvr.c | 188 |
4 files changed, 342 insertions, 225 deletions
diff --git a/src/lib/libssl/ssl_both.c b/src/lib/libssl/ssl_both.c index cfd32387d6..801b5bea29 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.42 2022/02/05 14:54:10 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_both.c,v 1.43 2022/10/01 16:23:15 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 | * |
@@ -161,152 +161,6 @@ ssl3_do_write(SSL *s, int type) | |||
161 | return (0); | 161 | return (0); |
162 | } | 162 | } |
163 | 163 | ||
164 | int | ||
165 | ssl3_send_finished(SSL *s, int state_a, int state_b) | ||
166 | { | ||
167 | CBB cbb, finished; | ||
168 | |||
169 | memset(&cbb, 0, sizeof(cbb)); | ||
170 | |||
171 | if (s->s3->hs.state == state_a) { | ||
172 | if (!tls12_derive_finished(s)) | ||
173 | goto err; | ||
174 | |||
175 | /* Copy finished so we can use it for renegotiation checks. */ | ||
176 | if (!s->server) { | ||
177 | memcpy(s->s3->previous_client_finished, | ||
178 | s->s3->hs.finished, s->s3->hs.finished_len); | ||
179 | s->s3->previous_client_finished_len = | ||
180 | s->s3->hs.finished_len; | ||
181 | } else { | ||
182 | memcpy(s->s3->previous_server_finished, | ||
183 | s->s3->hs.finished, s->s3->hs.finished_len); | ||
184 | s->s3->previous_server_finished_len = | ||
185 | s->s3->hs.finished_len; | ||
186 | } | ||
187 | |||
188 | if (!ssl3_handshake_msg_start(s, &cbb, &finished, | ||
189 | SSL3_MT_FINISHED)) | ||
190 | goto err; | ||
191 | if (!CBB_add_bytes(&finished, s->s3->hs.finished, | ||
192 | s->s3->hs.finished_len)) | ||
193 | goto err; | ||
194 | if (!ssl3_handshake_msg_finish(s, &cbb)) | ||
195 | goto err; | ||
196 | |||
197 | s->s3->hs.state = state_b; | ||
198 | } | ||
199 | |||
200 | return (ssl3_handshake_write(s)); | ||
201 | |||
202 | err: | ||
203 | CBB_cleanup(&cbb); | ||
204 | |||
205 | return (-1); | ||
206 | } | ||
207 | |||
208 | int | ||
209 | ssl3_get_finished(SSL *s, int a, int b) | ||
210 | { | ||
211 | int al, md_len, ret; | ||
212 | CBS cbs; | ||
213 | |||
214 | /* should actually be 36+4 :-) */ | ||
215 | if ((ret = ssl3_get_message(s, a, b, SSL3_MT_FINISHED, 64)) <= 0) | ||
216 | return ret; | ||
217 | |||
218 | /* If this occurs, we have missed a message */ | ||
219 | if (!s->s3->change_cipher_spec) { | ||
220 | al = SSL_AD_UNEXPECTED_MESSAGE; | ||
221 | SSLerror(s, SSL_R_GOT_A_FIN_BEFORE_A_CCS); | ||
222 | goto fatal_err; | ||
223 | } | ||
224 | s->s3->change_cipher_spec = 0; | ||
225 | |||
226 | md_len = TLS1_FINISH_MAC_LENGTH; | ||
227 | |||
228 | if (s->internal->init_num < 0) { | ||
229 | al = SSL_AD_DECODE_ERROR; | ||
230 | SSLerror(s, SSL_R_BAD_DIGEST_LENGTH); | ||
231 | goto fatal_err; | ||
232 | } | ||
233 | |||
234 | CBS_init(&cbs, s->internal->init_msg, s->internal->init_num); | ||
235 | |||
236 | if (s->s3->hs.peer_finished_len != md_len || | ||
237 | CBS_len(&cbs) != md_len) { | ||
238 | al = SSL_AD_DECODE_ERROR; | ||
239 | SSLerror(s, SSL_R_BAD_DIGEST_LENGTH); | ||
240 | goto fatal_err; | ||
241 | } | ||
242 | |||
243 | if (!CBS_mem_equal(&cbs, s->s3->hs.peer_finished, CBS_len(&cbs))) { | ||
244 | al = SSL_AD_DECRYPT_ERROR; | ||
245 | SSLerror(s, SSL_R_DIGEST_CHECK_FAILED); | ||
246 | goto fatal_err; | ||
247 | } | ||
248 | |||
249 | /* Copy finished so we can use it for renegotiation checks. */ | ||
250 | OPENSSL_assert(md_len <= EVP_MAX_MD_SIZE); | ||
251 | if (s->server) { | ||
252 | memcpy(s->s3->previous_client_finished, | ||
253 | s->s3->hs.peer_finished, md_len); | ||
254 | s->s3->previous_client_finished_len = md_len; | ||
255 | } else { | ||
256 | memcpy(s->s3->previous_server_finished, | ||
257 | s->s3->hs.peer_finished, md_len); | ||
258 | s->s3->previous_server_finished_len = md_len; | ||
259 | } | ||
260 | |||
261 | return (1); | ||
262 | fatal_err: | ||
263 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | ||
264 | return (0); | ||
265 | } | ||
266 | |||
267 | int | ||
268 | ssl3_send_change_cipher_spec(SSL *s, int a, int b) | ||
269 | { | ||
270 | size_t outlen; | ||
271 | CBB cbb; | ||
272 | |||
273 | memset(&cbb, 0, sizeof(cbb)); | ||
274 | |||
275 | if (s->s3->hs.state == a) { | ||
276 | if (!CBB_init_fixed(&cbb, s->internal->init_buf->data, | ||
277 | s->internal->init_buf->length)) | ||
278 | goto err; | ||
279 | if (!CBB_add_u8(&cbb, SSL3_MT_CCS)) | ||
280 | goto err; | ||
281 | if (!CBB_finish(&cbb, NULL, &outlen)) | ||
282 | goto err; | ||
283 | |||
284 | if (outlen > INT_MAX) | ||
285 | goto err; | ||
286 | |||
287 | s->internal->init_num = (int)outlen; | ||
288 | s->internal->init_off = 0; | ||
289 | |||
290 | if (SSL_is_dtls(s)) { | ||
291 | s->d1->handshake_write_seq = | ||
292 | s->d1->next_handshake_write_seq; | ||
293 | dtls1_set_message_header_int(s, SSL3_MT_CCS, 0, | ||
294 | s->d1->handshake_write_seq, 0, 0); | ||
295 | dtls1_buffer_message(s, 1); | ||
296 | } | ||
297 | |||
298 | s->s3->hs.state = b; | ||
299 | } | ||
300 | |||
301 | /* SSL3_ST_CW_CHANGE_B */ | ||
302 | return ssl3_record_write(s, SSL3_RT_CHANGE_CIPHER_SPEC); | ||
303 | |||
304 | err: | ||
305 | CBB_cleanup(&cbb); | ||
306 | |||
307 | return -1; | ||
308 | } | ||
309 | |||
310 | static int | 164 | static int |
311 | ssl3_add_cert(CBB *cbb, X509 *x) | 165 | ssl3_add_cert(CBB *cbb, X509 *x) |
312 | { | 166 | { |
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c index 0e50285898..8b2f209a79 100644 --- a/src/lib/libssl/ssl_clnt.c +++ b/src/lib/libssl/ssl_clnt.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_clnt.c,v 1.153 2022/08/17 07:39:19 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_clnt.c,v 1.154 2022/10/01 16:23:15 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 | * |
@@ -176,6 +176,25 @@ | |||
176 | 176 | ||
177 | static int ca_dn_cmp(const X509_NAME * const *a, const X509_NAME * const *b); | 177 | static int ca_dn_cmp(const X509_NAME * const *a, const X509_NAME * const *b); |
178 | 178 | ||
179 | static int ssl3_send_client_hello(SSL *s); | ||
180 | static int ssl3_get_dtls_hello_verify(SSL *s); | ||
181 | static int ssl3_get_server_hello(SSL *s); | ||
182 | static int ssl3_get_certificate_request(SSL *s); | ||
183 | static int ssl3_get_new_session_ticket(SSL *s); | ||
184 | static int ssl3_get_cert_status(SSL *s); | ||
185 | static int ssl3_get_server_done(SSL *s); | ||
186 | static int ssl3_send_client_verify(SSL *s); | ||
187 | static int ssl3_send_client_certificate(SSL *s); | ||
188 | static int ssl_do_client_cert_cb(SSL *s, X509 **px509, EVP_PKEY **ppkey); | ||
189 | static int ssl3_send_client_key_exchange(SSL *s); | ||
190 | static int ssl3_get_server_key_exchange(SSL *s); | ||
191 | static int ssl3_get_server_certificate(SSL *s); | ||
192 | static int ssl3_check_cert_and_algorithm(SSL *s); | ||
193 | static int ssl3_check_finished(SSL *s); | ||
194 | static int ssl3_send_client_change_cipher_spec(SSL *s); | ||
195 | static int ssl3_send_client_finished(SSL *s); | ||
196 | static int ssl3_get_server_finished(SSL *s); | ||
197 | |||
179 | int | 198 | int |
180 | ssl3_connect(SSL *s) | 199 | ssl3_connect(SSL *s) |
181 | { | 200 | { |
@@ -469,8 +488,7 @@ ssl3_connect(SSL *s) | |||
469 | case SSL3_ST_CW_CHANGE_B: | 488 | case SSL3_ST_CW_CHANGE_B: |
470 | if (SSL_is_dtls(s) && !s->internal->hit) | 489 | if (SSL_is_dtls(s) && !s->internal->hit) |
471 | dtls1_start_timer(s); | 490 | dtls1_start_timer(s); |
472 | ret = ssl3_send_change_cipher_spec(s, | 491 | ret = ssl3_send_client_change_cipher_spec(s); |
473 | SSL3_ST_CW_CHANGE_A, SSL3_ST_CW_CHANGE_B); | ||
474 | if (ret <= 0) | 492 | if (ret <= 0) |
475 | goto end; | 493 | goto end; |
476 | 494 | ||
@@ -492,8 +510,7 @@ ssl3_connect(SSL *s) | |||
492 | case SSL3_ST_CW_FINISHED_B: | 510 | case SSL3_ST_CW_FINISHED_B: |
493 | if (SSL_is_dtls(s) && !s->internal->hit) | 511 | if (SSL_is_dtls(s) && !s->internal->hit) |
494 | dtls1_start_timer(s); | 512 | dtls1_start_timer(s); |
495 | ret = ssl3_send_finished(s, SSL3_ST_CW_FINISHED_A, | 513 | ret = ssl3_send_client_finished(s); |
496 | SSL3_ST_CW_FINISHED_B); | ||
497 | if (ret <= 0) | 514 | if (ret <= 0) |
498 | goto end; | 515 | goto end; |
499 | if (!SSL_is_dtls(s)) | 516 | if (!SSL_is_dtls(s)) |
@@ -539,8 +556,7 @@ ssl3_connect(SSL *s) | |||
539 | s->d1->change_cipher_spec_ok = 1; | 556 | s->d1->change_cipher_spec_ok = 1; |
540 | else | 557 | else |
541 | s->s3->flags |= SSL3_FLAGS_CCS_OK; | 558 | s->s3->flags |= SSL3_FLAGS_CCS_OK; |
542 | ret = ssl3_get_finished(s, SSL3_ST_CR_FINISHED_A, | 559 | ret = ssl3_get_server_finished(s); |
543 | SSL3_ST_CR_FINISHED_B); | ||
544 | if (ret <= 0) | 560 | if (ret <= 0) |
545 | goto end; | 561 | goto end; |
546 | if (SSL_is_dtls(s)) | 562 | if (SSL_is_dtls(s)) |
@@ -640,7 +656,7 @@ ssl3_connect(SSL *s) | |||
640 | return (ret); | 656 | return (ret); |
641 | } | 657 | } |
642 | 658 | ||
643 | int | 659 | static int |
644 | ssl3_send_client_hello(SSL *s) | 660 | ssl3_send_client_hello(SSL *s) |
645 | { | 661 | { |
646 | CBB cbb, client_hello, session_id, cookie, cipher_suites; | 662 | CBB cbb, client_hello, session_id, cookie, cipher_suites; |
@@ -752,7 +768,7 @@ ssl3_send_client_hello(SSL *s) | |||
752 | return (-1); | 768 | return (-1); |
753 | } | 769 | } |
754 | 770 | ||
755 | int | 771 | static int |
756 | ssl3_get_dtls_hello_verify(SSL *s) | 772 | ssl3_get_dtls_hello_verify(SSL *s) |
757 | { | 773 | { |
758 | CBS hello_verify_request, cookie; | 774 | CBS hello_verify_request, cookie; |
@@ -813,7 +829,7 @@ ssl3_get_dtls_hello_verify(SSL *s) | |||
813 | return -1; | 829 | return -1; |
814 | } | 830 | } |
815 | 831 | ||
816 | int | 832 | static int |
817 | ssl3_get_server_hello(SSL *s) | 833 | ssl3_get_server_hello(SSL *s) |
818 | { | 834 | { |
819 | CBS cbs, server_random, session_id; | 835 | CBS cbs, server_random, session_id; |
@@ -1083,7 +1099,7 @@ ssl3_get_server_hello(SSL *s) | |||
1083 | return (-1); | 1099 | return (-1); |
1084 | } | 1100 | } |
1085 | 1101 | ||
1086 | int | 1102 | static int |
1087 | ssl3_get_server_certificate(SSL *s) | 1103 | ssl3_get_server_certificate(SSL *s) |
1088 | { | 1104 | { |
1089 | CBS cbs, cert_list, cert_data; | 1105 | CBS cbs, cert_list, cert_data; |
@@ -1280,7 +1296,7 @@ ssl3_get_server_kex_ecdhe(SSL *s, CBS *cbs) | |||
1280 | return 0; | 1296 | return 0; |
1281 | } | 1297 | } |
1282 | 1298 | ||
1283 | int | 1299 | static int |
1284 | ssl3_get_server_key_exchange(SSL *s) | 1300 | ssl3_get_server_key_exchange(SSL *s) |
1285 | { | 1301 | { |
1286 | CBS cbs, signature; | 1302 | CBS cbs, signature; |
@@ -1428,7 +1444,7 @@ ssl3_get_server_key_exchange(SSL *s) | |||
1428 | return (-1); | 1444 | return (-1); |
1429 | } | 1445 | } |
1430 | 1446 | ||
1431 | int | 1447 | static int |
1432 | ssl3_get_certificate_request(SSL *s) | 1448 | ssl3_get_certificate_request(SSL *s) |
1433 | { | 1449 | { |
1434 | CBS cert_request, cert_types, rdn_list; | 1450 | CBS cert_request, cert_types, rdn_list; |
@@ -1572,7 +1588,7 @@ ca_dn_cmp(const X509_NAME * const *a, const X509_NAME * const *b) | |||
1572 | return (X509_NAME_cmp(*a, *b)); | 1588 | return (X509_NAME_cmp(*a, *b)); |
1573 | } | 1589 | } |
1574 | 1590 | ||
1575 | int | 1591 | static int |
1576 | ssl3_get_new_session_ticket(SSL *s) | 1592 | ssl3_get_new_session_ticket(SSL *s) |
1577 | { | 1593 | { |
1578 | uint32_t lifetime_hint; | 1594 | uint32_t lifetime_hint; |
@@ -1647,7 +1663,7 @@ ssl3_get_new_session_ticket(SSL *s) | |||
1647 | return (-1); | 1663 | return (-1); |
1648 | } | 1664 | } |
1649 | 1665 | ||
1650 | int | 1666 | static int |
1651 | ssl3_get_cert_status(SSL *s) | 1667 | ssl3_get_cert_status(SSL *s) |
1652 | { | 1668 | { |
1653 | CBS cert_status, response; | 1669 | CBS cert_status, response; |
@@ -1748,7 +1764,7 @@ ssl3_get_cert_status(SSL *s) | |||
1748 | return (-1); | 1764 | return (-1); |
1749 | } | 1765 | } |
1750 | 1766 | ||
1751 | int | 1767 | static int |
1752 | ssl3_get_server_done(SSL *s) | 1768 | ssl3_get_server_done(SSL *s) |
1753 | { | 1769 | { |
1754 | int ret; | 1770 | int ret; |
@@ -2024,7 +2040,7 @@ ssl3_send_client_kex_gost(SSL *s, CBB *cbb) | |||
2024 | return ret; | 2040 | return ret; |
2025 | } | 2041 | } |
2026 | 2042 | ||
2027 | int | 2043 | static int |
2028 | ssl3_send_client_key_exchange(SSL *s) | 2044 | ssl3_send_client_key_exchange(SSL *s) |
2029 | { | 2045 | { |
2030 | unsigned long alg_k; | 2046 | unsigned long alg_k; |
@@ -2283,7 +2299,7 @@ ssl3_send_client_verify_gost(SSL *s, EVP_PKEY *pkey, CBB *cert_verify) | |||
2283 | } | 2299 | } |
2284 | #endif | 2300 | #endif |
2285 | 2301 | ||
2286 | int | 2302 | static int |
2287 | ssl3_send_client_verify(SSL *s) | 2303 | ssl3_send_client_verify(SSL *s) |
2288 | { | 2304 | { |
2289 | const struct ssl_sigalg *sigalg; | 2305 | const struct ssl_sigalg *sigalg; |
@@ -2345,7 +2361,7 @@ ssl3_send_client_verify(SSL *s) | |||
2345 | return (-1); | 2361 | return (-1); |
2346 | } | 2362 | } |
2347 | 2363 | ||
2348 | int | 2364 | static int |
2349 | ssl3_send_client_certificate(SSL *s) | 2365 | ssl3_send_client_certificate(SSL *s) |
2350 | { | 2366 | { |
2351 | EVP_PKEY *pkey = NULL; | 2367 | EVP_PKEY *pkey = NULL; |
@@ -2423,7 +2439,7 @@ ssl3_send_client_certificate(SSL *s) | |||
2423 | 2439 | ||
2424 | #define has_bits(i,m) (((i)&(m)) == (m)) | 2440 | #define has_bits(i,m) (((i)&(m)) == (m)) |
2425 | 2441 | ||
2426 | int | 2442 | static int |
2427 | ssl3_check_cert_and_algorithm(SSL *s) | 2443 | ssl3_check_cert_and_algorithm(SSL *s) |
2428 | { | 2444 | { |
2429 | long alg_k, alg_a; | 2445 | long alg_k, alg_a; |
@@ -2481,7 +2497,7 @@ ssl3_check_cert_and_algorithm(SSL *s) | |||
2481 | * session tickets we have to check the next message to be sure. | 2497 | * session tickets we have to check the next message to be sure. |
2482 | */ | 2498 | */ |
2483 | 2499 | ||
2484 | int | 2500 | static int |
2485 | ssl3_check_finished(SSL *s) | 2501 | ssl3_check_finished(SSL *s) |
2486 | { | 2502 | { |
2487 | int ret; | 2503 | int ret; |
@@ -2503,7 +2519,7 @@ ssl3_check_finished(SSL *s) | |||
2503 | return (1); | 2519 | return (1); |
2504 | } | 2520 | } |
2505 | 2521 | ||
2506 | int | 2522 | static int |
2507 | ssl_do_client_cert_cb(SSL *s, X509 **px509, EVP_PKEY **ppkey) | 2523 | ssl_do_client_cert_cb(SSL *s, X509 **px509, EVP_PKEY **ppkey) |
2508 | { | 2524 | { |
2509 | int i = 0; | 2525 | int i = 0; |
@@ -2521,3 +2537,137 @@ ssl_do_client_cert_cb(SSL *s, X509 **px509, EVP_PKEY **ppkey) | |||
2521 | i = s->ctx->internal->client_cert_cb(s, px509, ppkey); | 2537 | i = s->ctx->internal->client_cert_cb(s, px509, ppkey); |
2522 | return (i); | 2538 | return (i); |
2523 | } | 2539 | } |
2540 | |||
2541 | static int | ||
2542 | ssl3_send_client_change_cipher_spec(SSL *s) | ||
2543 | { | ||
2544 | size_t outlen; | ||
2545 | CBB cbb; | ||
2546 | |||
2547 | memset(&cbb, 0, sizeof(cbb)); | ||
2548 | |||
2549 | if (s->s3->hs.state == SSL3_ST_CW_CHANGE_A) { | ||
2550 | if (!CBB_init_fixed(&cbb, s->internal->init_buf->data, | ||
2551 | s->internal->init_buf->length)) | ||
2552 | goto err; | ||
2553 | if (!CBB_add_u8(&cbb, SSL3_MT_CCS)) | ||
2554 | goto err; | ||
2555 | if (!CBB_finish(&cbb, NULL, &outlen)) | ||
2556 | goto err; | ||
2557 | |||
2558 | if (outlen > INT_MAX) | ||
2559 | goto err; | ||
2560 | |||
2561 | s->internal->init_num = (int)outlen; | ||
2562 | s->internal->init_off = 0; | ||
2563 | |||
2564 | if (SSL_is_dtls(s)) { | ||
2565 | s->d1->handshake_write_seq = | ||
2566 | s->d1->next_handshake_write_seq; | ||
2567 | dtls1_set_message_header_int(s, SSL3_MT_CCS, 0, | ||
2568 | s->d1->handshake_write_seq, 0, 0); | ||
2569 | dtls1_buffer_message(s, 1); | ||
2570 | } | ||
2571 | |||
2572 | s->s3->hs.state = SSL3_ST_CW_CHANGE_B; | ||
2573 | } | ||
2574 | |||
2575 | /* SSL3_ST_CW_CHANGE_B */ | ||
2576 | return ssl3_record_write(s, SSL3_RT_CHANGE_CIPHER_SPEC); | ||
2577 | |||
2578 | err: | ||
2579 | CBB_cleanup(&cbb); | ||
2580 | |||
2581 | return -1; | ||
2582 | } | ||
2583 | |||
2584 | static int | ||
2585 | ssl3_send_client_finished(SSL *s) | ||
2586 | { | ||
2587 | CBB cbb, finished; | ||
2588 | |||
2589 | memset(&cbb, 0, sizeof(cbb)); | ||
2590 | |||
2591 | if (s->s3->hs.state == SSL3_ST_CW_FINISHED_A) { | ||
2592 | if (!tls12_derive_finished(s)) | ||
2593 | goto err; | ||
2594 | |||
2595 | /* Copy finished so we can use it for renegotiation checks. */ | ||
2596 | memcpy(s->s3->previous_client_finished, | ||
2597 | s->s3->hs.finished, s->s3->hs.finished_len); | ||
2598 | s->s3->previous_client_finished_len = | ||
2599 | s->s3->hs.finished_len; | ||
2600 | |||
2601 | if (!ssl3_handshake_msg_start(s, &cbb, &finished, | ||
2602 | SSL3_MT_FINISHED)) | ||
2603 | goto err; | ||
2604 | if (!CBB_add_bytes(&finished, s->s3->hs.finished, | ||
2605 | s->s3->hs.finished_len)) | ||
2606 | goto err; | ||
2607 | if (!ssl3_handshake_msg_finish(s, &cbb)) | ||
2608 | goto err; | ||
2609 | |||
2610 | s->s3->hs.state = SSL3_ST_CW_FINISHED_B; | ||
2611 | } | ||
2612 | |||
2613 | return (ssl3_handshake_write(s)); | ||
2614 | |||
2615 | err: | ||
2616 | CBB_cleanup(&cbb); | ||
2617 | |||
2618 | return (-1); | ||
2619 | } | ||
2620 | |||
2621 | static int | ||
2622 | ssl3_get_server_finished(SSL *s) | ||
2623 | { | ||
2624 | int al, md_len, ret; | ||
2625 | CBS cbs; | ||
2626 | |||
2627 | /* should actually be 36+4 :-) */ | ||
2628 | if ((ret = ssl3_get_message(s, SSL3_ST_CR_FINISHED_A, | ||
2629 | SSL3_ST_CR_FINISHED_B, SSL3_MT_FINISHED, 64)) <= 0) | ||
2630 | return ret; | ||
2631 | |||
2632 | /* If this occurs, we have missed a message */ | ||
2633 | if (!s->s3->change_cipher_spec) { | ||
2634 | al = SSL_AD_UNEXPECTED_MESSAGE; | ||
2635 | SSLerror(s, SSL_R_GOT_A_FIN_BEFORE_A_CCS); | ||
2636 | goto fatal_err; | ||
2637 | } | ||
2638 | s->s3->change_cipher_spec = 0; | ||
2639 | |||
2640 | md_len = TLS1_FINISH_MAC_LENGTH; | ||
2641 | |||
2642 | if (s->internal->init_num < 0) { | ||
2643 | al = SSL_AD_DECODE_ERROR; | ||
2644 | SSLerror(s, SSL_R_BAD_DIGEST_LENGTH); | ||
2645 | goto fatal_err; | ||
2646 | } | ||
2647 | |||
2648 | CBS_init(&cbs, s->internal->init_msg, s->internal->init_num); | ||
2649 | |||
2650 | if (s->s3->hs.peer_finished_len != md_len || | ||
2651 | CBS_len(&cbs) != md_len) { | ||
2652 | al = SSL_AD_DECODE_ERROR; | ||
2653 | SSLerror(s, SSL_R_BAD_DIGEST_LENGTH); | ||
2654 | goto fatal_err; | ||
2655 | } | ||
2656 | |||
2657 | if (!CBS_mem_equal(&cbs, s->s3->hs.peer_finished, CBS_len(&cbs))) { | ||
2658 | al = SSL_AD_DECRYPT_ERROR; | ||
2659 | SSLerror(s, SSL_R_DIGEST_CHECK_FAILED); | ||
2660 | goto fatal_err; | ||
2661 | } | ||
2662 | |||
2663 | /* Copy finished so we can use it for renegotiation checks. */ | ||
2664 | OPENSSL_assert(md_len <= EVP_MAX_MD_SIZE); | ||
2665 | memcpy(s->s3->previous_server_finished, | ||
2666 | s->s3->hs.peer_finished, md_len); | ||
2667 | s->s3->previous_server_finished_len = md_len; | ||
2668 | |||
2669 | return (1); | ||
2670 | fatal_err: | ||
2671 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | ||
2672 | return (0); | ||
2673 | } | ||
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h index a6fc6eaa32..a8d5308e8c 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.425 2022/09/10 15:29:33 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_locl.h,v 1.426 2022/10/01 16:23:15 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 | * |
@@ -1357,16 +1357,10 @@ int ssl_verify_alarm_type(long type); | |||
1357 | int SSL_SESSION_ticket(SSL_SESSION *ss, unsigned char **out, size_t *out_len); | 1357 | int SSL_SESSION_ticket(SSL_SESSION *ss, unsigned char **out, size_t *out_len); |
1358 | 1358 | ||
1359 | const SSL_CIPHER *ssl3_get_cipher_by_char(const unsigned char *p); | 1359 | const SSL_CIPHER *ssl3_get_cipher_by_char(const unsigned char *p); |
1360 | int ssl3_send_server_certificate(SSL *s); | ||
1361 | int ssl3_send_newsession_ticket(SSL *s); | ||
1362 | int ssl3_send_cert_status(SSL *s); | ||
1363 | int ssl3_get_finished(SSL *s, int state_a, int state_b); | ||
1364 | int ssl3_send_change_cipher_spec(SSL *s, int state_a, int state_b); | ||
1365 | int ssl3_do_write(SSL *s, int type); | 1360 | int ssl3_do_write(SSL *s, int type); |
1366 | int ssl3_send_alert(SSL *s, int level, int desc); | 1361 | int ssl3_send_alert(SSL *s, int level, int desc); |
1367 | int ssl3_get_req_cert_types(SSL *s, CBB *cbb); | 1362 | int ssl3_get_req_cert_types(SSL *s, CBB *cbb); |
1368 | int ssl3_get_message(SSL *s, int st1, int stn, int mt, long max); | 1363 | int ssl3_get_message(SSL *s, int st1, int stn, int mt, long max); |
1369 | int ssl3_send_finished(SSL *s, int state_a, int state_b); | ||
1370 | int ssl3_num_ciphers(void); | 1364 | int ssl3_num_ciphers(void); |
1371 | const SSL_CIPHER *ssl3_get_cipher(unsigned int u); | 1365 | const SSL_CIPHER *ssl3_get_cipher(unsigned int u); |
1372 | const SSL_CIPHER *ssl3_get_cipher_by_id(unsigned int id); | 1366 | const SSL_CIPHER *ssl3_get_cipher_by_id(unsigned int id); |
@@ -1424,35 +1418,6 @@ int ssl_server_legacy_first_packet(SSL *s); | |||
1424 | int ssl3_write_pending(SSL *s, int type, const unsigned char *buf, | 1418 | int ssl3_write_pending(SSL *s, int type, const unsigned char *buf, |
1425 | unsigned int len); | 1419 | unsigned int len); |
1426 | 1420 | ||
1427 | /* some client-only functions */ | ||
1428 | int ssl3_send_client_hello(SSL *s); | ||
1429 | int ssl3_get_dtls_hello_verify(SSL *s); | ||
1430 | int ssl3_get_server_hello(SSL *s); | ||
1431 | int ssl3_get_certificate_request(SSL *s); | ||
1432 | int ssl3_get_new_session_ticket(SSL *s); | ||
1433 | int ssl3_get_cert_status(SSL *s); | ||
1434 | int ssl3_get_server_done(SSL *s); | ||
1435 | int ssl3_send_client_verify(SSL *s); | ||
1436 | int ssl3_send_client_certificate(SSL *s); | ||
1437 | int ssl_do_client_cert_cb(SSL *s, X509 **px509, EVP_PKEY **ppkey); | ||
1438 | int ssl3_send_client_key_exchange(SSL *s); | ||
1439 | int ssl3_get_server_key_exchange(SSL *s); | ||
1440 | int ssl3_get_server_certificate(SSL *s); | ||
1441 | int ssl3_check_cert_and_algorithm(SSL *s); | ||
1442 | int ssl3_check_finished(SSL *s); | ||
1443 | |||
1444 | /* some server-only functions */ | ||
1445 | int ssl3_get_client_hello(SSL *s); | ||
1446 | int ssl3_send_dtls_hello_verify_request(SSL *s); | ||
1447 | int ssl3_send_server_hello(SSL *s); | ||
1448 | int ssl3_send_hello_request(SSL *s); | ||
1449 | int ssl3_send_server_key_exchange(SSL *s); | ||
1450 | int ssl3_send_certificate_request(SSL *s); | ||
1451 | int ssl3_send_server_done(SSL *s); | ||
1452 | int ssl3_get_client_certificate(SSL *s); | ||
1453 | int ssl3_get_client_key_exchange(SSL *s); | ||
1454 | int ssl3_get_cert_verify(SSL *s); | ||
1455 | |||
1456 | int ssl_kex_generate_dhe(DH *dh, DH *dh_params); | 1421 | int ssl_kex_generate_dhe(DH *dh, DH *dh_params); |
1457 | int ssl_kex_generate_dhe_params_auto(DH *dh, size_t key_len); | 1422 | int ssl_kex_generate_dhe_params_auto(DH *dh, size_t key_len); |
1458 | int ssl_kex_params_dhe(DH *dh, CBB *cbb); | 1423 | int ssl_kex_params_dhe(DH *dh, CBB *cbb); |
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c index acdcb15398..821006af81 100644 --- a/src/lib/libssl/ssl_srvr.c +++ b/src/lib/libssl/ssl_srvr.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_srvr.c,v 1.149 2022/08/17 07:39:19 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_srvr.c,v 1.150 2022/10/01 16:23:15 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 | * |
@@ -148,6 +148,7 @@ | |||
148 | * OTHERWISE. | 148 | * OTHERWISE. |
149 | */ | 149 | */ |
150 | 150 | ||
151 | #include <limits.h> | ||
151 | #include <stdio.h> | 152 | #include <stdio.h> |
152 | 153 | ||
153 | #include <openssl/bn.h> | 154 | #include <openssl/bn.h> |
@@ -171,6 +172,23 @@ | |||
171 | #include "ssl_sigalgs.h" | 172 | #include "ssl_sigalgs.h" |
172 | #include "ssl_tlsext.h" | 173 | #include "ssl_tlsext.h" |
173 | 174 | ||
175 | static int ssl3_get_client_hello(SSL *s); | ||
176 | static int ssl3_send_dtls_hello_verify_request(SSL *s); | ||
177 | static int ssl3_send_server_hello(SSL *s); | ||
178 | static int ssl3_send_hello_request(SSL *s); | ||
179 | static int ssl3_send_server_certificate(SSL *s); | ||
180 | static int ssl3_send_server_key_exchange(SSL *s); | ||
181 | static int ssl3_send_certificate_request(SSL *s); | ||
182 | static int ssl3_send_server_done(SSL *s); | ||
183 | static int ssl3_get_client_certificate(SSL *s); | ||
184 | static int ssl3_get_client_key_exchange(SSL *s); | ||
185 | static int ssl3_get_cert_verify(SSL *s); | ||
186 | static int ssl3_send_newsession_ticket(SSL *s); | ||
187 | static int ssl3_send_cert_status(SSL *s); | ||
188 | static int ssl3_send_server_change_cipher_spec(SSL *s); | ||
189 | static int ssl3_send_server_finished(SSL *s); | ||
190 | static int ssl3_get_client_finished(SSL *s); | ||
191 | |||
174 | int | 192 | int |
175 | ssl3_accept(SSL *s) | 193 | ssl3_accept(SSL *s) |
176 | { | 194 | { |
@@ -605,8 +623,7 @@ ssl3_accept(SSL *s) | |||
605 | s->d1->change_cipher_spec_ok = 1; | 623 | s->d1->change_cipher_spec_ok = 1; |
606 | else | 624 | else |
607 | s->s3->flags |= SSL3_FLAGS_CCS_OK; | 625 | s->s3->flags |= SSL3_FLAGS_CCS_OK; |
608 | ret = ssl3_get_finished(s, SSL3_ST_SR_FINISHED_A, | 626 | ret = ssl3_get_client_finished(s); |
609 | SSL3_ST_SR_FINISHED_B); | ||
610 | if (ret <= 0) | 627 | if (ret <= 0) |
611 | goto end; | 628 | goto end; |
612 | if (SSL_is_dtls(s)) | 629 | if (SSL_is_dtls(s)) |
@@ -640,8 +657,7 @@ ssl3_accept(SSL *s) | |||
640 | 657 | ||
641 | case SSL3_ST_SW_CHANGE_A: | 658 | case SSL3_ST_SW_CHANGE_A: |
642 | case SSL3_ST_SW_CHANGE_B: | 659 | case SSL3_ST_SW_CHANGE_B: |
643 | ret = ssl3_send_change_cipher_spec(s, | 660 | ret = ssl3_send_server_change_cipher_spec(s); |
644 | SSL3_ST_SW_CHANGE_A, SSL3_ST_SW_CHANGE_B); | ||
645 | if (ret <= 0) | 661 | if (ret <= 0) |
646 | goto end; | 662 | goto end; |
647 | s->s3->hs.state = SSL3_ST_SW_FINISHED_A; | 663 | s->s3->hs.state = SSL3_ST_SW_FINISHED_A; |
@@ -660,8 +676,7 @@ ssl3_accept(SSL *s) | |||
660 | 676 | ||
661 | case SSL3_ST_SW_FINISHED_A: | 677 | case SSL3_ST_SW_FINISHED_A: |
662 | case SSL3_ST_SW_FINISHED_B: | 678 | case SSL3_ST_SW_FINISHED_B: |
663 | ret = ssl3_send_finished(s, SSL3_ST_SW_FINISHED_A, | 679 | ret = ssl3_send_server_finished(s); |
664 | SSL3_ST_SW_FINISHED_B); | ||
665 | if (ret <= 0) | 680 | if (ret <= 0) |
666 | goto end; | 681 | goto end; |
667 | s->s3->hs.state = SSL3_ST_SW_FLUSH; | 682 | s->s3->hs.state = SSL3_ST_SW_FLUSH; |
@@ -748,7 +763,7 @@ ssl3_accept(SSL *s) | |||
748 | return (ret); | 763 | return (ret); |
749 | } | 764 | } |
750 | 765 | ||
751 | int | 766 | static int |
752 | ssl3_send_hello_request(SSL *s) | 767 | ssl3_send_hello_request(SSL *s) |
753 | { | 768 | { |
754 | CBB cbb, hello; | 769 | CBB cbb, hello; |
@@ -774,7 +789,7 @@ ssl3_send_hello_request(SSL *s) | |||
774 | return (-1); | 789 | return (-1); |
775 | } | 790 | } |
776 | 791 | ||
777 | int | 792 | static int |
778 | ssl3_get_client_hello(SSL *s) | 793 | ssl3_get_client_hello(SSL *s) |
779 | { | 794 | { |
780 | CBS cbs, client_random, session_id, cookie, cipher_suites; | 795 | CBS cbs, client_random, session_id, cookie, cipher_suites; |
@@ -1167,7 +1182,7 @@ ssl3_get_client_hello(SSL *s) | |||
1167 | return (ret); | 1182 | return (ret); |
1168 | } | 1183 | } |
1169 | 1184 | ||
1170 | int | 1185 | static int |
1171 | ssl3_send_dtls_hello_verify_request(SSL *s) | 1186 | ssl3_send_dtls_hello_verify_request(SSL *s) |
1172 | { | 1187 | { |
1173 | CBB cbb, verify, cookie; | 1188 | CBB cbb, verify, cookie; |
@@ -1211,7 +1226,7 @@ ssl3_send_dtls_hello_verify_request(SSL *s) | |||
1211 | return (-1); | 1226 | return (-1); |
1212 | } | 1227 | } |
1213 | 1228 | ||
1214 | int | 1229 | static int |
1215 | ssl3_send_server_hello(SSL *s) | 1230 | ssl3_send_server_hello(SSL *s) |
1216 | { | 1231 | { |
1217 | CBB cbb, server_hello, session_id; | 1232 | CBB cbb, server_hello, session_id; |
@@ -1290,7 +1305,7 @@ ssl3_send_server_hello(SSL *s) | |||
1290 | return (-1); | 1305 | return (-1); |
1291 | } | 1306 | } |
1292 | 1307 | ||
1293 | int | 1308 | static int |
1294 | ssl3_send_server_done(SSL *s) | 1309 | ssl3_send_server_done(SSL *s) |
1295 | { | 1310 | { |
1296 | CBB cbb, done; | 1311 | CBB cbb, done; |
@@ -1413,7 +1428,7 @@ ssl3_send_server_kex_ecdhe(SSL *s, CBB *cbb) | |||
1413 | return 0; | 1428 | return 0; |
1414 | } | 1429 | } |
1415 | 1430 | ||
1416 | int | 1431 | static int |
1417 | ssl3_send_server_key_exchange(SSL *s) | 1432 | ssl3_send_server_key_exchange(SSL *s) |
1418 | { | 1433 | { |
1419 | CBB cbb, cbb_params, cbb_signature, server_kex; | 1434 | CBB cbb, cbb_params, cbb_signature, server_kex; |
@@ -1552,7 +1567,7 @@ ssl3_send_server_key_exchange(SSL *s) | |||
1552 | return (-1); | 1567 | return (-1); |
1553 | } | 1568 | } |
1554 | 1569 | ||
1555 | int | 1570 | static int |
1556 | ssl3_send_certificate_request(SSL *s) | 1571 | ssl3_send_certificate_request(SSL *s) |
1557 | { | 1572 | { |
1558 | CBB cbb, cert_request, cert_types, sigalgs, cert_auth, dn; | 1573 | CBB cbb, cert_request, cert_types, sigalgs, cert_auth, dn; |
@@ -1868,7 +1883,7 @@ ssl3_get_client_kex_gost(SSL *s, CBS *cbs) | |||
1868 | return 0; | 1883 | return 0; |
1869 | } | 1884 | } |
1870 | 1885 | ||
1871 | int | 1886 | static int |
1872 | ssl3_get_client_key_exchange(SSL *s) | 1887 | ssl3_get_client_key_exchange(SSL *s) |
1873 | { | 1888 | { |
1874 | unsigned long alg_k; | 1889 | unsigned long alg_k; |
@@ -1919,7 +1934,7 @@ ssl3_get_client_key_exchange(SSL *s) | |||
1919 | return (-1); | 1934 | return (-1); |
1920 | } | 1935 | } |
1921 | 1936 | ||
1922 | int | 1937 | static int |
1923 | ssl3_get_cert_verify(SSL *s) | 1938 | ssl3_get_cert_verify(SSL *s) |
1924 | { | 1939 | { |
1925 | CBS cbs, signature; | 1940 | CBS cbs, signature; |
@@ -2153,7 +2168,7 @@ ssl3_get_cert_verify(SSL *s) | |||
2153 | return (ret); | 2168 | return (ret); |
2154 | } | 2169 | } |
2155 | 2170 | ||
2156 | int | 2171 | static int |
2157 | ssl3_get_client_certificate(SSL *s) | 2172 | ssl3_get_client_certificate(SSL *s) |
2158 | { | 2173 | { |
2159 | CBS cbs, cert_list, cert_data; | 2174 | CBS cbs, cert_list, cert_data; |
@@ -2271,7 +2286,7 @@ ssl3_get_client_certificate(SSL *s) | |||
2271 | return (ret); | 2286 | return (ret); |
2272 | } | 2287 | } |
2273 | 2288 | ||
2274 | int | 2289 | static int |
2275 | ssl3_send_server_certificate(SSL *s) | 2290 | ssl3_send_server_certificate(SSL *s) |
2276 | { | 2291 | { |
2277 | CBB cbb, server_cert; | 2292 | CBB cbb, server_cert; |
@@ -2310,7 +2325,7 @@ ssl3_send_server_certificate(SSL *s) | |||
2310 | } | 2325 | } |
2311 | 2326 | ||
2312 | /* send a new session ticket (not necessarily for a new session) */ | 2327 | /* send a new session ticket (not necessarily for a new session) */ |
2313 | int | 2328 | static int |
2314 | ssl3_send_newsession_ticket(SSL *s) | 2329 | ssl3_send_newsession_ticket(SSL *s) |
2315 | { | 2330 | { |
2316 | CBB cbb, session_ticket, ticket; | 2331 | CBB cbb, session_ticket, ticket; |
@@ -2443,7 +2458,7 @@ ssl3_send_newsession_ticket(SSL *s) | |||
2443 | return (-1); | 2458 | return (-1); |
2444 | } | 2459 | } |
2445 | 2460 | ||
2446 | int | 2461 | static int |
2447 | ssl3_send_cert_status(SSL *s) | 2462 | ssl3_send_cert_status(SSL *s) |
2448 | { | 2463 | { |
2449 | CBB cbb, certstatus, ocspresp; | 2464 | CBB cbb, certstatus, ocspresp; |
@@ -2475,3 +2490,136 @@ ssl3_send_cert_status(SSL *s) | |||
2475 | 2490 | ||
2476 | return (-1); | 2491 | return (-1); |
2477 | } | 2492 | } |
2493 | |||
2494 | static int | ||
2495 | ssl3_send_server_change_cipher_spec(SSL *s) | ||
2496 | { | ||
2497 | size_t outlen; | ||
2498 | CBB cbb; | ||
2499 | |||
2500 | memset(&cbb, 0, sizeof(cbb)); | ||
2501 | |||
2502 | if (s->s3->hs.state == SSL3_ST_SW_CHANGE_A) { | ||
2503 | if (!CBB_init_fixed(&cbb, s->internal->init_buf->data, | ||
2504 | s->internal->init_buf->length)) | ||
2505 | goto err; | ||
2506 | if (!CBB_add_u8(&cbb, SSL3_MT_CCS)) | ||
2507 | goto err; | ||
2508 | if (!CBB_finish(&cbb, NULL, &outlen)) | ||
2509 | goto err; | ||
2510 | |||
2511 | if (outlen > INT_MAX) | ||
2512 | goto err; | ||
2513 | |||
2514 | s->internal->init_num = (int)outlen; | ||
2515 | s->internal->init_off = 0; | ||
2516 | |||
2517 | if (SSL_is_dtls(s)) { | ||
2518 | s->d1->handshake_write_seq = | ||
2519 | s->d1->next_handshake_write_seq; | ||
2520 | dtls1_set_message_header_int(s, SSL3_MT_CCS, 0, | ||
2521 | s->d1->handshake_write_seq, 0, 0); | ||
2522 | dtls1_buffer_message(s, 1); | ||
2523 | } | ||
2524 | |||
2525 | s->s3->hs.state = SSL3_ST_SW_CHANGE_B; | ||
2526 | } | ||
2527 | |||
2528 | /* SSL3_ST_SW_CHANGE_B */ | ||
2529 | return ssl3_record_write(s, SSL3_RT_CHANGE_CIPHER_SPEC); | ||
2530 | |||
2531 | err: | ||
2532 | CBB_cleanup(&cbb); | ||
2533 | |||
2534 | return -1; | ||
2535 | } | ||
2536 | |||
2537 | static int | ||
2538 | ssl3_get_client_finished(SSL *s) | ||
2539 | { | ||
2540 | int al, md_len, ret; | ||
2541 | CBS cbs; | ||
2542 | |||
2543 | /* should actually be 36+4 :-) */ | ||
2544 | if ((ret = ssl3_get_message(s, SSL3_ST_SR_FINISHED_A, | ||
2545 | SSL3_ST_SR_FINISHED_B, SSL3_MT_FINISHED, 64)) <= 0) | ||
2546 | return ret; | ||
2547 | |||
2548 | /* If this occurs, we have missed a message */ | ||
2549 | if (!s->s3->change_cipher_spec) { | ||
2550 | al = SSL_AD_UNEXPECTED_MESSAGE; | ||
2551 | SSLerror(s, SSL_R_GOT_A_FIN_BEFORE_A_CCS); | ||
2552 | goto fatal_err; | ||
2553 | } | ||
2554 | s->s3->change_cipher_spec = 0; | ||
2555 | |||
2556 | md_len = TLS1_FINISH_MAC_LENGTH; | ||
2557 | |||
2558 | if (s->internal->init_num < 0) { | ||
2559 | al = SSL_AD_DECODE_ERROR; | ||
2560 | SSLerror(s, SSL_R_BAD_DIGEST_LENGTH); | ||
2561 | goto fatal_err; | ||
2562 | } | ||
2563 | |||
2564 | CBS_init(&cbs, s->internal->init_msg, s->internal->init_num); | ||
2565 | |||
2566 | if (s->s3->hs.peer_finished_len != md_len || | ||
2567 | CBS_len(&cbs) != md_len) { | ||
2568 | al = SSL_AD_DECODE_ERROR; | ||
2569 | SSLerror(s, SSL_R_BAD_DIGEST_LENGTH); | ||
2570 | goto fatal_err; | ||
2571 | } | ||
2572 | |||
2573 | if (!CBS_mem_equal(&cbs, s->s3->hs.peer_finished, CBS_len(&cbs))) { | ||
2574 | al = SSL_AD_DECRYPT_ERROR; | ||
2575 | SSLerror(s, SSL_R_DIGEST_CHECK_FAILED); | ||
2576 | goto fatal_err; | ||
2577 | } | ||
2578 | |||
2579 | /* Copy finished so we can use it for renegotiation checks. */ | ||
2580 | OPENSSL_assert(md_len <= EVP_MAX_MD_SIZE); | ||
2581 | memcpy(s->s3->previous_client_finished, | ||
2582 | s->s3->hs.peer_finished, md_len); | ||
2583 | s->s3->previous_client_finished_len = md_len; | ||
2584 | |||
2585 | return (1); | ||
2586 | fatal_err: | ||
2587 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | ||
2588 | return (0); | ||
2589 | } | ||
2590 | |||
2591 | static int | ||
2592 | ssl3_send_server_finished(SSL *s) | ||
2593 | { | ||
2594 | CBB cbb, finished; | ||
2595 | |||
2596 | memset(&cbb, 0, sizeof(cbb)); | ||
2597 | |||
2598 | if (s->s3->hs.state == SSL3_ST_SW_FINISHED_A) { | ||
2599 | if (!tls12_derive_finished(s)) | ||
2600 | goto err; | ||
2601 | |||
2602 | /* Copy finished so we can use it for renegotiation checks. */ | ||
2603 | memcpy(s->s3->previous_server_finished, | ||
2604 | s->s3->hs.finished, s->s3->hs.finished_len); | ||
2605 | s->s3->previous_server_finished_len = s->s3->hs.finished_len; | ||
2606 | |||
2607 | if (!ssl3_handshake_msg_start(s, &cbb, &finished, | ||
2608 | SSL3_MT_FINISHED)) | ||
2609 | goto err; | ||
2610 | if (!CBB_add_bytes(&finished, s->s3->hs.finished, | ||
2611 | s->s3->hs.finished_len)) | ||
2612 | goto err; | ||
2613 | if (!ssl3_handshake_msg_finish(s, &cbb)) | ||
2614 | goto err; | ||
2615 | |||
2616 | s->s3->hs.state = SSL3_ST_SW_FINISHED_B; | ||
2617 | } | ||
2618 | |||
2619 | return (ssl3_handshake_write(s)); | ||
2620 | |||
2621 | err: | ||
2622 | CBB_cleanup(&cbb); | ||
2623 | |||
2624 | return (-1); | ||
2625 | } | ||