mirror of
				https://github.com/cuberite/polarssl.git
				synced 2025-10-30 11:11:12 -04:00 
			
		
		
		
	Send TLS alerts in many more cases
The TLS client and server code was usually closing the connection in case of a fatal error without sending an alert. This commit adds alerts in many cases. Added one test case to detect that we send the alert, where a server complains that the client's certificate is from an unknown CA (case tracked internally as IOTSSL-1330).
This commit is contained in:
		
							parent
							
								
									071db41627
								
							
						
					
					
						commit
						1cc8e3472a
					
				| @ -1110,6 +1110,8 @@ static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl, | ||||
|         len != 1 || | ||||
|         buf[0] != ssl->conf->mfl_code ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching max fragment length extension" ) ); | ||||
|         mbedtls_ssl_send_fatal_handshake_failure( ssl ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -1125,6 +1127,8 @@ static int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl, | ||||
|     if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED || | ||||
|         len != 0 ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching truncated HMAC extension" ) ); | ||||
|         mbedtls_ssl_send_fatal_handshake_failure( ssl ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -1145,6 +1149,8 @@ static int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl, | ||||
|         ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 || | ||||
|         len != 0 ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching encrypt-then-MAC extension" ) ); | ||||
|         mbedtls_ssl_send_fatal_handshake_failure( ssl ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -1165,6 +1171,8 @@ static int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl, | ||||
|         ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 || | ||||
|         len != 0 ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching extended master secret extension" ) ); | ||||
|         mbedtls_ssl_send_fatal_handshake_failure( ssl ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -1184,6 +1192,8 @@ static int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl, | ||||
|     if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED || | ||||
|         len != 0 ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching session ticket extension" ) ); | ||||
|         mbedtls_ssl_send_fatal_handshake_failure( ssl ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -1208,6 +1218,8 @@ static int ssl_parse_supported_point_formats_ext( mbedtls_ssl_context *ssl, | ||||
|     if( list_size + 1 != len ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -1232,6 +1244,7 @@ static int ssl_parse_supported_point_formats_ext( mbedtls_ssl_context *ssl, | ||||
|     } | ||||
| 
 | ||||
|     MBEDTLS_SSL_DEBUG_MSG( 1, ( "no point format in common" ) ); | ||||
|         mbedtls_ssl_send_fatal_handshake_failure( ssl ); | ||||
|     return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
| } | ||||
| #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||  | ||||
| @ -1260,6 +1273,8 @@ static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl, | ||||
|                                                 buf, len ) ) != 0 ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret ); | ||||
|         if( ( ret = mbedtls_ssl_send_fatal_handshake_failure( ssl ) ) != 0 ) | ||||
|             return( ret ); | ||||
|         return( ret ); | ||||
|     } | ||||
| 
 | ||||
| @ -1276,7 +1291,11 @@ static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl, | ||||
| 
 | ||||
|     /* If we didn't send it, the server shouldn't send it */ | ||||
|     if( ssl->conf->alpn_list == NULL ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching ALPN extension" ) ); | ||||
|         mbedtls_ssl_send_fatal_handshake_failure( ssl ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
|     } | ||||
| 
 | ||||
|     /*
 | ||||
|      * opaque ProtocolName<1..2^8-1>; | ||||
| @ -1290,15 +1309,27 @@ static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl, | ||||
| 
 | ||||
|     /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */ | ||||
|     if( len < 4 ) | ||||
|     { | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
|     } | ||||
| 
 | ||||
|     list_len = ( buf[0] << 8 ) | buf[1]; | ||||
|     if( list_len != len - 2 ) | ||||
|     { | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
|     } | ||||
| 
 | ||||
|     name_len = buf[2]; | ||||
|     if( name_len != list_len - 1 ) | ||||
|     { | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
|     } | ||||
| 
 | ||||
|     /* Check that the server chosen protocol was in our list and save it */ | ||||
|     for( p = ssl->conf->alpn_list; *p != NULL; p++ ) | ||||
| @ -1311,6 +1342,8 @@ static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl, | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     MBEDTLS_SSL_DEBUG_MSG( 1, ( "ALPN extension: no matching protocol" ) ); | ||||
|     mbedtls_ssl_send_fatal_handshake_failure( ssl ); | ||||
|     return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
| } | ||||
| #endif /* MBEDTLS_SSL_ALPN */ | ||||
| @ -1415,6 +1448,7 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl ) | ||||
| 
 | ||||
|     if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 ) | ||||
|     { | ||||
|         /* No alert on a read error. */ | ||||
|         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); | ||||
|         return( ret ); | ||||
|     } | ||||
| @ -1440,6 +1474,8 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl ) | ||||
| #endif /* MBEDTLS_SSL_RENEGOTIATION */ | ||||
| 
 | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); | ||||
