#include "config.h" #include "p11-tests.h" #include 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]); } }