metaCrypt.c revision 4841:72ccafc74ba8
1351282Sdim/*
2351282Sdim * CDDL HEADER START
3351282Sdim *
4351282Sdim * The contents of this file are subject to the terms of the
5351282Sdim * Common Development and Distribution License (the "License").
6351282Sdim * You may not use this file except in compliance with the License.
7351282Sdim *
8351282Sdim * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9351282Sdim * or http://www.opensolaris.org/os/licensing.
10351282Sdim * See the License for the specific language governing permissions
11351282Sdim * and limitations under the License.
12351282Sdim *
13351282Sdim * When distributing Covered Code, include this CDDL HEADER in each
14351282Sdim * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15351282Sdim * If applicable, add the following below this CDDL HEADER, with the
16351282Sdim * fields enclosed by brackets "[]" replaced with your own identifying
17351282Sdim * information: Portions Copyright [yyyy] [name of copyright owner]
18351282Sdim *
19351282Sdim * CDDL HEADER END
20351282Sdim */
21351282Sdim/*
22351282Sdim * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23351282Sdim * Use is subject to license terms.
24351282Sdim */
25351282Sdim
26351282Sdim#pragma ident	"%Z%%M%	%I%	%E% SMI"
27351282Sdim
28351282Sdim/*
29351282Sdim * Encryption and Decryption Functions
30351282Sdim * (as defined in PKCS#11 spec sections 11.8 and 11.9)
31351282Sdim */
32351282Sdim
33351282Sdim#include "metaGlobal.h"
34351282Sdim
35351282Sdim
36351282Sdim/*
37351282Sdim * meta_EncryptInit
38351282Sdim *
39351282Sdim */
40351282SdimCK_RV
41351282Sdimmeta_EncryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
42351282Sdim    CK_OBJECT_HANDLE hKey)
43351282Sdim{
44351282Sdim	CK_RV rv;
45351282Sdim	meta_session_t *session;
46351282Sdim	meta_object_t *key;
47351282Sdim
48351282Sdim	if (pMechanism == NULL)
49351282Sdim		return (CKR_ARGUMENTS_BAD);
50351282Sdim
51351282Sdim	rv = meta_handle2session(hSession, &session);
52351282Sdim	if (rv != CKR_OK)
53351282Sdim		return (rv);
54351282Sdim
55351282Sdim	rv = meta_handle2object(hKey, &key);
56351282Sdim	if (rv != CKR_OK) {
57351282Sdim		REFRELEASE(session);
58351282Sdim		return (rv);
59351282Sdim	}
60351282Sdim
61351282Sdim	rv = meta_operation_init_defer(CKF_ENCRYPT, session, pMechanism, key);
62360784Sdim
63351282Sdim	OBJRELEASE(key);
64351282Sdim	REFRELEASE(session);
65351282Sdim
66351282Sdim	return (rv);
67351282Sdim}
68351282Sdim
69351282Sdim
70351282Sdim/*
71351282Sdim * meta_Encrypt
72351282Sdim *
73351282Sdim */
74351282SdimCK_RV
75351282Sdimmeta_Encrypt(CK_SESSION_HANDLE hSession,
76351282Sdim    CK_BYTE_PTR pData, CK_ULONG ulDataLen,
77351282Sdim    CK_BYTE_PTR pEncryptedData, CK_ULONG_PTR pulEncryptedDataLen)
78351282Sdim{
79351282Sdim	CK_RV rv;
80351282Sdim	meta_session_t *session;
81351282Sdim
82351282Sdim	rv = meta_handle2session(hSession, &session);
83351282Sdim	if (rv != CKR_OK)
84351282Sdim		return (rv);
85351282Sdim
86351282Sdim	if (pData == NULL || pulEncryptedDataLen == NULL) {
87351282Sdim		meta_operation_cleanup(session, CKF_ENCRYPT, FALSE);
88351282Sdim		REFRELEASE(session);
89351282Sdim		return (CKR_ARGUMENTS_BAD);
90351282Sdim	}
91351282Sdim
92351282Sdim	rv = meta_do_operation(CKF_ENCRYPT, MODE_SINGLE, session, NULL,
93351282Sdim	    pData, ulDataLen, pEncryptedData, pulEncryptedDataLen);
94351282Sdim
95351282Sdim	REFRELEASE(session);
96351282Sdim
97351282Sdim	return (rv);
98351282Sdim}
99351282Sdim
100351282Sdim
101351282Sdim/*
102351282Sdim * meta_EncryptUpdate
103351282Sdim *
104351282Sdim */
105351282SdimCK_RV
106351282Sdimmeta_EncryptUpdate(CK_SESSION_HANDLE hSession,
107351282Sdim    CK_BYTE_PTR pPart, CK_ULONG ulPartLen,
108351282Sdim    CK_BYTE_PTR pEncryptedPart, CK_ULONG_PTR pulEncryptedPartLen)
109351282Sdim{
110351282Sdim	CK_RV rv;
111351282Sdim	meta_session_t *session;
112351282Sdim
113351282Sdim	rv = meta_handle2session(hSession, &session);
114351282Sdim	if (rv != CKR_OK)
115351282Sdim		return (rv);
116351282Sdim
117351282Sdim	if (pPart == NULL || pulEncryptedPartLen == NULL) {
118351282Sdim		meta_operation_cleanup(session, CKF_ENCRYPT, FALSE);
119351282Sdim		REFRELEASE(session);
120351282Sdim		return (CKR_ARGUMENTS_BAD);
121351282Sdim	}
122351282Sdim
123351282Sdim	rv = meta_do_operation(CKF_ENCRYPT, MODE_UPDATE, session, NULL,
124351282Sdim	    pPart, ulPartLen, pEncryptedPart, pulEncryptedPartLen);
125351282Sdim
126351282Sdim	REFRELEASE(session);
127351282Sdim
128351282Sdim	return (rv);
129351282Sdim}
130351282Sdim
131351282Sdim
132351282Sdim/*
133360784Sdim * meta_EncryptFinal
134351282Sdim *
135351282Sdim */
136351282SdimCK_RV
137351282Sdimmeta_EncryptFinal(CK_SESSION_HANDLE hSession,
138351282Sdim    CK_BYTE_PTR pLastEncryptedPart, CK_ULONG_PTR pulLastEncryptedPartLen)
139351282Sdim{
140351282Sdim	CK_RV rv;
141351282Sdim	meta_session_t *session;
142351282Sdim
143351282Sdim	rv = meta_handle2session(hSession, &session);
144351282Sdim	if (rv != CKR_OK)
145351282Sdim		return (rv);
146351282Sdim
147351282Sdim	if (pulLastEncryptedPartLen == NULL) {
148351282Sdim		meta_operation_cleanup(session, CKF_ENCRYPT, FALSE);
149351282Sdim		REFRELEASE(session);
150351282Sdim		return (CKR_ARGUMENTS_BAD);
151351282Sdim	}
152351282Sdim
153351282Sdim	rv = meta_do_operation(CKF_ENCRYPT, MODE_FINAL, session, NULL,
154351282Sdim	    NULL, 0, pLastEncryptedPart, pulLastEncryptedPartLen);
155360784Sdim
156360784Sdim	REFRELEASE(session);
157360784Sdim
158360784Sdim	return (rv);
159360784Sdim}
160351282Sdim
161351282Sdim
162351282Sdim/*
163360784Sdim * meta_DecryptInit
164351282Sdim *
165351282Sdim */
166351282SdimCK_RV
167351282Sdimmeta_DecryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
168351282Sdim    CK_OBJECT_HANDLE hKey)
169351282Sdim{
170351282Sdim	CK_RV rv;
171351282Sdim	meta_session_t *session;
172351282Sdim	meta_object_t *key;
173351282Sdim
174351282Sdim	if (pMechanism == NULL)
175351282Sdim		return (CKR_ARGUMENTS_BAD);
176351282Sdim
177351282Sdim	rv = meta_handle2session(hSession, &session);
178351282Sdim	if (rv != CKR_OK)
179351282Sdim		return (rv);
180351282Sdim
181351282Sdim	rv = meta_handle2object(hKey, &key);
182351282Sdim	if (rv != CKR_OK) {
183351282Sdim		REFRELEASE(session);
184351282Sdim		return (rv);
185351282Sdim	}
186351282Sdim
187351282Sdim	rv = meta_operation_init_defer(CKF_DECRYPT, session, pMechanism, key);
188351282Sdim
189351282Sdim	OBJRELEASE(key);
190351282Sdim	REFRELEASE(session);
191351282Sdim
192351282Sdim	return (rv);
193351282Sdim}
194351282Sdim
195351282Sdim
196351282Sdim/*
197351282Sdim * meta_Decrypt
198351282Sdim *
199351282Sdim */
200351282SdimCK_RV
201351282Sdimmeta_Decrypt(CK_SESSION_HANDLE hSession,
202351282Sdim    CK_BYTE_PTR pEncryptedData, CK_ULONG ulEncryptedDataLen,
203351282Sdim    CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen)
204351282Sdim{
205351282Sdim	CK_RV rv;
206351282Sdim	meta_session_t *session;
207351282Sdim
208360784Sdim	rv = meta_handle2session(hSession, &session);
209351282Sdim	if (rv != CKR_OK)
210351282Sdim		return (rv);
211351282Sdim
212351282Sdim	if (pEncryptedData == NULL || pulDataLen == NULL) {
213351282Sdim		meta_operation_cleanup(session, CKF_DECRYPT, FALSE);
214351282Sdim		REFRELEASE(session);
215351282Sdim		return (CKR_ARGUMENTS_BAD);
216351282Sdim	}
217360784Sdim
218351282Sdim	rv = meta_do_operation(CKF_DECRYPT, MODE_SINGLE, session, NULL,
219351282Sdim	    pEncryptedData, ulEncryptedDataLen, pData, pulDataLen);
220351282Sdim
221360784Sdim	REFRELEASE(session);
222351282Sdim
223360784Sdim	return (rv);
224360784Sdim}
225360784Sdim
226351282Sdim
227351282Sdim/*
228360784Sdim * meta_DecryptUpdate
229360784Sdim *
230360784Sdim */
231360784SdimCK_RV
232360784Sdimmeta_DecryptUpdate(CK_SESSION_HANDLE hSession,
233360784Sdim    CK_BYTE_PTR pEncryptedPart, CK_ULONG ulEncryptedPartLen,
234360784Sdim    CK_BYTE_PTR pPart, CK_ULONG_PTR pulPartLen)
235360784Sdim{
236360784Sdim	CK_RV rv;
237360784Sdim	meta_session_t *session;
238360784Sdim
239351282Sdim	rv = meta_handle2session(hSession, &session);
240351282Sdim	if (rv != CKR_OK)
241351282Sdim		return (rv);
242351282Sdim
243360784Sdim	if (pEncryptedPart == NULL || pulPartLen == NULL) {
244351282Sdim		meta_operation_cleanup(session, CKF_DECRYPT, FALSE);
245351282Sdim		REFRELEASE(session);
246351282Sdim		return (CKR_ARGUMENTS_BAD);
247351282Sdim	}
248351282Sdim
249351282Sdim	rv = meta_do_operation(CKF_DECRYPT, MODE_UPDATE, session, NULL,
250351282Sdim	    pEncryptedPart, ulEncryptedPartLen, pPart, pulPartLen);
251351282Sdim
252351282Sdim	REFRELEASE(session);
253351282Sdim
254351282Sdim	return (rv);
255351282Sdim}
256351282Sdim
257351282Sdim
258351282Sdim/*
259351282Sdim * meta_DecryptFinal
260351282Sdim *
261351282Sdim */
262351282SdimCK_RV
263351282Sdimmeta_DecryptFinal(CK_SESSION_HANDLE hSession,
264351282Sdim    CK_BYTE_PTR pLastPart, CK_ULONG_PTR pulLastPartLen)
265351282Sdim{
266351282Sdim	CK_RV rv;
267351282Sdim	meta_session_t *session;
268351282Sdim
269351282Sdim	rv = meta_handle2session(hSession, &session);
270351282Sdim	if (rv != CKR_OK)
271351282Sdim		return (rv);
272351282Sdim
273351282Sdim	if (pulLastPartLen == NULL) {
274351282Sdim		meta_operation_cleanup(session, CKF_DECRYPT, FALSE);
275360784Sdim		REFRELEASE(session);
276351282Sdim		return (CKR_ARGUMENTS_BAD);
277351282Sdim	}
278351282Sdim
279351282Sdim	rv = meta_do_operation(CKF_DECRYPT, MODE_FINAL, session, NULL,
280351282Sdim	    NULL, 0, pLastPart, pulLastPartLen);
281351282Sdim
282351282Sdim	REFRELEASE(session);
283351282Sdim
284351282Sdim	return (rv);
285351282Sdim}
286351282Sdim