-/**
- * TLS session resumption callbacks (server-side)
- */
-#define MAX_SESSION_ID 32
-#define MAX_SESSION_DATA 1024
-
-typedef struct saved_session_t
-{
- char id[MAX_SESSION_ID];
- char data[MAX_SESSION_DATA];
-
- unsigned i_idlen;
- unsigned i_datalen;
-} saved_session_t;
-
-
-static int cb_store( void *p_server, gnutls_datum key, gnutls_datum data )
-{
- tls_server_sys_t *p_sys = ((tls_server_t *)p_server)->p_sys;
-
- if( ( p_sys->i_cache_size == 0 )
- || ( key.size > MAX_SESSION_ID )
- || ( data.size > MAX_SESSION_DATA ) )
- return -1;
-
- vlc_mutex_lock( &p_sys->cache_lock );
-
- memcpy( p_sys->p_store->id, key.data, key.size);
- memcpy( p_sys->p_store->data, data.data, data.size );
- p_sys->p_store->i_idlen = key.size;
- p_sys->p_store->i_datalen = data.size;
-
- p_sys->p_store++;
- if( ( p_sys->p_store - p_sys->p_cache ) == p_sys->i_cache_size )
- p_sys->p_store = p_sys->p_cache;
-
- vlc_mutex_unlock( &p_sys->cache_lock );
-
- return 0;
-}
-
-
-static gnutls_datum cb_fetch( void *p_server, gnutls_datum key )
-{
- static const gnutls_datum_t err_datum = { NULL, 0 };
- tls_server_sys_t *p_sys = ((tls_server_t *)p_server)->p_sys;
- saved_session_t *p_session, *p_end;
-
- p_session = p_sys->p_cache;
- p_end = p_session + p_sys->i_cache_size;
-
- vlc_mutex_lock( &p_sys->cache_lock );
-
- while( p_session < p_end )
- {
- if( ( p_session->i_idlen == key.size )
- && !memcmp( p_session->id, key.data, key.size ) )
- {
- gnutls_datum_t data;
-
- data.size = p_session->i_datalen;
-
- data.data = gnutls_malloc( data.size );
- if( data.data == NULL )
- {
- vlc_mutex_unlock( &p_sys->cache_lock );
- return err_datum;
- }
-
- memcpy( data.data, p_session->data, data.size );
- vlc_mutex_unlock( &p_sys->cache_lock );
- return data;
- }
- p_session++;
- }
-
- vlc_mutex_unlock( &p_sys->cache_lock );
-
- return err_datum;
-}
-
-
-static int cb_delete( void *p_server, gnutls_datum key )
-{
- tls_server_sys_t *p_sys = ((tls_server_t *)p_server)->p_sys;
- saved_session_t *p_session, *p_end;
-
- p_session = p_sys->p_cache;
- p_end = p_session + p_sys->i_cache_size;
-
- vlc_mutex_lock( &p_sys->cache_lock );
-
- while( p_session < p_end )
- {
- if( ( p_session->i_idlen == key.size )
- && !memcmp( p_session->id, key.data, key.size ) )
- {
- p_session->i_datalen = p_session->i_idlen = 0;
- vlc_mutex_unlock( &p_sys->cache_lock );
- return 0;
- }
- p_session++;
- }
-
- vlc_mutex_unlock( &p_sys->cache_lock );
-
- return -1;
-}
-
-