|         return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); | ||||
|     } | ||||
| 
 | ||||
| @ -1466,6 +1502,8 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl ) | ||||
|         buf[0] != MBEDTLS_SSL_HS_SERVER_HELLO ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -1520,6 +1558,8 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl ) | ||||
|     if( n > 32 ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -1532,6 +1572,8 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl ) | ||||
|             ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 40 + n + ext_len ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
|         } | ||||
|     } | ||||
| @ -1542,6 +1584,8 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl ) | ||||
|     else | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -1569,6 +1613,8 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl ) | ||||
| #endif/* MBEDTLS_ZLIB_SUPPORT */ | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "server hello, bad compression: %d", comp ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); | ||||
|         return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); | ||||
|     } | ||||
| 
 | ||||
| @ -1580,6 +1626,8 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl ) | ||||
|     if( ssl->transform_negotiate->ciphersuite_info == NULL ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "ciphersuite info for %04x not found", i ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); | ||||
|     } | ||||
| 
 | ||||
| @ -1617,6 +1665,8 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl ) | ||||
|         if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); | ||||
|             return( ret ); | ||||
|         } | ||||
|     } | ||||
| @ -1636,6 +1686,8 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl ) | ||||
|         ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -1647,6 +1699,8 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl ) | ||||
|         if( ssl->conf->ciphersuite_list[ssl->minor_ver][i] == 0 ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); | ||||
|             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
|         } | ||||
| 
 | ||||
| @ -1664,6 +1718,8 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl ) | ||||
|       ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
|     } | ||||
|     ssl->session_negotiate->compression = comp; | ||||
| @ -1682,6 +1738,8 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl ) | ||||
|         if( ext_size + 4 > ext_len ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); | ||||
|         } | ||||
| 
 | ||||
| @ -2218,6 +2276,8 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl ) | ||||
|         if( ( ret = ssl_get_ecdh_params_from_cert( ssl ) ) != 0 ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_RET( 1, "ssl_get_ecdh_params_from_cert", ret ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); | ||||
|             return( ret ); | ||||
|         } | ||||
| 
 | ||||
| @ -2239,6 +2299,8 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl ) | ||||
|     if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); | ||||
|         return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); | ||||
|     } | ||||
| 
 | ||||
| @ -2256,6 +2318,8 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl ) | ||||
|         } | ||||
| 
 | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); | ||||
|         return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); | ||||
|     } | ||||
| 
 | ||||
| @ -2272,6 +2336,8 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl ) | ||||
|         if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); | ||||
|             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); | ||||
|         } | ||||
|     } /* FALLTROUGH */ | ||||
| @ -2293,6 +2359,8 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl ) | ||||
|         if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); | ||||
|             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); | ||||
|         } | ||||
|     } | ||||
| @ -2309,6 +2377,8 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl ) | ||||
|         if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); | ||||
|             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); | ||||
|         } | ||||
|     } | ||||
| @ -2324,6 +2394,8 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl ) | ||||
|         if( ret != 0 ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); | ||||
|             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); | ||||
|         } | ||||
|     } | ||||
| @ -2358,12 +2430,16 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl ) | ||||
|                                                &md_alg, &pk_alg ) != 0 ) | ||||
|             { | ||||
|                 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); | ||||
|                 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                                 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); | ||||
|                 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); | ||||
|             } | ||||
| 
 | ||||
