1. Как найти все сертификаты
/*************************************************************************
* Шаблон для поиска сертификата *
*************************************************************************/
CK_ATTRIBUTE certificateTemplate[] =
{
{ CKA_CLASS, &certificateObject, sizeof(certificateObject) }, // Класс - сертификат
{ CKA_TOKEN, &attributeTrue, sizeof(attributeTrue) }, // Сертификат является объектом токена
{ CKA_PRIVATE, &attributeFalse, sizeof(attributeFalse) }, // Сертификат доступен без аутентификации
{ CKA_CERTIFICATE_TYPE, &certificateType, sizeof(certificateType) }, // Тип сертификата - X.509
{ CKA_CERTIFICATE_CATEGORY, &tokenUserCertificate, sizeof(tokenUserCertificate) }, // Категория сертификата - пользовательский
};
r = findObjects(functionList, session, certificateTemplate, arraysize(certificateTemplate),
&certificates, &objectCount);
2. А затем для найденных объектов в цикле получайте CKA_ID.
Упрощенный код:
for(CK_ULONG i = 0; i < objCount; ++i) {
CK_ATTRIBUTE idAttr = { CKA_ID, NULL_PTR, 0 };
rv = C_GetAttributeValue(session, pObjHandles[i], &idAttr, 1);
if(rv != CKR_OK) break;
std::vector<CK_BYTE> ckId;
ckId.resize(idAttr.ulValueLen);
idAttr.pValue = ckId.data();
rv = functionList->C_GetAttributeValue(session, pObjHandles[i], &idAttr, 1);
if(rv != CKR_OK) break;
}
3. У закрытого ключа, открытого ключа и сертификата одинаковые CKA_ID.
Чтобы найти закртый ключ по CKA_ID сертификата, надо поиска объектов c CKA_CLASS == CKO_CERTIFICATE и получения их CKA_ID, запустить второй поиск, где в качестве шаблона поиска будет CKA_ID ключа и CKA_CLASS == CKO_PRIVATE_KEY.
4. Алгорим сертификата можно найти в информации, которая выдает функция C_EX_GetCertificateInfoText