void TestSessionKeyTableAPI( CuTest* tc ) { dssl_SessionKeyTable* tbl = NULL; DSSL_Session* sess = NULL; DSSL_SessionKeyData* kd = NULL; tbl = dssl_SessionKT_Create( 100, TEST_CACHE_TIMEOUT ); CuAssert( tc, "SessionKeyTable object should be not NULL", tbl != NULL ); sess = (DSSL_Session*) malloc( sizeof( DSSL_Session ) ); CuAssert( tc, "DSSL_Session object should be not NULL", sess != NULL ); memset( sess, 0, sizeof(*sess) ); dssl_SessionKT_Add( tbl, sess ); CuAssertTrue( tc, tbl->count == 1 ); kd = dssl_SessionKT_Find( tbl, sess->session_id ); CuAssertTrue( tc, kd != NULL ); CuAssertTrue( tc, kd->refcount == 1 ); CuAssertTrue( tc, kd->released_time == 0 ); kd = NULL; dssl_SessionKT_Release( tbl, sess->session_id ); ThreadSleep( (TEST_CACHE_TIMEOUT+1)*1000 ); dssl_SessionKT_CleanSessionCache( tbl ); CuAssertTrue( tc, tbl->count == 0 ); free( sess ); dssl_SessionKT_Destroy( tbl ); }
int ssls_lookup_session( DSSL_Session* sess ) { DSSL_SessionKeyData* sess_data = NULL; _ASSERT( sess ); _ASSERT( sess->env ); if( sess->env->session_cache ) { sess_data = dssl_SessionKT_Find( sess->env->session_cache, sess->session_id ); } if( !sess_data ) return NM_ERROR( DSSL_E_SSL_SESSION_NOT_IN_CACHE ); dssl_SessionKT_AddRef( sess_data ); memcpy( sess->master_secret, sess_data->master_secret, SSL3_MASTER_SECRET_SIZE ); sess->master_key_len = sess_data->master_secret_len; if(sess->version == SSL2_VERSION) { memcpy(sess->ssl2_key_arg, sess_data->ssl2_key_arg, SSL2_KEYARG_MAX_LEN ); sess->ssl2_key_arg_len = sess_data->ssl2_key_arg_length; sess->cipher_suite = sess_data->ssl2_cipher_suite; } return DSSL_RC_OK; }
void dssl_SessionKT_Release( dssl_SessionKeyTable* tbl, u_char* session_id ) { DSSL_SessionKeyData* sess_data = dssl_SessionKT_Find( tbl, session_id ); if( sess_data ) { sess_data->refcount--; if(sess_data->refcount == 0 ) { time( &sess_data->released_time ); } } }
void ssls_store_session( DSSL_Session* sess ) { DSSL_SessionKeyData* sess_data = NULL; _ASSERT( sess ); _ASSERT( sess->env ); if( !sess->env->session_cache ) return; sess_data = dssl_SessionKT_Find( sess->env->session_cache, sess->session_id ); if( sess_data ) { memcpy( sess_data->master_secret, sess->master_secret, SSL3_MASTER_SECRET_SIZE ); sess_data->master_secret_len = sess->master_key_len; } else { dssl_SessionKT_Add( sess->env->session_cache, sess ); } }