Add helper function to find entry in SSL session cache

Signed-off-by: Hanno Becker <hanno.becker@arm.com>
This commit is contained in:
Hanno Becker 2021-04-15 10:17:53 +01:00
parent 02a68ebc0e
commit f938c436fb

View File

@ -50,84 +50,98 @@ void mbedtls_ssl_cache_init( mbedtls_ssl_cache_context *cache )
#endif #endif
} }
static int ssl_cache_find_entry( mbedtls_ssl_cache_context *cache,
unsigned char const *session_id,
size_t session_id_len,
mbedtls_ssl_cache_entry **dst )
{
int ret = 1;
#if defined(MBEDTLS_HAVE_TIME)
mbedtls_time_t t = mbedtls_time( NULL );
#endif
mbedtls_ssl_cache_entry *cur;
for( cur = cache->chain; cur != NULL; cur = cur->next )
{
#if defined(MBEDTLS_HAVE_TIME)
if( cache->timeout != 0 &&
(int) ( t - cur->timestamp ) > cache->timeout )
continue;
#endif
if( session_id_len != cur->session.id_len ||
memcmp( session_id, cur->session.id,
cur->session.id_len ) != 0 )
{
continue;
}
break;
}
if( cur != NULL )
{
*dst = cur;
ret = 0;
}
return( ret );
}
int mbedtls_ssl_cache_get( void *data, int mbedtls_ssl_cache_get( void *data,
unsigned char const *session_id, unsigned char const *session_id,
size_t session_id_len, size_t session_id_len,
mbedtls_ssl_session *session ) mbedtls_ssl_session *session )
{ {
int ret = 1; int ret = 1;
#if defined(MBEDTLS_HAVE_TIME)
mbedtls_time_t t = mbedtls_time( NULL );
#endif
mbedtls_ssl_cache_context *cache = (mbedtls_ssl_cache_context *) data; mbedtls_ssl_cache_context *cache = (mbedtls_ssl_cache_context *) data;
mbedtls_ssl_cache_entry *cur, *entry; mbedtls_ssl_cache_entry *entry;
#if defined(MBEDTLS_THREADING_C) #if defined(MBEDTLS_THREADING_C)
if( mbedtls_mutex_lock( &cache->mutex ) != 0 ) if( mbedtls_mutex_lock( &cache->mutex ) != 0 )
return( 1 ); return( 1 );
#endif #endif
cur = cache->chain; ret = ssl_cache_find_entry( cache, session_id, session_id_len, &entry );
entry = NULL; if( ret != 0 )
goto exit;
while( cur != NULL ) ret = mbedtls_ssl_session_copy( session, &entry->session );
if( ret != 0 )
goto exit;
#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
/*
* Restore peer certificate (without rest of the original chain)
*/
if( entry->peer_cert.p != NULL )
{ {
entry = cur; /* `session->peer_cert` is NULL after the call to
cur = cur->next; * mbedtls_ssl_session_copy(), because cache entries
* have the `peer_cert` field set to NULL. */
#if defined(MBEDTLS_HAVE_TIME) if( ( session->peer_cert = mbedtls_calloc( 1,
if( cache->timeout != 0 && sizeof(mbedtls_x509_crt) ) ) == NULL )
(int) ( t - entry->timestamp ) > cache->timeout )
continue;
#endif
if( session_id_len != entry->session.id_len ||
memcmp( session_id, entry->session.id,
entry->session.id_len ) != 0 )
{
continue;
}
ret = mbedtls_ssl_session_copy( session, &entry->session );
if( ret != 0 )
{ {
ret = 1; ret = 1;
goto exit; goto exit;
} }
#if defined(MBEDTLS_X509_CRT_PARSE_C) && \ mbedtls_x509_crt_init( session->peer_cert );
defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE) if( mbedtls_x509_crt_parse( session->peer_cert, entry->peer_cert.p,
/* entry->peer_cert.len ) != 0 )
* Restore peer certificate (without rest of the original chain)
*/
if( entry->peer_cert.p != NULL )
{ {
/* `session->peer_cert` is NULL after the call to mbedtls_free( session->peer_cert );
* mbedtls_ssl_session_copy(), because cache entries session->peer_cert = NULL;
* have the `peer_cert` field set to NULL. */ ret = 1;
goto exit;
if( ( session->peer_cert = mbedtls_calloc( 1,
sizeof(mbedtls_x509_crt) ) ) == NULL )
{
ret = 1;
goto exit;
}
mbedtls_x509_crt_init( session->peer_cert );
if( mbedtls_x509_crt_parse( session->peer_cert, entry->peer_cert.p,
entry->peer_cert.len ) != 0 )
{
mbedtls_free( session->peer_cert );
session->peer_cert = NULL;
ret = 1;
goto exit;
}
} }
}
#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */ #endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
ret = 0; ret = 0;
goto exit;
}
exit: exit:
#if defined(MBEDTLS_THREADING_C) #if defined(MBEDTLS_THREADING_C)