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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 /*
30  * Message Digesting Functions
31  * (as defined in PKCS#11 spec section 11.10)
32  */
33 
34 #include "metaGlobal.h"
35 
36 
37 /*
38  * meta_DigestInit
39  *
40  */
41 CK_RV
42 meta_DigestInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism)
43 {
44 	CK_RV rv;
45 	meta_session_t *session;
46 
47 	if (pMechanism == NULL)
48 		return (CKR_ARGUMENTS_BAD);
49 
50 	rv = meta_handle2session(hSession, &session);
51 	if (rv != CKR_OK)
52 		return (rv);
53 
54 	rv = meta_operation_init(OP_DIGEST, session, pMechanism, NULL);
55 
56 	REFRELEASE(session);
57 
58 	return (rv);
59 }
60 
61 
62 /*
63  * meta_Digest
64  *
65  */
66 CK_RV
67 meta_Digest(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen,
68     CK_BYTE_PTR pDigest, CK_ULONG_PTR pulDigestLen)
69 {
70 	CK_RV rv;
71 	meta_session_t *session;
72 
73 
74 	if (pData == NULL || pulDigestLen == NULL)
75 		return (CKR_ARGUMENTS_BAD);
76 
77 	rv = meta_handle2session(hSession, &session);
78 	if (rv != CKR_OK)
79 		return (rv);
80 
81 	rv = meta_do_operation(OP_DIGEST, MODE_SINGLE, session, NULL,
82 		pData, ulDataLen, pDigest, pulDigestLen);
83 
84 	REFRELEASE(session);
85 
86 	return (rv);
87 }
88 
89 
90 /*
91  * meta_DigestUpdate
92  *
93  */
94 CK_RV
95 meta_DigestUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart,
96     CK_ULONG ulPartLen)
97 {
98 	CK_RV rv;
99 	meta_session_t *session;
100 
101 
102 	if (pPart == NULL)
103 		return (CKR_ARGUMENTS_BAD);
104 
105 	rv = meta_handle2session(hSession, &session);
106 	if (rv != CKR_OK)
107 		return (rv);
108 
109 	rv = meta_do_operation(OP_DIGEST, MODE_UPDATE, session, NULL,
110 		pPart, ulPartLen, NULL, NULL);
111 
112 	REFRELEASE(session);
113 
114 	return (rv);
115 }
116 
117 
118 /*
119  * meta_DigestKey
120  *
121  * NOTE: This function can fail under certain circumstances!
122  * Unlike the other crypto functions, we didn't get the key object
123  * when the operation was initialized with C_DigestInit().
124  * Thus, the slot we're using for the digest operation may
125  * not be the slot containing the key -- if the key is extractible we can
126  * deal with it, but if it's not the operation will FAIL.
127  */
128 CK_RV
129 meta_DigestKey(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hKey)
130 {
131 	CK_RV rv;
132 	meta_session_t *session;
133 	meta_object_t *key;
134 
135 	rv = meta_handle2session(hSession, &session);
136 	if (rv != CKR_OK)
137 		return (rv);
138 
139 	rv = meta_handle2object(hKey, &key);
140 	if (rv != CKR_OK) {
141 		REFRELEASE(session);
142 		return (rv);
143 	}
144 
145 	/* meta_do_operation() will clone the key, if needed. */
146 	rv = meta_do_operation(OP_DIGEST, MODE_UPDATE_WITHKEY, session, key,
147 	    NULL, 0, NULL, NULL);
148 
149 	OBJRELEASE(key);
150 	REFRELEASE(session);
151 
152 	return (rv);
153 }
154 
155 
156 /*
157  * meta_DigestFinal
158  *
159  */
160 CK_RV
161 meta_DigestFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pDigest,
162     CK_ULONG_PTR pulDigestLen)
163 {
164 	CK_RV rv;
165 	meta_session_t *session;
166 
167 	if (pulDigestLen == NULL)
168 		return (CKR_ARGUMENTS_BAD);
169 
170 	rv = meta_handle2session(hSession, &session);
171 	if (rv != CKR_OK)
172 		return (rv);
173 
174 	rv = meta_do_operation(OP_DIGEST, MODE_FINAL, session, NULL,
175 		NULL, 0, pDigest, pulDigestLen);
176 
177 	REFRELEASE(session);
178 
179 	return (rv);
180 }
181