mirror of
https://github.com/Mbed-TLS/mbedtls.git
synced 2025-07-29 11:41:15 +03:00
Implement 3.0-semantics for mbedtls_ssl_{get,set}_session()
mbedtls_ssl_{get,set}_session() exhibited idempotent behaviour in Mbed TLS 2.x. Multiple calls to those functions are not useful in TLS 1.2, and the idempotent nature is unsuitable for support of TLS 1.3 which introduces the availabilty to offer multiple tickets for resumption, as well as receive multiple tickets. In preparation for TLS 1.3 support, this commit relaxes the semantics of `mbedtls_ssl_{get,set}_session()` by allowing implementations to fail gracefully, and leveraging this freedom by modifying the existing TLS 1.2 implementation to only accept one call to `mbedtls_ssl_{get,set}_session()` per context, and non-fatally failing all subsequent invocations. For TLS 1.3, it will be leveraged by making multiple calls to `mbedtls_ssl_get_session()` issue one ticket a time until no more tickets are available, and by using multiple calls to `mbedtls_ssl_set_session()` to allow the client to offer multiple tickets to the server. Signed-off-by: Hanno Becker <hanno.becker@arm.com>
This commit is contained in:
@ -3788,6 +3788,9 @@ int mbedtls_ssl_set_session( mbedtls_ssl_context *ssl, const mbedtls_ssl_session
|
||||
return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
|
||||
}
|
||||
|
||||
if( ssl->handshake->resume == 1 )
|
||||
return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
|
||||
|
||||
if( ( ret = mbedtls_ssl_session_copy( ssl->session_negotiate,
|
||||
session ) ) != 0 )
|
||||
return( ret );
|
||||
@ -4789,6 +4792,8 @@ const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert( const mbedtls_ssl_context *ss
|
||||
int mbedtls_ssl_get_session( const mbedtls_ssl_context *ssl,
|
||||
mbedtls_ssl_session *dst )
|
||||
{
|
||||
int ret;
|
||||
|
||||
if( ssl == NULL ||
|
||||
dst == NULL ||
|
||||
ssl->session == NULL ||
|
||||
@ -4797,7 +4802,27 @@ int mbedtls_ssl_get_session( const mbedtls_ssl_context *ssl,
|
||||
return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
|
||||
}
|
||||
|
||||
return( mbedtls_ssl_session_copy( dst, ssl->session ) );
|
||||
/* Since Mbed TLS 3.0, mbedtls_ssl_get_session() is no longer
|
||||
* idempotent: Each session can only be exported once.
|
||||
*
|
||||
* (This is in preparation for TLS 1.3 support where we will
|
||||
* need the ability to export multiple sessions (aka tickets),
|
||||
* which will be achieved by calling mbedtls_ssl_get_session()
|
||||
* multiple times until it fails.)
|
||||
*
|
||||
* Check whether we have already exported the current session,
|
||||
* and fail if so.
|
||||
*/
|
||||
if( ssl->session->exported == 1 )
|
||||
return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
|
||||
|
||||
ret = mbedtls_ssl_session_copy( dst, ssl->session );
|
||||
if( ret != 0 )
|
||||
return( ret );
|
||||
|
||||
/* Remember that we've exported the session. */
|
||||
ssl->session->exported = 1;
|
||||
return( 0 );
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CLI_C */
|
||||
|
||||
|
Reference in New Issue
Block a user