Opens a connection between an application and a particular token or sets up an application callback for token insertion.
CK_FLAGS flags,
CK_VOID_PTR pApplication,
CK_NOTIFY Notify,
CK_SESSION_HANDLE_PTR phSession )
{
CK_RV xResult = CKR_OK;
uint32_t ulSessionCount = 0;
( void ) ( slotID );
( void ) ( pApplication );
( void ) Notify;
{
xResult = CKR_CRYPTOKI_NOT_INITIALIZED;
}
if( NULL == phSession )
{
xResult = CKR_ARGUMENTS_BAD;
}
if( ( CKR_OK == xResult ) && ( 0UL == ( CKF_SERIAL_SESSION & flags ) ) )
{
xResult = CKR_SESSION_PARALLEL_NOT_SUPPORTED;
}
if( CKR_OK == xResult )
{
{
for( ulSessionCount = 0; ulSessionCount < pkcs11configMAX_SESSIONS; ++ulSessionCount )
{
if(
pxP11Sessions[ ulSessionCount ].xOpened == ( CK_BBOOL ) CK_FALSE )
{
xResult = CKR_OK;
pxSessionObj->
xOpened = ( CK_BBOOL ) CK_TRUE;
break;
}
else
{
xResult = CKR_SESSION_COUNT;
}
}
}
else
{
xResult = CKR_FUNCTION_FAILED;
}
if( CKR_OK == xResult )
{
pxSessionObj->
xSignMutex = xSemaphoreCreateMutex();
{
xResult = CKR_HOST_MEMORY;
}
{
xResult = CKR_HOST_MEMORY;
}
}
}
if( CKR_OK == xResult )
{
( 0UL != ( flags & CKF_RW_SESSION ) ) ? CKS_RW_PUBLIC_SESSION : CKS_RO_PUBLIC_SESSION;
}
if( CKR_OK == xResult )
{
}
if( CKR_OK != xResult )
{
PKCS11_PRINT( (
"Failed to open a new session with error %d \r\n", xResult ) );
if( pxSessionObj != NULL )
{
{
}
{
}
*phSession = CK_INVALID_HANDLE;
}
}
else
{
++ulSessionCount;
*phSession = ulSessionCount;
}
return xResult;
}