enum ssl_hs_wait_t tls13_server_handshake(SSL_HANDSHAKE *hs) { while (hs->tls13_state != state_done) { enum ssl_hs_wait_t ret = ssl_hs_error; enum server_hs_state_t state = hs->tls13_state; switch (state) { case state_select_parameters: ret = do_select_parameters(hs); break; case state_select_session: ret = do_select_session(hs); break; case state_send_hello_retry_request: ret = do_send_hello_retry_request(hs); break; case state_process_second_client_hello: ret = do_process_second_client_hello(hs); break; case state_send_server_hello: ret = do_send_server_hello(hs); break; case state_send_server_certificate_verify: ret = do_send_server_certificate_verify(hs); break; case state_send_server_finished: ret = do_send_server_finished(hs); break; case state_read_second_client_flight: ret = do_read_second_client_flight(hs); break; case state_process_end_of_early_data: ret = do_process_end_of_early_data(hs); break; case state_process_client_certificate: ret = do_process_client_certificate(hs); break; case state_process_client_certificate_verify: ret = do_process_client_certificate_verify(hs); break; case state_process_channel_id: ret = do_process_channel_id(hs); break; case state_process_client_finished: ret = do_process_client_finished(hs); break; case state_send_new_session_ticket: ret = do_send_new_session_ticket(hs); break; case state_done: ret = ssl_hs_ok; break; } if (ret != ssl_hs_ok) { return ret; } } return ssl_hs_ok; }
enum ssl_hs_wait_t tls13_server_handshake(SSL *ssl) { SSL_HANDSHAKE *hs = ssl->s3->hs; while (hs->state != state_done) { enum ssl_hs_wait_t ret = ssl_hs_error; enum server_hs_state_t state = hs->state; switch (state) { case state_process_client_hello: ret = do_process_client_hello(ssl, hs); break; case state_select_parameters: ret = do_select_parameters(ssl, hs); break; case state_send_hello_retry_request: ret = do_send_hello_retry_request(ssl, hs); break; case state_flush_hello_retry_request: ret = do_flush_hello_retry_request(ssl, hs); break; case state_process_second_client_hello: ret = do_process_second_client_hello(ssl, hs); break; case state_send_server_hello: ret = do_send_server_hello(ssl, hs); break; case state_send_encrypted_extensions: ret = do_send_encrypted_extensions(ssl, hs); break; case state_send_certificate_request: ret = do_send_certificate_request(ssl, hs); break; case state_send_server_certificate: ret = do_send_server_certificate(ssl, hs); break; case state_send_server_certificate_verify: ret = do_send_server_certificate_verify(ssl, hs, 1 /* first run */); break; case state_complete_server_certificate_verify: ret = do_send_server_certificate_verify(ssl, hs, 0 /* complete */); break; case state_send_server_finished: ret = do_send_server_finished(ssl, hs); break; case state_flush: ret = do_flush(ssl, hs); break; case state_process_client_certificate: ret = do_process_client_certificate(ssl, hs); break; case state_process_client_certificate_verify: ret = do_process_client_certificate_verify(ssl, hs); break; case state_process_client_finished: ret = do_process_client_finished(ssl, hs); break; case state_send_new_session_ticket: ret = do_send_new_session_ticket(ssl, hs); break; case state_flush_new_session_ticket: ret = do_flush_new_session_ticket(ssl, hs); break; case state_done: ret = ssl_hs_ok; break; } if (ret != ssl_hs_ok) { return ret; } } return ssl_hs_ok; }