/* Test for PKCS#11 calls. */
#include <stdio.h>
#include <security/cryptoki.h>
#include <security/pkcs11.h>
int main(void)
{
CK_RV ret = C_Initialize(NULL);
if (ret != CKR_OK) {
fprintf(stderr, "Initialize: %lu\n", ret);
return 1;
}
CK_ULONG slot_count;
ret = C_GetSlotList(0, NULL, &slot_count);
if (ret != CKR_OK) {
fprintf(stderr, "GetSlotList(NULL): %lu\n", ret);
return 1;
}
CK_SLOT_ID_PTR slots = malloc(slot_count * sizeof(CK_SLOT_ID));
if (slots == NULL) {
fprintf(stderr, "malloc(slots)\n");
return 1;
}
ret = C_GetSlotList(0, slots, &slot_count);
if (ret != CKR_OK) {
fprintf(stderr, "GetSlotList(slots): %lu\n", ret);
return 1;
}
CK_ULONG i;
for (i = 0; i < slot_count; i++) {
CK_SLOT_ID slot_id = slots[i];
CK_ULONG mech_count;
ret = C_GetMechanismList(slot_id, NULL, &mech_count);
if (ret != CKR_OK) {
fprintf(stderr, "GetMechanismList(NULL): %lu\n", ret);
return 1;
}
CK_MECHANISM_TYPE_PTR mechs = malloc(mech_count * sizeof(CK_MECHANISM_TYPE));
if (slots == NULL) {
fprintf(stderr, "malloc(mechs)\n");
return 1;
}
ret = C_GetMechanismList(slot_id, mechs, &mech_count);
if (ret != CKR_OK) {
fprintf(stderr, "GetMechanismList(mechs): %lu\n", ret);
return 1;
}
free(mechs);
}
free(slots);
C_Finalize(NULL_PTR);
return 0;
}