|             if( pk_alg != mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ) ) | ||||
|             { | ||||
|                 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); | ||||
|                 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                                 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); | ||||
|                 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); | ||||
|             } | ||||
|         } | ||||
| @ -2395,6 +2471,8 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl ) | ||||
|         if( end != p + sig_len ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); | ||||
|         } | ||||
| 
 | ||||
| @ -2466,6 +2544,8 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl ) | ||||
|                                      mbedtls_md_info_from_type( md_alg ), 0 ) ) != 0 ) | ||||
|             { | ||||
|                 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret ); | ||||
|                 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                                 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); | ||||
|                 return( ret ); | ||||
|             } | ||||
| 
 | ||||
| @ -2489,6 +2569,8 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl ) | ||||
|         if( ssl->session_negotiate->peer_cert == NULL ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); | ||||
|             return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); | ||||
|         } | ||||
| 
 | ||||
| @ -2498,12 +2580,16 @@ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl ) | ||||
|         if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, pk_alg ) ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); | ||||
|             return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH ); | ||||
|         } | ||||
| 
 | ||||
|         if( ( ret = mbedtls_pk_verify( &ssl->session_negotiate->peer_cert->pk, | ||||
|                                md_alg, hash, hashlen, p, sig_len ) ) != 0 ) | ||||
|         { | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR ); | ||||
|             MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret ); | ||||
|             return( ret ); | ||||
|         } | ||||
| @ -2579,6 +2665,8 @@ static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl ) | ||||
|         if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); | ||||
|             return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); | ||||
|         } | ||||
| 
 | ||||
| @ -2632,6 +2720,8 @@ static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl ) | ||||
|     if( ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ); | ||||
|     } | ||||
| 
 | ||||
| @ -2656,6 +2746,8 @@ static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl ) | ||||
|         if( ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|             return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ); | ||||
|         } | ||||
|     } | ||||
| @ -2669,6 +2761,8 @@ static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl ) | ||||
|     if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ); | ||||
|     } | ||||
| 
 | ||||
| @ -2710,6 +2804,8 @@ static int ssl_parse_server_hello_done( mbedtls_ssl_context *ssl ) | ||||
|         ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_HELLO_DONE ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE ); | ||||
|     } | ||||
| 
 | ||||
| @ -3190,6 +3286,8 @@ static int ssl_parse_new_session_ticket( mbedtls_ssl_context *ssl ) | ||||
|     if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); | ||||
|         return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); | ||||
|     } | ||||
| 
 | ||||
| @ -3207,6 +3305,8 @@ static int ssl_parse_new_session_ticket( mbedtls_ssl_context *ssl ) | ||||
|         ssl->in_hslen < 6 + mbedtls_ssl_hs_hdr_len( ssl ) ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET ); | ||||
|     } | ||||
| 
 | ||||
| @ -3220,6 +3320,8 @@ static int ssl_parse_new_session_ticket( mbedtls_ssl_context *ssl ) | ||||
|     if( ticket_len + 6 + mbedtls_ssl_hs_hdr_len( ssl ) != ssl->in_hslen ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET ); | ||||
|     } | ||||
| 
 | ||||
