mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2025-03-24 22:25:11 +00:00
Make DTLS_HELLO_VERIFY a compile option
This commit is contained in:
parent
98545f128a
commit
82202f0a9c
|
@ -263,6 +263,11 @@
|
||||||
#error "Illegal protocol selection"
|
#error "Illegal protocol selection"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(POLARSSL_SSL_DTLS_HELLO_VERIFY) && \
|
||||||
|
( !defined(POLARSSL_SSL_SRV_C) || !defined(POLARSSL_SSL_PROTO_DTLS) )
|
||||||
|
#error "POLARSSL_SSL_DTLS_HELLO_VERIFY defined, but not all prerequisites"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(POLARSSL_SSL_SESSION_TICKETS) && defined(POLARSSL_SSL_TLS_C) && \
|
#if defined(POLARSSL_SSL_SESSION_TICKETS) && defined(POLARSSL_SSL_TLS_C) && \
|
||||||
( !defined(POLARSSL_AES_C) || !defined(POLARSSL_SHA256_C) || \
|
( !defined(POLARSSL_AES_C) || !defined(POLARSSL_SHA256_C) || \
|
||||||
!defined(POLARSSL_CIPHER_MODE_CBC) )
|
!defined(POLARSSL_CIPHER_MODE_CBC) )
|
||||||
|
|
|
@ -923,6 +923,23 @@
|
||||||
*/
|
*/
|
||||||
#define POLARSSL_SSL_ALPN
|
#define POLARSSL_SSL_ALPN
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \def POLARSSL_SSL_DTLS_HELLO_VERIFY
|
||||||
|
*
|
||||||
|
* Enable support for HelloVerifyRequest on DTLS servers.
|
||||||
|
*
|
||||||
|
* This feature is highly recommended to prevent DTLS servers being used as
|
||||||
|
* amplifiers in DoS attacks against other hosts. It should always be enabled
|
||||||
|
* unless you know for sure amplification cannot be a problem in the
|
||||||
|
* environment in which your server operates.
|
||||||
|
*
|
||||||
|
* Requires: POLARSSL_SSL_SRV_C
|
||||||
|
* POLARSSL_POLARSSL_PROTO_DTLS
|
||||||
|
*
|
||||||
|
* Comment this to disable support for HelloVerifyRequest.
|
||||||
|
*/
|
||||||
|
#define POLARSSL_SSL_DTLS_HELLO_VERIFY
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \def POLARSSL_SSL_SESSION_TICKETS
|
* \def POLARSSL_SSL_SESSION_TICKETS
|
||||||
*
|
*
|
||||||
|
|
|
@ -878,7 +878,7 @@ struct _ssl_context
|
||||||
/*
|
/*
|
||||||
* Client id (IP/port) for DTLS hello verify
|
* Client id (IP/port) for DTLS hello verify
|
||||||
*/
|
*/
|
||||||
#if defined(POLARSSL_SSL_PROTO_DTLS) && defined(POLARSSL_SSL_SRV_C)
|
#if defined(POLARSSL_SSL_DTLS_HELLO_VERIFY)
|
||||||
unsigned char *cli_id; /*!< transport-level ID of the client */
|
unsigned char *cli_id; /*!< transport-level ID of the client */
|
||||||
size_t cli_id_len; /*!< length of cli_id */
|
size_t cli_id_len; /*!< length of cli_id */
|
||||||
md_context_t hvr_hmac_ctx; /*!< HMAC data for HelloVerifyRequest */
|
md_context_t hvr_hmac_ctx; /*!< HMAC data for HelloVerifyRequest */
|
||||||
|
@ -1067,7 +1067,7 @@ void ssl_set_bio( ssl_context *ssl,
|
||||||
int (*f_recv)(void *, unsigned char *, size_t), void *p_recv,
|
int (*f_recv)(void *, unsigned char *, size_t), void *p_recv,
|
||||||
int (*f_send)(void *, const unsigned char *, size_t), void *p_send );
|
int (*f_send)(void *, const unsigned char *, size_t), void *p_send );
|
||||||
|
|
||||||
#if defined(POLARSSL_SSL_PROTO_DTLS) && defined(POLARSSL_SSL_SRV_C)
|
#if defined(POLARSSL_SSL_DTLS_HELLO_VERIFY)
|
||||||
/**
|
/**
|
||||||
* \brief Set client's transport-level identification info.
|
* \brief Set client's transport-level identification info.
|
||||||
* (Only usable on server.)
|
* (Only usable on server.)
|
||||||
|
@ -1095,7 +1095,7 @@ int ssl_set_client_transport_id( ssl_context *ssl,
|
||||||
|
|
||||||
/* Temporary */
|
/* Temporary */
|
||||||
int ssl_setup_hvr_key( ssl_context *ssl );
|
int ssl_setup_hvr_key( ssl_context *ssl );
|
||||||
#endif /* POLARSSL_SSL_PROTO_DTLS && POLARSSL_SSL_SRV_C */
|
#endif /* POLARSSL_SSL_DTLS_HELLO_VERIFY */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Set the session cache callbacks (server-side only)
|
* \brief Set the session cache callbacks (server-side only)
|
||||||
|
|
|
@ -351,7 +351,7 @@ static int ssl_parse_ticket( ssl_context *ssl,
|
||||||
}
|
}
|
||||||
#endif /* POLARSSL_SSL_SESSION_TICKETS */
|
#endif /* POLARSSL_SSL_SESSION_TICKETS */
|
||||||
|
|
||||||
#if defined(POLARSSL_SSL_PROTO_DTLS)
|
#if defined(POLARSSL_SSL_DTLS_HELLO_VERIFY)
|
||||||
int ssl_set_client_transport_id( ssl_context *ssl,
|
int ssl_set_client_transport_id( ssl_context *ssl,
|
||||||
const unsigned char *info,
|
const unsigned char *info,
|
||||||
size_t ilen )
|
size_t ilen )
|
||||||
|
@ -369,7 +369,7 @@ int ssl_set_client_transport_id( ssl_context *ssl,
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
#endif /* POLARSSL_SSL_PROTO_DTLS */
|
#endif /* POLARSSL_SSL_DTLS_HELLO_VERIFY */
|
||||||
|
|
||||||
#if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
|
#if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
|
||||||
/*
|
/*
|
||||||
|
@ -1136,7 +1136,7 @@ have_ciphersuite_v2:
|
||||||
}
|
}
|
||||||
#endif /* POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */
|
#endif /* POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */
|
||||||
|
|
||||||
#if defined(POLARSSL_SSL_PROTO_DTLS)
|
#if defined(POLARSSL_SSL_DTLS_HELLO_VERIFY)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If DTLS is in use, then at least one of SHA-1, SHA-256, SHA-512 is
|
* If DTLS is in use, then at least one of SHA-1, SHA-256, SHA-512 is
|
||||||
|
@ -1186,7 +1186,7 @@ int ssl_setup_hvr_key( ssl_context *ssl )
|
||||||
/*
|
/*
|
||||||
* Generate cookie for DTLS ClientHello verification
|
* Generate cookie for DTLS ClientHello verification
|
||||||
*/
|
*/
|
||||||
static int ssl_generate_verify_cookie( ssl_context *ssl )
|
static int ssl_cookie_generate( ssl_context *ssl )
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned char *cookie = ssl->handshake->verify_cookie;
|
unsigned char *cookie = ssl->handshake->verify_cookie;
|
||||||
|
@ -1219,7 +1219,7 @@ static int ssl_generate_verify_cookie( ssl_context *ssl )
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
#endif /* POLARSSL_SSL_PROTO_DTLS */
|
#endif /* POLARSSL_SSL_DTLS_HELLO_VERIFY */
|
||||||
|
|
||||||
static int ssl_parse_client_hello( ssl_context *ssl )
|
static int ssl_parse_client_hello( ssl_context *ssl )
|
||||||
{
|
{
|
||||||
|
@ -1515,14 +1515,15 @@ static int ssl_parse_client_hello( ssl_context *ssl )
|
||||||
SSL_DEBUG_BUF( 3, "client hello, cookie",
|
SSL_DEBUG_BUF( 3, "client hello, cookie",
|
||||||
buf + cookie_offset + 1, cookie_len );
|
buf + cookie_offset + 1, cookie_len );
|
||||||
|
|
||||||
|
#if defined(POLARSSL_SSL_DTLS_HELLO_VERIFY)
|
||||||
/*
|
/*
|
||||||
* Generate reference cookie content:
|
* Generate reference cookie content:
|
||||||
* - used for verification below,
|
* - used for verification below,
|
||||||
* - stored to be sent if verification fails
|
* - stored to be sent if verification fails
|
||||||
*/
|
*/
|
||||||
if( ( ret = ssl_generate_verify_cookie( ssl ) ) != 0 )
|
if( ( ret = ssl_cookie_generate( ssl ) ) != 0 )
|
||||||
{
|
{
|
||||||
SSL_DEBUG_RET( 1, "ssl_generate_verify_cookie", ret );
|
SSL_DEBUG_RET( 1, "ssl_cookie_generate", ret );
|
||||||
return( ret );
|
return( ret );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1540,7 +1541,16 @@ static int ssl_parse_client_hello( ssl_context *ssl )
|
||||||
SSL_DEBUG_MSG( 2, ( "client hello, cookie verification %s",
|
SSL_DEBUG_MSG( 2, ( "client hello, cookie verification %s",
|
||||||
ssl->handshake->verify_cookie == NULL ?
|
ssl->handshake->verify_cookie == NULL ?
|
||||||
"passed" : "failed" ) );
|
"passed" : "failed" ) );
|
||||||
|
#else
|
||||||
|
/* We know we didn't send a cookie, so it should be empty */
|
||||||
|
if( cookie_len != 0 )
|
||||||
|
{
|
||||||
|
SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
|
||||||
|
return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
|
||||||
|
}
|
||||||
|
|
||||||
|
SSL_DEBUG_MSG( 2, ( "cookie verification disabled" ) );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif /* POLARSSL_SSL_PROTO_DTLS */
|
#endif /* POLARSSL_SSL_PROTO_DTLS */
|
||||||
|
|
||||||
|
@ -1603,6 +1613,7 @@ static int ssl_parse_client_hello( ssl_context *ssl )
|
||||||
if( ssl->transport == SSL_TRANSPORT_DATAGRAM )
|
if( ssl->transport == SSL_TRANSPORT_DATAGRAM )
|
||||||
ssl->session_negotiate->compression = SSL_COMPRESS_NULL;
|
ssl->session_negotiate->compression = SSL_COMPRESS_NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check the extension length
|
* Check the extension length
|
||||||
*/
|
*/
|
||||||
|
@ -2037,7 +2048,7 @@ static void ssl_write_alpn_ext( ssl_context *ssl,
|
||||||
}
|
}
|
||||||
#endif /* POLARSSL_ECDH_C || POLARSSL_ECDSA_C */
|
#endif /* POLARSSL_ECDH_C || POLARSSL_ECDSA_C */
|
||||||
|
|
||||||
#if defined(POLARSSL_SSL_PROTO_DTLS)
|
#if defined(POLARSSL_SSL_DTLS_HELLO_VERIFY)
|
||||||
static int ssl_write_hello_verify_request( ssl_context *ssl )
|
static int ssl_write_hello_verify_request( ssl_context *ssl )
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -2081,7 +2092,7 @@ static int ssl_write_hello_verify_request( ssl_context *ssl )
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
#endif /* POLARSSL_SSL_PROTO_DTLS */
|
#endif /* POLARSSL_SSL_DTLS_HELLO_VERIFY */
|
||||||
|
|
||||||
static int ssl_write_server_hello( ssl_context *ssl )
|
static int ssl_write_server_hello( ssl_context *ssl )
|
||||||
{
|
{
|
||||||
|
@ -2094,7 +2105,7 @@ static int ssl_write_server_hello( ssl_context *ssl )
|
||||||
|
|
||||||
SSL_DEBUG_MSG( 2, ( "=> write server hello" ) );
|
SSL_DEBUG_MSG( 2, ( "=> write server hello" ) );
|
||||||
|
|
||||||
#if defined(POLARSSL_SSL_PROTO_DTLS)
|
#if defined(POLARSSL_SSL_DTLS_HELLO_VERIFY)
|
||||||
if( ssl->transport == SSL_TRANSPORT_DATAGRAM &&
|
if( ssl->transport == SSL_TRANSPORT_DATAGRAM &&
|
||||||
ssl->handshake->verify_cookie != NULL )
|
ssl->handshake->verify_cookie != NULL )
|
||||||
{
|
{
|
||||||
|
@ -2109,7 +2120,7 @@ static int ssl_write_server_hello( ssl_context *ssl )
|
||||||
|
|
||||||
return( POLARSSL_ERR_SSL_HELLO_VERIFY_REQUIRED );
|
return( POLARSSL_ERR_SSL_HELLO_VERIFY_REQUIRED );
|
||||||
}
|
}
|
||||||
#endif /* POLARSSL_SSL_PROTO_DTLS */
|
#endif /* POLARSSL_SSL_DTLS_HELLO_VERIFY */
|
||||||
|
|
||||||
if( ssl->f_rng == NULL )
|
if( ssl->f_rng == NULL )
|
||||||
{
|
{
|
||||||
|
|
|
@ -3749,7 +3749,7 @@ int ssl_session_reset( ssl_context *ssl )
|
||||||
ssl->alpn_chosen = NULL;
|
ssl->alpn_chosen = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(POLARSSL_SSL_PROTO_DTLS) && defined(POLARSSL_SSL_SRV_C)
|
#if defined(POLARSSL_SSL_DTLS_HELLO_VERIFY)
|
||||||
polarssl_free( ssl->cli_id );
|
polarssl_free( ssl->cli_id );
|
||||||
ssl->cli_id = NULL;
|
ssl->cli_id = NULL;
|
||||||
ssl->cli_id_len = 0;
|
ssl->cli_id_len = 0;
|
||||||
|
@ -5039,7 +5039,7 @@ void ssl_free( ssl_context *ssl )
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(POLARSSL_SSL_PROTO_DTLS) && defined(POLARSSL_SSL_SRV_C)
|
#if defined(POLARSSL_SSL_DTLS_HELLO_VERIFY)
|
||||||
polarssl_free( ssl->cli_id );
|
polarssl_free( ssl->cli_id );
|
||||||
md_free( &ssl->hvr_hmac_ctx );
|
md_free( &ssl->hvr_hmac_ctx );
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1344,7 +1344,7 @@ int main( int argc, char *argv[] )
|
||||||
ssl_set_session_ticket_lifetime( &ssl, opt.ticket_timeout );
|
ssl_set_session_ticket_lifetime( &ssl, opt.ticket_timeout );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(POLARSSL_SSL_PROTO_DTLS)
|
#if defined(POLARSSL_SSL_DTLS_HELLO_VERIFY)
|
||||||
if( opt.transport == SSL_TRANSPORT_DATAGRAM &&
|
if( opt.transport == SSL_TRANSPORT_DATAGRAM &&
|
||||||
( ret = ssl_setup_hvr_key( &ssl ) ) != 0 )
|
( ret = ssl_setup_hvr_key( &ssl ) ) != 0 )
|
||||||
{
|
{
|
||||||
|
@ -1538,7 +1538,7 @@ reset:
|
||||||
else
|
else
|
||||||
ssl_set_bio( &ssl, net_recv, &client_fd, net_send, &client_fd );
|
ssl_set_bio( &ssl, net_recv, &client_fd, net_send, &client_fd );
|
||||||
|
|
||||||
#if defined(POLARSSL_SSL_PROTO_DTLS)
|
#if defined(POLARSSL_SSL_DTLS_HELLO_VERIFY)
|
||||||
if( opt.transport == SSL_TRANSPORT_DATAGRAM )
|
if( opt.transport == SSL_TRANSPORT_DATAGRAM )
|
||||||
{
|
{
|
||||||
if( ( ret = ssl_set_client_transport_id( &ssl, client_ip,
|
if( ( ret = ssl_set_client_transport_id( &ssl, client_ip,
|
||||||
|
@ -1549,7 +1549,7 @@ reset:
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* POLARSSL_SSL_PROTO_DTLS */
|
#endif /* POLARSSL_SSL_DTLS_HELLO_VERIFY */
|
||||||
|
|
||||||
printf( " ok\n" );
|
printf( " ok\n" );
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue