Mercurial > illumos > illumos-gate
annotate usr/src/lib/pkcs11/pkcs11_kms/common/kmsSession.c @ 12720:3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
6944296 Solaris needs a PKCS#11 provider to allow access to KMS keystore functionality
author | Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM> |
---|---|
date | Mon, 28 Jun 2010 16:04:11 -0700 |
parents | |
children |
rev | line source |
---|---|
12720
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
1 /* |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
2 * CDDL HEADER START |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
3 * |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
4 * The contents of this file are subject to the terms of the |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
5 * Common Development and Distribution License (the "License"). |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
6 * You may not use this file except in compliance with the License. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
7 * |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
9 * or http://www.opensolaris.org/os/licensing. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
10 * See the License for the specific language governing permissions |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
11 * and limitations under the License. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
12 * |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
13 * When distributing Covered Code, include this CDDL HEADER in each |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
15 * If applicable, add the following below this CDDL HEADER, with the |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
16 * fields enclosed by brackets "[]" replaced with your own identifying |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
17 * information: Portions Copyright [yyyy] [name of copyright owner] |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
18 * |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
19 * CDDL HEADER END |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
20 * |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
21 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
22 */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
23 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
24 #include <pthread.h> |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
25 #include <errno.h> |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
26 #include <security/cryptoki.h> |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
27 #include "kmsGlobal.h" |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
28 #include "kmsSession.h" |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
29 #include "kmsSlot.h" |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
30 #include "kmsKeystoreUtil.h" |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
31 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
32 CK_RV |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
33 C_OpenSession(CK_SLOT_ID slotID, CK_FLAGS flags, CK_VOID_PTR pApplication, |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
34 CK_NOTIFY Notify, CK_SESSION_HANDLE_PTR phSession) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
35 { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
36 CK_RV rv = CKR_OK; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
37 kms_slot_t *pslot; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
38 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
39 if (!kms_initialized) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
40 return (CKR_CRYPTOKI_NOT_INITIALIZED); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
41 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
42 if (!(flags & CKF_SERIAL_SESSION)) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
43 return (CKR_SESSION_PARALLEL_NOT_SUPPORTED); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
44 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
45 if (phSession == NULL) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
46 return (CKR_ARGUMENTS_BAD); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
47 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
48 if (slotID != KMS_TOKEN_SLOTID) { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
49 return (CKR_SLOT_ID_INVALID); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
50 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
51 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
52 /* |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
53 * Acquire the slot lock to protect sl_state and sl_sess_list. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
54 * These two fields need to be protected atomically, even though |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
55 * "sl_sess_list" is updated in kms_add_session(). |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
56 */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
57 pslot = get_slotinfo(); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
58 (void) pthread_mutex_lock(&pslot->sl_mutex); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
59 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
60 /* If SO is logged in the slot, only the RW session is allowed. */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
61 if ((pslot->sl_state == CKU_SO) && !(flags & CKF_RW_SESSION)) { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
62 (void) pthread_mutex_unlock(&pslot->sl_mutex); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
63 return (CKR_SESSION_READ_WRITE_SO_EXISTS); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
64 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
65 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
66 /* Create a new session */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
67 rv = kms_add_session(slotID, flags, pApplication, Notify, |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
68 phSession); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
69 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
70 (void) pthread_mutex_unlock(&pslot->sl_mutex); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
71 return (rv); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
72 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
73 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
74 CK_RV |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
75 C_CloseSession(CK_SESSION_HANDLE hSession) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
76 { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
77 CK_RV rv; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
78 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
79 kms_session_t *session_p; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
80 boolean_t ses_lock_held = B_FALSE; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
81 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
82 if (!kms_initialized) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
83 return (CKR_CRYPTOKI_NOT_INITIALIZED); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
84 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
85 /* |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
86 * Obtain the session pointer. Also, increment the session |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
87 * reference count. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
88 */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
89 rv = handle2session(hSession, &session_p); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
90 if (rv != CKR_OK) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
91 return (rv); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
92 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
93 (void) pthread_mutex_lock(&session_p->session_mutex); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
94 ses_lock_held = B_TRUE; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
95 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
96 /* |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
97 * Set SESSION_IS_CLOSING flag so any access to this |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
98 * session will be rejected. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
99 */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
100 if (session_p->ses_close_sync & SESSION_IS_CLOSING) { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
101 REFRELE(session_p, ses_lock_held); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
102 return (CKR_SESSION_CLOSED); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
103 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
104 session_p->ses_close_sync |= SESSION_IS_CLOSING; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
105 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
106 /* |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
107 * Decrement the session reference count. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
108 * We hold the session lock, and REFRELE() |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
109 * will release the session lock for us. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
110 */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
111 REFRELE(session_p, ses_lock_held); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
112 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
113 /* |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
114 * Delete a session by calling kms_delete_session() with |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
115 * a session pointer and two boolean arguments. The 3rd argument |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
116 * boolean value FALSE indicates that the caller does not |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
117 * hold the slot lock. The 4th argument boolean value B_FALSE |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
118 * indicates that we want to delete all the objects completely. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
119 * |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
120 * kms_delete_session() will reset SESSION_IS_CLOSING |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
121 * flag after it is done. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
122 */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
123 kms_delete_session(session_p, B_FALSE, B_FALSE); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
124 return (rv); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
125 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
126 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
127 /*ARGSUSED*/ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
128 CK_RV |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
129 C_CloseAllSessions(CK_SLOT_ID slotID) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
130 { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
131 if (!kms_initialized) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
132 return (CKR_CRYPTOKI_NOT_INITIALIZED); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
133 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
134 /* Delete all the sessions and release the allocated resources */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
135 kms_delete_all_sessions(B_FALSE); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
136 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
137 return (CKR_OK); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
138 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
139 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
140 /* |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
141 * Utility routine to get CK_STATE value for a session. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
142 * The caller should not be holding the session lock. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
143 */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
144 static CK_STATE |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
145 get_ses_state(kms_session_t *session_p) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
146 { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
147 CK_STATE state; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
148 kms_slot_t *pslot; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
149 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
150 pslot = get_slotinfo(); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
151 (void) pthread_mutex_lock(&pslot->sl_mutex); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
152 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
153 if (pslot->sl_state == CKU_PUBLIC) { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
154 state = (session_p->ses_RO) ? |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
155 CKS_RO_PUBLIC_SESSION : CKS_RW_PUBLIC_SESSION; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
156 } else if (pslot->sl_state == CKU_USER) { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
157 state = (session_p->ses_RO) ? |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
158 CKS_RO_USER_FUNCTIONS : CKS_RW_USER_FUNCTIONS; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
159 } else if (pslot->sl_state == CKU_SO) { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
160 state = CKS_RW_SO_FUNCTIONS; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
161 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
162 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
163 (void) pthread_mutex_unlock(&pslot->sl_mutex); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
164 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
165 return (state); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
166 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
167 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
168 CK_RV |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
169 C_GetSessionInfo(CK_SESSION_HANDLE hSession, CK_SESSION_INFO_PTR pInfo) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
170 { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
171 kms_session_t *session_p; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
172 CK_RV rv; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
173 boolean_t ses_lock_held = B_FALSE; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
174 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
175 if (!kms_initialized) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
176 return (CKR_CRYPTOKI_NOT_INITIALIZED); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
177 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
178 if (pInfo == NULL) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
179 return (CKR_ARGUMENTS_BAD); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
180 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
181 /* |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
182 * Obtain the session pointer. Also, increment the session |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
183 * reference count. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
184 */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
185 rv = handle2session(hSession, &session_p); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
186 if (rv != CKR_OK) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
187 return (rv); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
188 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
189 /* Provide information for the specified session */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
190 pInfo->slotID = session_p->ses_slotid; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
191 pInfo->flags = session_p->flags; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
192 pInfo->ulDeviceError = 0; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
193 pInfo->state = get_ses_state(session_p); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
194 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
195 /* |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
196 * Decrement the session reference count. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
197 */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
198 REFRELE(session_p, ses_lock_held); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
199 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
200 return (rv); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
201 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
202 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
203 /*ARGSUSED*/ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
204 CK_RV |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
205 C_GetOperationState(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pOperationState, |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
206 CK_ULONG_PTR pulOperationStateLen) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
207 { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
208 if (!kms_initialized) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
209 return (CKR_CRYPTOKI_NOT_INITIALIZED); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
210 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
211 return (CKR_FUNCTION_NOT_SUPPORTED); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
212 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
213 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
214 /*ARGSUSED*/ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
215 CK_RV |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
216 C_SetOperationState(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pOperationState, |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
217 CK_ULONG ulOperationStateLen, CK_OBJECT_HANDLE hEncryptionKey, |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
218 CK_OBJECT_HANDLE hAuthenticationKey) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
219 { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
220 if (!kms_initialized) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
221 return (CKR_CRYPTOKI_NOT_INITIALIZED); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
222 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
223 return (CKR_FUNCTION_NOT_SUPPORTED); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
224 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
225 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
226 CK_RV |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
227 C_Login(CK_SESSION_HANDLE hSession, CK_USER_TYPE userType, |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
228 CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
229 { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
230 CK_RV rv = CKR_OK; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
231 kms_session_t *session_p; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
232 kms_slot_t *pslot; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
233 boolean_t ses_lock_held = B_FALSE; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
234 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
235 if (!kms_initialized) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
236 return (CKR_CRYPTOKI_NOT_INITIALIZED); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
237 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
238 if ((userType != CKU_SO) && (userType != CKU_USER)) { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
239 return (CKR_USER_TYPE_INVALID); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
240 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
241 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
242 /* |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
243 * Obtain the session pointer. Also, increment the session |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
244 * reference count. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
245 */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
246 rv = handle2session(hSession, &session_p); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
247 if (rv != CKR_OK) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
248 return (rv); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
249 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
250 /* Acquire the slot lock */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
251 pslot = get_slotinfo(); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
252 (void) pthread_mutex_lock(&pslot->sl_mutex); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
253 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
254 /* Check if the slot is logged in already */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
255 if ((pslot->sl_state == CKU_USER) || (pslot->sl_state == CKU_SO)) { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
256 rv = CKR_USER_ALREADY_LOGGED_IN; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
257 goto clean_exit; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
258 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
259 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
260 /* To login as SO, every session in this slot needs to be R/W */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
261 if (userType == CKU_SO) { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
262 kms_session_t *sp; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
263 boolean_t found; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
264 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
265 found = B_FALSE; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
266 sp = pslot->sl_sess_list; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
267 while (sp) { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
268 /* |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
269 * Need not to lock individual sessions before |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
270 * accessing their "ses_RO" and "next" fields, |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
271 * because they are always accessed under the |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
272 * slot's mutex protection. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
273 */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
274 if (sp->ses_RO) { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
275 found = B_TRUE; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
276 break; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
277 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
278 sp = sp->next; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
279 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
280 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
281 if (found) { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
282 rv = CKR_SESSION_READ_ONLY_EXISTS; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
283 goto clean_exit; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
284 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
285 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
286 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
287 /* |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
288 * Login to KMS by attempting to load the profile using |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
289 * the given password. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
290 */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
291 rv = KMS_LoadProfile( |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
292 &session_p->kmsProfile, |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
293 &session_p->configInfo, |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
294 (const char *)pPin, |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
295 (size_t)ulPinLen); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
296 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
297 if (rv == CKR_OK) { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
298 /* Set the slot's session state. */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
299 pslot->sl_state = userType; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
300 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
301 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
302 clean_exit: |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
303 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
304 REFRELE(session_p, ses_lock_held); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
305 (void) pthread_mutex_unlock(&pslot->sl_mutex); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
306 return (rv); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
307 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
308 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
309 CK_RV |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
310 C_Logout(CK_SESSION_HANDLE hSession) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
311 { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
312 CK_RV rv = CKR_OK; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
313 kms_session_t *session_p; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
314 kms_slot_t *pslot; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
315 boolean_t ses_lock_held = B_FALSE; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
316 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
317 if (!kms_initialized) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
318 return (CKR_CRYPTOKI_NOT_INITIALIZED); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
319 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
320 /* |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
321 * Obtain the session pointer. Also, increment the session |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
322 * reference count. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
323 */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
324 rv = handle2session(hSession, &session_p); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
325 if (rv != CKR_OK) |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
326 return (rv); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
327 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
328 /* Acquire the slot lock. */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
329 pslot = get_slotinfo(); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
330 (void) pthread_mutex_lock(&pslot->sl_mutex); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
331 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
332 /* Check if the user or SO was logged in */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
333 if (pslot->sl_state == CKU_PUBLIC) { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
334 rv = CKR_USER_NOT_LOGGED_IN; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
335 goto clean_exit; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
336 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
337 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
338 KMS_UnloadProfile(&session_p->kmsProfile); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
339 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
340 /* |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
341 * If this slot was logged in as USER previously, we need to clean up |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
342 * all private object wrappers in library for this slot. |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
343 */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
344 kms_cleanup_pri_objects_in_slot(pslot, session_p); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
345 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
346 if (rv == CKR_OK) { |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
347 /* Reset the slot's session state. */ |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
348 pslot->sl_state = CKU_PUBLIC; |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
349 } |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
350 |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
351 clean_exit: |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
352 REFRELE(session_p, ses_lock_held); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
353 (void) pthread_mutex_unlock(&pslot->sl_mutex); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
354 return (rv); |
3db6e0082404
PSARC 2010/195 PKCS11 KMS Provider
Wyllys Ingersoll <Wyllys.Ingersoll@Sun.COM>
parents:
diff
changeset
|
355 } |