| @ -3245,6 +3347,8 @@ static int ssl_parse_new_session_ticket( mbedtls_ssl_context *ssl ) | ||||
|     if( ( ticket = mbedtls_calloc( 1, ticket_len ) ) == NULL ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "ticket alloc failed" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -101,6 +101,8 @@ static int ssl_parse_servername_ext( mbedtls_ssl_context *ssl, | ||||
|     if( servername_list_size + 2 != len ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -111,6 +113,8 @@ static int ssl_parse_servername_ext( mbedtls_ssl_context *ssl, | ||||
|         if( hostname_len + 3 > servername_list_size ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|             return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|         } | ||||
| 
 | ||||
| @ -135,6 +139,8 @@ static int ssl_parse_servername_ext( mbedtls_ssl_context *ssl, | ||||
|     if( servername_list_size != 0 ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -201,6 +207,8 @@ static int ssl_parse_signature_algorithms_ext( mbedtls_ssl_context *ssl, | ||||
|         sig_alg_list_size % 2 != 0 ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -247,6 +255,8 @@ static int ssl_parse_supported_elliptic_curves( mbedtls_ssl_context *ssl, | ||||
|         list_size % 2 != 0 ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -254,6 +264,8 @@ static int ssl_parse_supported_elliptic_curves( mbedtls_ssl_context *ssl, | ||||
|     if( ssl->handshake->curves != NULL ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -264,7 +276,11 @@ static int ssl_parse_supported_elliptic_curves( mbedtls_ssl_context *ssl, | ||||
|         our_size = MBEDTLS_ECP_DP_MAX; | ||||
| 
 | ||||
|     if( ( curves = mbedtls_calloc( our_size, sizeof( *curves ) ) ) == NULL ) | ||||
|     { | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); | ||||
|     } | ||||
| 
 | ||||
|     ssl->handshake->curves = curves; | ||||
| 
 | ||||
| @ -297,6 +313,8 @@ static int ssl_parse_supported_point_formats( mbedtls_ssl_context *ssl, | ||||
|     if( list_size + 1 != len ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -342,6 +360,8 @@ static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl, | ||||
|                                                 buf, len ) ) != 0 ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); | ||||
|         return( ret ); | ||||
|     } | ||||
| 
 | ||||
| @ -360,6 +380,8 @@ static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl, | ||||
|     if( len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -377,6 +399,8 @@ static int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl, | ||||
|     if( len != 0 ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -397,6 +421,8 @@ static int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl, | ||||
|     if( len != 0 ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -420,6 +446,8 @@ static int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl, | ||||
|     if( len != 0 ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -531,11 +559,19 @@ static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl, | ||||
| 
 | ||||
|     /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */ | ||||
|     if( len < 4 ) | ||||
|     { | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|     } | ||||
| 
 | ||||
|     list_len = ( buf[0] << 8 ) | buf[1]; | ||||
|     if( list_len != len - 2 ) | ||||
|     { | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|     } | ||||
| 
 | ||||
|     /*
 | ||||
|      * Use our order of preference | ||||
| @ -549,13 +585,21 @@ static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl, | ||||
|         { | ||||
|             /* If the list is well formed, we should get equality first */ | ||||
|             if( theirs > end ) | ||||
|             { | ||||
|                 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                                 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); | ||||
|                 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|             } | ||||
| 
 | ||||
|             cur_len = *theirs++; | ||||
| 
 | ||||
|             /* Empty strings MUST NOT be included */ | ||||
|             if( cur_len == 0 ) | ||||
|             { | ||||
|                 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                                 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); | ||||
|                 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|             } | ||||
| 
 | ||||
|             if( cur_len == ours_len && | ||||
|                 memcmp( theirs, *ours, cur_len ) == 0 ) | ||||
| @ -1064,6 +1108,9 @@ have_ciphersuite_v2: | ||||
| } | ||||
| #endif /* MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */ | ||||
| 
 | ||||
| /* This function doesn't alert on errors that happen early during
 | ||||
|    ClientHello parsing because they might indicate that the client is | ||||
|    not talking SSL/TLS at all and would not understand our alert. */ | ||||
| static int ssl_parse_client_hello( mbedtls_ssl_context *ssl ) | ||||
| { | ||||
|     int ret, got_common_suite; | ||||
| @ -1098,6 +1145,7 @@ read_record_header: | ||||
|     { | ||||
|         if( ( ret = mbedtls_ssl_fetch_input( ssl, 5 ) ) != 0 ) | ||||
|         { | ||||
|             /* No alert on a read error. */ | ||||
|             MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret ); | ||||
|             return( ret ); | ||||
|         } | ||||
| @ -1349,10 +1397,8 @@ read_record_header: | ||||
|                             " [%d:%d] < [%d:%d]", | ||||
|                             ssl->major_ver, ssl->minor_ver, | ||||
|                             ssl->conf->min_major_ver, ssl->conf->min_minor_ver ) ); | ||||
| 
 | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                      MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION ); | ||||
| 
 | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION ); | ||||
|     } | ||||
| 
 | ||||
| @ -1380,6 +1426,8 @@ read_record_header: | ||||
|         sess_len + 34 + 2 > msg_len ) /* 2 for cipherlist length field */ | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -1403,6 +1451,8 @@ read_record_header: | ||||
|         if( cookie_offset + 1 + cookie_len + 2 > msg_len ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION ); | ||||
|             return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|         } | ||||
| 
 | ||||
| @ -1435,6 +1485,7 @@ read_record_header: | ||||
|             /* We know we didn't send a cookie, so it should be empty */ | ||||
|             if( cookie_len != 0 ) | ||||
|             { | ||||
|                 /* This may be an attacker's probe, so don't send an alert */ | ||||
|                 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|                 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|             } | ||||
| @ -1459,6 +1510,8 @@ read_record_header: | ||||
|         ( ciph_len % 2 ) != 0 ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -1477,6 +1530,8 @@ read_record_header: | ||||
|         comp_len + comp_offset + 1 > msg_len ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|     } | ||||
| 
 | ||||
| @ -1515,6 +1570,8 @@ read_record_header: | ||||
|             if( msg_len < ext_offset + 2 ) | ||||
|             { | ||||
|                 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|                 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                                 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|                 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|             } | ||||
| 
 | ||||
| @ -1525,6 +1582,8 @@ read_record_header: | ||||
|                 msg_len != ext_offset + 2 + ext_len ) | ||||
|             { | ||||
|                 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|                 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                                 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|                 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|             } | ||||
|         } | ||||
| @ -1544,6 +1603,8 @@ read_record_header: | ||||
|             if( ext_size + 4 > ext_len ) | ||||
|             { | ||||
|                 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|                 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                                 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|                 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|             } | ||||
|             switch( ext_id ) | ||||
| @ -1689,6 +1750,8 @@ read_record_header: | ||||
|             if( ext_len > 0 && ext_len < 4 ) | ||||
|             { | ||||
|                 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); | ||||
|                 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                                 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|                 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @ -4030,6 +4030,7 @@ int mbedtls_ssl_send_alert_message( mbedtls_ssl_context *ssl, | ||||
|         return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); | ||||
| 
 | ||||
