summaryrefslogtreecommitdiff
path: root/src/object.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/object.c')
-rw-r--r--src/object.c175
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]);
+ }
+}