Add ssl_set_dtls_badmac_limit()
This commit is contained in:
parent
9b35f18f66
commit
b0643d152d
4 changed files with 66 additions and 2 deletions
|
@ -277,6 +277,11 @@
|
|||
#error "POLARSSL_SSL_DTLS_ANTI_REPLAY defined, but not all prerequisites"
|
||||
#endif
|
||||
|
||||
#if defined(POLARSSL_SSL_DTLS_BADMAC_LIMIT) && \
|
||||
( !defined(POLARSSL_SSL_TLS_C) || !defined(POLARSSL_SSL_PROTO_DTLS) )
|
||||
#error "POLARSSL_SSL_DTLS_BADMAC_LIMIT defined, but not all prerequisites"
|
||||
#endif
|
||||
|
||||
#if defined(POLARSSL_SSL_SESSION_TICKETS) && defined(POLARSSL_SSL_TLS_C) && \
|
||||
( !defined(POLARSSL_AES_C) || !defined(POLARSSL_SHA256_C) || \
|
||||
!defined(POLARSSL_CIPHER_MODE_CBC) )
|
||||
|
|
|
@ -929,7 +929,7 @@
|
|||
* Enable support for the anti-replay mechanism in DTLS.
|
||||
*
|
||||
* Requires: POLARSSL_SSL_TLS_C
|
||||
* POLARSSL_POLARSSL_PROTO_DTLS
|
||||
* POLARSSL_SSL_PROTO_DTLS
|
||||
*
|
||||
* \warning Disabling this is often a security risk!
|
||||
* See ssl_set_dtls_anti_replay() for details.
|
||||
|
@ -951,12 +951,23 @@
|
|||
* \warning Disabling this can ba a security risk! (see above)
|
||||
*
|
||||
* Requires: POLARSSL_SSL_SRV_C
|
||||
* POLARSSL_POLARSSL_PROTO_DTLS
|
||||
* POLARSSL_SSL_PROTO_DTLS
|
||||
*
|
||||
* Comment this to disable support for HelloVerifyRequest.
|
||||
*/
|
||||
#define POLARSSL_SSL_DTLS_HELLO_VERIFY
|
||||
|
||||
/**
|
||||
* \def POLARSSL_SSL_DTLS_BADMAC_LIMIT
|
||||
*
|
||||
* Enable support for a limit of records with bad MAC.
|
||||
*
|
||||
* See ssl_set_dtls_badmac_limit().
|
||||
*
|
||||
* Requires: POLARSSL_SSL_PROTO_DTLS
|
||||
*/
|
||||
#define POLARSSL_SSL_DTLS_BADMAC_LIMIT
|
||||
|
||||
/**
|
||||
* \def POLARSSL_SSL_SESSION_TICKETS
|
||||
*
|
||||
|
|
|
@ -772,6 +772,11 @@ struct _ssl_context
|
|||
|
||||
uint32_t read_timeout; /*!< timeout for ssl_read in milliseconds */
|
||||
|
||||
#if defined(POLARSSL_SSL_DTLS_BADMAC_LIMIT)
|
||||
unsigned badmac_limit; /*!< limit of records with a bad MAC */
|
||||
unsigned badmac_seen; /*!< records with a bad MAC received */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Callbacks (RNG, debug, I/O, verification)
|
||||
*/
|
||||
|
@ -1294,6 +1299,33 @@ void ssl_set_dtls_cookies( ssl_context *ssl,
|
|||
void ssl_set_dtls_anti_replay( ssl_context *ssl, char mode );
|
||||
#endif /* POLARSSL_SSL_DTLS_ANTI_REPLAY */
|
||||
|
||||
#if defined(POLARSSL_SSL_DTLS_BADMAC_LIMIT)
|
||||
/**
|
||||
* \brief Set a limit on the number of records with a bad MAC
|
||||
* before terminating the connection.
|
||||
* (DTLS only, no effect on TLS.)
|
||||
* Default: 0 (disabled).
|
||||
*
|
||||
* \param ssl SSL context
|
||||
* \param limit Limit, or 0 to disable.
|
||||
*
|
||||
* \note If the limit is N, then the connection is terminated when
|
||||
* the Nth non-authentic record is seen.
|
||||
*
|
||||
* \note Records with an invalid header are not counted, only the
|
||||
* ones going through the authentication-decryption phase.
|
||||
*
|
||||
* \note This is a security trade-off related to the fact that it's
|
||||
* often relatively easy for an active attacker ot inject UDP
|
||||
* datagrams. On one hand, setting a low limit here makes it
|
||||
* easier for such an attacker to forcibly terminated a
|
||||
* connection. On the other hand, a high limit or no limit
|
||||
* might make us waste resources checking authentication on
|
||||
* many bogus packets.
|
||||
*/
|
||||
void ssl_set_dtls_badmac_limit( ssl_context *ssl, unsigned limit );
|
||||
#endif /* POLARSSL_DTLS_BADMAC_LIMIT */
|
||||
|
||||
#if defined(POLARSSL_SSL_PROTO_DTLS)
|
||||
/**
|
||||
* \brief Set retransmit timeout values for the DTLS handshale.
|
||||
|
|
|
@ -3238,6 +3238,15 @@ read_record_header:
|
|||
if( ret == POLARSSL_ERR_SSL_INVALID_RECORD ||
|
||||
ret == POLARSSL_ERR_SSL_INVALID_MAC )
|
||||
{
|
||||
#if defined(POLARSSL_SSL_DTLS_BADMAC_LIMIT)
|
||||
if( ssl->badmac_limit != 0 &&
|
||||
++ssl->badmac_seen >= ssl->badmac_limit )
|
||||
{
|
||||
SSL_DEBUG_MSG( 1, ( "too many records with bad MAC" ) );
|
||||
return( POLARSSL_ERR_SSL_INVALID_MAC );
|
||||
}
|
||||
#endif
|
||||
|
||||
SSL_DEBUG_MSG( 1, ( "discarding invalid record" ) );
|
||||
goto read_record_header;
|
||||
}
|
||||
|
@ -4923,6 +4932,13 @@ void ssl_set_dtls_anti_replay( ssl_context *ssl, char mode )
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(POLARSSL_SSL_DTLS_BADMAC_LIMIT)
|
||||
void ssl_set_dtls_badmac_limit( ssl_context *ssl, unsigned limit )
|
||||
{
|
||||
ssl->badmac_limit = limit;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(POLARSSL_SSL_PROTO_DTLS)
|
||||
void ssl_set_handshake_timeout( ssl_context *ssl, uint32_t min, uint32_t max )
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue