diff options
author | Stef Walter <stef@memberwebs.com> | 2008-12-05 16:37:29 +0000 |
---|---|---|
committer | Stef Walter <stef@memberwebs.com> | 2008-12-05 16:37:29 +0000 |
commit | 8ebef7ee31f973b64dce777297cba0b3cfe0f3fe (patch) | |
tree | 53ecaacefac2ef75e6a13f59cec53d85ca830e3d /src | |
parent | e0c53da1d03328ea7aa29116c4452c4632f286a2 (diff) |
Add support for testing FindObjects.
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/object.c | 175 | ||||
-rw-r--r-- | src/p11-tests.c | 1 | ||||
-rw-r--r-- | src/p11-tests.h | 12 | ||||
-rw-r--r-- | src/session.c | 101 |
5 files changed, 290 insertions, 0 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 1f8a5ce..0a725c1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -8,6 +8,7 @@ p11_tests_SOURCES = \ config.c \ module.c \ msg.c \ + object.c \ p11-tests.c \ session.c \ slot.c 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]); + } +} diff --git a/src/p11-tests.c b/src/p11-tests.c index 3346766..689dba4 100644 --- a/src/p11-tests.c +++ b/src/p11-tests.c @@ -53,6 +53,7 @@ main(int argc, char* argv[]) p11t_slot_tests(); p11t_session_tests(); + p11t_object_tests(); /* Remaining module tests */ p11t_module_finalize(); diff --git a/src/p11-tests.h b/src/p11-tests.h index 425032d..d30e1cc 100644 --- a/src/p11-tests.h +++ b/src/p11-tests.h @@ -66,9 +66,21 @@ void p11t_module_initialize(void); void p11t_module_finalize(void); /* ------------------------------------------------------------------- + * object.c + */ + +void p11t_object_tests(void); + +/* ------------------------------------------------------------------- * session.c */ +CK_SESSION_HANDLE p11t_session_open(CK_SLOT_ID slot, int readwrite); +int p11t_session_login(CK_SESSION_HANDLE handle); +int p11t_session_logout(CK_SESSION_HANDLE handle); +int p11t_session_close(CK_SESSION_HANDLE handle); +int p11t_session_close_all(CK_SLOT_ID slot); + void p11t_session_config(const char *name, const char *value); void p11t_session_tests(void); diff --git a/src/session.c b/src/session.c index 703227c..51bc050 100644 --- a/src/session.c +++ b/src/session.c @@ -343,6 +343,106 @@ p11t_session_tests() } } +CK_SESSION_HANDLE +p11t_session_open(CK_SLOT_ID slot, int readwrite) +{ + CK_SESSION_HANDLE session; + CK_FLAGS flags; + + assert(p11t_module_funcs); + + flags = CKF_SERIAL_SESSION; + if(readwrite) + flags |= CKF_RW_SESSION; + + if((p11t_module_funcs->C_OpenSession)(slot, flags, NULL, NULL, &session) != CKR_OK) + return CK_INVALID; + + return session; +} + +int +p11t_session_login(CK_SESSION_HANDLE session) +{ + CK_SESSION_INFO info; + CK_UTF8CHAR_PTR pin; + CK_ULONG n_pin; + + assert(session != CK_INVALID); + assert(p11t_module_funcs); + + if((p11t_module_funcs->C_GetSessionInfo)(session, &info) != CKR_OK) + return 0; + + switch(info.state) + { + case CKS_RO_USER_FUNCTIONS: + case CKS_RW_USER_FUNCTIONS: + case CKS_RW_SO_FUNCTIONS: + return 1; + } + + pin = calculate_pin(info.slotID, CKU_USER, &n_pin); + if((p11t_module_funcs->C_Login)(session, CKU_USER, pin, n_pin) != CKR_OK) + return 0; + + return 1; +} + +int +p11t_session_logout(CK_SESSION_HANDLE session) +{ + CK_SESSION_INFO info; + + assert(session != CK_INVALID); + assert(p11t_module_funcs); + + if((p11t_module_funcs->C_GetSessionInfo)(session, &info) != CKR_OK) + return 0; + + switch(info.state) + { + case CKS_RO_PUBLIC_SESSION: + case CKS_RW_PUBLIC_SESSION: + return 1; + } + + if((p11t_module_funcs->C_Logout)(session) != CKR_OK) + return 0; + + return 1; +} + +int +p11t_session_close(CK_SESSION_HANDLE session) +{ + CK_RV rv; + + assert(session != CK_INVALID); + assert(p11t_module_funcs); + + rv = (p11t_module_funcs->C_CloseSession)(session); + switch(rv) + { + case CKR_SESSION_HANDLE_INVALID: + case CKR_SESSION_CLOSED: + case CKR_OK: + return 1; + default: + return 0; + } +} + +int +p11t_session_close_all(CK_SLOT_ID slot) +{ + assert(p11t_module_funcs); + + if((p11t_module_funcs->C_CloseAllSessions)(slot) == CKR_OK) + return 1; + return 0; +} + void p11t_session_config(const char *name, const char *value) { @@ -351,3 +451,4 @@ p11t_session_config(const char *name, const char *value) if(strcmp(name, "login-so-pin") == 0) login_so_pin = value; } + |