summaryrefslogtreecommitdiff
path: root/usr/src/lib/pkcs11/pkcs11_kms/common/kmsSession.c
diff options
context:
space:
mode:
authorJohn Sonnenschein <johns@joyent.com>2012-05-17 18:26:57 +0000
committerJohn Sonnenschein <johns@joyent.com>2012-05-17 18:26:57 +0000
commit04b244dd661c24b510ac22936decfc0972d202d3 (patch)
tree3ebfef98afc303fddf3415d6fba64e8682f495e8 /usr/src/lib/pkcs11/pkcs11_kms/common/kmsSession.c
parenteac250589e41f1b705e1b7427b02b3379aac9f9e (diff)
parenta69187741b83640a90dd8586195456dd50c016a8 (diff)
downloadillumos-joyent-20120517.tar.gz
Merge git.joyent.com:illumos-joyent20120517
Diffstat (limited to 'usr/src/lib/pkcs11/pkcs11_kms/common/kmsSession.c')
-rw-r--r--usr/src/lib/pkcs11/pkcs11_kms/common/kmsSession.c355
1 files changed, 0 insertions, 355 deletions
diff --git a/usr/src/lib/pkcs11/pkcs11_kms/common/kmsSession.c b/usr/src/lib/pkcs11/pkcs11_kms/common/kmsSession.c
deleted file mode 100644
index bdde865b56..0000000000
--- a/usr/src/lib/pkcs11/pkcs11_kms/common/kmsSession.c
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- *
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
- */
-
-#include <pthread.h>
-#include <errno.h>
-#include <security/cryptoki.h>
-#include "kmsGlobal.h"
-#include "kmsSession.h"
-#include "kmsSlot.h"
-#include "kmsKeystoreUtil.h"
-
-CK_RV
-C_OpenSession(CK_SLOT_ID slotID, CK_FLAGS flags, CK_VOID_PTR pApplication,
- CK_NOTIFY Notify, CK_SESSION_HANDLE_PTR phSession)
-{
- CK_RV rv = CKR_OK;
- kms_slot_t *pslot;
-
- if (!kms_initialized)
- return (CKR_CRYPTOKI_NOT_INITIALIZED);
-
- if (!(flags & CKF_SERIAL_SESSION))
- return (CKR_SESSION_PARALLEL_NOT_SUPPORTED);
-
- if (phSession == NULL)
- return (CKR_ARGUMENTS_BAD);
-
- if (slotID != KMS_TOKEN_SLOTID) {
- return (CKR_SLOT_ID_INVALID);
- }
-
- /*
- * Acquire the slot lock to protect sl_state and sl_sess_list.
- * These two fields need to be protected atomically, even though
- * "sl_sess_list" is updated in kms_add_session().
- */
- pslot = get_slotinfo();
- (void) pthread_mutex_lock(&pslot->sl_mutex);
-
- /* If SO is logged in the slot, only the RW session is allowed. */
- if ((pslot->sl_state == CKU_SO) && !(flags & CKF_RW_SESSION)) {
- (void) pthread_mutex_unlock(&pslot->sl_mutex);
- return (CKR_SESSION_READ_WRITE_SO_EXISTS);
- }
-
- /* Create a new session */
- rv = kms_add_session(slotID, flags, pApplication, Notify,
- phSession);
-
- (void) pthread_mutex_unlock(&pslot->sl_mutex);
- return (rv);
-}
-
-CK_RV
-C_CloseSession(CK_SESSION_HANDLE hSession)
-{
- CK_RV rv;
-
- kms_session_t *session_p;
- boolean_t ses_lock_held = B_FALSE;
-
- if (!kms_initialized)
- return (CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /*
- * Obtain the session pointer. Also, increment the session
- * reference count.
- */
- rv = handle2session(hSession, &session_p);
- if (rv != CKR_OK)
- return (rv);
-
- (void) pthread_mutex_lock(&session_p->session_mutex);
- ses_lock_held = B_TRUE;
-
- /*
- * Set SESSION_IS_CLOSING flag so any access to this
- * session will be rejected.
- */
- if (session_p->ses_close_sync & SESSION_IS_CLOSING) {
- REFRELE(session_p, ses_lock_held);
- return (CKR_SESSION_CLOSED);
- }
- session_p->ses_close_sync |= SESSION_IS_CLOSING;
-
- /*
- * Decrement the session reference count.
- * We hold the session lock, and REFRELE()
- * will release the session lock for us.
- */
- REFRELE(session_p, ses_lock_held);
-
- /*
- * Delete a session by calling kms_delete_session() with
- * a session pointer and two boolean arguments. The 3rd argument
- * boolean value FALSE indicates that the caller does not
- * hold the slot lock. The 4th argument boolean value B_FALSE
- * indicates that we want to delete all the objects completely.
- *
- * kms_delete_session() will reset SESSION_IS_CLOSING
- * flag after it is done.
- */
- kms_delete_session(session_p, B_FALSE, B_FALSE);
- return (rv);
-}
-
-/*ARGSUSED*/
-CK_RV
-C_CloseAllSessions(CK_SLOT_ID slotID)
-{
- if (!kms_initialized)
- return (CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /* Delete all the sessions and release the allocated resources */
- kms_delete_all_sessions(B_FALSE);
-
- return (CKR_OK);
-}
-
-/*
- * Utility routine to get CK_STATE value for a session.
- * The caller should not be holding the session lock.
- */
-static CK_STATE
-get_ses_state(kms_session_t *session_p)
-{
- CK_STATE state;
- kms_slot_t *pslot;
-
- pslot = get_slotinfo();
- (void) pthread_mutex_lock(&pslot->sl_mutex);
-
- if (pslot->sl_state == CKU_PUBLIC) {
- state = (session_p->ses_RO) ?
- CKS_RO_PUBLIC_SESSION : CKS_RW_PUBLIC_SESSION;
- } else if (pslot->sl_state == CKU_USER) {
- state = (session_p->ses_RO) ?
- CKS_RO_USER_FUNCTIONS : CKS_RW_USER_FUNCTIONS;
- } else if (pslot->sl_state == CKU_SO) {
- state = CKS_RW_SO_FUNCTIONS;
- }
-
- (void) pthread_mutex_unlock(&pslot->sl_mutex);
-
- return (state);
-}
-
-CK_RV
-C_GetSessionInfo(CK_SESSION_HANDLE hSession, CK_SESSION_INFO_PTR pInfo)
-{
- kms_session_t *session_p;
- CK_RV rv;
- boolean_t ses_lock_held = B_FALSE;
-
- if (!kms_initialized)
- return (CKR_CRYPTOKI_NOT_INITIALIZED);
-
- if (pInfo == NULL)
- return (CKR_ARGUMENTS_BAD);
-
- /*
- * Obtain the session pointer. Also, increment the session
- * reference count.
- */
- rv = handle2session(hSession, &session_p);
- if (rv != CKR_OK)
- return (rv);
-
- /* Provide information for the specified session */
- pInfo->slotID = session_p->ses_slotid;
- pInfo->flags = session_p->flags;
- pInfo->ulDeviceError = 0;
- pInfo->state = get_ses_state(session_p);
-
- /*
- * Decrement the session reference count.
- */
- REFRELE(session_p, ses_lock_held);
-
- return (rv);
-}
-
-/*ARGSUSED*/
-CK_RV
-C_GetOperationState(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pOperationState,
- CK_ULONG_PTR pulOperationStateLen)
-{
- if (!kms_initialized)
- return (CKR_CRYPTOKI_NOT_INITIALIZED);
-
- return (CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-/*ARGSUSED*/
-CK_RV
-C_SetOperationState(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pOperationState,
- CK_ULONG ulOperationStateLen, CK_OBJECT_HANDLE hEncryptionKey,
- CK_OBJECT_HANDLE hAuthenticationKey)
-{
- if (!kms_initialized)
- return (CKR_CRYPTOKI_NOT_INITIALIZED);
-
- return (CKR_FUNCTION_NOT_SUPPORTED);
-}
-
-CK_RV
-C_Login(CK_SESSION_HANDLE hSession, CK_USER_TYPE userType,
- CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen)
-{
- CK_RV rv = CKR_OK;
- kms_session_t *session_p;
- kms_slot_t *pslot;
- boolean_t ses_lock_held = B_FALSE;
-
- if (!kms_initialized)
- return (CKR_CRYPTOKI_NOT_INITIALIZED);
-
- if ((userType != CKU_SO) && (userType != CKU_USER)) {
- return (CKR_USER_TYPE_INVALID);
- }
-
- /*
- * Obtain the session pointer. Also, increment the session
- * reference count.
- */
- rv = handle2session(hSession, &session_p);
- if (rv != CKR_OK)
- return (rv);
-
- /* Acquire the slot lock */
- pslot = get_slotinfo();
- (void) pthread_mutex_lock(&pslot->sl_mutex);
-
- /* Check if the slot is logged in already */
- if ((pslot->sl_state == CKU_USER) || (pslot->sl_state == CKU_SO)) {
- rv = CKR_USER_ALREADY_LOGGED_IN;
- goto clean_exit;
- }
-
- /* To login as SO, every session in this slot needs to be R/W */
- if (userType == CKU_SO) {
- kms_session_t *sp;
- boolean_t found;
-
- found = B_FALSE;
- sp = pslot->sl_sess_list;
- while (sp) {
- /*
- * Need not to lock individual sessions before
- * accessing their "ses_RO" and "next" fields,
- * because they are always accessed under the
- * slot's mutex protection.
- */
- if (sp->ses_RO) {
- found = B_TRUE;
- break;
- }
- sp = sp->next;
- }
-
- if (found) {
- rv = CKR_SESSION_READ_ONLY_EXISTS;
- goto clean_exit;
- }
- }
-
- /*
- * Login to KMS by attempting to load the profile using
- * the given password.
- */
- rv = KMS_LoadProfile(
- &session_p->kmsProfile,
- &session_p->configInfo,
- (const char *)pPin,
- (size_t)ulPinLen);
-
- if (rv == CKR_OK) {
- /* Set the slot's session state. */
- pslot->sl_state = userType;
- }
-
-clean_exit:
-
- REFRELE(session_p, ses_lock_held);
- (void) pthread_mutex_unlock(&pslot->sl_mutex);
- return (rv);
-}
-
-CK_RV
-C_Logout(CK_SESSION_HANDLE hSession)
-{
- CK_RV rv = CKR_OK;
- kms_session_t *session_p;
- kms_slot_t *pslot;
- boolean_t ses_lock_held = B_FALSE;
-
- if (!kms_initialized)
- return (CKR_CRYPTOKI_NOT_INITIALIZED);
-
- /*
- * Obtain the session pointer. Also, increment the session
- * reference count.
- */
- rv = handle2session(hSession, &session_p);
- if (rv != CKR_OK)
- return (rv);
-
- /* Acquire the slot lock. */
- pslot = get_slotinfo();
- (void) pthread_mutex_lock(&pslot->sl_mutex);
-
- /* Check if the user or SO was logged in */
- if (pslot->sl_state == CKU_PUBLIC) {
- rv = CKR_USER_NOT_LOGGED_IN;
- goto clean_exit;
- }
-
- KMS_UnloadProfile(&session_p->kmsProfile);
-
- /*
- * If this slot was logged in as USER previously, we need to clean up
- * all private object wrappers in library for this slot.
- */
- kms_cleanup_pri_objects_in_slot(pslot, session_p);
-
- if (rv == CKR_OK) {
- /* Reset the slot's session state. */
- pslot->sl_state = CKU_PUBLIC;
- }
-
-clean_exit:
- REFRELE(session_p, ses_lock_held);
- (void) pthread_mutex_unlock(&pslot->sl_mutex);
- return (rv);
-}