|     MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> send alert message" ) ); | ||||
|     MBEDTLS_SSL_DEBUG_MSG( 3, ( "send alert level=%u message=%u", level, message )); | ||||
| 
 | ||||
|     ssl->out_msgtype = MBEDTLS_SSL_MSG_ALERT; | ||||
|     ssl->out_msglen = 2; | ||||
| @ -4041,7 +4042,6 @@ int mbedtls_ssl_send_alert_message( mbedtls_ssl_context *ssl, | ||||
|         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret ); | ||||
|         return( ret ); | ||||
|     } | ||||
| 
 | ||||
|     MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= send alert message" ) ); | ||||
| 
 | ||||
|     return( 0 ); | ||||
| @ -4262,6 +4262,8 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) | ||||
| 
 | ||||
|     if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 ) | ||||
|     { | ||||
|         /* mbedtls_ssl_read_record may have sent an alert already. We
 | ||||
|            let it decide whether to alert. */ | ||||
|         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); | ||||
|         return( ret ); | ||||
|     } | ||||
| @ -4283,6 +4285,9 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) ); | ||||
| 
 | ||||
|             /* The client was asked for a certificate but didn't send
 | ||||
|                one. The client should know what's going on, so we | ||||
|                don't send an alert. */ | ||||
|             ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING; | ||||
|             if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL ) | ||||
|                 return( 0 ); | ||||
| @ -4304,6 +4309,9 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) ); | ||||
| 
 | ||||
