CK_RV gkm_module_C_Logout (GkmModule *self, CK_SESSION_HANDLE handle) { CK_ULONG apt_id; Apartment *apt; GkmSession *session; g_return_val_if_fail (GKM_IS_MODULE (self), CKR_CRYPTOKI_NOT_INITIALIZED); session = gkm_module_lookup_session (self, handle); if (session == NULL) return CKR_SESSION_HANDLE_INVALID; apt_id = gkm_session_get_apartment (session); apt = lookup_apartment (self, apt_id); g_return_val_if_fail (apt, CKR_GENERAL_ERROR); if (apt->logged_in == CKU_NONE) return CKR_USER_NOT_LOGGED_IN; else if (apt->logged_in == CKU_USER) return gkm_module_logout_user (self, apt_id); else if (apt->logged_in == CKU_SO) return gkm_module_logout_so (self, apt_id); else g_return_val_if_reached (CKR_GENERAL_ERROR); }
CK_RV gkm_module_C_InitPIN (GkmModule* self, CK_SESSION_HANDLE handle, CK_UTF8CHAR_PTR pin, CK_ULONG n_pin) { GkmSession *session; Apartment *apt; CK_ULONG apt_id; g_return_val_if_fail (GKM_IS_MODULE (self), CKR_CRYPTOKI_NOT_INITIALIZED); session = gkm_module_lookup_session (self, handle); if (session == NULL) return CKR_SESSION_HANDLE_INVALID; /* Calculate the virtual slot */ apt_id = gkm_session_get_apartment (session); apt = lookup_apartment (self, apt_id); g_return_val_if_fail (apt, CKR_GENERAL_ERROR); if (apt->logged_in != CKU_SO) return CKR_USER_NOT_LOGGED_IN; /* Our InitPIN assumes an uninitialized PIN */ return gkm_module_login_change (self, apt_id, NULL, 0, pin, n_pin); }
CK_RV gkm_module_C_CloseSession (GkmModule *self, CK_SESSION_HANDLE handle) { GkmSession *session; CK_ULONG apt_id; Apartment *apt; GList *link; g_return_val_if_fail (GKM_IS_MODULE (self), CKR_CRYPTOKI_NOT_INITIALIZED); session = gkm_module_lookup_session (self, handle); if (session == NULL) return CKR_SESSION_HANDLE_INVALID; /* Calculate the virtual slot */ apt_id = gkm_session_get_apartment (session); apt = lookup_apartment (self, apt_id); g_return_val_if_fail (apt, CKR_GENERAL_ERROR); link = g_list_find (apt->sessions, session); g_return_val_if_fail (link, CKR_GENERAL_ERROR); apt->sessions = g_list_delete_link (apt->sessions, link); g_object_unref (session); if (!apt->sessions) unregister_apartment (self, apt); if (!g_hash_table_remove (self->pv->sessions_by_handle, &handle)) g_assert_not_reached (); return CKR_OK; }
CK_RV gkm_module_C_Login (GkmModule *self, CK_SESSION_HANDLE handle, CK_USER_TYPE user_type, CK_UTF8CHAR_PTR pin, CK_ULONG pin_len) { CK_ULONG apt_id; GkmSession *session; Apartment *apt; GList *l; g_return_val_if_fail (GKM_IS_MODULE (self), CKR_CRYPTOKI_NOT_INITIALIZED); session = gkm_module_lookup_session (self, handle); if (session == NULL) return CKR_SESSION_HANDLE_INVALID; /* Pass off context specifc logins to appropriate place */ if (user_type == CKU_CONTEXT_SPECIFIC) return gkm_session_login_context_specific (session, pin, pin_len); /* Some random crap... */ if (user_type != CKU_USER && user_type != CKU_SO) return CKR_USER_TYPE_INVALID; /* Calculate the virtual slot */ apt_id = gkm_session_get_apartment (session); apt = lookup_apartment (self, apt_id); g_return_val_if_fail (apt, CKR_GENERAL_ERROR); if (apt->logged_in == user_type) return CKR_USER_ALREADY_LOGGED_IN; if (apt->logged_in != CKU_NONE) return CKR_USER_ANOTHER_ALREADY_LOGGED_IN; if (user_type == CKU_SO) { /* Can't login as SO if read-only sessions exist */ for (l = apt->sessions; l; l = g_list_next (l)) { if (gkm_session_get_read_only (l->data)) return CKR_SESSION_READ_ONLY_EXISTS; } return gkm_module_login_so (self, apt_id, pin, pin_len); } else if (user_type == CKU_USER) { return gkm_module_login_user (self, apt_id, pin, pin_len); } else { return CKR_USER_TYPE_INVALID; } }
GkmSession* mock_module_open_session (gboolean writable) { CK_ULONG flags = CKF_SERIAL_SESSION; CK_SESSION_HANDLE handle; GkmSession *session; CK_RV rv; if (writable) flags |= CKF_RW_SESSION; rv = gkm_module_C_OpenSession (pkcs11_module, 1, flags, NULL, NULL, &handle); g_assert (rv == CKR_OK); session = gkm_module_lookup_session (pkcs11_module, handle); g_assert (session); return session; }
CK_RV gkm_module_C_SetPIN (GkmModule* self, CK_SESSION_HANDLE handle, CK_UTF8CHAR_PTR old_pin, CK_ULONG old_pin_len, CK_UTF8CHAR_PTR new_pin, CK_ULONG new_pin_len) { GkmSession *session; Apartment *apt; CK_ULONG apt_id; g_return_val_if_fail (GKM_IS_MODULE (self), CKR_CRYPTOKI_NOT_INITIALIZED); session = gkm_module_lookup_session (self, handle); if (session == NULL) return CKR_SESSION_HANDLE_INVALID; /* Calculate the virtual slot */ apt_id = gkm_session_get_apartment (session); apt = lookup_apartment (self, apt_id); g_return_val_if_fail (apt, CKR_GENERAL_ERROR); return gkm_module_login_change (self, apt_id, old_pin, old_pin_len, new_pin, new_pin_len); }
GkmSession* test_xdg_module_open_session (gboolean writable) { CK_ULONG flags = CKF_SERIAL_SESSION; CK_SESSION_HANDLE handle; GkmModule *module; GkmSession *session; CK_RV rv; module = _gkm_xdg_store_get_module_for_testing (); g_return_val_if_fail (module, NULL); if (writable) flags |= CKF_RW_SESSION; rv = gkm_module_C_OpenSession (module, 1, flags, NULL, NULL, &handle); g_assert (rv == CKR_OK); session = gkm_module_lookup_session (module, handle); g_assert (session); return session; }