diff --git a/configs/baremetal.h b/configs/baremetal.h index 2a3e39af7..bacc9d167 100644 --- a/configs/baremetal.h +++ b/configs/baremetal.h @@ -80,6 +80,7 @@ #define MBEDTLS_SSL_DTLS_CONNECTION_ID /* Compile-time fixed parts of the SSL configuration */ +#define MBEDTLS_SSL_CONF_BADMAC_LIMIT 0 #define MBEDTLS_SSL_CONF_ANTI_REPLAY MBEDTLS_SSL_ANTI_REPLAY_ENABLED #define MBEDTLS_SSL_CONF_EXTENDED_MASTER_SECRET \ MBEDTLS_SSL_EXTENDED_MS_ENABLED diff --git a/include/mbedtls/config.h b/include/mbedtls/config.h index 1ff34dc47..ee292c532 100644 --- a/include/mbedtls/config.h +++ b/include/mbedtls/config.h @@ -3450,8 +3450,9 @@ * \{ */ -/* DTLS Anti replay */ +/* DTLS-specific settings */ //#define MBEDTLS_SSL_CONF_ANTI_REPLAY MBEDTLS_SSL_ANTI_REPLAY_ENABLED +//#define MBEDTLS_SSL_CONF_BADMAC_LIMIT 0 /* ExtendedMasterSecret extension * The following two options must be set/unset simultaneously. */ diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h index fbc61099f..dd546b8a2 100644 --- a/include/mbedtls/ssl.h +++ b/include/mbedtls/ssl.h @@ -1029,7 +1029,9 @@ struct mbedtls_ssl_config #endif #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) +#if !defined(MBEDTLS_SSL_CONF_BADMAC_LIMIT) unsigned int badmac_limit; /*!< limit of records with a bad MAC */ +#endif /* !MBEDTLS_SSL_CONF_BADMAC_LIMIT */ #endif #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) @@ -2043,7 +2045,8 @@ int mbedtls_ssl_set_client_transport_id( mbedtls_ssl_context *ssl, void mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode ); #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY && !MBEDTLS_SSL_CONF_ANTI_REPLAY */ -#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) +#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) && \ + !defined(MBEDTLS_SSL_CONF_BADMAC_LIMIT) /** * \brief Set a limit on the number of records with a bad MAC * before terminating the connection. @@ -2066,9 +2069,13 @@ void mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode ); * connection. On the other hand, a high limit or no limit * might make us waste resources checking authentication on * many bogus packets. + * + * \note On constrained systems, this option can also be + * fixed at compile-time by defining the constant + * MBEDTLS_SSL_CONF_BADMAC_LIMIT. */ void mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, unsigned limit ); -#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */ +#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT && !MBEDTLS_SSL_CONF_BADMAC_LIMIT */ #if defined(MBEDTLS_SSL_PROTO_DTLS) diff --git a/include/mbedtls/ssl_internal.h b/include/mbedtls/ssl_internal.h index 092819e31..49c60506c 100644 --- a/include/mbedtls/ssl_internal.h +++ b/include/mbedtls/ssl_internal.h @@ -1085,6 +1085,23 @@ int mbedtls_ssl_decrypt_buf( mbedtls_ssl_context *ssl, * be fixed at compile time via one of MBEDTLS_SSL_SSL_CONF_XXX. */ +#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) +#if !defined(MBEDTLS_SSL_CONF_BADMAC_LIMIT) +static inline unsigned int mbedtls_ssl_conf_get_badmac_limit( + mbedtls_ssl_config const *conf ) +{ + return( conf->badmac_limit ); +} +#else /* !MBEDTLS_SSL_CONF_BADMAC_LIMIT */ +static inline unsigned int mbedtls_ssl_conf_get_badmac_limit( + mbedtls_ssl_config const *conf ) +{ + ((void) conf); + return( MBEDTLS_SSL_CONF_BADMAC_LIMIT ); +} +#endif /* MBEDTLS_SSL_CONF_BADMAC_LIMIT */ +#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */ + #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) #if !defined(MBEDTLS_SSL_CONF_ANTI_REPLAY) static inline unsigned int mbedtls_ssl_conf_get_anti_replay( diff --git a/library/ssl_tls.c b/library/ssl_tls.c index c70bc21eb..a79ce8d78 100644 --- a/library/ssl_tls.c +++ b/library/ssl_tls.c @@ -5780,8 +5780,8 @@ static int ssl_get_next_record( mbedtls_ssl_context *ssl ) } #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) - if( ssl->conf->badmac_limit != 0 && - ++ssl->badmac_seen >= ssl->conf->badmac_limit ) + if( mbedtls_ssl_conf_get_badmac_limit( ssl->conf ) != 0 && + ++ssl->badmac_seen >= mbedtls_ssl_conf_get_badmac_limit( ssl->conf ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "too many records with bad MAC" ) ); return( MBEDTLS_ERR_SSL_INVALID_MAC ); @@ -8068,12 +8068,14 @@ void mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode ) } #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY && !MBEDTLS_SSL_CONF_ANTI_REPLAY */ -#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) -void mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, unsigned limit ) +#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) && \ + !defined(MBEDTLS_SSL_CONF_BADMAC_LIMIT) +void mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, + unsigned limit ) { conf->badmac_limit = limit; } -#endif +#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT && !MBEDTLS_SSL_CONF_BADMAC_LIMIT */ #if defined(MBEDTLS_SSL_PROTO_DTLS) diff --git a/programs/ssl/query_config.c b/programs/ssl/query_config.c index 35b3fe932..2a7ca130d 100644 --- a/programs/ssl/query_config.c +++ b/programs/ssl/query_config.c @@ -2586,6 +2586,14 @@ int query_config( const char *config ) } #endif /* MBEDTLS_SSL_CONF_ANTI_REPLAY */ +#if defined(MBEDTLS_SSL_CONF_BADMAC_LIMIT) + if( strcmp( "MBEDTLS_SSL_CONF_BADMAC_LIMIT", config ) == 0 ) + { + MACRO_EXPANSION_TO_STR( MBEDTLS_SSL_CONF_BADMAC_LIMIT ); + return( 0 ); + } +#endif /* MBEDTLS_SSL_CONF_BADMAC_LIMIT */ + #if defined(MBEDTLS_SSL_CONF_EXTENDED_MASTER_SECRET) if( strcmp( "MBEDTLS_SSL_CONF_EXTENDED_MASTER_SECRET", config ) == 0 ) { diff --git a/programs/ssl/ssl_server2.c b/programs/ssl/ssl_server2.c index b76473f01..3fcc120d2 100644 --- a/programs/ssl/ssl_server2.c +++ b/programs/ssl/ssl_server2.c @@ -325,7 +325,8 @@ int main( void ) #define USAGE_ANTI_REPLAY "" #endif -#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) +#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) && \ + !defined(MBEDTLS_SSL_CONF_BADMAC_LIMIT) #define USAGE_BADMAC_LIMIT \ " badmac_limit=%%d default: (library default: disabled)\n" #else @@ -1898,12 +1899,14 @@ int main( int argc, char *argv[] ) goto usage; } #endif /* !MBEDTLS_SSL_CONF_ANTI_REPLAY */ +#if !defined(MBEDTLS_SSL_CONF_BADMAC_LIMIT) else if( strcmp( p, "badmac_limit" ) == 0 ) { opt.badmac_limit = atoi( q ); if( opt.badmac_limit < 0 ) goto usage; } +#endif /* !MBEDTLS_SSL_CONF_BADMAC_LIMIT */ else if( strcmp( p, "hs_timeout" ) == 0 ) { if( ( p = strchr( q, '-' ) ) == NULL ) @@ -2589,7 +2592,8 @@ int main( int argc, char *argv[] ) mbedtls_ssl_conf_dtls_anti_replay( &conf, opt.anti_replay ); #endif -#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) +#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) && \ + !defined(MBEDTLS_SSL_CONF_BADMAC_LIMIT) if( opt.badmac_limit != DFL_BADMAC_LIMIT ) mbedtls_ssl_conf_dtls_badmac_limit( &conf, opt.badmac_limit ); #endif diff --git a/tests/ssl-opt.sh b/tests/ssl-opt.sh index 6d71120dc..87c1d24be 100755 --- a/tests/ssl-opt.sh +++ b/tests/ssl-opt.sh @@ -549,6 +549,9 @@ check_cmdline_compat() { check_cmdline_param_compat "anti_replay" \ "MBEDTLS_SSL_CONF_ANTI_REPLAY" + # DTLS bad MAC limit + check_cmdline_param_compat "badmac_limit" \ + "MBEDTLS_SSL_CONF_BADMAC_LIMIT" } # Usage: run_test name [-p proxy_cmd] srv_cmd cli_cmd cli_exit [option [...]]