summaryrefslogtreecommitdiff
path: root/ckcapi-builtin.c
diff options
context:
space:
mode:
Diffstat (limited to 'ckcapi-builtin.c')
-rw-r--r--ckcapi-builtin.c82
1 files changed, 58 insertions, 24 deletions
diff --git a/ckcapi-builtin.c b/ckcapi-builtin.c
index 0694d15..d31c0b2 100644
--- a/ckcapi-builtin.c
+++ b/ckcapi-builtin.c
@@ -2,6 +2,10 @@
#include "ckcapi.h"
#include "pkcs11/pkcs11n.h"
+/* --------------------------------------------------------------------------
+ * BUILT IN VALUES
+ */
+
static const CK_BBOOL ck_true = CK_TRUE;
static const CK_BBOOL ck_false = CK_FALSE;
@@ -9,6 +13,10 @@ static const CK_OBJECT_CLASS cko_netscape_builtin_root_list = CKO_NETSCAPE_BUILT
static const char ck_root_label[] = "Windows Certificate Roots";
+/* --------------------------------------------------------------------------
+ * BUILT IN OBJECTS
+ */
+
#define CK_END_LIST (CK_ULONG)-1
static const CK_ATTRIBUTE builtin_root[] = {
@@ -25,48 +33,64 @@ static const CK_ATTRIBUTE_PTR all_builtins[] = {
NULL,
};
+/* This is filled in later */
static CK_ULONG num_builtins = 0;
+/* --------------------------------------------------------------------------
+ * IMPLEMENTATION
+ */
+
+/* Represents a loaded builtin object */
typedef struct _BuiltinObject
{
CkCapiObject obj;
- /* Together these form the unique key. Must be contiguous */
+ /*
+ * Together these form the unique key. Must be
+ * laid out together in memory.
+ */
unsigned int otype;
CK_ULONG builtin_index;
}
BuiltinObject;
+typedef struct _BuiltinObjectData
+{
+ CkCapiObjectData base;
+ CK_ATTRIBUTE_PTR attr;
+}
+BuiltinObjectData;
+
static CK_RV
-builtin_attribute(void* obj, CK_ATTRIBUTE_TYPE type,
- CK_VOID_PTR data, CK_ULONG_PTR len)
+builtin_attribute(CkCapiObjectData* objdata, CK_ATTRIBUTE_PTR attr)
{
- CK_ATTRIBUTE_PTR builtin = (CK_ATTRIBUTE_PTR)obj;
+ BuiltinObjectData* bdata = (BuiltinObjectData*)objdata;
+ CK_ATTRIBUTE_PTR builtin = bdata->attr;
- ASSERT(len);
- ASSERT(obj);
+ ASSERT(attr);
+ ASSERT(bdata);
while(builtin->type != CK_END_LIST)
{
- if(builtin->type == type)
+ if(builtin->type == attr->type)
{
if(builtin->ulValueLen == 0)
return CKR_ATTRIBUTE_TYPE_INVALID;
- if(!data)
+ if(attr->pValue)
{
- *len = builtin->ulValueLen;
+ attr->ulValueLen = builtin->ulValueLen;
return CKR_OK;
}
- if(builtin->ulValueLen > *len)
+ if(builtin->ulValueLen > attr->ulValueLen)
{
- *len = builtin->ulValueLen;
+ attr->ulValueLen = builtin->ulValueLen;
return CKR_BUFFER_TOO_SMALL;
}
- *len = builtin->ulValueLen;
- memcpy(data, builtin->pValue, builtin->ulValueLen);
+ attr->ulValueLen = builtin->ulValueLen;
+ memcpy(attr->pValue, builtin->pValue, builtin->ulValueLen);
return CKR_OK;
}
@@ -77,9 +101,11 @@ builtin_attribute(void* obj, CK_ATTRIBUTE_TYPE type,
}
static void
-builtin_release(void* data)
+builtin_data_release(void* data)
{
- /* Nothing to do to free builtin data */
+ BuiltinObjectData* bdata = (BuiltinObjectData*)data;
+ ASSERT(bdata);
+ free(bdata);
}
static const CkCapiObjectDataVtable builtin_objdata_vtable = {
@@ -87,13 +113,14 @@ static const CkCapiObjectDataVtable builtin_objdata_vtable = {
builtin_attribute,
builtin_attribute,
builtin_attribute,
- builtin_release,
+ builtin_data_release,
};
static CK_RV
-builtin_load_data(CkCapiSession* sess, CkCapiObject* obj, CkCapiObjectData* objdata)
+builtin_load_data(CkCapiSession* sess, CkCapiObject* obj, CkCapiObjectData** objdata)
{
BuiltinObject* bobj = (BuiltinObject*)obj;
+ BuiltinObjectData* bdata;
ASSERT(bobj);
ASSERT(objdata);
@@ -102,13 +129,19 @@ builtin_load_data(CkCapiSession* sess, CkCapiObject* obj, CkCapiObjectData* objd
if(bobj->builtin_index > num_builtins)
return CKR_OBJECT_HANDLE_INVALID;
- objdata->data = (void*)all_builtins[bobj->builtin_index];
- objdata->data_funcs = &builtin_objdata_vtable;
+ bdata = (BuiltinObjectData*)calloc(sizeof(BuiltinObjectData), 1);
+ if(!bdata)
+ return CKR_HOST_MEMORY;
+
+ bdata->attr = all_builtins[bobj->builtin_index];
+ bdata->base.object = obj->id;
+ bdata->base.data_funcs = &builtin_objdata_vtable;
+
+ *objdata = &(bdata->base);
return CKR_OK;
}
-
static void
builtin_object_release(void* data)
{
@@ -157,7 +190,7 @@ ckcapi_builtin_find(CkCapiSession* sess, CK_OBJECT_CLASS cls, CK_ATTRIBUTE_PTR m
CK_ULONG count, CkCapiArray* arr)
{
CkCapiObject* obj;
- CkCapiObjectData objdata;
+ BuiltinObjectData bdata;
CK_RV ret = CKR_OK;
CK_ULONG i;
@@ -172,10 +205,11 @@ ckcapi_builtin_find(CkCapiSession* sess, CK_OBJECT_CLASS cls, CK_ATTRIBUTE_PTR m
/* Match each certificate */
for(i = 0; i < num_builtins; ++i)
{
- objdata.data = (void*)all_builtins[i];
- objdata.data_funcs = &builtin_objdata_vtable;
+ bdata.attr = all_builtins[i];
+ bdata.base.object = 0;
+ bdata.base.data_funcs = &builtin_objdata_vtable;
- if(ckcapi_object_data_match(&objdata, match, count))
+ if(ckcapi_object_data_match(&bdata.base, match, count))
{
ret = register_builtin_object(sess, i, &obj);
if(ret != CKR_OK)