|             /* The client was asked for a certificate but didn't send
 | ||||
|                one. The client should know what's going on, so we | ||||
|                don't send an alert. */ | ||||
|             ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING; | ||||
|             if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL ) | ||||
|                 return( 0 ); | ||||
| @ -4318,6 +4326,8 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) | ||||
|     if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); | ||||
|         return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); | ||||
|     } | ||||
| 
 | ||||
| @ -4325,6 +4335,8 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) | ||||
|         ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 3 + 3 ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); | ||||
|     } | ||||
| 
 | ||||
| @ -4339,6 +4351,8 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) | ||||
|         ssl->in_hslen != n + 3 + mbedtls_ssl_hs_hdr_len( ssl ) ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); | ||||
|     } | ||||
| 
 | ||||
| @ -4354,6 +4368,8 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed", | ||||
|                        sizeof( mbedtls_x509_crt ) ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); | ||||
|     } | ||||
| 
 | ||||
| @ -4366,6 +4382,8 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) | ||||
|         if( ssl->in_msg[i] != 0 ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|             return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); | ||||
|         } | ||||
| 
 | ||||
| @ -4376,13 +4394,35 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) | ||||
|         if( n < 128 || i + n > ssl->in_hslen ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|             return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); | ||||
|         } | ||||
| 
 | ||||
|         ret = mbedtls_x509_crt_parse_der( ssl->session_negotiate->peer_cert, | ||||
|                                   ssl->in_msg + i, n ); | ||||
|         if( 0 != ret && ( MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND ) != ret ) | ||||
|         switch( ret ) | ||||
|         { | ||||
|         uint8_t alert; | ||||
| 
 | ||||
|         case 0: /*ok*/ | ||||
|         case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND: | ||||
|             /* Ignore certificate with an unknown algorithm: maybe a
 | ||||
|                prior certificate was already trusted. */ | ||||
|             break; | ||||
| 
 | ||||
|         case MBEDTLS_ERR_X509_ALLOC_FAILED: | ||||
|             alert = MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR; | ||||
|             goto crt_parse_der_failed; | ||||
| 
 | ||||
|         case MBEDTLS_ERR_X509_UNKNOWN_VERSION: | ||||
|             alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; | ||||
|             goto crt_parse_der_failed; | ||||
| 
 | ||||
|         default: | ||||
|             alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT; | ||||
|         crt_parse_der_failed: | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, alert ); | ||||
|             MBEDTLS_SSL_DEBUG_RET( 1, " mbedtls_x509_crt_parse_der", ret ); | ||||
|             return( ret ); | ||||
|         } | ||||
| @ -4403,6 +4443,8 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) | ||||
|         if( ssl->session->peer_cert == NULL ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "new server cert during renegotiation" ) ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED ); | ||||
|             return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); | ||||
|         } | ||||
| 
 | ||||
| @ -4413,6 +4455,8 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) | ||||
|                     ssl->session->peer_cert->raw.len ) != 0 ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "server cert changed during renegotiation" ) ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED ); | ||||
|             return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); | ||||
|         } | ||||
|     } | ||||
| @ -4439,6 +4483,8 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) | ||||
|         if( ca_chain == NULL ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no CA chain" ) ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_BAD_CERT ); | ||||
|             return( MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED ); | ||||
|         } | ||||
| 
 | ||||
| @ -4489,6 +4535,36 @@ int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) | ||||
| 
 | ||||
|         if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL ) | ||||
|             ret = 0; | ||||
| 
 | ||||
