mirror of https://github.com/openssl/openssl.git
				
				
				
			Ensure the end of first server flight processing is done
There is a set of miscellaneous processing for OCSP, CT etc at the end of the ServerDone processing. In TLS1.3 we don't have a ServerDone, so this needs to move elsewhere. Reviewed-by: Rich Salz <rsalz@openssl.org>
This commit is contained in:
		
							parent
							
								
									9970290e1d
								
							
						
					
					
						commit
						7776a36cfa
					
				|  | @ -2294,6 +2294,7 @@ int ERR_load_SSL_strings(void); | ||||||
| # define SSL_F_TLS_PROCESS_CLIENT_HELLO                   381 | # define SSL_F_TLS_PROCESS_CLIENT_HELLO                   381 | ||||||
| # define SSL_F_TLS_PROCESS_CLIENT_KEY_EXCHANGE            382 | # define SSL_F_TLS_PROCESS_CLIENT_KEY_EXCHANGE            382 | ||||||
| # define SSL_F_TLS_PROCESS_FINISHED                       364 | # define SSL_F_TLS_PROCESS_FINISHED                       364 | ||||||
|  | # define SSL_F_TLS_PROCESS_INITIAL_SERVER_FLIGHT          442 | ||||||
| # define SSL_F_TLS_PROCESS_KEY_EXCHANGE                   365 | # define SSL_F_TLS_PROCESS_KEY_EXCHANGE                   365 | ||||||
| # define SSL_F_TLS_PROCESS_NEW_SESSION_TICKET             366 | # define SSL_F_TLS_PROCESS_NEW_SESSION_TICKET             366 | ||||||
| # define SSL_F_TLS_PROCESS_NEXT_PROTO                     383 | # define SSL_F_TLS_PROCESS_NEXT_PROTO                     383 | ||||||
|  |  | ||||||
|  | @ -313,6 +313,8 @@ static ERR_STRING_DATA SSL_str_functs[] = { | ||||||
|     {ERR_FUNC(SSL_F_TLS_PROCESS_CLIENT_KEY_EXCHANGE), |     {ERR_FUNC(SSL_F_TLS_PROCESS_CLIENT_KEY_EXCHANGE), | ||||||
|      "tls_process_client_key_exchange"}, |      "tls_process_client_key_exchange"}, | ||||||
|     {ERR_FUNC(SSL_F_TLS_PROCESS_FINISHED), "tls_process_finished"}, |     {ERR_FUNC(SSL_F_TLS_PROCESS_FINISHED), "tls_process_finished"}, | ||||||
|  |     {ERR_FUNC(SSL_F_TLS_PROCESS_INITIAL_SERVER_FLIGHT), | ||||||
|  |      "tls_process_initial_server_flight"}, | ||||||
|     {ERR_FUNC(SSL_F_TLS_PROCESS_KEY_EXCHANGE), "tls_process_key_exchange"}, |     {ERR_FUNC(SSL_F_TLS_PROCESS_KEY_EXCHANGE), "tls_process_key_exchange"}, | ||||||
|     {ERR_FUNC(SSL_F_TLS_PROCESS_NEW_SESSION_TICKET), |     {ERR_FUNC(SSL_F_TLS_PROCESS_NEW_SESSION_TICKET), | ||||||
|      "tls_process_new_session_ticket"}, |      "tls_process_new_session_ticket"}, | ||||||
|  |  | ||||||
|  | @ -2186,34 +2186,22 @@ MSG_PROCESS_RETURN tls_process_cert_status(SSL *s, PACKET *pkt) | ||||||
|     return MSG_PROCESS_ERROR; |     return MSG_PROCESS_ERROR; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| MSG_PROCESS_RETURN tls_process_server_done(SSL *s, PACKET *pkt) | /*
 | ||||||
|  |  * Perform miscellaneous checks and processing after we have received the | ||||||
|  |  * server's initial flight. In TLS1.3 this is after the Server Finished message. | ||||||
|  |  * In <=TLS1.2 this is after the ServerDone message. | ||||||
|  |  * | ||||||
|  |  * Returns 1 on success or 0 on failure. | ||||||
|  |  */ | ||||||
|  | int tls_process_initial_server_flight(SSL *s, int *al) | ||||||
| { | { | ||||||
|     if (PACKET_remaining(pkt) > 0) { |  | ||||||
|         /* should contain no data */ |  | ||||||
|         ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); |  | ||||||
|         SSLerr(SSL_F_TLS_PROCESS_SERVER_DONE, SSL_R_LENGTH_MISMATCH); |  | ||||||
|         ossl_statem_set_error(s); |  | ||||||
|         return MSG_PROCESS_ERROR; |  | ||||||
|     } |  | ||||||
| #ifndef OPENSSL_NO_SRP |  | ||||||
|     if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kSRP) { |  | ||||||
|         if (SRP_Calc_A_param(s) <= 0) { |  | ||||||
|             SSLerr(SSL_F_TLS_PROCESS_SERVER_DONE, SSL_R_SRP_A_CALC); |  | ||||||
|             ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); |  | ||||||
|             ossl_statem_set_error(s); |  | ||||||
|             return MSG_PROCESS_ERROR; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
|     /*
 |     /*
 | ||||||
|      * at this point we check that we have the required stuff from |      * at this point we check that we have the required stuff from | ||||||
|      * the server |      * the server | ||||||
|      */ |      */ | ||||||
|     if (!ssl3_check_cert_and_algorithm(s)) { |     if (!ssl3_check_cert_and_algorithm(s)) { | ||||||
|         ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); |         *al = SSL_AD_HANDSHAKE_FAILURE; | ||||||
|         ossl_statem_set_error(s); |         return 0; | ||||||
|         return MSG_PROCESS_ERROR; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /*
 |     /*
 | ||||||
|  | @ -2225,28 +2213,56 @@ MSG_PROCESS_RETURN tls_process_server_done(SSL *s, PACKET *pkt) | ||||||
|         int ret; |         int ret; | ||||||
|         ret = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg); |         ret = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg); | ||||||
|         if (ret == 0) { |         if (ret == 0) { | ||||||
|             ssl3_send_alert(s, SSL3_AL_FATAL, |             *al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE; | ||||||
|                             SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE); |             SSLerr(SSL_F_TLS_PROCESS_INITIAL_SERVER_FLIGHT, | ||||||
|             SSLerr(SSL_F_TLS_PROCESS_SERVER_DONE, |  | ||||||
|                    SSL_R_INVALID_STATUS_RESPONSE); |                    SSL_R_INVALID_STATUS_RESPONSE); | ||||||
|             return MSG_PROCESS_ERROR; |             return 0; | ||||||
|         } |         } | ||||||
|         if (ret < 0) { |         if (ret < 0) { | ||||||
|             ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); |             *al = SSL_AD_INTERNAL_ERROR; | ||||||
|             SSLerr(SSL_F_TLS_PROCESS_SERVER_DONE, ERR_R_MALLOC_FAILURE); |             SSLerr(SSL_F_TLS_PROCESS_INITIAL_SERVER_FLIGHT, | ||||||
|             return MSG_PROCESS_ERROR; |                    ERR_R_MALLOC_FAILURE); | ||||||
|  |             return 0; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| #ifndef OPENSSL_NO_CT | #ifndef OPENSSL_NO_CT | ||||||
|     if (s->ct_validation_callback != NULL) { |     if (s->ct_validation_callback != NULL) { | ||||||
|         /* Note we validate the SCTs whether or not we abort on error */ |         /* Note we validate the SCTs whether or not we abort on error */ | ||||||
|         if (!ssl_validate_ct(s) && (s->verify_mode & SSL_VERIFY_PEER)) { |         if (!ssl_validate_ct(s) && (s->verify_mode & SSL_VERIFY_PEER)) { | ||||||
|             ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); |             *al = SSL_AD_HANDSHAKE_FAILURE; | ||||||
|             return MSG_PROCESS_ERROR; |             return 0; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  |     return 1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | MSG_PROCESS_RETURN tls_process_server_done(SSL *s, PACKET *pkt) | ||||||
|  | { | ||||||
|  |     int al = SSL_AD_INTERNAL_ERROR; | ||||||
|  | 
 | ||||||
|  |     if (PACKET_remaining(pkt) > 0) { | ||||||
|  |         /* should contain no data */ | ||||||
|  |         al = SSL_AD_DECODE_ERROR; | ||||||
|  |         SSLerr(SSL_F_TLS_PROCESS_SERVER_DONE, SSL_R_LENGTH_MISMATCH); | ||||||
|  |         goto err; | ||||||
|  |     } | ||||||
|  | #ifndef OPENSSL_NO_SRP | ||||||
|  |     if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kSRP) { | ||||||
|  |         if (SRP_Calc_A_param(s) <= 0) { | ||||||
|  |             SSLerr(SSL_F_TLS_PROCESS_SERVER_DONE, SSL_R_SRP_A_CALC); | ||||||
|  |             goto err; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |     /*
 | ||||||
|  |      * Error queue messages are generated directly by this function | ||||||
|  |      */ | ||||||
|  |     if (!tls_process_initial_server_flight(s, &al)) | ||||||
|  |         goto err; | ||||||
|  | 
 | ||||||
| #ifndef OPENSSL_NO_SCTP | #ifndef OPENSSL_NO_SCTP | ||||||
|     /* Only applies to renegotiation */ |     /* Only applies to renegotiation */ | ||||||
|     if (SSL_IS_DTLS(s) && BIO_dgram_is_sctp(SSL_get_wbio(s)) |     if (SSL_IS_DTLS(s) && BIO_dgram_is_sctp(SSL_get_wbio(s)) | ||||||
|  | @ -2255,6 +2271,11 @@ MSG_PROCESS_RETURN tls_process_server_done(SSL *s, PACKET *pkt) | ||||||
|     else |     else | ||||||
| #endif | #endif | ||||||
|         return MSG_PROCESS_FINISHED_READING; |         return MSG_PROCESS_FINISHED_READING; | ||||||
|  | 
 | ||||||
|  |  err: | ||||||
|  |     ssl3_send_alert(s, SSL3_AL_FATAL, al); | ||||||
|  |     ossl_statem_set_error(s); | ||||||
|  |     return MSG_PROCESS_ERROR; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int tls_construct_cke_psk_preamble(SSL *s, WPACKET *pkt, int *al) | static int tls_construct_cke_psk_preamble(SSL *s, WPACKET *pkt, int *al) | ||||||
|  |  | ||||||
|  | @ -326,7 +326,7 @@ MSG_PROCESS_RETURN tls_process_change_cipher_spec(SSL *s, PACKET *pkt) | ||||||
| 
 | 
 | ||||||
| MSG_PROCESS_RETURN tls_process_finished(SSL *s, PACKET *pkt) | MSG_PROCESS_RETURN tls_process_finished(SSL *s, PACKET *pkt) | ||||||
| { | { | ||||||
|     int al; |     int al = SSL_AD_INTERNAL_ERROR; | ||||||
|     size_t md_len; |     size_t md_len; | ||||||
| 
 | 
 | ||||||
|     /* If this occurs, we have missed a message */ |     /* If this occurs, we have missed a message */ | ||||||
|  | @ -367,12 +367,14 @@ MSG_PROCESS_RETURN tls_process_finished(SSL *s, PACKET *pkt) | ||||||
|         s->s3->previous_server_finished_len = md_len; |         s->s3->previous_server_finished_len = md_len; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* In TLS1.3 we also have to change cipher state */ |     /*
 | ||||||
|  |      * In TLS1.3 we also have to change cipher state and do any final processing | ||||||
|  |      * of the initial server flight (if we are a client) | ||||||
|  |      */ | ||||||
|     if (SSL_IS_TLS13(s)) { |     if (SSL_IS_TLS13(s)) { | ||||||
|         if (s->server) { |         if (s->server) { | ||||||
|             if (!s->method->ssl3_enc->change_cipher_state(s, |             if (!s->method->ssl3_enc->change_cipher_state(s, | ||||||
|                     SSL3_CC_APPLICATION | SSL3_CHANGE_CIPHER_SERVER_READ)) { |                     SSL3_CC_APPLICATION | SSL3_CHANGE_CIPHER_SERVER_READ)) { | ||||||
|                 al = SSL_AD_INTERNAL_ERROR; |  | ||||||
|                 SSLerr(SSL_F_TLS_PROCESS_FINISHED, SSL_R_CANNOT_CHANGE_CIPHER); |                 SSLerr(SSL_F_TLS_PROCESS_FINISHED, SSL_R_CANNOT_CHANGE_CIPHER); | ||||||
|                 goto f_err; |                 goto f_err; | ||||||
|             } |             } | ||||||
|  | @ -380,16 +382,16 @@ MSG_PROCESS_RETURN tls_process_finished(SSL *s, PACKET *pkt) | ||||||
|             if (!s->method->ssl3_enc->generate_master_secret(s, |             if (!s->method->ssl3_enc->generate_master_secret(s, | ||||||
|                     s->session->master_key, s->handshake_secret, 0, |                     s->session->master_key, s->handshake_secret, 0, | ||||||
|                     &s->session->master_key_length)) { |                     &s->session->master_key_length)) { | ||||||
|                 al = SSL_AD_INTERNAL_ERROR; |  | ||||||
|                 SSLerr(SSL_F_TLS_PROCESS_FINISHED, SSL_R_CANNOT_CHANGE_CIPHER); |                 SSLerr(SSL_F_TLS_PROCESS_FINISHED, SSL_R_CANNOT_CHANGE_CIPHER); | ||||||
|                 goto f_err; |                 goto f_err; | ||||||
|             } |             } | ||||||
|             if (!s->method->ssl3_enc->change_cipher_state(s, |             if (!s->method->ssl3_enc->change_cipher_state(s, | ||||||
|                     SSL3_CC_APPLICATION | SSL3_CHANGE_CIPHER_CLIENT_READ)) { |                     SSL3_CC_APPLICATION | SSL3_CHANGE_CIPHER_CLIENT_READ)) { | ||||||
|                 al = SSL_AD_INTERNAL_ERROR; |  | ||||||
|                 SSLerr(SSL_F_TLS_PROCESS_FINISHED, SSL_R_CANNOT_CHANGE_CIPHER); |                 SSLerr(SSL_F_TLS_PROCESS_FINISHED, SSL_R_CANNOT_CHANGE_CIPHER); | ||||||
|                 goto f_err; |                 goto f_err; | ||||||
|             } |             } | ||||||
|  |             if (!tls_process_initial_server_flight(s, &al)) | ||||||
|  |                 goto f_err; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -77,6 +77,7 @@ __owur int tls_get_message_body(SSL *s, size_t *len); | ||||||
| __owur int dtls_get_message(SSL *s, int *mt, size_t *len); | __owur int dtls_get_message(SSL *s, int *mt, size_t *len); | ||||||
| 
 | 
 | ||||||
| /* Message construction and processing functions */ | /* Message construction and processing functions */ | ||||||
|  | __owur int tls_process_initial_server_flight(SSL *s, int *al); | ||||||
| __owur MSG_PROCESS_RETURN tls_process_change_cipher_spec(SSL *s, PACKET *pkt); | __owur MSG_PROCESS_RETURN tls_process_change_cipher_spec(SSL *s, PACKET *pkt); | ||||||
| __owur MSG_PROCESS_RETURN tls_process_finished(SSL *s, PACKET *pkt); | __owur MSG_PROCESS_RETURN tls_process_finished(SSL *s, PACKET *pkt); | ||||||
| __owur int tls_construct_change_cipher_spec(SSL *s, WPACKET *pkt); | __owur int tls_construct_change_cipher_spec(SSL *s, WPACKET *pkt); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue