diff options
Diffstat (limited to 'src/object.c')
-rw-r--r-- | src/object.c | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/src/object.c b/src/object.c new file mode 100644 index 0000000..450c795 --- /dev/null +++ b/src/object.c @@ -0,0 +1,175 @@ + +#include "config.h" + +#include "p11-tests.h" + +#include <stdlib.h> + +static void +create_object(CK_SESSION_HANDLE session_rw, CK_SESSION_HANDLE session_ro) +{ + /** C_CreateObject */ + + /** - Not Implemented */ +} + +static void +copy_object(CK_SESSION_HANDLE session_rw, CK_SESSION_HANDLE session_ro) +{ + /** C_CopyObject */ + + /** - Not Implemented */ +} + +static void +destroy_object(CK_SESSION_HANDLE session_rw, CK_SESSION_HANDLE session_ro) +{ + /** C_DestroyObject */ + + /** - Not Implemented */ +} + +static void +find_all_objects(CK_SESSION_HANDLE session) +{ + CK_OBJECT_HANDLE_PTR objects; + CK_OBJECT_HANDLE extra; + CK_ATTRIBUTE dummy; + CK_ULONG object_count, count; + CK_RV rv; + + assert(p11t_module_funcs); + + /** C_FindObjectsInit */ + + if(p11t_test_unexpected) + { + /** - Invalid session */ + rv = (p11t_module_funcs->C_FindObjectsInit)((CK_SESSION_HANDLE)-99, &dummy, 0); + p11t_check_returns("C_FindObjectsInit: invalid session", rv, CKR_SESSION_HANDLE_INVALID); + + /** - Attribute count without buffer */ + rv = (p11t_module_funcs->C_FindObjectsInit)((CK_SESSION_HANDLE)-99, NULL, 1); + p11t_check_returns("C_FindObjectsInit: count without buffer", rv, CKR_ARGUMENTS_BAD); + + } + + rv = (p11t_module_funcs->C_FindObjectsInit)(session, &dummy, 0); + p11t_check_returns("C_FindObjectsInit: all", rv, CKR_OK); + + if(p11t_test_unexpected) + { + /** - Double call. */ + rv = (p11t_module_funcs->C_FindObjectsInit)(session, &dummy, 0); + p11t_check_returns("C_FindObjectsInit: all", rv, CKR_OPERATION_ACTIVE); + + } + + /** C_FindObjects */ + + if(p11t_test_unexpected) + { + /** - Invalid session */ + rv = (p11t_module_funcs->C_FindObjects)((CK_SESSION_HANDLE)-99, NULL, 0, &object_count); + p11t_check_returns("C_FindObjects: invalid session", rv, CKR_SESSION_HANDLE_INVALID); + + /** - Null object count */ + rv = (p11t_module_funcs->C_FindObjects)(session, NULL, 0, NULL); + p11t_check_returns("C_FindObjects: invalid session", rv, CKR_ARGUMENTS_BAD); + + /** - Retrieve count of objects, using NULL buffer */ + rv = (p11t_module_funcs->C_FindObjects)(session, NULL, 0, &object_count); + p11t_check_returns("C_FindObjects: retrieve count", rv, CKR_OK); + } + + /** - Retrieve count of objects */ + rv = (p11t_module_funcs->C_FindObjects)(session, &extra, 0, &object_count); + p11t_check_returns("C_FindObjects: retrieve count", rv, CKR_OK); + + if(object_count > 0) + { + if(p11t_test_unexpected) + { + /** - Retrieve a single object before remainder */ + rv = (p11t_module_funcs->C_FindObjects)(session, &extra, 1, &count); + p11t_check_returns("C_FindObjects: single object", rv, CKR_OK); + p11t_check_ulong("C_FindObjects: should return one object", count, 1); + --object_count; + } + + /** - Retrieve remaining objects */ + objects = calloc(object_count, sizeof(CK_OBJECT_HANDLE)); + assert(objects); + rv = (p11t_module_funcs->C_FindObjects)(session, objects, object_count, &count); + p11t_check_returns("C_FindObjects: all objects", rv, CKR_OK); + p11t_check_ulong("C_FindObjects: should return one object", count, object_count); + } + + if(p11t_test_unexpected) + { + /** - Extra call after retrieving all objects. */ + rv = (p11t_module_funcs->C_FindObjects(session, &extra, 1, &count)); + p11t_check_returns("C_FindObjects: extra call", rv, CKR_OK); + p11t_check_ulong("C_FindObjects: should return no objects in extra call", count, 0); + } + + /** C_FindObjectsFinal */ + + if(p11t_test_unexpected) + { + /** - Invalid session */ + rv = (p11t_module_funcs->C_FindObjectsFinal)((CK_SESSION_HANDLE)-88); + p11t_check_returns("C_FindObjectsFinal: invalid session", rv, CKR_SESSION_HANDLE_INVALID); + } + + /** - Normal call */ + rv = (p11t_module_funcs->C_FindObjectsFinal)(session); + p11t_check_returns("C_FindObjectsFinal", rv, CKR_OK); + + if(p11t_test_unexpected) + { + /** - Extra call */ + rv = (p11t_module_funcs->C_FindObjectsFinal)(session); + p11t_check_returns("C_FindObjectsFinal: extra call", rv, CKR_OPERATION_NOT_INITIALIZED); + + /** C_FindObjects */ + + /** - Out of order call */ + rv = (p11t_module_funcs->C_FindObjects)(session, &extra, 1, &count); + p11t_check_returns("C_FindObjectsFinal: extra call", rv, CKR_OPERATION_NOT_INITIALIZED); + } + +} + +void +p11t_object_tests(void) +{ + CK_SESSION_HANDLE session_rw; + CK_SESSION_HANDLE session_ro; + CK_ULONG i; + + for(i = 0; i < p11t_slot_count; ++i) + { + session_rw = p11t_session_open(p11t_slot_ids[i], 1); + session_ro = p11t_session_open(p11t_slot_ids[i], 0); + + /* We need to have the readonly session and log in for tests to proceed */ + if(session_ro == CK_INVALID) + continue; + + if(p11t_session_login(session_ro)) + continue; + + find_all_objects(session_ro); + + if(session_rw != CK_INVALID) + { + find_all_objects(session_rw); + create_object(session_rw, session_ro); + copy_object(session_rw, session_ro); + destroy_object(session_rw, session_ro); + } + + p11t_session_close_all(p11t_slot_ids[i]); + } +} |