summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_srvr.c
diff options
context:
space:
mode:
authorjsing <>2022-10-01 16:23:15 +0000
committerjsing <>2022-10-01 16:23:15 +0000
commitd5e660940f76ba9fedb2400c0fa888e996ee93c9 (patch)
tree17355bd2c7397fbcda5912079e30abc288561c2f /src/lib/libssl/ssl_srvr.c
parent891337e5a26a9faa47ed08abfbaeaf58e11c669c (diff)
downloadopenbsd-d5e660940f76ba9fedb2400c0fa888e996ee93c9.tar.gz
openbsd-d5e660940f76ba9fedb2400c0fa888e996ee93c9.tar.bz2
openbsd-d5e660940f76ba9fedb2400c0fa888e996ee93c9.zip
Move handshake message handling functions from ssl_both.c to client/server.
Currently, ssl_both.c contains several functions that are used by both the legacy client and legacy server. This interwines the client and server, making it harder to make progressive changes. While it does deduplicate some code, it also ends up with code that is conditioned on s->server and forces the caller to pass in SSL3_ST_* values. Move these functions from ssl_both.c into ssl_clnt.c and ssl_srvr.c, renaming as appropriate and removing the s->server conditionals. Also move the client and server function prototypes from ssl_locl.h into the .c files, making them static in the process. ok tb@
Diffstat (limited to 'src/lib/libssl/ssl_srvr.c')
-rw-r--r--src/lib/libssl/ssl_srvr.c188
1 files changed, 168 insertions, 20 deletions
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
175static int ssl3_get_client_hello(SSL *s);
176static int ssl3_send_dtls_hello_verify_request(SSL *s);
177static int ssl3_send_server_hello(SSL *s);
178static int ssl3_send_hello_request(SSL *s);
179static int ssl3_send_server_certificate(SSL *s);
180static int ssl3_send_server_key_exchange(SSL *s);
181static int ssl3_send_certificate_request(SSL *s);
182static int ssl3_send_server_done(SSL *s);
183static int ssl3_get_client_certificate(SSL *s);
184static int ssl3_get_client_key_exchange(SSL *s);
185static int ssl3_get_cert_verify(SSL *s);
186static int ssl3_send_newsession_ticket(SSL *s);
187static int ssl3_send_cert_status(SSL *s);
188static int ssl3_send_server_change_cipher_spec(SSL *s);
189static int ssl3_send_server_finished(SSL *s);
190static int ssl3_get_client_finished(SSL *s);
191
174int 192int
175ssl3_accept(SSL *s) 193ssl3_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
751int 766static int
752ssl3_send_hello_request(SSL *s) 767ssl3_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
777int 792static int
778ssl3_get_client_hello(SSL *s) 793ssl3_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
1170int 1185static int
1171ssl3_send_dtls_hello_verify_request(SSL *s) 1186ssl3_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
1214int 1229static int
1215ssl3_send_server_hello(SSL *s) 1230ssl3_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
1293int 1308static int
1294ssl3_send_server_done(SSL *s) 1309ssl3_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
1416int 1431static int
1417ssl3_send_server_key_exchange(SSL *s) 1432ssl3_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
1555int 1570static int
1556ssl3_send_certificate_request(SSL *s) 1571ssl3_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
1871int 1886static int
1872ssl3_get_client_key_exchange(SSL *s) 1887ssl3_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
1922int 1937static int
1923ssl3_get_cert_verify(SSL *s) 1938ssl3_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
2156int 2171static int
2157ssl3_get_client_certificate(SSL *s) 2172ssl3_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
2274int 2289static int
2275ssl3_send_server_certificate(SSL *s) 2290ssl3_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) */
2313int 2328static int
2314ssl3_send_newsession_ticket(SSL *s) 2329ssl3_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
2446int 2461static int
2447ssl3_send_cert_status(SSL *s) 2462ssl3_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
2494static int
2495ssl3_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
2537static int
2538ssl3_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
2591static int
2592ssl3_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}