in source/core_pkcs11.c [176:249]
CK_RV xInitializePkcs11Token( void )
{
CK_RV xResult = CKR_OK;
CK_FUNCTION_LIST_PTR pxFunctionList = NULL;
CK_SLOT_ID * pxSlotId = NULL;
CK_ULONG xSlotCount;
CK_FLAGS xTokenFlags = 0;
CK_TOKEN_INFO_PTR pxTokenInfo = NULL;
xResult = C_GetFunctionList( &pxFunctionList );
if( ( pxFunctionList == NULL ) || ( pxFunctionList->C_GetTokenInfo == NULL ) || ( pxFunctionList->C_InitToken == NULL ) )
{
xResult = CKR_FUNCTION_FAILED;
}
if( xResult == CKR_OK )
{
xResult = xInitializePKCS11();
}
if( ( xResult == CKR_OK ) || ( xResult == CKR_CRYPTOKI_ALREADY_INITIALIZED ) )
{
xResult = xGetSlotList( &pxSlotId, &xSlotCount );
}
if( ( xResult == CKR_OK ) &&
( NULL != pxFunctionList->C_GetTokenInfo ) &&
( NULL != pxFunctionList->C_InitToken ) )
{
/* Check if the token requires further initialization. */
pxTokenInfo = pkcs11configPKCS11_MALLOC( sizeof( CK_TOKEN_INFO ) );
if( pxTokenInfo != NULL )
{
/* We will take the first slot available. If your application
* has multiple slots, insert logic for selecting an appropriate
* slot here.
*/
xResult = pxFunctionList->C_GetTokenInfo( pxSlotId[ 0 ], pxTokenInfo );
}
else
{
xResult = CKR_HOST_MEMORY;
}
if( CKR_OK == xResult )
{
xTokenFlags = pxTokenInfo->flags;
}
if( ( CKR_OK == xResult ) && ( ( CKF_TOKEN_INITIALIZED & xTokenFlags ) != CKF_TOKEN_INITIALIZED ) )
{
/* Initialize the token if it is not already. */
xResult = pxFunctionList->C_InitToken( pxSlotId[ 0 ],
( CK_UTF8CHAR_PTR ) pkcs11configPKCS11_DEFAULT_USER_PIN,
sizeof( pkcs11configPKCS11_DEFAULT_USER_PIN ) - 1UL,
( CK_UTF8CHAR_PTR ) "FreeRTOS" );
}
}
if( pxTokenInfo != NULL )
{
pkcs11configPKCS11_FREE( pxTokenInfo );
}
if( pxSlotId != NULL )
{
pkcs11configPKCS11_FREE( pxSlotId );
}
return xResult;
}