1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26 /*
27 * Signing and MACing Functions
28 * (as defined in PKCs#11 spec section 11.11)
29 */
30
31 #include "metaGlobal.h"
32
33
34 /*
35 * meta_SignInit
36 *
37 */
38 CK_RV
meta_SignInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey)39 meta_SignInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
40 CK_OBJECT_HANDLE hKey)
41 {
42 CK_RV rv;
43 meta_session_t *session;
44 meta_object_t *key;
45
46 if (pMechanism == NULL)
47 return (CKR_ARGUMENTS_BAD);
48
49 rv = meta_handle2session(hSession, &session);
50 if (rv != CKR_OK)
51 return (rv);
52
53 rv = meta_handle2object(hKey, &key);
54 if (rv != CKR_OK) {
55 REFRELEASE(session);
56 return (rv);
57 }
58
59 rv = meta_operation_init(CKF_SIGN, session, pMechanism, key);
60
61 OBJRELEASE(key);
62 REFRELEASE(session);
63
64 return (rv);
65 }
66
67
68 /*
69 * meta_Sign
70 *
71 */
72 CK_RV
meta_Sign(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pData,CK_ULONG ulDataLen,CK_BYTE_PTR pSignature,CK_ULONG_PTR pulSignatureLen)73 meta_Sign(CK_SESSION_HANDLE hSession,
74 CK_BYTE_PTR pData, CK_ULONG ulDataLen,
75 CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen)
76 {
77 CK_RV rv;
78 meta_session_t *session;
79
80 rv = meta_handle2session(hSession, &session);
81 if (rv != CKR_OK)
82 return (rv);
83
84 if (pData == NULL || pulSignatureLen == NULL) {
85 meta_operation_cleanup(session, CKF_SIGN, FALSE);
86 REFRELEASE(session);
87 return (CKR_ARGUMENTS_BAD);
88 }
89
90 rv = meta_do_operation(CKF_SIGN, MODE_SINGLE, session, NULL,
91 pData, ulDataLen, pSignature, pulSignatureLen);
92
93 REFRELEASE(session);
94
95 return (rv);
96 }
97
98
99 /*
100 * meta_SignUpdate
101 *
102 */
103 CK_RV
meta_SignUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pPart,CK_ULONG ulPartLen)104 meta_SignUpdate(CK_SESSION_HANDLE hSession,
105 CK_BYTE_PTR pPart, CK_ULONG ulPartLen)
106 {
107 CK_RV rv;
108 meta_session_t *session;
109
110 rv = meta_handle2session(hSession, &session);
111 if (rv != CKR_OK)
112 return (rv);
113
114 if (pPart == NULL) {
115 meta_operation_cleanup(session, CKF_SIGN, FALSE);
116 REFRELEASE(session);
117 return (CKR_ARGUMENTS_BAD);
118 }
119
120 rv = meta_do_operation(CKF_SIGN, MODE_UPDATE, session, NULL,
121 pPart, ulPartLen, NULL, NULL);
122
123 REFRELEASE(session);
124
125 return (rv);
126 }
127
128
129 /*
130 * meta_SignFinal
131 *
132 */
133 CK_RV
meta_SignFinal(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pSignature,CK_ULONG_PTR pulSignatureLen)134 meta_SignFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature,
135 CK_ULONG_PTR pulSignatureLen)
136 {
137 CK_RV rv;
138 meta_session_t *session;
139
140 rv = meta_handle2session(hSession, &session);
141 if (rv != CKR_OK)
142 return (rv);
143
144 if (pulSignatureLen == NULL) {
145 meta_operation_cleanup(session, CKF_SIGN, FALSE);
146 REFRELEASE(session);
147 return (CKR_ARGUMENTS_BAD);
148 }
149
150 rv = meta_do_operation(CKF_SIGN, MODE_FINAL, session, NULL,
151 NULL, 0, pSignature, pulSignatureLen);
152
153 REFRELEASE(session);
154
155 return (rv);
156 }
157
158 /*
159 * meta_SignRecoverInit
160 *
161 */
162 CK_RV
meta_SignRecoverInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey)163 meta_SignRecoverInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
164 CK_OBJECT_HANDLE hKey)
165 {
166 CK_RV rv;
167 meta_session_t *session;
168 meta_object_t *key;
169
170 if (pMechanism == NULL)
171 return (CKR_ARGUMENTS_BAD);
172
173 rv = meta_handle2session(hSession, &session);
174 if (rv != CKR_OK)
175 return (rv);
176
177 rv = meta_handle2object(hKey, &key);
178 if (rv != CKR_OK) {
179 REFRELEASE(session);
180 return (rv);
181 }
182
183 rv = meta_operation_init(CKF_SIGN_RECOVER, session, pMechanism, key);
184
185 OBJRELEASE(key);
186 REFRELEASE(session);
187
188 return (rv);
189 }
190
191
192 /*
193 * meta_SignRecover
194 *
195 */
196 CK_RV
meta_SignRecover(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pData,CK_ULONG ulDataLen,CK_BYTE_PTR pSignature,CK_ULONG_PTR pulSignatureLen)197 meta_SignRecover(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData,
198 CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen)
199 {
200 CK_RV rv;
201 meta_session_t *session;
202
203 rv = meta_handle2session(hSession, &session);
204 if (rv != CKR_OK)
205 return (rv);
206
207 if (pData == NULL || pulSignatureLen == NULL) {
208 meta_operation_cleanup(session, CKF_SIGN_RECOVER, FALSE);
209 REFRELEASE(session);
210 return (CKR_ARGUMENTS_BAD);
211 }
212
213 rv = meta_do_operation(CKF_SIGN_RECOVER, MODE_SINGLE, session, NULL,
214 pData, ulDataLen, pSignature, pulSignatureLen);
215
216 REFRELEASE(session);
217
218 return (rv);
219 }
220