summaryrefslogtreecommitdiff
path: root/src/session.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/session.c')
-rw-r--r--src/session.c101
1 files changed, 101 insertions, 0 deletions
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;
}
+