diff options
Diffstat (limited to 'ckcapi-builtin.c')
-rw-r--r-- | ckcapi-builtin.c | 82 |
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) |