1/*
2 * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
3 */
4
5/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 *
13 * 2. Redistributions in binary form must reproduce the above copyright notice,
14 * this list of conditions and the following disclaimer in the documentation
15 * and/or other materials provided with the distribution.
16 *
17 * 3. The end-user documentation included with the redistribution, if any, must
18 * include the following acknowledgment:
19 *
20 * "This product includes software developed by IAIK of Graz University of
21 * Technology."
22 *
23 * Alternately, this acknowledgment may appear in the software itself, if
24 * and wherever such third-party acknowledgments normally appear.
25 *
26 * 4. The names "Graz University of Technology" and "IAIK of Graz University of
27 * Technology" must not be used to endorse or promote products derived from
28 * this software without prior written permission.
29 *
30 * 5. Products derived from this software may not be called
31 * "IAIK PKCS Wrapper", nor may "IAIK" appear in their name, without prior
32 * written permission of Graz University of Technology.
33 *
34 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
35 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
36 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
37 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE LICENSOR BE
38 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
39 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
40 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
41 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
42 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
43 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
44 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
45 * POSSIBILITY OF SUCH DAMAGE.
46 * ===========================================================================
47 */
48
49#include "pkcs11wrapper.h"
50
51#include <stdio.h>
52#include <stdlib.h>
53#include <string.h>
54#include <assert.h>
55
56#include "sun_security_pkcs11_wrapper_PKCS11.h"
57
58#ifdef P11_ENABLE_C_DIGESTENCRYPTUPDATE
59/*
60 * Class: sun_security_pkcs11_wrapper_PKCS11
61 * Method: C_DigestEncryptUpdate
62 * Signature: (J[B)[B
63 * Parametermapping: *PKCS11*
64 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession
65 * @param jbyteArray jPart CK_BYTE_PTR pPart
66 * CK_ULONG ulPartLen
67 * @return jbyteArray jEncryptedPart CK_BYTE_PTR pEncryptedPart
68 * CK_ULONG_PTR pulEncryptedPartLen
69 */
70JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DigestEncryptUpdate
71 (JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jPart)
72{
73 CK_SESSION_HANDLE ckSessionHandle;
74 CK_BYTE_PTR ckpPart = NULL_PTR, ckpEncryptedPart;
75 CK_ULONG ckPartLength, ckEncryptedPartLength = 0;
76 jbyteArray jEncryptedPart = NULL;
77 CK_RV rv;
78
79 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
80 if (ckpFunctions == NULL) { return NULL; }
81
82 ckSessionHandle = jLongToCKULong(jSessionHandle);
83 jByteArrayToCKByteArray(env, jPart, &ckpPart, &ckPartLength);
84 if ((*env)->ExceptionCheck(env)) { return NULL; }
85
86 rv = (*ckpFunctions->C_DigestEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, NULL_PTR, &ckEncryptedPartLength);
87 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
88 free(ckpPart);
89 return NULL;
90 }
91
92 ckpEncryptedPart = (CK_BYTE_PTR) malloc(ckEncryptedPartLength * sizeof(CK_BYTE));
93 if (ckpEncryptedPart == NULL) {
94 free(ckpPart);
95 throwOutOfMemoryError(env, 0);
96 return NULL;
97 }
98
99 rv = (*ckpFunctions->C_DigestEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, ckpEncryptedPart, &ckEncryptedPartLength);
100 if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
101 jEncryptedPart = ckByteArrayToJByteArray(env, ckpEncryptedPart, ckEncryptedPartLength);
102 }
103 free(ckpPart);
104 free(ckpEncryptedPart);
105
106 return jEncryptedPart ;
107}
108#endif
109
110#ifdef P11_ENABLE_C_DECRYPTDIGESTUPDATE
111/*
112 * Class: sun_security_pkcs11_wrapper_PKCS11
113 * Method: C_DecryptDigestUpdate
114 * Signature: (J[B)[B
115 * Parametermapping: *PKCS11*
116 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession
117 * @param jbyteArray jEncryptedPart CK_BYTE_PTR pEncryptedPart
118 * CK_ULONG ulEncryptedPartLen
119 * @return jbyteArray jPart CK_BYTE_PTR pPart
120 * CK_ULONG_PTR pulPartLen
121 */
122JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptDigestUpdate
123 (JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jEncryptedPart)
124{
125 CK_SESSION_HANDLE ckSessionHandle;
126 CK_BYTE_PTR ckpPart, ckpEncryptedPart = NULL_PTR;
127 CK_ULONG ckPartLength = 0, ckEncryptedPartLength;
128 jbyteArray jPart = NULL;
129 CK_RV rv;
130
131 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
132 if (ckpFunctions == NULL) { return NULL; }
133
134 ckSessionHandle = jLongToCKULong(jSessionHandle);
135 jByteArrayToCKByteArray(env, jEncryptedPart, &ckpEncryptedPart, &ckEncryptedPartLength);
136 if ((*env)->ExceptionCheck(env)) { return NULL; }
137
138 rv = (*ckpFunctions->C_DecryptDigestUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, NULL_PTR, &ckPartLength);
139 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
140 free(ckpEncryptedPart);
141 return NULL;
142 }
143
144 ckpPart = (CK_BYTE_PTR) malloc(ckPartLength * sizeof(CK_BYTE));
145 if (ckpPart == NULL) {
146 free(ckpEncryptedPart);
147 throwOutOfMemoryError(env, 0);
148 return NULL;
149 }
150
151 rv = (*ckpFunctions->C_DecryptDigestUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, ckpPart, &ckPartLength);
152 if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
153 jPart = ckByteArrayToJByteArray(env, ckpPart, ckPartLength);
154 }
155 free(ckpEncryptedPart);
156 free(ckpPart);
157
158 return jPart ;
159}
160#endif
161
162#ifdef P11_ENABLE_C_SIGNENCRYPTUPDATE
163/*
164 * Class: sun_security_pkcs11_wrapper_PKCS11
165 * Method: C_SignEncryptUpdate
166 * Signature: (J[B)[B
167 * Parametermapping: *PKCS11*
168 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession
169 * @param jbyteArray jPart CK_BYTE_PTR pPart
170 * CK_ULONG ulPartLen
171 * @return jbyteArray jEncryptedPart CK_BYTE_PTR pEncryptedPart
172 * CK_ULONG_PTR pulEncryptedPartLen
173 */
174JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignEncryptUpdate
175 (JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jPart)
176{
177 CK_SESSION_HANDLE ckSessionHandle;
178 CK_BYTE_PTR ckpPart = NULL_PTR, ckpEncryptedPart;
179 CK_ULONG ckPartLength, ckEncryptedPartLength = 0;
180 jbyteArray jEncryptedPart = NULL;
181 CK_RV rv;
182
183 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
184 if (ckpFunctions == NULL) { return NULL; }
185
186 ckSessionHandle = jLongToCKULong(jSessionHandle);
187 jByteArrayToCKByteArray(env, jPart, &ckpPart, &ckPartLength);
188 if ((*env)->ExceptionCheck(env)) { return NULL; }
189
190 rv = (*ckpFunctions->C_SignEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, NULL_PTR, &ckEncryptedPartLength);
191 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
192 free(ckpPart);
193 return NULL;
194 }
195
196 ckpEncryptedPart = (CK_BYTE_PTR) malloc(ckEncryptedPartLength * sizeof(CK_BYTE));
197 if (ckpEncryptedPart == NULL) {
198 free(ckpPart);
199 throwOutOfMemoryError(env, 0);
200 return NULL;
201 }
202
203 rv = (*ckpFunctions->C_SignEncryptUpdate)(ckSessionHandle, ckpPart, ckPartLength, ckpEncryptedPart, &ckEncryptedPartLength);
204 if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
205 jEncryptedPart = ckByteArrayToJByteArray(env, ckpEncryptedPart, ckEncryptedPartLength);
206 }
207 free(ckpPart);
208 free(ckpEncryptedPart);
209
210 return jEncryptedPart ;
211}
212#endif
213
214#ifdef P11_ENABLE_C_DECRYPTVERIFYUPDATE
215/*
216 * Class: sun_security_pkcs11_wrapper_PKCS11
217 * Method: C_DecryptVerifyUpdate
218 * Signature: (J[B)[B
219 * Parametermapping: *PKCS11*
220 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession
221 * @param jbyteArray jEncryptedPart CK_BYTE_PTR pEncryptedPart
222 * CK_ULONG ulEncryptedPartLen
223 * @return jbyteArray jPart CK_BYTE_PTR pPart
224 * CK_ULONG_PTR pulPartLen
225 */
226JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1DecryptVerifyUpdate
227 (JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jEncryptedPart)
228{
229 CK_SESSION_HANDLE ckSessionHandle;
230 CK_BYTE_PTR ckpPart, ckpEncryptedPart = NULL_PTR;
231 CK_ULONG ckPartLength = 0, ckEncryptedPartLength;
232 jbyteArray jPart = NULL;
233 CK_RV rv;
234
235 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
236 if (ckpFunctions == NULL) { return NULL; }
237
238 ckSessionHandle = jLongToCKULong(jSessionHandle);
239 jByteArrayToCKByteArray(env, jEncryptedPart, &ckpEncryptedPart, &ckEncryptedPartLength);
240 if ((*env)->ExceptionCheck(env)) { return NULL; }
241
242 rv = (*ckpFunctions->C_DecryptVerifyUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, NULL_PTR, &ckPartLength);
243 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
244 free(ckpEncryptedPart);
245 return NULL;
246 }
247
248 ckpPart = (CK_BYTE_PTR) malloc(ckPartLength * sizeof(CK_BYTE));
249 if (ckpPart == NULL) {
250 free(ckpEncryptedPart);
251 throwOutOfMemoryError(env, 0);
252 return NULL;
253 }
254
255 rv = (*ckpFunctions->C_DecryptVerifyUpdate)(ckSessionHandle, ckpEncryptedPart, ckEncryptedPartLength, ckpPart, &ckPartLength);
256
257 if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
258 jPart = ckByteArrayToJByteArray(env, ckpPart, ckPartLength);
259 }
260 free(ckpEncryptedPart);
261 free(ckpPart);
262
263 return jPart ;
264}
265#endif
266
267#ifdef P11_ENABLE_C_GETFUNCTIONSTATUS
268/*
269 * Class: sun_security_pkcs11_wrapper_PKCS11
270 * Method: C_GetFunctionStatus
271 * Signature: (J)V
272 * Parametermapping: *PKCS11*
273 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession
274 */
275JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1GetFunctionStatus
276 (JNIEnv *env, jobject obj, jlong jSessionHandle)
277{
278 CK_SESSION_HANDLE ckSessionHandle;
279 CK_RV rv;
280
281 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
282 if (ckpFunctions == NULL) { return; }
283
284 ckSessionHandle = jLongToCKULong(jSessionHandle);
285
286 /* C_GetFunctionStatus should always return CKR_FUNCTION_NOT_PARALLEL */
287 rv = (*ckpFunctions->C_GetFunctionStatus)(ckSessionHandle);
288 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
289}
290#endif
291
292#ifdef P11_ENABLE_C_CANCELFUNCTION
293/*
294 * Class: sun_security_pkcs11_wrapper_PKCS11
295 * Method: C_CancelFunction
296 * Signature: (J)V
297 * Parametermapping: *PKCS11*
298 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession
299 */
300JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1CancelFunction
301 (JNIEnv *env, jobject obj, jlong jSessionHandle)
302{
303 CK_SESSION_HANDLE ckSessionHandle;
304 CK_RV rv;
305
306 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
307 if (ckpFunctions == NULL) { return; }
308
309 ckSessionHandle = jLongToCKULong(jSessionHandle);
310
311 /* C_GetFunctionStatus should always return CKR_FUNCTION_NOT_PARALLEL */
312 rv = (*ckpFunctions->C_CancelFunction)(ckSessionHandle);
313 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
314}
315#endif
316