diff options
Diffstat (limited to 'src/object.c')
-rw-r--r-- | src/object.c | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/src/object.c b/src/object.c index 87f89e2..fe4e801 100644 --- a/src/object.c +++ b/src/object.c @@ -364,7 +364,6 @@ p11t_object_find(CK_SESSION_HANDLE session, CK_ATTRIBUTE_PTR attrs, { CK_OBJECT_HANDLE_PTR objects; CK_ATTRIBUTE dummy_attr; - CK_ULONG count; assert(p11t_module_funcs); @@ -387,7 +386,7 @@ p11t_object_find(CK_SESSION_HANDLE session, CK_ATTRIBUTE_PTR attrs, return NULL; } - if(!count) + if(!*n_objects) { free(objects); return NULL; @@ -396,3 +395,48 @@ p11t_object_find(CK_SESSION_HANDLE session, CK_ATTRIBUTE_PTR attrs, return objects; } +CK_OBJECT_HANDLE +p11t_object_find_one(CK_SESSION_HANDLE session, CK_ATTRIBUTE_PTR attrs, + CK_ULONG n_attrs) +{ + CK_OBJECT_HANDLE object; + CK_ULONG count; + + assert(p11t_module_funcs); + + if((p11t_module_funcs->C_FindObjectsInit)(session, attrs, n_attrs) != CKR_OK) + return CK_INVALID; + + if((p11t_module_funcs->C_FindObjects)(session, &object, 1, &count) != CKR_OK) + return CK_INVALID; + + if(count != 1) + return CK_INVALID; + + return object; +} + + +int +p11t_object_get(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE object, + CK_ATTRIBUTE_PTR attrs, CK_ULONG count) +{ + CK_RV rv; + + assert(p11t_module_funcs); + + if(!count) + return 1; + + rv = (p11t_module_funcs->C_GetAttributeValue)(session, object, attrs, count); + switch(rv) + { + case CKR_OK: + case CKR_BUFFER_TOO_SMALL: + case CKR_ATTRIBUTE_TYPE_INVALID: + case CKR_ATTRIBUTE_SENSITIVE: + return 1; + } + + return 0; +} |