move resume psk ticket computation to end
Signed-off-by: Jerry Yu <jerry.h.yu@arm.com>
diff --git a/library/ssl_tls13_client.c b/library/ssl_tls13_client.c
index b61626d..586440a 100644
--- a/library/ssl_tls13_client.c
+++ b/library/ssl_tls13_client.c
@@ -1925,52 +1925,49 @@
*/
static int ssl_tls13_parse_new_session_ticket( mbedtls_ssl_context *ssl,
unsigned char *buf,
- unsigned char *end )
+ unsigned char *end,
+ unsigned char **ticket_nonce,
+ size_t *ticket_nonce_len )
{
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
unsigned char *p = buf;
mbedtls_ssl_session *session = ssl->session;
- size_t ticket_nonce_len;
- unsigned char *ticket_nonce;
size_t ticket_len;
unsigned char *ticket;
size_t extensions_len;
- const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
- psa_algorithm_t psa_hash_alg;
- int hash_length;
+ *ticket_nonce = NULL;
+ *ticket_nonce_len = 0;
/*
* ticket_lifetime 4 bytes
* ticket_age_add 4 bytes
* ticket_nonce >=1 byte
- * ticket >=2 bytes
- * extensions >=2 bytes
*/
- MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 13);
+ MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 9 );
session->ticket_lifetime = MBEDTLS_GET_UINT32_BE( p, 0 );
- p += 4;
MBEDTLS_SSL_DEBUG_MSG( 3,
( "ticket->lifetime: %u",
( unsigned int )session->ticket_lifetime ) );
- session->ticket_age_add = MBEDTLS_GET_UINT32_BE( p, 0 );
- p += 4;
+ session->ticket_age_add = MBEDTLS_GET_UINT32_BE( p, 4 );
MBEDTLS_SSL_DEBUG_MSG( 3,
( "ticket->ticket_age_add: %u",
( unsigned int )session->ticket_age_add ) );
- ticket_nonce_len = *p++;
- MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, ticket_nonce_len );
- ticket_nonce = p;
- MBEDTLS_SSL_DEBUG_BUF( 3, "ticket_nonce:", ticket_nonce, ticket_nonce_len );
- p += ticket_nonce_len;
+ *ticket_nonce_len = p[8];
+ p += 9;
+
+ MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, *ticket_nonce_len );
+ *ticket_nonce = p;
+ MBEDTLS_SSL_DEBUG_BUF( 3, "ticket_nonce:", *ticket_nonce, *ticket_nonce_len );
+ p += *ticket_nonce_len;
/* Ticket */
+ MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
ticket_len = MBEDTLS_GET_UINT16_BE( p, 0 );
p += 2;
MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, ticket_len );
-
MBEDTLS_SSL_DEBUG_BUF( 3, "received ticket", p, ticket_len ) ;
/* Check if we previously received a ticket already. */
@@ -1992,6 +1989,7 @@
session->ticket_len = ticket_len;
MBEDTLS_SSL_DEBUG_BUF( 4, "stored ticket", ticket, ticket_len );
+ MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
extensions_len = MBEDTLS_GET_UINT16_BE( p, 0 );
p += 2;
MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, extensions_len );
@@ -2008,6 +2006,24 @@
}
p += extensions_len;
+#if defined(MBEDTLS_HAVE_TIME)
+ /* Store ticket creation time */
+ session->ticket_received = time( NULL );
+#endif
+
+ return( 0 );
+}
+
+static int ssl_tls13_postprocess_new_session_ticket( mbedtls_ssl_context *ssl,
+ unsigned char *ticket_nonce,
+ size_t ticket_nonce_len )
+{
+ int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
+ mbedtls_ssl_session *session = ssl->session;
+ const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
+ psa_algorithm_t psa_hash_alg;
+ int hash_length;
+
/* Compute PSK based on received nonce and resumption_master_secret
* in the following style:
*
@@ -2059,16 +2075,6 @@
session->key,
session->key_len );
-#if defined(MBEDTLS_HAVE_TIME)
- /* Store ticket creation time */
- session->ticket_received = time( NULL );
-#endif
-
- return( 0 );
-}
-
-static int ssl_tls13_postprocess_new_session_ticket( mbedtls_ssl_context *ssl )
-{
mbedtls_ssl_handshake_set_state( ssl, MBEDTLS_SSL_HANDSHAKE_OVER );
return( 0 );
}
@@ -2081,6 +2087,8 @@
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
unsigned char *buf;
size_t buf_len;
+ unsigned char *ticket_nonce;
+ size_t ticket_nonce_len;
MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) );
@@ -2088,11 +2096,12 @@
ssl, MBEDTLS_SSL_HS_NEW_SESSION_TICKET,
&buf, &buf_len ) );
- MBEDTLS_SSL_PROC_CHK( ssl_tls13_parse_new_session_ticket( ssl,
- buf,
- buf + buf_len ) );
+ MBEDTLS_SSL_PROC_CHK( ssl_tls13_parse_new_session_ticket(
+ ssl, buf, buf + buf_len,
+ &ticket_nonce, &ticket_nonce_len ) );
- MBEDTLS_SSL_PROC_CHK( ssl_tls13_postprocess_new_session_ticket( ssl ) );
+ MBEDTLS_SSL_PROC_CHK( ssl_tls13_postprocess_new_session_ticket(
+ ssl, ticket_nonce, ticket_nonce_len ) );
cleanup: