in components/ota_pal/source/ota_pal.c [376:459]
static CK_RV prvGetCertificate(const char *pcLabelName,
uint8_t **ppucData,
uint32_t *pulDataSize)
{
/* Find the certificate */
CK_OBJECT_HANDLE xHandle = 0;
CK_RV xResult;
CK_FUNCTION_LIST_PTR xFunctionList;
CK_SLOT_ID xSlotId;
CK_ULONG xCount = 1;
CK_SESSION_HANDLE xSession;
CK_ATTRIBUTE xTemplate = {0};
uint8_t *pucCert = NULL;
CK_BBOOL xSessionOpen = CK_FALSE;
xResult = C_GetFunctionList(&xFunctionList);
if (CKR_OK == xResult)
{
xResult = xFunctionList->C_Initialize(NULL);
}
if ((CKR_OK == xResult) || (CKR_CRYPTOKI_ALREADY_INITIALIZED == xResult))
{
xResult = xFunctionList->C_GetSlotList(CK_TRUE, &xSlotId, &xCount);
}
if (CKR_OK == xResult)
{
xResult = xFunctionList->C_OpenSession(xSlotId, CKF_SERIAL_SESSION, NULL, NULL, &xSession);
}
if (CKR_OK == xResult)
{
xSessionOpen = CK_TRUE;
xResult = prvGetCertificateHandle(xFunctionList, xSession, pcLabelName, &xHandle);
}
if ((xHandle != 0) && (xResult == CKR_OK)) /* 0 is an invalid handle */
{
/* Get the length of the certificate */
xTemplate.type = CKA_VALUE;
xTemplate.pValue = NULL;
xResult = xFunctionList->C_GetAttributeValue(xSession, xHandle, &xTemplate, xCount);
if (xResult == CKR_OK)
{
pucCert = pvPortMalloc(xTemplate.ulValueLen);
}
if ((xResult == CKR_OK) && (pucCert == NULL))
{
xResult = CKR_HOST_MEMORY;
}
if (xResult == CKR_OK)
{
xTemplate.pValue = pucCert;
xResult = xFunctionList->C_GetAttributeValue(xSession, xHandle, &xTemplate, xCount);
if (xResult == CKR_OK)
{
*ppucData = pucCert;
*pulDataSize = xTemplate.ulValueLen;
}
else
{
vPortFree(pucCert);
}
}
}
else /* Certificate was not found. */
{
*ppucData = NULL;
*pulDataSize = 0;
}
if (xSessionOpen == CK_TRUE)
{
(void)xFunctionList->C_CloseSession(xSession);
}
return xResult;
}