in components/pkcs11_pal/source/core_pkcs11_pal.c [441:496]
CK_RV PKCS11_PAL_DestroyObject( CK_OBJECT_HANDLE xHandle )
{
CK_RV xResult = CKR_OK;
CK_BYTE_PTR pxZeroedData = NULL;
CK_BYTE_PTR pxObject = NULL;
CK_BBOOL xIsPrivate = ( CK_BBOOL ) CK_TRUE;
CK_OBJECT_HANDLE xPalHandle2 = CK_INVALID_HANDLE;
CK_ULONG ulObjectLength = sizeof( CK_BYTE );
char * pcLabel = NULL;
CK_ATTRIBUTE xLabel;
prvHandleToLabel( &pcLabel, xHandle );
if( pcLabel != NULL )
{
xLabel.type = CKA_LABEL;
xLabel.pValue = pcLabel;
xLabel.ulValueLen = strlen( pcLabel );
xResult = PKCS11_PAL_GetObjectValue( xHandle, &pxObject, &ulObjectLength, &xIsPrivate );
}
else
{
xResult = CKR_OBJECT_HANDLE_INVALID;
}
if( xResult == CKR_OK )
{
/* Some ports return a pointer to memory for which using memset directly won't work. */
pxZeroedData = pvPortMalloc( ulObjectLength * sizeof( CK_BYTE ) );
if( NULL != pxZeroedData )
{
/* Zero out the object. */
( void ) memset( pxZeroedData, 0x0, ulObjectLength );
/* Create an object label attribute. */
/* Overwrite the object in NVM with zeros. */
xPalHandle2 = PKCS11_PAL_SaveObject( &xLabel, pxZeroedData, ( size_t ) ulObjectLength );
if( xPalHandle2 != xHandle )
{
xResult = CKR_GENERAL_ERROR;
}
vPortFree( pxZeroedData );
}
else
{
xResult = CKR_HOST_MEMORY;
}
PKCS11_PAL_GetObjectValueCleanup( pxObject, ulObjectLength );
}
return xResult;
}