#ifndef CKCAPI_H #define CKCAPI_H #ifndef ASSERT #include "assert.h" #define ASSERT assert #endif #define WIN32_LEAN_AND_MEAN #define _WIN32_WINNT 0x400 #include #define CRYPTOKI_EXPORTS #include "pkcs11/cryptoki.h" #include "ckcapi-util.h" struct _CkCapiObject; struct _CkCapiSession; /* ------------------------------------------------------------------ * cryptoki-capi.c */ #define DBG(args) \ ckcapi_debug args void ckcapi_debug(const char* msg, ...); void ckcapi_lock_global(void); void ckcapi_unlock_global(void); CK_RV ckcapi_winerr_to_ckr (DWORD werr); /* ------------------------------------------------------------------ * cryptoki-capi-session.c */ /* For operation_type in CkCapiSession */ enum { OPERATION_NONE = 0, OPERATION_FIND = 1, }; typedef void (*CkCapiSessionCancel) (struct _CkCapiSession* sess); typedef struct _CkCapiSession { CK_ULONG id; /* Unique ID for this session */ int in_call; /* Whether this session is use in PKCS#11 function */ int operation_type; /* Whether an operation is happening or not */ void* operation_data; /* Data for this operation */ CkCapiSessionCancel operation_cancel; /* Callback to cancel operation when necessary */ CK_NOTIFY notify_callback; /* Application specified callback */ CK_VOID_PTR user_data; /* Argument for above */ int refs; /* Reference count */ HANDLE mutex; /* Mutex for protecting this structure */ } CkCapiSession; #define DBGS(sess, msg) \ ckcapi_debug("S%d: %s", (sess) ? (sess)->id : 0, (msg)) CkCapiSession* ckcapi_session_create(void); void ckcapi_session_destroy(CkCapiSession* sess); CK_RV ckcapi_session_register(CkCapiSession* sess); CK_RV ckcapi_session_get_lock_ref(CK_ULONG id, int remove, CkCapiSession **sess); void ckcapi_session_unref_unlock(CkCapiSession* sess); void ckcapi_session_close_all(); CK_RV ckcapi_session_find_init (CkCapiSession* sess, CK_ATTRIBUTE_PTR templ, CK_ULONG count); CK_RV ckcapi_session_find (CkCapiSession* sess, CK_OBJECT_HANDLE_PTR objects, CK_ULONG max_object_count, CK_ULONG_PTR object_count); CK_RV ckcapi_session_find_final (CkCapiSession* sess); /* ------------------------------------------------------------------ * ckcapi-object.c */ typedef CK_RV (*CkCapiGetAttribute)(void* obj, CK_ATTRIBUTE_TYPE type, CK_VOID_PTR data, CK_ULONG_PTR len); typedef void (*CkCapiRelease)(void* value); typedef struct _CkCapiObjectDataVtable { CkCapiGetAttribute get_bool; CkCapiGetAttribute get_ulong; CkCapiGetAttribute get_bytes; CkCapiGetAttribute get_date; CkCapiRelease release; } CkCapiObjectDataVtable; typedef struct _CkCapiObjectData { void* data; CkCapiObjectDataVtable data_funcs; } CkCapiObjectData; typedef CK_RV (*CkCapiLoadData)(struct _CkCapiObject* obj, CkCapiObjectData* objdata); typedef struct _CkCapiObjectVtable { CkCapiLoadData load_data; CkCapiRelease release; } CkCapiObjectVtable; typedef struct _CkCapiObject { CK_OBJECT_HANDLE id; void* unique_key; size_t unique_len; CkCapiObjectVtable obj_funcs; CkCapiObjectDataVtable data_funcs; } CkCapiObject; #define DBGO(obj, msg) \ ckcapi_debug("O%d: %s", (obj) ? (obj)->id : 0, (msg)) CkCapiObject* ckcapi_object_lookup (CkCapiSession* sess, CK_OBJECT_HANDLE obj); CK_RV ckcapi_object_register (CkCapiSession* sess, CkCapiObject* obj); CK_RV ckcapi_object_load_data (CkCapiObject* obj, CkCapiObjectData* objdata); CK_RV ckcapi_object_load_data_for (CkCapiSession* sess, CK_OBJECT_HANDLE hand, CkCapiObjectData* objdata); CK_BBOOL ckcapi_object_data_match (CkCapiObjectData* objdata, CK_ATTRIBUTE_PTR matches, CK_ULONG count); CK_BBOOL ckcapi_object_data_match_attr (CkCapiObjectData* objdata, CK_ATTRIBUTE_PTR match); CK_RV ckcapi_object_data_get_attrs (CkCapiObjectData* objdata, CK_ATTRIBUTE_PTR attrs, CK_ULONG count); void ckcapi_object_data_release (CkCapiObjectData* objdata); /* ------------------------------------------------------------------- * ckcapi-cert.c */ CK_RV ckcapi_cert_find_all (CkCapiSession* sess, CK_ATTRIBUTE_PTR match, CK_ULONG count, CkCapiArray* arr); CK_RV ckcapi_cert_find_in_store (CkCapiSession* sess, const char* store_name, CK_ATTRIBUTE_PTR match, CK_ULONG count, CkCapiArray* arr); #endif /* CRYPTOKI_CAPI_H */