diff options
Diffstat (limited to 'src/session.c')
-rw-r--r-- | src/session.c | 101 |
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; } + |