mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2025-07-15 20:27:26 +00:00
Fix non compliance SSLv3 in server extension handling.
The server code parses the client hello extensions even when the protocol is SSLv3 and this behaviour is non compliant with rfc6101. Also the server sends extensions in the server hello and omitting them may prevent interoperability problems.
This commit is contained in:
parent
8abaa8b275
commit
307e181cfa
|
@ -18,6 +18,8 @@ Changes
|
||||||
don't use the optimized assembly for bignum multiplication. This removes
|
don't use the optimized assembly for bignum multiplication. This removes
|
||||||
the need to pass -fomit-frame-pointer to avoid a build error with -O0.
|
the need to pass -fomit-frame-pointer to avoid a build error with -O0.
|
||||||
* Disabled SSLv3 in the default configuration.
|
* Disabled SSLv3 in the default configuration.
|
||||||
|
* Fix non-compliance server extension handling. Extensions for SSLv3 are now
|
||||||
|
ignored, as required by RFC6101.
|
||||||
|
|
||||||
= mbed TLS 1.3.16 released 2016-01-05
|
= mbed TLS 1.3.16 released 2016-01-05
|
||||||
|
|
||||||
|
|
|
@ -1564,6 +1564,12 @@ static int ssl_parse_client_hello( ssl_context *ssl )
|
||||||
}
|
}
|
||||||
#endif /* POLARSSL_SSL_FALLBACK_SCSV */
|
#endif /* POLARSSL_SSL_FALLBACK_SCSV */
|
||||||
|
|
||||||
|
/* Do not parse the extensions if the protocol is SSLv3 */
|
||||||
|
#if defined(POLARSSL_SSL_PROTO_SSL3)
|
||||||
|
if( ( ssl->major_ver != 3 ) || ( ssl->minor_ver != 0 ) )
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
ext = buf + 44 + sess_len + ciph_len + comp_len;
|
ext = buf + 44 + sess_len + ciph_len + comp_len;
|
||||||
|
|
||||||
while( ext_len )
|
while( ext_len )
|
||||||
|
@ -1580,7 +1586,7 @@ static int ssl_parse_client_hello( ssl_context *ssl )
|
||||||
}
|
}
|
||||||
switch( ext_id )
|
switch( ext_id )
|
||||||
{
|
{
|
||||||
#if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
|
#if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
|
||||||
case TLS_EXT_SERVERNAME:
|
case TLS_EXT_SERVERNAME:
|
||||||
SSL_DEBUG_MSG( 3, ( "found ServerName extension" ) );
|
SSL_DEBUG_MSG( 3, ( "found ServerName extension" ) );
|
||||||
if( ssl->f_sni == NULL )
|
if( ssl->f_sni == NULL )
|
||||||
|
@ -1590,36 +1596,36 @@ static int ssl_parse_client_hello( ssl_context *ssl )
|
||||||
if( ret != 0 )
|
if( ret != 0 )
|
||||||
return( ret );
|
return( ret );
|
||||||
break;
|
break;
|
||||||
#endif /* POLARSSL_SSL_SERVER_NAME_INDICATION */
|
#endif /* POLARSSL_SSL_SERVER_NAME_INDICATION */
|
||||||
|
|
||||||
case TLS_EXT_RENEGOTIATION_INFO:
|
case TLS_EXT_RENEGOTIATION_INFO:
|
||||||
SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
|
SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
|
||||||
#if defined(POLARSSL_SSL_RENEGOTIATION)
|
#if defined(POLARSSL_SSL_RENEGOTIATION)
|
||||||
renegotiation_info_seen = 1;
|
renegotiation_info_seen = 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size );
|
ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size );
|
||||||
if( ret != 0 )
|
if( ret != 0 )
|
||||||
return( ret );
|
return( ret );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#if defined(POLARSSL_SSL_PROTO_TLS1_2) && \
|
#if defined(POLARSSL_SSL_PROTO_TLS1_2) && \
|
||||||
defined(POLARSSL_KEY_EXCHANGE__WITH_CERT__ENABLED)
|
defined(POLARSSL_KEY_EXCHANGE__WITH_CERT__ENABLED)
|
||||||
case TLS_EXT_SIG_ALG:
|
case TLS_EXT_SIG_ALG:
|
||||||
SSL_DEBUG_MSG( 3, ( "found signature_algorithms extension" ) );
|
SSL_DEBUG_MSG( 3, ( "found signature_algorithms extension" ) );
|
||||||
#if defined(POLARSSL_SSL_RENEGOTIATION)
|
#if defined(POLARSSL_SSL_RENEGOTIATION)
|
||||||
if( ssl->renegotiation == SSL_RENEGOTIATION )
|
if( ssl->renegotiation == SSL_RENEGOTIATION )
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ret = ssl_parse_signature_algorithms_ext( ssl, ext + 4, ext_size );
|
ret = ssl_parse_signature_algorithms_ext( ssl, ext + 4, ext_size );
|
||||||
if( ret != 0 )
|
if( ret != 0 )
|
||||||
return( ret );
|
return( ret );
|
||||||
break;
|
break;
|
||||||
#endif /* POLARSSL_SSL_PROTO_TLS1_2 &&
|
#endif /* POLARSSL_SSL_PROTO_TLS1_2 &&
|
||||||
POLARSSL_KEY_EXCHANGE__WITH_CERT__ENABLED */
|
POLARSSL_KEY_EXCHANGE__WITH_CERT__ENABLED */
|
||||||
|
|
||||||
#if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
|
#if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
|
||||||
case TLS_EXT_SUPPORTED_ELLIPTIC_CURVES:
|
case TLS_EXT_SUPPORTED_ELLIPTIC_CURVES:
|
||||||
SSL_DEBUG_MSG( 3, ( "found supported elliptic curves extension" ) );
|
SSL_DEBUG_MSG( 3, ( "found supported elliptic curves extension" ) );
|
||||||
|
|
||||||
|
@ -1636,9 +1642,9 @@ static int ssl_parse_client_hello( ssl_context *ssl )
|
||||||
if( ret != 0 )
|
if( ret != 0 )
|
||||||
return( ret );
|
return( ret );
|
||||||
break;
|
break;
|
||||||
#endif /* POLARSSL_ECDH_C || POLARSSL_ECDSA_C */
|
#endif /* POLARSSL_ECDH_C || POLARSSL_ECDSA_C */
|
||||||
|
|
||||||
#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
|
#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
|
||||||
case TLS_EXT_MAX_FRAGMENT_LENGTH:
|
case TLS_EXT_MAX_FRAGMENT_LENGTH:
|
||||||
SSL_DEBUG_MSG( 3, ( "found max fragment length extension" ) );
|
SSL_DEBUG_MSG( 3, ( "found max fragment length extension" ) );
|
||||||
|
|
||||||
|
@ -1646,9 +1652,9 @@ static int ssl_parse_client_hello( ssl_context *ssl )
|
||||||
if( ret != 0 )
|
if( ret != 0 )
|
||||||
return( ret );
|
return( ret );
|
||||||
break;
|
break;
|
||||||
#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
|
#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
|
||||||
|
|
||||||
#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
|
#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
|
||||||
case TLS_EXT_TRUNCATED_HMAC:
|
case TLS_EXT_TRUNCATED_HMAC:
|
||||||
SSL_DEBUG_MSG( 3, ( "found truncated hmac extension" ) );
|
SSL_DEBUG_MSG( 3, ( "found truncated hmac extension" ) );
|
||||||
|
|
||||||
|
@ -1656,9 +1662,9 @@ static int ssl_parse_client_hello( ssl_context *ssl )
|
||||||
if( ret != 0 )
|
if( ret != 0 )
|
||||||
return( ret );
|
return( ret );
|
||||||
break;
|
break;
|
||||||
#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
|
#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
|
||||||
|
|
||||||
#if defined(POLARSSL_SSL_ENCRYPT_THEN_MAC)
|
#if defined(POLARSSL_SSL_ENCRYPT_THEN_MAC)
|
||||||
case TLS_EXT_ENCRYPT_THEN_MAC:
|
case TLS_EXT_ENCRYPT_THEN_MAC:
|
||||||
SSL_DEBUG_MSG( 3, ( "found encrypt then mac extension" ) );
|
SSL_DEBUG_MSG( 3, ( "found encrypt then mac extension" ) );
|
||||||
|
|
||||||
|
@ -1666,9 +1672,9 @@ static int ssl_parse_client_hello( ssl_context *ssl )
|
||||||
if( ret != 0 )
|
if( ret != 0 )
|
||||||
return( ret );
|
return( ret );
|
||||||
break;
|
break;
|
||||||
#endif /* POLARSSL_SSL_ENCRYPT_THEN_MAC */
|
#endif /* POLARSSL_SSL_ENCRYPT_THEN_MAC */
|
||||||
|
|
||||||
#if defined(POLARSSL_SSL_EXTENDED_MASTER_SECRET)
|
#if defined(POLARSSL_SSL_EXTENDED_MASTER_SECRET)
|
||||||
case TLS_EXT_EXTENDED_MASTER_SECRET:
|
case TLS_EXT_EXTENDED_MASTER_SECRET:
|
||||||
SSL_DEBUG_MSG( 3, ( "found extended master secret extension" ) );
|
SSL_DEBUG_MSG( 3, ( "found extended master secret extension" ) );
|
||||||
|
|
||||||
|
@ -1676,9 +1682,9 @@ static int ssl_parse_client_hello( ssl_context *ssl )
|
||||||
if( ret != 0 )
|
if( ret != 0 )
|
||||||
return( ret );
|
return( ret );
|
||||||
break;
|
break;
|
||||||
#endif /* POLARSSL_SSL_EXTENDED_MASTER_SECRET */
|
#endif /* POLARSSL_SSL_EXTENDED_MASTER_SECRET */
|
||||||
|
|
||||||
#if defined(POLARSSL_SSL_SESSION_TICKETS)
|
#if defined(POLARSSL_SSL_SESSION_TICKETS)
|
||||||
case TLS_EXT_SESSION_TICKET:
|
case TLS_EXT_SESSION_TICKET:
|
||||||
SSL_DEBUG_MSG( 3, ( "found session ticket extension" ) );
|
SSL_DEBUG_MSG( 3, ( "found session ticket extension" ) );
|
||||||
|
|
||||||
|
@ -1686,9 +1692,9 @@ static int ssl_parse_client_hello( ssl_context *ssl )
|
||||||
if( ret != 0 )
|
if( ret != 0 )
|
||||||
return( ret );
|
return( ret );
|
||||||
break;
|
break;
|
||||||
#endif /* POLARSSL_SSL_SESSION_TICKETS */
|
#endif /* POLARSSL_SSL_SESSION_TICKETS */
|
||||||
|
|
||||||
#if defined(POLARSSL_SSL_ALPN)
|
#if defined(POLARSSL_SSL_ALPN)
|
||||||
case TLS_EXT_ALPN:
|
case TLS_EXT_ALPN:
|
||||||
SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
|
SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
|
||||||
|
|
||||||
|
@ -1696,7 +1702,7 @@ static int ssl_parse_client_hello( ssl_context *ssl )
|
||||||
if( ret != 0 )
|
if( ret != 0 )
|
||||||
return( ret );
|
return( ret );
|
||||||
break;
|
break;
|
||||||
#endif /* POLARSSL_SSL_SESSION_TICKETS */
|
#endif /* POLARSSL_SSL_SESSION_TICKETS */
|
||||||
|
|
||||||
default:
|
default:
|
||||||
SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
|
SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
|
||||||
|
@ -1713,6 +1719,10 @@ static int ssl_parse_client_hello( ssl_context *ssl )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(POLARSSL_SSL_PROTO_SSL3)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Renegotiation security checks
|
* Renegotiation security checks
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue