Start adding ticket keys (only key_name for now)
diff --git a/include/polarssl/ssl.h b/include/polarssl/ssl.h
index 5596cc1..b51cc87 100644
--- a/include/polarssl/ssl.h
+++ b/include/polarssl/ssl.h
@@ -328,6 +328,7 @@
 typedef struct _ssl_context ssl_context;
 typedef struct _ssl_transform ssl_transform;
 typedef struct _ssl_handshake_params ssl_handshake_params;
+typedef struct _ssl_ticket_keys ssl_ticket_keys;
 
 /*
  * This structure is used for storing current session data.
@@ -445,6 +446,14 @@
     int new_session_ticket;             /*!< use NewSessionTicket?    */
 };
 
+/*
+ * Parameters needed to secure session tickets
+ */
+struct _ssl_ticket_keys
+{
+    unsigned char key_name[16];     /*!< name to quickly discard bad tickets */
+};
+
 struct _ssl_context
 {
     /*
@@ -554,6 +563,11 @@
 #endif /* POLARSSL_X509_PARSE_C */
 
     /*
+     * Support for generating and checking session tickets
+     */
+    ssl_ticket_keys *ticket_keys;       /*!<  keys for ticket encryption */
+
+    /*
      * User settings
      */
     int endpoint;                       /*!<  0: client, 1: server    */
diff --git a/library/ssl_srv.c b/library/ssl_srv.c
index 5b7db17..1178309 100644
--- a/library/ssl_srv.c
+++ b/library/ssl_srv.c
@@ -165,7 +165,10 @@
     unsigned char *p = start;
     size_t clear_len, enc_len;
 
-    memset( p, 0, 16 ); // TODO: key_name
+    if( ssl->ticket_keys == NULL )
+        return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
+
+    memcpy( p, ssl->ticket_keys->key_name, 16 );
     p += 16;
 
     memset( p, 0, 16 ); // TODO: iv
@@ -208,7 +211,7 @@
     const unsigned char *mac;
     size_t enc_len, clear_len;
 
-    if( len < 34 )
+    if( len < 34 || ssl->ticket_keys == NULL )
         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
 
     enc_len = ( enc_len_p[0] << 8 ) | enc_len_p[1];
@@ -217,8 +220,8 @@
     if( len != enc_len + 66 )
         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
 
-    // TODO: check key_name
-    (void) key_name;
+    if( memcmp( key_name, ssl->ticket_keys->key_name, 16 ) != 0 )
+        return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
 
     // TODO: check hmac
     (void) mac;
diff --git a/library/ssl_tls.c b/library/ssl_tls.c
index f7b9bd9..f4d6e24 100644
--- a/library/ssl_tls.c
+++ b/library/ssl_tls.c
@@ -2973,6 +2973,28 @@
 }
 
 /*
+ * Allocate and initialize ticket keys
+ */
+static int ssl_ticket_keys_init( ssl_context *ssl )
+{
+    int ret;
+    ssl_ticket_keys *tkeys;
+
+    if( ssl->ticket_keys != NULL )
+        return( 0 );
+
+    if( ( tkeys = polarssl_malloc( sizeof( ssl_ticket_keys ) ) ) == NULL )
+        return( POLARSSL_ERR_SSL_MALLOC_FAILED );
+
+    if( ( ret = ssl->f_rng( ssl->p_rng, tkeys->key_name, 16 ) ) != 0 )
+        return( ret );
+
+    ssl->ticket_keys = tkeys;
+
+    return( 0 );
+}
+
+/*
  * SSL set accessors
  */
 void ssl_set_endpoint( ssl_context *ssl, int endpoint )
@@ -3232,7 +3254,13 @@
 {
     ssl->session_tickets = use_tickets;
 
-    return( 0 );
+    if( ssl->endpoint == SSL_IS_CLIENT )
+        return( 0 );
+
+    if( ssl->f_rng == NULL )
+        return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
+
+    return( ssl_ticket_keys_init( ssl ) );
 }
 
 /*
@@ -3671,6 +3699,8 @@
         polarssl_free( ssl->session );
     }
 
+    polarssl_free( ssl->ticket_keys );
+
     if ( ssl->hostname != NULL)
     {
         memset( ssl->hostname, 0, ssl->hostname_len );