Rearrange ExtendedMasterSecret parsing logic
`mbedtls_ssl_handshake_params::extended_ms` holds the state of the
ExtendedMasterSecret extension in the current handshake. Initially
set to 'disabled' for both client and server,
- the client sets it to 'enabled' as soon as it finds the ExtendedMS
extension in the `ServerHello` and it has advertised that extension
in its ClientHello,
- the server sets it to 'enabled' as soon as it finds the ExtendedMS
extension in the `ClientHello` and is willing to advertise is in its
`ServerHello`.
This commit slightly restructures this logic in prepraration for the
removal of `mbedtls_ssl_handshake_params::extended_ms` in case both
the use and the enforcement of the ExtendedMasterSecret extension have
been fixed at compile-time. Namely, in this case there is no need for
the `extended_ms` field in the handshake structure, as the ExtendedMS
must be in use if the handshake progresses beyond the Hello stage.
Paving the way for the removal of mbedtls_ssl_handshake_params::extended_ms
this commit introduces a temporary variable tracking the presence of the
ExtendedMS extension in the ClientHello/ServerHello messages, leaving
the derivation of `extended_ms` (and potential failure) to the end of
the parsing routine.
diff --git a/library/ssl_cli.c b/library/ssl_cli.c
index 238eeb1..257a517 100644
--- a/library/ssl_cli.c
+++ b/library/ssl_cli.c
@@ -1341,9 +1341,6 @@
}
((void) buf);
-
- ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
-
return( 0 );
}
#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
@@ -1604,6 +1601,9 @@
#if defined(MBEDTLS_SSL_RENEGOTIATION)
int renegotiation_info_seen = 0;
#endif
+#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
+ int extended_ms_seen = 0;
+#endif
int handshake_failure = 0;
const mbedtls_ssl_ciphersuite_t *suite_info;
@@ -1984,6 +1984,7 @@
{
return( ret );
}
+ extended_ms_seen = 1;
break;
#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
@@ -2092,14 +2093,19 @@
*/
#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
if( mbedtls_ssl_conf_get_ems( ssl->conf ) ==
- MBEDTLS_SSL_EXTENDED_MS_ENABLED &&
- mbedtls_ssl_conf_get_ems_enforced( ssl->conf ) ==
- MBEDTLS_SSL_EXTENDED_MS_ENFORCE_ENABLED &&
- ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED)
+ MBEDTLS_SSL_EXTENDED_MS_ENABLED )
{
- MBEDTLS_SSL_DEBUG_MSG( 1, ( "Peer not offering extended master "
+ if( extended_ms_seen )
+ {
+ ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
+ }
+ else if( mbedtls_ssl_conf_get_ems_enforced( ssl->conf ) ==
+ MBEDTLS_SSL_EXTENDED_MS_ENFORCE_ENABLED )
+ {
+ MBEDTLS_SSL_DEBUG_MSG( 1, ( "Peer not offering extended master "
"secret, while it is enforced") );
- handshake_failure = 1;
+ handshake_failure = 1;
+ }
}
#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */