Merge branch 'mbedtls-1.3' into mbedtls-1.3-restricted

This commit is contained in:
Gilles Peskine 2017-11-29 21:06:11 +01:00
commit af86fb9ded
5 changed files with 69 additions and 16 deletions

View File

@ -56,6 +56,10 @@ Bugfix
* Don't print X.509 version tag for v1 CRT's, and omit extensions for * Don't print X.509 version tag for v1 CRT's, and omit extensions for
non-v3 CRT's. non-v3 CRT's.
* Fix bugs in RSA test suite under MBEDTLS_NO_PLATFORM_ENTROPY. #1023 #1024 * Fix bugs in RSA test suite under MBEDTLS_NO_PLATFORM_ENTROPY. #1023 #1024
* Fix net_would_block to avoid modification by errno through fcntl call.
Found by nkolban. Fixes #845.
* Fix handling of handshake messages in ssl_read in case
POLARSSL_SSL_DISABLE_RENEGOTIATION is set. Found by erja-gp.
Changes Changes
* Extend cert_write example program by options to set the CRT version * Extend cert_write example program by options to set the CRT version

View File

@ -404,13 +404,18 @@ static int net_would_block( int fd )
*/ */
static int net_would_block( int fd ) static int net_would_block( int fd )
{ {
int err = errno;
/* /*
* Never return 'WOULD BLOCK' on a non-blocking socket * Never return 'WOULD BLOCK' on a non-blocking socket
*/ */
if( ( fcntl( fd, F_GETFL ) & O_NONBLOCK ) != O_NONBLOCK ) if( ( fcntl( fd, F_GETFL ) & O_NONBLOCK ) != O_NONBLOCK )
{
errno = err;
return( 0 ); return( 0 );
}
switch( errno ) switch( errno = err )
{ {
#if defined EAGAIN #if defined EAGAIN
case EAGAIN: case EAGAIN:

View File

@ -4762,7 +4762,6 @@ int ssl_read( ssl_context *ssl, unsigned char *buf, size_t len )
} }
} }
#if defined(POLARSSL_SSL_RENEGOTIATION)
if( ssl->in_msgtype == SSL_MSG_HANDSHAKE ) if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
{ {
SSL_DEBUG_MSG( 1, ( "received handshake message" ) ); SSL_DEBUG_MSG( 1, ( "received handshake message" ) );
@ -4777,10 +4776,22 @@ int ssl_read( ssl_context *ssl, unsigned char *buf, size_t len )
} }
#endif #endif
if( ssl->disable_renegotiation == SSL_RENEGOTIATION_DISABLED || #if defined(POLARSSL_SSL_RENEGOTIATION)
( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION && if( ! ( ssl->disable_renegotiation == SSL_RENEGOTIATION_DISABLED ||
ssl->allow_legacy_renegotiation == ( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
SSL_LEGACY_NO_RENEGOTIATION ) ) ssl->allow_legacy_renegotiation ==
SSL_LEGACY_NO_RENEGOTIATION ) ) )
{
ret = ssl_start_renegotiation( ssl );
if( ret != POLARSSL_ERR_SSL_WAITING_SERVER_HELLO_RENEGO &&
ret != 0 )
{
SSL_DEBUG_RET( 1, "ssl_start_renegotiation", ret );
return( ret );
}
}
else
#endif /* POLARSSL_SSL_RENEGOTIATION */
{ {
SSL_DEBUG_MSG( 3, ( "ignoring renegotiation, sending alert" ) ); SSL_DEBUG_MSG( 3, ( "ignoring renegotiation, sending alert" ) );
@ -4814,19 +4825,10 @@ int ssl_read( ssl_context *ssl, unsigned char *buf, size_t len )
return( POLARSSL_ERR_SSL_INTERNAL_ERROR ); return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
} }
} }
else
{
ret = ssl_start_renegotiation( ssl );
if( ret != POLARSSL_ERR_SSL_WAITING_SERVER_HELLO_RENEGO &&
ret != 0 )
{
SSL_DEBUG_RET( 1, "ssl_start_renegotiation", ret );
return( ret );
}
}
return( POLARSSL_ERR_NET_WANT_READ ); return( POLARSSL_ERR_NET_WANT_READ );
} }
#if defined(POLARSSL_SSL_RENEGOTIATION)
else if( ssl->renegotiation == SSL_RENEGOTIATION_PENDING ) else if( ssl->renegotiation == SSL_RENEGOTIATION_PENDING )
{ {
ssl->renego_records_seen++; ssl->renego_records_seen++;

View File

@ -259,6 +259,19 @@ OPENSSL_CMD="$OPENSSL_LEGACY" tests/compat.sh -m 'ssl3'
msg "build: SSLv3 - ssl-opt.sh (ASan build)" # ~ 6 min msg "build: SSLv3 - ssl-opt.sh (ASan build)" # ~ 6 min
tests/ssl-opt.sh tests/ssl-opt.sh
msg "build: Default + POLARSSL_SSL_DISABLE_RENEGOTIATION (ASan build)" # ~ 6 min
cleanup
cp "$CONFIG_H" "$CONFIG_BAK"
scripts/config.pl set POLARSSL_SSL_DISABLE_RENEGOTIATION
CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
make
msg "test: POLARSSL_SSL_DISABLE_RENEGOTIATION - main suites (inc. selftests) (ASan build)" # ~ 50s
make test
msg "test: POLARSSL_SSL_DISABLE_RENEGOTIATION - ssl-opt.sh (ASan build)" # ~ 6 min
tests/ssl-opt.sh
msg "build: cmake, full config, clang" # ~ 50s msg "build: cmake, full config, clang" # ~ 50s
cleanup cleanup
cp "$CONFIG_H" "$CONFIG_BAK" cp "$CONFIG_H" "$CONFIG_BAK"

View File

@ -75,6 +75,13 @@ requires_config_enabled() {
fi fi
} }
# skip next test if the flag is enabled in config.h
requires_config_disabled() {
if grep "^#define $1" $CONFIG_H > /dev/null; then
SKIP_NEXT="YES"
fi
}
# skip next test if OpenSSL can't send SSLv2 ClientHello # skip next test if OpenSSL can't send SSLv2 ClientHello
requires_openssl_with_sslv2() { requires_openssl_with_sslv2() {
if [ -z "${OPENSSL_HAS_SSL2:-}" ]; then if [ -z "${OPENSSL_HAS_SSL2:-}" ]; then
@ -1073,6 +1080,7 @@ run_test "Renegotiation: none, for reference" \
-S "=> renegotiate" \ -S "=> renegotiate" \
-S "write hello request" -S "write hello request"
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: client-initiated" \ run_test "Renegotiation: client-initiated" \
"$P_SRV debug_level=3 exchanges=2 renegotiation=1" \ "$P_SRV debug_level=3 exchanges=2 renegotiation=1" \
"$P_CLI debug_level=3 exchanges=2 renegotiation=1 renegotiate=1" \ "$P_CLI debug_level=3 exchanges=2 renegotiation=1 renegotiate=1" \
@ -1086,6 +1094,7 @@ run_test "Renegotiation: client-initiated" \
-s "=> renegotiate" \ -s "=> renegotiate" \
-S "write hello request" -S "write hello request"
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: server-initiated" \ run_test "Renegotiation: server-initiated" \
"$P_SRV debug_level=3 exchanges=2 renegotiation=1 renegotiate=1" \ "$P_SRV debug_level=3 exchanges=2 renegotiation=1 renegotiate=1" \
"$P_CLI debug_level=3 exchanges=2 renegotiation=1" \ "$P_CLI debug_level=3 exchanges=2 renegotiation=1" \
@ -1102,6 +1111,7 @@ run_test "Renegotiation: server-initiated" \
# Checks that no Signature Algorithm with SHA-1 gets negotiated. Negotiating SHA-1 would mean that # Checks that no Signature Algorithm with SHA-1 gets negotiated. Negotiating SHA-1 would mean that
# the server did not parse the Signature Algorithm extension. This test is valid only if an MD # the server did not parse the Signature Algorithm extension. This test is valid only if an MD
# algorithm stronger than SHA-1 is enabled in config.h # algorithm stronger than SHA-1 is enabled in config.h
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: Signature Algorithms parsing, client-initiated" \ run_test "Renegotiation: Signature Algorithms parsing, client-initiated" \
"$P_SRV debug_level=3 exchanges=2 renegotiation=1 auth_mode=optional" \ "$P_SRV debug_level=3 exchanges=2 renegotiation=1 auth_mode=optional" \
"$P_CLI debug_level=3 exchanges=2 renegotiation=1 renegotiate=1" \ "$P_CLI debug_level=3 exchanges=2 renegotiation=1 renegotiate=1" \
@ -1119,6 +1129,7 @@ run_test "Renegotiation: Signature Algorithms parsing, client-initiated" \
# Checks that no Signature Algorithm with SHA-1 gets negotiated. Negotiating SHA-1 would mean that # Checks that no Signature Algorithm with SHA-1 gets negotiated. Negotiating SHA-1 would mean that
# the server did not parse the Signature Algorithm extension. This test is valid only if an MD # the server did not parse the Signature Algorithm extension. This test is valid only if an MD
# algorithm stronger than SHA-1 is enabled in config.h # algorithm stronger than SHA-1 is enabled in config.h
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: Signature Algorithms parsing, server-initiated" \ run_test "Renegotiation: Signature Algorithms parsing, server-initiated" \
"$P_SRV debug_level=3 exchanges=2 renegotiation=1 auth_mode=optional renegotiate=1" \ "$P_SRV debug_level=3 exchanges=2 renegotiation=1 auth_mode=optional renegotiate=1" \
"$P_CLI debug_level=3 exchanges=2 renegotiation=1" \ "$P_CLI debug_level=3 exchanges=2 renegotiation=1" \
@ -1133,6 +1144,7 @@ run_test "Renegotiation: Signature Algorithms parsing, server-initiated" \
-s "write hello request" \ -s "write hello request" \
-S "client hello v3, signature_algorithm ext: 2" # Is SHA-1 negotiated? -S "client hello v3, signature_algorithm ext: 2" # Is SHA-1 negotiated?
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: double" \ run_test "Renegotiation: double" \
"$P_SRV debug_level=3 exchanges=2 renegotiation=1 renegotiate=1" \ "$P_SRV debug_level=3 exchanges=2 renegotiation=1 renegotiate=1" \
"$P_CLI debug_level=3 exchanges=2 renegotiation=1 renegotiate=1" \ "$P_CLI debug_level=3 exchanges=2 renegotiation=1 renegotiate=1" \
@ -1146,6 +1158,7 @@ run_test "Renegotiation: double" \
-s "=> renegotiate" \ -s "=> renegotiate" \
-s "write hello request" -s "write hello request"
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: client-initiated, server-rejected" \ run_test "Renegotiation: client-initiated, server-rejected" \
"$P_SRV debug_level=3 exchanges=2 renegotiation=0" \ "$P_SRV debug_level=3 exchanges=2 renegotiation=0" \
"$P_CLI debug_level=3 exchanges=2 renegotiation=1 renegotiate=1" \ "$P_CLI debug_level=3 exchanges=2 renegotiation=1 renegotiate=1" \
@ -1161,6 +1174,7 @@ run_test "Renegotiation: client-initiated, server-rejected" \
-c "SSL - Unexpected message at ServerHello in renegotiation" \ -c "SSL - Unexpected message at ServerHello in renegotiation" \
-c "failed" -c "failed"
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: server-initiated, client-rejected, default" \ run_test "Renegotiation: server-initiated, client-rejected, default" \
"$P_SRV debug_level=3 exchanges=2 renegotiation=1 renegotiate=1" \ "$P_SRV debug_level=3 exchanges=2 renegotiation=1 renegotiate=1" \
"$P_CLI debug_level=3 exchanges=2 renegotiation=0" \ "$P_CLI debug_level=3 exchanges=2 renegotiation=0" \
@ -1176,6 +1190,7 @@ run_test "Renegotiation: server-initiated, client-rejected, default" \
-S "SSL - An unexpected message was received from our peer" \ -S "SSL - An unexpected message was received from our peer" \
-S "failed" -S "failed"
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: server-initiated, client-rejected, not enforced" \ run_test "Renegotiation: server-initiated, client-rejected, not enforced" \
"$P_SRV debug_level=3 exchanges=2 renegotiation=1 renegotiate=1 \ "$P_SRV debug_level=3 exchanges=2 renegotiation=1 renegotiate=1 \
renego_delay=-1" \ renego_delay=-1" \
@ -1193,6 +1208,7 @@ run_test "Renegotiation: server-initiated, client-rejected, not enforced" \
-S "failed" -S "failed"
# delay 2 for 1 alert record + 1 application data record # delay 2 for 1 alert record + 1 application data record
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: server-initiated, client-rejected, delay 2" \ run_test "Renegotiation: server-initiated, client-rejected, delay 2" \
"$P_SRV debug_level=3 exchanges=2 renegotiation=1 renegotiate=1 \ "$P_SRV debug_level=3 exchanges=2 renegotiation=1 renegotiate=1 \
renego_delay=2" \ renego_delay=2" \
@ -1209,6 +1225,7 @@ run_test "Renegotiation: server-initiated, client-rejected, delay 2" \
-S "SSL - An unexpected message was received from our peer" \ -S "SSL - An unexpected message was received from our peer" \
-S "failed" -S "failed"
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: server-initiated, client-rejected, delay 0" \ run_test "Renegotiation: server-initiated, client-rejected, delay 0" \
"$P_SRV debug_level=3 exchanges=2 renegotiation=1 renegotiate=1 \ "$P_SRV debug_level=3 exchanges=2 renegotiation=1 renegotiate=1 \
renego_delay=0" \ renego_delay=0" \
@ -1224,6 +1241,7 @@ run_test "Renegotiation: server-initiated, client-rejected, delay 0" \
-s "write hello request" \ -s "write hello request" \
-s "SSL - An unexpected message was received from our peer" -s "SSL - An unexpected message was received from our peer"
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: server-initiated, client-accepted, delay 0" \ run_test "Renegotiation: server-initiated, client-accepted, delay 0" \
"$P_SRV debug_level=3 exchanges=2 renegotiation=1 renegotiate=1 \ "$P_SRV debug_level=3 exchanges=2 renegotiation=1 renegotiate=1 \
renego_delay=0" \ renego_delay=0" \
@ -1240,6 +1258,7 @@ run_test "Renegotiation: server-initiated, client-accepted, delay 0" \
-S "SSL - An unexpected message was received from our peer" \ -S "SSL - An unexpected message was received from our peer" \
-S "failed" -S "failed"
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: periodic, just below period" \ run_test "Renegotiation: periodic, just below period" \
"$P_SRV debug_level=3 exchanges=9 renegotiation=1 renego_period=3" \ "$P_SRV debug_level=3 exchanges=9 renegotiation=1 renego_period=3" \
"$P_CLI debug_level=3 exchanges=2 renegotiation=1" \ "$P_CLI debug_level=3 exchanges=2 renegotiation=1" \
@ -1257,6 +1276,7 @@ run_test "Renegotiation: periodic, just below period" \
-S "failed" -S "failed"
# one extra exchange to be able to complete renego # one extra exchange to be able to complete renego
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: periodic, just above period" \ run_test "Renegotiation: periodic, just above period" \
"$P_SRV debug_level=3 exchanges=9 renegotiation=1 renego_period=3" \ "$P_SRV debug_level=3 exchanges=9 renegotiation=1 renego_period=3" \
"$P_CLI debug_level=3 exchanges=4 renegotiation=1" \ "$P_CLI debug_level=3 exchanges=4 renegotiation=1" \
@ -1273,6 +1293,7 @@ run_test "Renegotiation: periodic, just above period" \
-S "SSL - An unexpected message was received from our peer" \ -S "SSL - An unexpected message was received from our peer" \
-S "failed" -S "failed"
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: periodic, two times period" \ run_test "Renegotiation: periodic, two times period" \
"$P_SRV debug_level=3 exchanges=9 renegotiation=1 renego_period=3" \ "$P_SRV debug_level=3 exchanges=9 renegotiation=1 renego_period=3" \
"$P_CLI debug_level=3 exchanges=7 renegotiation=1" \ "$P_CLI debug_level=3 exchanges=7 renegotiation=1" \
@ -1289,6 +1310,7 @@ run_test "Renegotiation: periodic, two times period" \
-S "SSL - An unexpected message was received from our peer" \ -S "SSL - An unexpected message was received from our peer" \
-S "failed" -S "failed"
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: periodic, above period, disabled" \ run_test "Renegotiation: periodic, above period, disabled" \
"$P_SRV debug_level=3 exchanges=9 renegotiation=0 renego_period=3" \ "$P_SRV debug_level=3 exchanges=9 renegotiation=0 renego_period=3" \
"$P_CLI debug_level=3 exchanges=4 renegotiation=1" \ "$P_CLI debug_level=3 exchanges=4 renegotiation=1" \
@ -1305,6 +1327,7 @@ run_test "Renegotiation: periodic, above period, disabled" \
-S "SSL - An unexpected message was received from our peer" \ -S "SSL - An unexpected message was received from our peer" \
-S "failed" -S "failed"
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: nbio, client-initiated" \ run_test "Renegotiation: nbio, client-initiated" \
"$P_SRV debug_level=3 nbio=2 exchanges=2 renegotiation=1" \ "$P_SRV debug_level=3 nbio=2 exchanges=2 renegotiation=1" \
"$P_CLI debug_level=3 nbio=2 exchanges=2 renegotiation=1 renegotiate=1" \ "$P_CLI debug_level=3 nbio=2 exchanges=2 renegotiation=1 renegotiate=1" \
@ -1318,6 +1341,7 @@ run_test "Renegotiation: nbio, client-initiated" \
-s "=> renegotiate" \ -s "=> renegotiate" \
-S "write hello request" -S "write hello request"
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: nbio, server-initiated" \ run_test "Renegotiation: nbio, server-initiated" \
"$P_SRV debug_level=3 nbio=2 exchanges=2 renegotiation=1 renegotiate=1" \ "$P_SRV debug_level=3 nbio=2 exchanges=2 renegotiation=1 renegotiate=1" \
"$P_CLI debug_level=3 nbio=2 exchanges=2 renegotiation=1" \ "$P_CLI debug_level=3 nbio=2 exchanges=2 renegotiation=1" \
@ -1331,6 +1355,7 @@ run_test "Renegotiation: nbio, server-initiated" \
-s "=> renegotiate" \ -s "=> renegotiate" \
-s "write hello request" -s "write hello request"
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: openssl server, client-initiated" \ run_test "Renegotiation: openssl server, client-initiated" \
"$O_SRV" \ "$O_SRV" \
"$P_CLI debug_level=3 exchanges=1 renegotiation=1 renegotiate=1" \ "$P_CLI debug_level=3 exchanges=1 renegotiation=1 renegotiate=1" \
@ -1343,6 +1368,7 @@ run_test "Renegotiation: openssl server, client-initiated" \
-c "HTTP/1.0 200 [Oo][Kk]" -c "HTTP/1.0 200 [Oo][Kk]"
requires_gnutls requires_gnutls
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: gnutls server strict, client-initiated" \ run_test "Renegotiation: gnutls server strict, client-initiated" \
"$G_SRV --priority=NORMAL:%SAFE_RENEGOTIATION" \ "$G_SRV --priority=NORMAL:%SAFE_RENEGOTIATION" \
"$P_CLI debug_level=3 exchanges=1 renegotiation=1 renegotiate=1" \ "$P_CLI debug_level=3 exchanges=1 renegotiation=1 renegotiate=1" \
@ -1355,6 +1381,7 @@ run_test "Renegotiation: gnutls server strict, client-initiated" \
-c "HTTP/1.0 200 [Oo][Kk]" -c "HTTP/1.0 200 [Oo][Kk]"
requires_gnutls requires_gnutls
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: gnutls server unsafe, client-initiated default" \ run_test "Renegotiation: gnutls server unsafe, client-initiated default" \
"$G_SRV --priority=NORMAL:%DISABLE_SAFE_RENEGOTIATION" \ "$G_SRV --priority=NORMAL:%DISABLE_SAFE_RENEGOTIATION" \
"$P_CLI debug_level=3 exchanges=1 renegotiation=1 renegotiate=1" \ "$P_CLI debug_level=3 exchanges=1 renegotiation=1 renegotiate=1" \
@ -1367,6 +1394,7 @@ run_test "Renegotiation: gnutls server unsafe, client-initiated default" \
-C "HTTP/1.0 200 [Oo][Kk]" -C "HTTP/1.0 200 [Oo][Kk]"
requires_gnutls requires_gnutls
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: gnutls server unsafe, client-inititated no legacy" \ run_test "Renegotiation: gnutls server unsafe, client-inititated no legacy" \
"$G_SRV --priority=NORMAL:%DISABLE_SAFE_RENEGOTIATION" \ "$G_SRV --priority=NORMAL:%DISABLE_SAFE_RENEGOTIATION" \
"$P_CLI debug_level=3 exchanges=1 renegotiation=1 renegotiate=1 \ "$P_CLI debug_level=3 exchanges=1 renegotiation=1 renegotiate=1 \
@ -1380,6 +1408,7 @@ run_test "Renegotiation: gnutls server unsafe, client-inititated no legacy" \
-C "HTTP/1.0 200 [Oo][Kk]" -C "HTTP/1.0 200 [Oo][Kk]"
requires_gnutls requires_gnutls
requires_config_disabled POLARSSL_SSL_DISABLE_RENEGOTIATION
run_test "Renegotiation: gnutls server unsafe, client-inititated legacy" \ run_test "Renegotiation: gnutls server unsafe, client-inititated legacy" \
"$G_SRV --priority=NORMAL:%DISABLE_SAFE_RENEGOTIATION" \ "$G_SRV --priority=NORMAL:%DISABLE_SAFE_RENEGOTIATION" \
"$P_CLI debug_level=3 exchanges=1 renegotiation=1 renegotiate=1 \ "$P_CLI debug_level=3 exchanges=1 renegotiation=1 renegotiate=1 \