61 * Method: C_SignInit |
61 * Method: C_SignInit |
62 * Signature: (JLsun/security/pkcs11/wrapper/CK_MECHANISM;J)V |
62 * Signature: (JLsun/security/pkcs11/wrapper/CK_MECHANISM;J)V |
63 * Parametermapping: *PKCS11* |
63 * Parametermapping: *PKCS11* |
64 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession |
64 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession |
65 * @param jobject jMechanism CK_MECHANISM_PTR pMechanism |
65 * @param jobject jMechanism CK_MECHANISM_PTR pMechanism |
66 * @return jlong jKeyHandle CK_OBJECT_HANDLE hKey |
66 * @param jlong jKeyHandle CK_OBJECT_HANDLE hKey |
67 */ |
67 */ |
68 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignInit |
68 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignInit |
69 (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle) |
69 (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle) |
70 { |
70 { |
71 CK_SESSION_HANDLE ckSessionHandle; |
71 CK_SESSION_HANDLE ckSessionHandle; |
72 CK_MECHANISM ckMechanism; |
72 CK_MECHANISM_PTR ckpMechanism = NULL; |
73 CK_OBJECT_HANDLE ckKeyHandle; |
73 CK_OBJECT_HANDLE ckKeyHandle; |
74 CK_RV rv; |
74 CK_RV rv; |
75 |
75 |
76 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
76 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
77 if (ckpFunctions == NULL) { return; } |
77 if (ckpFunctions == NULL) { return; } |
78 |
78 |
79 ckSessionHandle = jLongToCKULong(jSessionHandle); |
79 TRACE0("DEBUG: C_SignInit\n"); |
80 jMechanismToCKMechanism(env, jMechanism, &ckMechanism); |
80 |
|
81 ckSessionHandle = jLongToCKULong(jSessionHandle); |
|
82 |
|
83 ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); |
81 if ((*env)->ExceptionCheck(env)) { return; } |
84 if ((*env)->ExceptionCheck(env)) { return; } |
|
85 |
82 ckKeyHandle = jLongToCKULong(jKeyHandle); |
86 ckKeyHandle = jLongToCKULong(jKeyHandle); |
83 |
87 |
84 rv = (*ckpFunctions->C_SignInit)(ckSessionHandle, &ckMechanism, ckKeyHandle); |
88 rv = (*ckpFunctions->C_SignInit)(ckSessionHandle, ckpMechanism, ckKeyHandle); |
85 |
89 |
86 if (ckMechanism.pParameter != NULL_PTR) { |
90 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK || |
87 free(ckMechanism.pParameter); |
91 (ckpMechanism->pParameter == NULL)) { |
88 } |
92 freeCKMechanismPtr(ckpMechanism); |
89 |
93 } else { |
90 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } |
94 (*env)->SetLongField(env, jMechanism, mech_pHandleID, ptr_to_jlong(ckpMechanism)); |
|
95 TRACE1("DEBUG C_SignInit: stored pMech = 0x%lX\n", ptr_to_jlong(ckpMechanism)); |
|
96 } |
|
97 TRACE0("FINISHED\n"); |
91 } |
98 } |
92 #endif |
99 #endif |
93 |
100 |
94 #ifdef P11_ENABLE_C_SIGN |
101 #ifdef P11_ENABLE_C_SIGN |
95 /* |
102 /* |
96 * Class: sun_security_pkcs11_wrapper_PKCS11 |
103 * Class: sun_security_pkcs11_wrapper_PKCS11 |
97 * Method: C_Sign |
104 * Method: C_Sign |
98 * Signature: (J[B)[B |
105 * Signature: (J[BI)[B |
99 * Parametermapping: *PKCS11* |
106 * Parametermapping: *PKCS11* |
100 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession |
107 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession |
101 * @param jbyteArray jData CK_BYTE_PTR pData |
108 * @param jbyteArray jData CK_BYTE_PTR pData |
102 * CK_ULONG ulDataLen |
109 * CK_ULONG ulDataLen |
103 * @return jbyteArray jSignature CK_BYTE_PTR pSignature |
110 * @return jbyteArray jSignature CK_BYTE_PTR pSignature |
106 JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Sign |
113 JNIEXPORT jbyteArray JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1Sign |
107 (JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jData) |
114 (JNIEnv *env, jobject obj, jlong jSessionHandle, jbyteArray jData) |
108 { |
115 { |
109 CK_SESSION_HANDLE ckSessionHandle; |
116 CK_SESSION_HANDLE ckSessionHandle; |
110 CK_BYTE_PTR ckpData = NULL_PTR; |
117 CK_BYTE_PTR ckpData = NULL_PTR; |
111 CK_BYTE_PTR ckpSignature; |
|
112 CK_ULONG ckDataLength; |
118 CK_ULONG ckDataLength; |
113 CK_ULONG ckSignatureLength = 0; |
119 CK_BYTE_PTR bufP; |
|
120 CK_ULONG ckSignatureLength; |
|
121 CK_BYTE BUF[MAX_STACK_BUFFER_LEN]; |
114 jbyteArray jSignature = NULL; |
122 jbyteArray jSignature = NULL; |
115 CK_RV rv; |
123 CK_RV rv; |
116 |
124 |
117 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
125 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
118 if (ckpFunctions == NULL) { return NULL; } |
126 if (ckpFunctions == NULL) { return NULL; } |
119 |
127 |
|
128 TRACE0("DEBUG: C_Sign\n"); |
|
129 |
120 ckSessionHandle = jLongToCKULong(jSessionHandle); |
130 ckSessionHandle = jLongToCKULong(jSessionHandle); |
121 jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength); |
131 jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength); |
122 if ((*env)->ExceptionCheck(env)) { return NULL; } |
132 if ((*env)->ExceptionCheck(env)) { |
123 |
|
124 /* START standard code */ |
|
125 |
|
126 /* first determine the length of the signature */ |
|
127 rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, NULL_PTR, &ckSignatureLength); |
|
128 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { |
|
129 free(ckpData); |
|
130 return NULL; |
133 return NULL; |
131 } |
134 } |
132 |
135 |
133 ckpSignature = (CK_BYTE_PTR) malloc(ckSignatureLength * sizeof(CK_BYTE)); |
136 TRACE1("DEBUG C_Sign: data length = %lu\n", ckDataLength); |
134 if (ckpSignature == NULL) { |
137 |
135 free(ckpData); |
138 // unknown signature length |
136 throwOutOfMemoryError(env, 0); |
139 bufP = BUF; |
137 return NULL; |
140 ckSignatureLength = MAX_STACK_BUFFER_LEN; |
138 } |
141 |
139 |
142 rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, |
140 /* now get the signature */ |
143 bufP, &ckSignatureLength); |
141 rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength); |
144 |
142 /* END standard code */ |
145 TRACE1("DEBUG C_Sign: ret rv=0x%lX\n", rv); |
143 |
146 |
144 |
|
145 /* START workaround code for operation abort bug in pkcs#11 of Datakey and iButton */ |
|
146 /* |
|
147 ckpSignature = (CK_BYTE_PTR) malloc(256 * sizeof(CK_BYTE)); |
|
148 if (ckpSignature == NULL) { |
|
149 free(ckpData); |
|
150 throwOutOfMemoryError(env, 0); |
|
151 return NULL; |
|
152 } |
|
153 rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength); |
|
154 |
|
155 if (rv == CKR_BUFFER_TOO_SMALL) { |
|
156 free(ckpSignature); |
|
157 ckpSignature = (CK_BYTE_PTR) malloc(ckSignatureLength * sizeof(CK_BYTE)); |
|
158 if (ckpSignature == NULL) { |
|
159 free(ckpData); |
|
160 throwOutOfMemoryError(env, 0); |
|
161 return NULL; |
|
162 } |
|
163 rv = (*ckpFunctions->C_Sign)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, &ckSignatureLength); |
|
164 } |
|
165 */ |
|
166 /* END workaround code */ |
|
167 if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) { |
147 if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) { |
168 jSignature = ckByteArrayToJByteArray(env, ckpSignature, ckSignatureLength); |
148 jSignature = ckByteArrayToJByteArray(env, bufP, ckSignatureLength); |
169 } |
149 TRACE1("DEBUG C_Sign: signature length = %lu\n", ckSignatureLength); |
|
150 } |
|
151 |
170 free(ckpData); |
152 free(ckpData); |
171 free(ckpSignature); |
153 if (bufP != BUF) { free(bufP); } |
172 |
154 |
173 return jSignature ; |
155 TRACE0("FINISHED\n"); |
|
156 return jSignature; |
174 } |
157 } |
175 #endif |
158 #endif |
176 |
159 |
177 #ifdef P11_ENABLE_C_SIGNUPDATE |
160 #ifdef P11_ENABLE_C_SIGNUPDATE |
178 /* |
161 /* |
218 |
201 |
219 while (jInLen > 0) { |
202 while (jInLen > 0) { |
220 jsize chunkLen = min(bufLen, jInLen); |
203 jsize chunkLen = min(bufLen, jInLen); |
221 (*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP); |
204 (*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP); |
222 if ((*env)->ExceptionCheck(env)) { |
205 if ((*env)->ExceptionCheck(env)) { |
223 if (bufP != BUF) { free(bufP); } |
206 goto cleanup; |
224 return; |
|
225 } |
207 } |
226 rv = (*ckpFunctions->C_SignUpdate)(ckSessionHandle, bufP, chunkLen); |
208 rv = (*ckpFunctions->C_SignUpdate)(ckSessionHandle, bufP, chunkLen); |
227 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { |
209 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { |
228 if (bufP != BUF) { |
210 goto cleanup; |
229 free(bufP); |
|
230 } |
|
231 return; |
|
232 } |
211 } |
233 jInOfs += chunkLen; |
212 jInOfs += chunkLen; |
234 jInLen -= chunkLen; |
213 jInLen -= chunkLen; |
235 } |
214 } |
236 |
215 |
|
216 cleanup: |
237 if (bufP != BUF) { free(bufP); } |
217 if (bufP != BUF) { free(bufP); } |
|
218 |
|
219 return; |
238 } |
220 } |
239 #endif |
221 #endif |
240 |
222 |
241 #ifdef P11_ENABLE_C_SIGNFINAL |
223 #ifdef P11_ENABLE_C_SIGNFINAL |
242 /* |
224 /* |
292 * Method: C_SignRecoverInit |
274 * Method: C_SignRecoverInit |
293 * Signature: (JLsun/security/pkcs11/wrapper/CK_MECHANISM;J)V |
275 * Signature: (JLsun/security/pkcs11/wrapper/CK_MECHANISM;J)V |
294 * Parametermapping: *PKCS11* |
276 * Parametermapping: *PKCS11* |
295 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession |
277 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession |
296 * @param jobject jMechanism CK_MECHANISM_PTR pMechanism |
278 * @param jobject jMechanism CK_MECHANISM_PTR pMechanism |
297 * @return jlong jKeyHandle CK_OBJECT_HANDLE hKey |
279 * @param jlong jKeyHandle CK_OBJECT_HANDLE hKey |
298 */ |
280 */ |
299 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignRecoverInit |
281 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1SignRecoverInit |
300 (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle) |
282 (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle) |
301 { |
283 { |
302 CK_SESSION_HANDLE ckSessionHandle; |
284 CK_SESSION_HANDLE ckSessionHandle; |
303 CK_MECHANISM ckMechanism; |
285 CK_MECHANISM_PTR ckpMechanism = NULL; |
304 CK_OBJECT_HANDLE ckKeyHandle; |
286 CK_OBJECT_HANDLE ckKeyHandle; |
305 CK_RV rv; |
287 CK_RV rv; |
306 |
288 |
307 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
289 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
308 if (ckpFunctions == NULL) { return; } |
290 if (ckpFunctions == NULL) { return; } |
309 |
291 |
310 ckSessionHandle = jLongToCKULong(jSessionHandle); |
292 TRACE0("DEBUG: C_SignRecoverInit\n"); |
311 jMechanismToCKMechanism(env, jMechanism, &ckMechanism); |
293 |
|
294 ckSessionHandle = jLongToCKULong(jSessionHandle); |
|
295 ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); |
312 if ((*env)->ExceptionCheck(env)) { return; } |
296 if ((*env)->ExceptionCheck(env)) { return; } |
313 |
297 |
314 ckKeyHandle = jLongToCKULong(jKeyHandle); |
298 ckKeyHandle = jLongToCKULong(jKeyHandle); |
315 |
299 |
316 rv = (*ckpFunctions->C_SignRecoverInit)(ckSessionHandle, &ckMechanism, ckKeyHandle); |
300 rv = (*ckpFunctions->C_SignRecoverInit)(ckSessionHandle, ckpMechanism, ckKeyHandle); |
317 |
301 |
318 if (ckMechanism.pParameter != NULL_PTR) { |
302 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK || |
319 free(ckMechanism.pParameter); |
303 (ckpMechanism->pParameter == NULL)) { |
320 } |
304 freeCKMechanismPtr(ckpMechanism); |
321 |
305 } else { |
322 if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } |
306 (*env)->SetLongField(env, jMechanism, mech_pHandleID, ptr_to_jlong(ckpMechanism)); |
|
307 TRACE1("DEBUG C_SignRecoverInit, stored pMech = 0x%lX\n", ptr_to_jlong(ckpMechanism)); |
|
308 } |
|
309 TRACE0("FINISHED\n"); |
323 } |
310 } |
324 #endif |
311 #endif |
325 |
312 |
326 #ifdef P11_ENABLE_C_SIGNRECOVER |
313 #ifdef P11_ENABLE_C_SIGNRECOVER |
327 /* |
314 /* |
342 CK_RV rv; |
329 CK_RV rv; |
343 CK_BYTE INBUF[MAX_STACK_BUFFER_LEN]; |
330 CK_BYTE INBUF[MAX_STACK_BUFFER_LEN]; |
344 CK_BYTE OUTBUF[MAX_STACK_BUFFER_LEN]; |
331 CK_BYTE OUTBUF[MAX_STACK_BUFFER_LEN]; |
345 CK_BYTE_PTR inBufP; |
332 CK_BYTE_PTR inBufP; |
346 CK_BYTE_PTR outBufP = OUTBUF; |
333 CK_BYTE_PTR outBufP = OUTBUF; |
347 CK_ULONG ckSignatureLength = MAX_STACK_BUFFER_LEN; |
334 CK_ULONG ckSignatureLength = 0; |
348 |
335 |
349 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
336 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
350 if (ckpFunctions == NULL) { return 0; } |
337 if (ckpFunctions == NULL) { return 0; } |
351 |
338 |
352 ckSessionHandle = jLongToCKULong(jSessionHandle); |
339 ckSessionHandle = jLongToCKULong(jSessionHandle); |
353 |
340 |
354 if (jInLen <= MAX_STACK_BUFFER_LEN) { |
341 if (jInLen <= MAX_STACK_BUFFER_LEN) { |
355 inBufP = INBUF; |
342 inBufP = INBUF; |
|
343 ckSignatureLength = MAX_STACK_BUFFER_LEN; |
356 } else { |
344 } else { |
357 inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen); |
345 inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen); |
358 if (inBufP == NULL) { |
346 if (inBufP == NULL) { |
359 throwOutOfMemoryError(env, 0); |
347 throwOutOfMemoryError(env, 0); |
360 return 0; |
348 return 0; |
361 } |
349 } |
|
350 ckSignatureLength = jInLen; |
362 } |
351 } |
363 |
352 |
364 (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP); |
353 (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP); |
365 if ((*env)->ExceptionCheck(env)) { |
354 if ((*env)->ExceptionCheck(env)) { |
366 if (inBufP != INBUF) { free(inBufP); } |
355 goto cleanup; |
367 return 0; |
356 } |
368 } |
357 |
369 rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength); |
358 rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength); |
370 /* re-alloc larger buffer if it fits into our Java buffer */ |
359 /* re-alloc larger buffer if it fits into our Java buffer */ |
371 if ((rv == CKR_BUFFER_TOO_SMALL) && (ckSignatureLength <= jIntToCKULong(jOutLen))) { |
360 if ((rv == CKR_BUFFER_TOO_SMALL) && (ckSignatureLength <= jIntToCKULong(jOutLen))) { |
372 outBufP = (CK_BYTE_PTR) malloc(ckSignatureLength); |
361 outBufP = (CK_BYTE_PTR) malloc(ckSignatureLength); |
373 if (outBufP == NULL) { |
362 if (outBufP == NULL) { |
374 if (inBufP != INBUF) { |
|
375 free(inBufP); |
|
376 } |
|
377 throwOutOfMemoryError(env, 0); |
363 throwOutOfMemoryError(env, 0); |
378 return 0; |
364 goto cleanup; |
379 } |
365 } |
380 rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength); |
366 rv = (*ckpFunctions->C_SignRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckSignatureLength); |
381 } |
367 } |
382 if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) { |
368 if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) { |
383 (*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckSignatureLength, (jbyte *)outBufP); |
369 (*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckSignatureLength, (jbyte *)outBufP); |
384 } |
370 } |
385 |
371 cleanup: |
386 if (inBufP != INBUF) { free(inBufP); } |
372 if (inBufP != INBUF) { free(inBufP); } |
387 if (outBufP != OUTBUF) { free(outBufP); } |
373 if (outBufP != OUTBUF) { free(outBufP); } |
388 |
374 |
389 return ckSignatureLength; |
375 return ckSignatureLength; |
390 } |
376 } |
396 * Method: C_VerifyInit |
382 * Method: C_VerifyInit |
397 * Signature: (JLsun/security/pkcs11/wrapper/CK_MECHANISM;J)V |
383 * Signature: (JLsun/security/pkcs11/wrapper/CK_MECHANISM;J)V |
398 * Parametermapping: *PKCS11* |
384 * Parametermapping: *PKCS11* |
399 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession |
385 * @param jlong jSessionHandle CK_SESSION_HANDLE hSession |
400 * @param jobject jMechanism CK_MECHANISM_PTR pMechanism |
386 * @param jobject jMechanism CK_MECHANISM_PTR pMechanism |
401 * @return jlong jKeyHandle CK_OBJECT_HANDLE hKey |
387 * @param jlong jKeyHandle CK_OBJECT_HANDLE hKey |
402 */ |
388 */ |
403 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyInit |
389 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyInit |
404 (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle) |
390 (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle) |
405 { |
391 { |
406 CK_SESSION_HANDLE ckSessionHandle; |
392 CK_SESSION_HANDLE ckSessionHandle; |
407 CK_MECHANISM ckMechanism; |
393 CK_MECHANISM_PTR ckpMechanism = NULL; |
408 CK_OBJECT_HANDLE ckKeyHandle; |
394 CK_OBJECT_HANDLE ckKeyHandle; |
409 CK_RV rv; |
395 CK_RV rv; |
410 |
396 |
411 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
397 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
412 if (ckpFunctions == NULL) { return; } |
398 if (ckpFunctions == NULL) { return; } |
413 |
399 |
414 ckSessionHandle = jLongToCKULong(jSessionHandle); |
400 TRACE0("DEBUG: C_VerifyInit\n"); |
415 jMechanismToCKMechanism(env, jMechanism, &ckMechanism); |
401 |
416 if ((*env)->ExceptionCheck(env)) { return; } |
402 ckSessionHandle = jLongToCKULong(jSessionHandle); |
|
403 ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); |
|
404 if ((*env)->ExceptionCheck(env)) { |
|
405 return; |
|
406 } |
417 |
407 |
418 ckKeyHandle = jLongToCKULong(jKeyHandle); |
408 ckKeyHandle = jLongToCKULong(jKeyHandle); |
419 |
409 |
420 rv = (*ckpFunctions->C_VerifyInit)(ckSessionHandle, &ckMechanism, ckKeyHandle); |
410 rv = (*ckpFunctions->C_VerifyInit)(ckSessionHandle, ckpMechanism, ckKeyHandle); |
421 |
411 |
422 if(ckMechanism.pParameter != NULL_PTR) { |
412 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK || |
423 free(ckMechanism.pParameter); |
413 (ckpMechanism->pParameter == NULL)) { |
424 } |
414 freeCKMechanismPtr(ckpMechanism); |
425 |
415 } else { |
426 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } |
416 (*env)->SetLongField(env, jMechanism, mech_pHandleID, ptr_to_jlong(ckpMechanism)); |
|
417 TRACE1("DEBUG C_VerifyInit: stored pMech = 0x%lX\n", ptr_to_jlong(ckpMechanism)); |
|
418 } |
|
419 TRACE0("FINISHED\n"); |
427 } |
420 } |
428 #endif |
421 #endif |
429 |
422 |
430 #ifdef P11_ENABLE_C_VERIFY |
423 #ifdef P11_ENABLE_C_VERIFY |
431 /* |
424 /* |
445 CK_SESSION_HANDLE ckSessionHandle; |
438 CK_SESSION_HANDLE ckSessionHandle; |
446 CK_BYTE_PTR ckpData = NULL_PTR; |
439 CK_BYTE_PTR ckpData = NULL_PTR; |
447 CK_BYTE_PTR ckpSignature = NULL_PTR; |
440 CK_BYTE_PTR ckpSignature = NULL_PTR; |
448 CK_ULONG ckDataLength; |
441 CK_ULONG ckDataLength; |
449 CK_ULONG ckSignatureLength; |
442 CK_ULONG ckSignatureLength; |
450 CK_RV rv; |
443 CK_RV rv = 0; |
451 |
444 |
452 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
445 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
453 if (ckpFunctions == NULL) { return; } |
446 if (ckpFunctions == NULL) { return; } |
454 |
447 |
455 ckSessionHandle = jLongToCKULong(jSessionHandle); |
448 ckSessionHandle = jLongToCKULong(jSessionHandle); |
|
449 |
456 jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength); |
450 jByteArrayToCKByteArray(env, jData, &ckpData, &ckDataLength); |
457 if ((*env)->ExceptionCheck(env)) { return; } |
451 if ((*env)->ExceptionCheck(env)) { |
|
452 return; |
|
453 } |
458 |
454 |
459 jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength); |
455 jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength); |
460 if ((*env)->ExceptionCheck(env)) { |
456 if ((*env)->ExceptionCheck(env)) { |
461 free(ckpData); |
457 goto cleanup; |
462 return; |
|
463 } |
458 } |
464 |
459 |
465 /* verify the signature */ |
460 /* verify the signature */ |
466 rv = (*ckpFunctions->C_Verify)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, ckSignatureLength); |
461 rv = (*ckpFunctions->C_Verify)(ckSessionHandle, ckpData, ckDataLength, ckpSignature, ckSignatureLength); |
467 |
462 |
|
463 cleanup: |
468 free(ckpData); |
464 free(ckpData); |
469 free(ckpSignature); |
465 free(ckpSignature); |
470 |
466 |
471 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } |
467 ckAssertReturnValueOK(env, rv); |
472 } |
468 } |
473 #endif |
469 #endif |
474 |
470 |
475 #ifdef P11_ENABLE_C_VERIFYUPDATE |
471 #ifdef P11_ENABLE_C_VERIFYUPDATE |
476 /* |
472 /* |
508 } else { |
504 } else { |
509 bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen); |
505 bufLen = min(MAX_HEAP_BUFFER_LEN, jInLen); |
510 bufP = (CK_BYTE_PTR) malloc((size_t)bufLen); |
506 bufP = (CK_BYTE_PTR) malloc((size_t)bufLen); |
511 if (bufP == NULL) { |
507 if (bufP == NULL) { |
512 throwOutOfMemoryError(env, 0); |
508 throwOutOfMemoryError(env, 0); |
513 return; |
509 goto cleanup; |
514 } |
510 } |
515 } |
511 } |
516 |
512 |
517 while (jInLen > 0) { |
513 while (jInLen > 0) { |
518 jsize chunkLen = min(bufLen, jInLen); |
514 jsize chunkLen = min(bufLen, jInLen); |
519 (*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP); |
515 (*env)->GetByteArrayRegion(env, jIn, jInOfs, chunkLen, (jbyte *)bufP); |
520 if ((*env)->ExceptionCheck(env)) { |
516 if ((*env)->ExceptionCheck(env)) { |
521 if (bufP != BUF) { free(bufP); } |
517 goto cleanup; |
522 return; |
|
523 } |
518 } |
524 |
519 |
525 rv = (*ckpFunctions->C_VerifyUpdate)(ckSessionHandle, bufP, chunkLen); |
520 rv = (*ckpFunctions->C_VerifyUpdate)(ckSessionHandle, bufP, chunkLen); |
526 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { |
521 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { |
527 if (bufP != BUF) { free(bufP); } |
522 goto cleanup; |
528 return; |
|
529 } |
523 } |
530 jInOfs += chunkLen; |
524 jInOfs += chunkLen; |
531 jInLen -= chunkLen; |
525 jInLen -= chunkLen; |
532 } |
526 } |
533 |
527 |
|
528 cleanup: |
534 if (bufP != BUF) { free(bufP); } |
529 if (bufP != BUF) { free(bufP); } |
535 } |
530 } |
536 #endif |
531 #endif |
537 |
532 |
538 #ifdef P11_ENABLE_C_VERIFYFINAL |
533 #ifdef P11_ENABLE_C_VERIFYFINAL |
556 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
551 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
557 if (ckpFunctions == NULL) { return; } |
552 if (ckpFunctions == NULL) { return; } |
558 |
553 |
559 ckSessionHandle = jLongToCKULong(jSessionHandle); |
554 ckSessionHandle = jLongToCKULong(jSessionHandle); |
560 jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength); |
555 jByteArrayToCKByteArray(env, jSignature, &ckpSignature, &ckSignatureLength); |
561 if ((*env)->ExceptionCheck(env)) { return; } |
556 if ((*env)->ExceptionCheck(env)) { |
|
557 return; |
|
558 } |
562 |
559 |
563 /* verify the signature */ |
560 /* verify the signature */ |
564 rv = (*ckpFunctions->C_VerifyFinal)(ckSessionHandle, ckpSignature, ckSignatureLength); |
561 rv = (*ckpFunctions->C_VerifyFinal)(ckSessionHandle, ckpSignature, ckSignatureLength); |
565 |
562 |
566 free(ckpSignature); |
563 free(ckpSignature); |
567 |
564 |
568 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } |
565 ckAssertReturnValueOK(env, rv); |
569 } |
566 } |
570 #endif |
567 #endif |
571 |
568 |
572 #ifdef P11_ENABLE_C_VERIFYRECOVERINIT |
569 #ifdef P11_ENABLE_C_VERIFYRECOVERINIT |
573 /* |
570 /* |
581 */ |
578 */ |
582 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyRecoverInit |
579 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_C_1VerifyRecoverInit |
583 (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle) |
580 (JNIEnv *env, jobject obj, jlong jSessionHandle, jobject jMechanism, jlong jKeyHandle) |
584 { |
581 { |
585 CK_SESSION_HANDLE ckSessionHandle; |
582 CK_SESSION_HANDLE ckSessionHandle; |
586 CK_MECHANISM ckMechanism; |
583 CK_MECHANISM_PTR ckpMechanism = NULL; |
587 CK_OBJECT_HANDLE ckKeyHandle; |
584 CK_OBJECT_HANDLE ckKeyHandle; |
588 CK_RV rv; |
585 CK_RV rv; |
589 |
586 |
590 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
587 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
591 if (ckpFunctions == NULL) { return; } |
588 if (ckpFunctions == NULL) { return; } |
592 |
589 |
593 ckSessionHandle = jLongToCKULong(jSessionHandle); |
590 TRACE0("DEBUG: C_VerifyRecoverInit\n"); |
594 jMechanismToCKMechanism(env, jMechanism, &ckMechanism); |
591 |
|
592 ckSessionHandle = jLongToCKULong(jSessionHandle); |
|
593 ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); |
595 if ((*env)->ExceptionCheck(env)) { return; } |
594 if ((*env)->ExceptionCheck(env)) { return; } |
596 |
595 |
597 ckKeyHandle = jLongToCKULong(jKeyHandle); |
596 ckKeyHandle = jLongToCKULong(jKeyHandle); |
598 |
597 |
599 rv = (*ckpFunctions->C_VerifyRecoverInit)(ckSessionHandle, &ckMechanism, ckKeyHandle); |
598 rv = (*ckpFunctions->C_VerifyRecoverInit)(ckSessionHandle, ckpMechanism, ckKeyHandle); |
600 |
599 |
601 if (ckMechanism.pParameter != NULL_PTR) { |
600 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK || |
602 free(ckMechanism.pParameter); |
601 (ckpMechanism->pParameter == NULL)) { |
603 } |
602 freeCKMechanismPtr(ckpMechanism); |
604 |
603 } else { |
605 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } |
604 (*env)->SetLongField(env, jMechanism, mech_pHandleID, ptr_to_jlong(ckpMechanism)); |
|
605 TRACE1("DEBUG C_VerifyRecoverInit: stored pMech = 0x%lX\n", ptr_to_jlong(ckpMechanism)); |
|
606 } |
|
607 TRACE0("FINISHED\n"); |
606 } |
608 } |
607 #endif |
609 #endif |
608 |
610 |
609 #ifdef P11_ENABLE_C_VERIFYRECOVER |
611 #ifdef P11_ENABLE_C_VERIFYRECOVER |
610 /* |
612 /* |
625 CK_RV rv; |
627 CK_RV rv; |
626 CK_BYTE INBUF[MAX_STACK_BUFFER_LEN]; |
628 CK_BYTE INBUF[MAX_STACK_BUFFER_LEN]; |
627 CK_BYTE OUTBUF[MAX_STACK_BUFFER_LEN]; |
629 CK_BYTE OUTBUF[MAX_STACK_BUFFER_LEN]; |
628 CK_BYTE_PTR inBufP; |
630 CK_BYTE_PTR inBufP; |
629 CK_BYTE_PTR outBufP = OUTBUF; |
631 CK_BYTE_PTR outBufP = OUTBUF; |
630 CK_ULONG ckDataLength = MAX_STACK_BUFFER_LEN; |
632 CK_ULONG ckDataLength = 0; |
631 |
633 |
632 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
634 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
633 if (ckpFunctions == NULL) { return 0; } |
635 if (ckpFunctions == NULL) { return 0; } |
634 |
636 |
635 ckSessionHandle = jLongToCKULong(jSessionHandle); |
637 ckSessionHandle = jLongToCKULong(jSessionHandle); |
636 |
638 |
637 if (jInLen <= MAX_STACK_BUFFER_LEN) { |
639 if (jInLen <= MAX_STACK_BUFFER_LEN) { |
638 inBufP = INBUF; |
640 inBufP = INBUF; |
|
641 ckDataLength = MAX_STACK_BUFFER_LEN; |
639 } else { |
642 } else { |
640 inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen); |
643 inBufP = (CK_BYTE_PTR) malloc((size_t)jInLen); |
641 if (inBufP == NULL) { |
644 if (inBufP == NULL) { |
642 throwOutOfMemoryError(env, 0); |
645 throwOutOfMemoryError(env, 0); |
643 return 0; |
646 return 0; |
644 } |
647 } |
|
648 ckDataLength = jInLen; |
645 } |
649 } |
646 |
650 |
647 (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP); |
651 (*env)->GetByteArrayRegion(env, jIn, jInOfs, jInLen, (jbyte *)inBufP); |
648 if ((*env)->ExceptionCheck(env)) { |
652 if ((*env)->ExceptionCheck(env)) { |
649 if (inBufP != INBUF) { free(inBufP); } |
653 goto cleanup; |
650 return 0; |
|
651 } |
654 } |
652 |
655 |
653 rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength); |
656 rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength); |
654 |
657 |
655 /* re-alloc larger buffer if it fits into our Java buffer */ |
658 /* re-alloc larger buffer if it fits into our Java buffer */ |
656 if ((rv == CKR_BUFFER_TOO_SMALL) && (ckDataLength <= jIntToCKULong(jOutLen))) { |
659 if ((rv == CKR_BUFFER_TOO_SMALL) && (ckDataLength <= jIntToCKULong(jOutLen))) { |
657 outBufP = (CK_BYTE_PTR) malloc(ckDataLength); |
660 outBufP = (CK_BYTE_PTR) malloc(ckDataLength); |
658 if (outBufP == NULL) { |
661 if (outBufP == NULL) { |
659 if (inBufP != INBUF) { free(inBufP); } |
|
660 throwOutOfMemoryError(env, 0); |
662 throwOutOfMemoryError(env, 0); |
661 return 0; |
663 goto cleanup; |
662 } |
664 } |
663 rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength); |
665 rv = (*ckpFunctions->C_VerifyRecover)(ckSessionHandle, inBufP, jInLen, outBufP, &ckDataLength); |
664 } |
666 } |
665 if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) { |
667 if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) { |
666 (*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckDataLength, (jbyte *)outBufP); |
668 (*env)->SetByteArrayRegion(env, jOut, jOutOfs, ckDataLength, (jbyte *)outBufP); |
667 } |
669 } |
668 |
670 |
|
671 cleanup: |
669 if (inBufP != INBUF) { free(inBufP); } |
672 if (inBufP != INBUF) { free(inBufP); } |
670 if (outBufP != OUTBUF) { free(outBufP); } |
673 if (outBufP != OUTBUF) { free(outBufP); } |
671 |
674 |
672 return ckDataLength; |
675 return ckDataLength; |
673 } |
676 } |