Adapt prototypes of ticket handling functions

This is an intermediate step. The ssl_config argument will be replace by a
ticket context next.
diff --git a/library/ssl_ticket.c b/library/ssl_ticket.c
index 6709c68..5ce7a35 100644
--- a/library/ssl_ticket.c
+++ b/library/ssl_ticket.c
@@ -39,11 +39,6 @@
 
 #include <string.h>
 
-/* Implementation that should never be optimized out by the compiler */
-static void mbedtls_zeroize( void *v, size_t n ) {
-    volatile unsigned char *p = v; while( n-- ) *p++ = 0;
-}
-
 /*
  * Serialize a session in the following format:
  *  0   .   n-1     session structure, n = sizeof(mbedtls_ssl_session)
@@ -167,10 +162,13 @@
  *
  * (the internal state structure differs, however).
  */
-int mbedtls_ssl_ticket_write( mbedtls_ssl_context *ssl, size_t *tlen )
+int mbedtls_ssl_ticket_write( const mbedtls_ssl_config *conf,
+                              const mbedtls_ssl_session *session,
+                              unsigned char *start,
+                              const unsigned char *end,
+                              size_t *tlen )
 {
     int ret;
-    unsigned char * const start = ssl->out_msg + 10;
     unsigned char *p = start;
     unsigned char *state;
     unsigned char iv[16];
@@ -178,32 +176,29 @@
 
     *tlen = 0;
 
-    if( ssl->conf->ticket_keys == NULL )
+    if( conf->ticket_keys == NULL )
         return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
 
+    /* We need at least 16 bytes for key_name, 16 for IV, 2 for len
+     * 16 for padding, 32 for MAC, in addition to session itself,
+     * that will be checked when writing it. */
+    if( end - start < 16 + 16 + 2 + 16 + 32 )
+        return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
+
     /* Write key name */
-    memcpy( p, ssl->conf->ticket_keys->key_name, 16 );
+    memcpy( p, conf->ticket_keys->key_name, 16 );
     p += 16;
 
     /* Generate and write IV (with a copy for aes_crypt) */
-    if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 16 ) ) != 0 )
+    if( ( ret = conf->f_rng( conf->p_rng, p, 16 ) ) != 0 )
         return( ret );
     memcpy( iv, p, 16 );
     p += 16;
 
-    /*
-     * Dump session state
-     *
-     * After the session state itself, we still need room for 16 bytes of
-     * padding and 32 bytes of MAC, so there's only so much room left
-     */
+    /* Dump session state */
     state = p + 2;
-    if( ssl_save_session( ssl->session_negotiate, state,
-                          MBEDTLS_SSL_MAX_CONTENT_LEN - ( state - ssl->out_msg ) - 48,
-                          &clear_len ) != 0 )
-    {
-        return( MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE );
-    }
+    if( ssl_save_session( session, state, end - state, &clear_len ) != 0 )
+        return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
 
     /* Apply PKCS padding */
     pad_len = 16 - clear_len % 16;
@@ -212,7 +207,7 @@
         state[i] = (unsigned char) pad_len;
 
     /* Encrypt */
-    if( ( ret = mbedtls_aes_crypt_cbc( &ssl->conf->ticket_keys->enc, MBEDTLS_AES_ENCRYPT,
+    if( ( ret = mbedtls_aes_crypt_cbc( &conf->ticket_keys->enc, MBEDTLS_AES_ENCRYPT,
                                enc_len, iv, state, state ) ) != 0 )
     {
         return( ret );
@@ -225,7 +220,7 @@
 
     /* Compute and write MAC( key_name + iv + enc_state_len + enc_state ) */
     if( ( ret = mbedtls_md_hmac( mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ),
-                         ssl->conf->ticket_keys->mac_key, 16,
+                         conf->ticket_keys->mac_key, 16,
                          start, p - start, p ) ) != 0 )
     {
         return( ret );
@@ -240,12 +235,12 @@
 /*
  * Load session ticket (see mbedtls_ssl_ticket_write for structure)
  */
-int mbedtls_ssl_ticket_parse( mbedtls_ssl_context *ssl,
-                             unsigned char *buf,
-                             size_t len )
+int mbedtls_ssl_ticket_parse( const mbedtls_ssl_config *conf,
+                              mbedtls_ssl_session *session,
+                              unsigned char *buf,
+                              size_t len )
 {
     int ret;
-    mbedtls_ssl_session session;
     unsigned char *key_name = buf;
     unsigned char *iv = buf + 16;
     unsigned char *enc_len_p = iv + 16;
@@ -255,7 +250,7 @@
     size_t enc_len, clear_len, i;
     unsigned char pad_len, diff;
 
-    if( len < 34 || ssl->conf->ticket_keys == NULL )
+    if( len < 34 || conf->ticket_keys == NULL )
         return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
 
     enc_len = ( enc_len_p[0] << 8 ) | enc_len_p[1];
@@ -267,12 +262,12 @@
     /* Check name, in constant time though it's not a big secret */
     diff = 0;
     for( i = 0; i < 16; i++ )
-        diff |= key_name[i] ^ ssl->conf->ticket_keys->key_name[i];
+        diff |= key_name[i] ^ conf->ticket_keys->key_name[i];
     /* don't return yet, check the MAC anyway */
 
     /* Check mac, with constant-time buffer comparison */
     if( ( ret = mbedtls_md_hmac( mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ),
-                         ssl->conf->ticket_keys->mac_key, 16,
+                         conf->ticket_keys->mac_key, 16,
                          buf, len - 32, computed_mac ) ) != 0 )
     {
         return( ret );
@@ -287,7 +282,7 @@
         return( MBEDTLS_ERR_SSL_INVALID_MAC );
 
     /* Decrypt */
-    if( ( ret = mbedtls_aes_crypt_cbc( &ssl->conf->ticket_keys->dec, MBEDTLS_AES_DECRYPT,
+    if( ( ret = mbedtls_aes_crypt_cbc( &conf->ticket_keys->dec, MBEDTLS_AES_DECRYPT,
                                enc_len, iv, ticket, ticket ) ) != 0 )
     {
         return( ret );
@@ -306,34 +301,15 @@
     clear_len = enc_len - pad_len;
 
     /* Actually load session */
-    if( ( ret = ssl_load_session( &session, ticket, clear_len ) ) != 0 )
-    {
-        mbedtls_ssl_session_free( &session );
+    if( ( ret = ssl_load_session( session, ticket, clear_len ) ) != 0 )
         return( ret );
-    }
 
 #if defined(MBEDTLS_HAVE_TIME)
     /* Check if still valid */
-    if( (int) ( time( NULL) - session.start ) > ssl->conf->ticket_lifetime )
-    {
-        mbedtls_ssl_session_free( &session );
+    if( (int) ( time( NULL) - session->start ) > conf->ticket_lifetime )
         return( MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED );
-    }
 #endif
 
-    /*
-     * Keep the session ID sent by the client, since we MUST send it back to
-     * inform him we're accepting the ticket  (RFC 5077 section 3.4)
-     */
-    session.length = ssl->session_negotiate->length;
-    memcpy( &session.id, ssl->session_negotiate->id, session.length );
-
-    mbedtls_ssl_session_free( ssl->session_negotiate );
-    memcpy( ssl->session_negotiate, &session, sizeof( mbedtls_ssl_session ) );
-
-    /* Zeroize instead of free as we copied the content */
-    mbedtls_zeroize( &session, sizeof( mbedtls_ssl_session ) );
-
     return( 0 );
 }