summaryrefslogtreecommitdiff
path: root/ckcapi.h
diff options
context:
space:
mode:
Diffstat (limited to 'ckcapi.h')
-rw-r--r--ckcapi.h160
1 files changed, 160 insertions, 0 deletions
diff --git a/ckcapi.h b/ckcapi.h
new file mode 100644
index 0000000..6442a8d
--- /dev/null
+++ b/ckcapi.h
@@ -0,0 +1,160 @@
+#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 <windows.h>
+
+#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 */
+