#ifdef __cplusplus extern "C" { #endif #include <unistd.h> #include <stdlib.h> #include "mypkcs11.h" #include "cackey-chrome.h" struct cackey_chrome_id { unsigned char *id; size_t idLen; }; static CK_FUNCTION_LIST_PTR moduleFunctionList = NULL; static CK_RV cackey_chrome_init(void) { CK_C_INITIALIZE_ARGS initargs; CK_RV chk_rv; if (moduleFunctionList != NULL) { return(CKR_OK); } chk_rv = C_GetFunctionList(&moduleFunctionList); if (chk_rv != CKR_OK) { return(chk_rv); } initargs.CreateMutex = NULL; initargs.DestroyMutex = NULL; initargs.LockMutex = NULL; initargs.UnlockMutex = NULL; initargs.flags = CKF_OS_LOCKING_OK; initargs.pReserved = NULL; chk_rv = moduleFunctionList->C_Initialize(&initargs); if (chk_rv != CKR_OK) { return(chk_rv); } return(CKR_OK); } int cackey_chrome_listCertificates(struct cackey_certificate **certificates) { CK_RV chk_rv; CK_ULONG numSlots, currSlot; CK_SLOT_ID_PTR slots; CK_SLOT_INFO slotInfo; CK_SESSION_HANDLE hSession; CK_OBJECT_HANDLE hObject; CK_ULONG ulObjectCount; CK_ATTRIBUTE searchTemplatePrivateKeys[] = { {CKA_CLASS, NULL, sizeof(CK_OBJECT_CLASS)} }; CK_ATTRIBUTE searchTemplateCertificates[] = { {CKA_CLASS, NULL, sizeof(CK_OBJECT_CLASS)}, {CKA_ID, NULL, 0} }; CK_ATTRIBUTE attrTemplate[] = { {CKA_ID, NULL, 0} }, *currAttr; CK_ULONG currAttrIndex; CK_OBJECT_CLASS objectClassPrivateKey = CKO_PRIVATE_KEY; chk_rv = cackey_chrome_init(); if (chk_rv != CKR_OK) { return(0); } chk_rv = moduleFunctionList->C_GetSlotList(FALSE, NULL, &numSlots); if (chk_rv != CKR_OK) { return(0); } slots = malloc(sizeof(*slots) * numSlots); chk_rv = moduleFunctionList->C_GetSlotList(FALSE, slots, &numSlots); if (chk_rv != CKR_OK) { return(0); } searchTemplatePrivateKeys[0].pValue = &objectClassPrivateKey; for (currSlot = 0; currSlot < numSlots; currSlot++) { chk_rv = moduleFunctionList->C_GetSlotInfo(slots[currSlot], &slotInfo); if (chk_rv != CKR_OK) { continue; } if ((slotInfo.flags & CKF_TOKEN_PRESENT) != CKF_TOKEN_PRESENT) { continue; } chk_rv = moduleFunctionList->C_OpenSession(slots[currSlot], CKF_SERIAL_SESSION, NULL, NULL, &hSession); if (chk_rv != CKR_OK) { continue; } chk_rv = moduleFunctionList->C_FindObjectsInit(hSession, searchTemplatePrivateKeys, sizeof(searchTemplatePrivateKeys) / sizeof(searchTemplatePrivateKeys[0])); if (chk_rv != CKR_OK) { moduleFunctionList->C_CloseSession(hSession); continue; } while (1) { chk_rv = moduleFunctionList->C_FindObjects(hSession, &hObject, 1, &ulObjectCount); if (chk_rv != CKR_OK) { break; } if (ulObjectCount == 0) { break; } if (ulObjectCount != 1) { break; } for (currAttrIndex = 0; currAttrIndex < (sizeof(attrTemplate) / sizeof(attrTemplate[0])); currAttrIndex++) { currAttr = &attrTemplate[currAttrIndex]; currAttr->pValue = NULL; currAttr->ulValueLen = 0; } chk_rv = C_GetAttributeValue(hSession, hObject, attrTemplate, sizeof(attrTemplate) / sizeof(attrTemplate[0])); if (chk_rv == CKR_ATTRIBUTE_TYPE_INVALID || chk_rv == CKR_ATTRIBUTE_SENSITIVE || chk_rv == CKR_BUFFER_TOO_SMALL) { chk_rv = CKR_OK; } if (chk_rv != CKR_OK) { continue; } for (currAttrIndex = 0; currAttrIndex < (sizeof(attrTemplate) / sizeof(attrTemplate[0])); currAttrIndex++) { currAttr = &attrTemplate[currAttrIndex]; if (currAttr->ulValueLen == 0) { continue; } if (((CK_LONG) currAttr->ulValueLen) == ((CK_LONG) -1)) { continue; } currAttr->pValue = malloc(currAttr->ulValueLen); } chk_rv = C_GetAttributeValue(hSession, hObject, attrTemplate, sizeof(attrTemplate) / sizeof(attrTemplate[0])); if (chk_rv != CKR_OK) { continue; } } moduleFunctionList->C_FindObjectsFinal(hSession); moduleFunctionList->C_CloseSession(hSession); } return(0); } #ifdef __cplusplus } #endif