diff options
Diffstat (limited to 'src/lib/libssl/ssl_clnt.c')
-rw-r--r-- | src/lib/libssl/ssl_clnt.c | 194 |
1 files changed, 172 insertions, 22 deletions
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 | } | ||