summaryrefslogtreecommitdiff
path: root/ckcapi-object.h
diff options
context:
space:
mode:
Diffstat (limited to 'ckcapi-object.h')
-rw-r--r--ckcapi-object.h123
1 files changed, 123 insertions, 0 deletions
diff --git a/ckcapi-object.h b/ckcapi-object.h
new file mode 100644
index 0000000..98451f6
--- /dev/null
+++ b/ckcapi-object.h
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2007 Stef Walter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef CKCAPI_OBJECT_H
+#define CKCAPI_OBJECT_H
+
+#include "ckcapi.h"
+
+/* Debug print something about an object */
+#define DBGO(obj, msg) \
+ ckcapi_debug("O%d: %s", (obj) ? (obj)->id : 0, (msg))
+
+/* A function to load data for an object */
+typedef CK_RV (*CkCapiLoadData)(CkCapiSession* sess, struct _CkCapiObject* obj,
+ CkCapiObjectData** objdata);
+
+/* A function to free some data */
+typedef void (*CkCapiRelease)(void* data);
+
+/* Object functions */
+typedef struct _CkCapiObjectVtable
+{
+ CkCapiLoadData load_data;
+ CkCapiRelease release;
+}
+CkCapiObjectVtable;
+
+/* Represents a object we've seen */
+struct _CkCapiObject
+{
+ CK_OBJECT_HANDLE id;
+ CK_SLOT_ID slot;
+ CK_SESSION_HANDLE session;
+ const CkCapiObjectVtable* obj_funcs;
+ void* unique_key;
+ size_t unique_len;
+};
+
+/* A function to get an attribute from ObjectData */
+typedef CK_RV (*CkCapiGetAttribute)(CkCapiObjectData* objdata, CK_ATTRIBUTE_PTR attr);
+
+/* Object data functions */
+typedef struct _CkCapiObjectDataVtable
+{
+ CkCapiGetAttribute get_bool;
+ CkCapiGetAttribute get_ulong;
+ CkCapiGetAttribute get_bytes;
+ CkCapiGetAttribute get_date;
+ CkCapiRelease release;
+}
+CkCapiObjectDataVtable;
+
+/*
+ * Base class for object data. Different types of
+ * objects extend this with more detailed data
+ */
+struct _CkCapiObjectData
+{
+ CK_OBJECT_HANDLE object;
+ const CkCapiObjectDataVtable* data_funcs;
+};
+
+/* Match object data against all the given match attributes */
+CK_BBOOL ckcapi_object_data_match (CkCapiObjectData* objdata,
+ CK_ATTRIBUTE_PTR matches, CK_ULONG count);
+
+/* Match a single attribute against object data */
+CK_BBOOL ckcapi_object_data_match_attr (CkCapiObjectData* objdata,
+ CK_ATTRIBUTE_PTR match);
+
+/* Get a bunch of attributes from object data */
+CK_RV ckcapi_object_data_get_attrs (CkCapiObjectData* objdata, CK_ATTRIBUTE_PTR attrs,
+ CK_ULONG count);
+
+/* Debug print something about an object data */
+#define DBGOD(objdata, msg) \
+ ckcapi_debug("O%d: %s", (objdata) ? (objdata)->obj : 0, (msg))
+
+/*
+ * Each object has a unique key which guarantees that we're
+ * not loading the same objects over and over again.
+ * Usually these are contiguous members of a struct. These
+ * macros help calculate the address and length of such a
+ * unique key
+ */
+
+/* The unique key starts at the address of the starting struct member */
+#define UNIQUE_KEY_AT(obj, mem) \
+ (void*)(&((obj->mem)))
+
+/* Calculates key length between first and last struct members */
+#define UNIQUE_KEY_LEN(obj, first, last) \
+ UNIQUE_KEY_VAR_LEN(obj, first, last, sizeof(obj->last))
+
+/* Calcs key len between first and a certain num of bytes past last struct member */
+#define UNIQUE_KEY_VAR_LEN(obj, first, last, len) \
+ ((((char*)&((obj->last))) - ((char*)&((obj->first)))) + (len))
+
+/* Used internally to have a unique id for different object types */
+enum
+{
+ OBJECT_CERT = 1,
+ OBJECT_BUILTIN = 2,
+ OBJECT_TRUST = 3
+};
+
+#endif /* CKCAPI_OBJECT_H */