Merge remote-tracking branch 'origin/master'
[unleashed/lotheac.git] / usr / src / lib / pkcs11 / libpkcs11 / common / metaCrypt.c
blob0df7ea84b3067061ba04a0bc0ca4121a6ee5bf46
1 /*
2 * CDDL HEADER START
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.
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.
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]
19 * CDDL HEADER END
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 * Copyright 2018, Joyent, Inc.
28 * Encryption and Decryption Functions
29 * (as defined in PKCS#11 spec sections 11.8 and 11.9)
32 #include "metaGlobal.h"
36 * meta_EncryptInit
39 CK_RV
40 meta_EncryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
41 CK_OBJECT_HANDLE hKey)
43 CK_RV rv;
44 meta_session_t *session;
45 meta_object_t *key;
47 if (pMechanism == NULL)
48 return (CKR_ARGUMENTS_BAD);
50 rv = meta_handle2session(hSession, &session);
51 if (rv != CKR_OK)
52 return (rv);
54 rv = meta_handle2object(hKey, &key);
55 if (rv != CKR_OK) {
56 REFRELEASE(session);
57 return (rv);
60 rv = meta_operation_init_defer(CKF_ENCRYPT, session, pMechanism, key);
62 OBJRELEASE(key);
63 REFRELEASE(session);
65 return (rv);
70 * meta_Encrypt
73 CK_RV
74 meta_Encrypt(CK_SESSION_HANDLE hSession,
75 CK_BYTE_PTR pData, CK_ULONG ulDataLen,
76 CK_BYTE_PTR pEncryptedData, CK_ULONG_PTR pulEncryptedDataLen)
78 CK_RV rv;
79 meta_session_t *session;
81 rv = meta_handle2session(hSession, &session);
82 if (rv != CKR_OK)
83 return (rv);
85 if (pulEncryptedDataLen == NULL) {
86 meta_operation_cleanup(session, CKF_ENCRYPT, FALSE);
87 REFRELEASE(session);
88 return (CKR_ARGUMENTS_BAD);
92 * Allow pData to be NULL as long as the length is 0 in order to
93 * support ciphers that permit 0 byte inputs (e.g. combined mode
94 * ciphers), otherwise consider pData being NULL as invalid.
96 if (pData == NULL && ulDataLen != 0) {
97 meta_operation_cleanup(session, CKF_ENCRYPT, FALSE);
98 REFRELEASE(session);
99 return (CKR_ARGUMENTS_BAD);
102 rv = meta_do_operation(CKF_ENCRYPT, MODE_SINGLE, session, NULL,
103 pData, ulDataLen, pEncryptedData, pulEncryptedDataLen);
105 REFRELEASE(session);
107 return (rv);
112 * meta_EncryptUpdate
115 CK_RV
116 meta_EncryptUpdate(CK_SESSION_HANDLE hSession,
117 CK_BYTE_PTR pPart, CK_ULONG ulPartLen,
118 CK_BYTE_PTR pEncryptedPart, CK_ULONG_PTR pulEncryptedPartLen)
120 CK_RV rv;
121 meta_session_t *session;
123 rv = meta_handle2session(hSession, &session);
124 if (rv != CKR_OK)
125 return (rv);
127 if (pPart == NULL || pulEncryptedPartLen == NULL) {
128 meta_operation_cleanup(session, CKF_ENCRYPT, FALSE);
129 REFRELEASE(session);
130 return (CKR_ARGUMENTS_BAD);
133 rv = meta_do_operation(CKF_ENCRYPT, MODE_UPDATE, session, NULL,
134 pPart, ulPartLen, pEncryptedPart, pulEncryptedPartLen);
136 REFRELEASE(session);
138 return (rv);
143 * meta_EncryptFinal
146 CK_RV
147 meta_EncryptFinal(CK_SESSION_HANDLE hSession,
148 CK_BYTE_PTR pLastEncryptedPart, CK_ULONG_PTR pulLastEncryptedPartLen)
150 CK_RV rv;
151 meta_session_t *session;
153 rv = meta_handle2session(hSession, &session);
154 if (rv != CKR_OK)
155 return (rv);
157 if (pulLastEncryptedPartLen == NULL) {
158 meta_operation_cleanup(session, CKF_ENCRYPT, FALSE);
159 REFRELEASE(session);
160 return (CKR_ARGUMENTS_BAD);
163 rv = meta_do_operation(CKF_ENCRYPT, MODE_FINAL, session, NULL,
164 NULL, 0, pLastEncryptedPart, pulLastEncryptedPartLen);
166 REFRELEASE(session);
168 return (rv);
173 * meta_DecryptInit
176 CK_RV
177 meta_DecryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
178 CK_OBJECT_HANDLE hKey)
180 CK_RV rv;
181 meta_session_t *session;
182 meta_object_t *key;
184 if (pMechanism == NULL)
185 return (CKR_ARGUMENTS_BAD);
187 rv = meta_handle2session(hSession, &session);
188 if (rv != CKR_OK)
189 return (rv);
191 rv = meta_handle2object(hKey, &key);
192 if (rv != CKR_OK) {
193 REFRELEASE(session);
194 return (rv);
197 rv = meta_operation_init_defer(CKF_DECRYPT, session, pMechanism, key);
199 OBJRELEASE(key);
200 REFRELEASE(session);
202 return (rv);
207 * meta_Decrypt
210 CK_RV
211 meta_Decrypt(CK_SESSION_HANDLE hSession,
212 CK_BYTE_PTR pEncryptedData, CK_ULONG ulEncryptedDataLen,
213 CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen)
215 CK_RV rv;
216 meta_session_t *session;
218 rv = meta_handle2session(hSession, &session);
219 if (rv != CKR_OK)
220 return (rv);
222 if (pEncryptedData == NULL || pulDataLen == NULL) {
223 meta_operation_cleanup(session, CKF_DECRYPT, FALSE);
224 REFRELEASE(session);
225 return (CKR_ARGUMENTS_BAD);
228 rv = meta_do_operation(CKF_DECRYPT, MODE_SINGLE, session, NULL,
229 pEncryptedData, ulEncryptedDataLen, pData, pulDataLen);
231 REFRELEASE(session);
233 return (rv);
238 * meta_DecryptUpdate
241 CK_RV
242 meta_DecryptUpdate(CK_SESSION_HANDLE hSession,
243 CK_BYTE_PTR pEncryptedPart, CK_ULONG ulEncryptedPartLen,
244 CK_BYTE_PTR pPart, CK_ULONG_PTR pulPartLen)
246 CK_RV rv;
247 meta_session_t *session;
249 rv = meta_handle2session(hSession, &session);
250 if (rv != CKR_OK)
251 return (rv);
253 if (pEncryptedPart == NULL || pulPartLen == NULL) {
254 meta_operation_cleanup(session, CKF_DECRYPT, FALSE);
255 REFRELEASE(session);
256 return (CKR_ARGUMENTS_BAD);
259 rv = meta_do_operation(CKF_DECRYPT, MODE_UPDATE, session, NULL,
260 pEncryptedPart, ulEncryptedPartLen, pPart, pulPartLen);
262 REFRELEASE(session);
264 return (rv);
269 * meta_DecryptFinal
272 CK_RV
273 meta_DecryptFinal(CK_SESSION_HANDLE hSession,
274 CK_BYTE_PTR pLastPart, CK_ULONG_PTR pulLastPartLen)
276 CK_RV rv;
277 meta_session_t *session;
279 rv = meta_handle2session(hSession, &session);
280 if (rv != CKR_OK)
281 return (rv);
283 if (pulLastPartLen == NULL) {
284 meta_operation_cleanup(session, CKF_DECRYPT, FALSE);
285 REFRELEASE(session);
286 return (CKR_ARGUMENTS_BAD);
289 rv = meta_do_operation(CKF_DECRYPT, MODE_FINAL, session, NULL,
290 NULL, 0, pLastPart, pulLastPartLen);
292 REFRELEASE(session);
294 return (rv);