|         if( ret != 0 ) | ||||
|         { | ||||
|             /* The certificate may have been rejected for several reasons.
 | ||||
|                Pick one and send the corresponding alert. Which alert to send | ||||
|                may be a subject of debate in some cases. */ | ||||
|             uint8_t alert = MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN; | ||||
|             if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_OTHER ) | ||||
|                 alert = MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED; | ||||
|             else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_CN_MISMATCH ) | ||||
|                 alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT; | ||||
|             else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_KEY_USAGE ) | ||||
|                 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; | ||||
|             else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXT_KEY_USAGE ) | ||||
|                 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; | ||||
|             else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NS_CERT_TYPE ) | ||||
|                 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; | ||||
|             else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_PK ) | ||||
|                 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; | ||||
|             else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_KEY ) | ||||
|                 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; | ||||
|             else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXPIRED ) | ||||
|                 alert = MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED; | ||||
|             else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_REVOKED ) | ||||
|                 alert = MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED; | ||||
|             else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NOT_TRUSTED ) | ||||
|                 alert = MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA; | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             alert ); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) ); | ||||
| @ -4541,12 +4617,16 @@ int mbedtls_ssl_parse_change_cipher_spec( mbedtls_ssl_context *ssl ) | ||||
|     if( ssl->in_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); | ||||
|         return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); | ||||
|     } | ||||
| 
 | ||||
|     if( ssl->in_msglen != 1 || ssl->in_msg[0] != 1 ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC ); | ||||
|     } | ||||
| 
 | ||||
| @ -4569,6 +4649,8 @@ int mbedtls_ssl_parse_change_cipher_spec( mbedtls_ssl_context *ssl ) | ||||
|         if( ++ssl->in_epoch == 0 ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS epoch would wrap" ) ); | ||||
|             /* This is highly unlikely to happen for legitimate reasons, so
 | ||||
|                treat it as an attack and don't send an alert. */ | ||||
|             return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING ); | ||||
|         } | ||||
|     } | ||||
| @ -4593,6 +4675,8 @@ int mbedtls_ssl_parse_change_cipher_spec( mbedtls_ssl_context *ssl ) | ||||
|         if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_INBOUND ) ) != 0 ) | ||||
|         { | ||||
|             MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret ); | ||||
|             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                             MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); | ||||
|             return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); | ||||
|         } | ||||
|     } | ||||
| @ -5171,6 +5255,8 @@ int mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl ) | ||||
|     if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); | ||||
|         return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); | ||||
|     } | ||||
| 
 | ||||
| @ -5186,6 +5272,8 @@ int mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl ) | ||||
|         ssl->in_hslen  != mbedtls_ssl_hs_hdr_len( ssl ) + hash_len ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_FINISHED ); | ||||
|     } | ||||
| 
 | ||||
| @ -5193,6 +5281,8 @@ int mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl ) | ||||
|                       buf, hash_len ) != 0 ) | ||||
|     { | ||||
|         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) ); | ||||
|         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, | ||||
|                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); | ||||
|         return( MBEDTLS_ERR_SSL_BAD_HS_FINISHED ); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -1840,8 +1840,12 @@ run_test    "Authentication: client badcert, server required" \ | ||||
|             -s "x509_verify_cert() returned" \ | ||||
|             -s "! The certificate is not correctly signed by the trusted CA" \ | ||||
|             -s "! mbedtls_ssl_handshake returned" \ | ||||
|             -s "send alert level=2 message=48" \ | ||||
|             -c "! mbedtls_ssl_handshake returned" \ | ||||
|             -s "X509 - Certificate verification failed" | ||||
| # We don't check that the client receives the alert because it might | ||||
| # detect that its write end of the connection is closed and abort | ||||
| # before reading the alert message. | ||||
| 
 | ||||
| run_test    "Authentication: client badcert, server optional" \ | ||||
|             "$P_SRV debug_level=3 auth_mode=optional" \ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Gilles Peskine
						Gilles Peskine