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 );
}
Beispiel #2
0
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 );
		}
	}
}
Beispiel #4
0
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 );
	}
}