70 (JNIEnv *env, jobject obj, jlong jSessionHandle, |
70 (JNIEnv *env, jobject obj, jlong jSessionHandle, |
71 jobject jMechanism, jlong jKeyHandle) |
71 jobject jMechanism, jlong jKeyHandle) |
72 { |
72 { |
73 CK_SESSION_HANDLE ckSessionHandle; |
73 CK_SESSION_HANDLE ckSessionHandle; |
74 CK_MECHANISM_PTR ckpMechanism = NULL; |
74 CK_MECHANISM_PTR ckpMechanism = NULL; |
|
75 CK_MECHANISM_PTR ckpTemp; |
75 CK_OBJECT_HANDLE ckKeyHandle; |
76 CK_OBJECT_HANDLE ckKeyHandle; |
76 CK_RV rv; |
77 CK_RV rv; |
77 |
78 |
78 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
79 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
79 if (ckpFunctions == NULL) { return; } |
80 if (ckpFunctions == NULL) { return; } |
80 |
81 |
81 ckSessionHandle = jLongToCKULong(jSessionHandle); |
82 ckSessionHandle = jLongToCKULong(jSessionHandle); |
82 ckKeyHandle = jLongToCKULong(jKeyHandle); |
83 ckKeyHandle = jLongToCKULong(jKeyHandle); |
83 ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); |
84 ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); |
|
85 TRACE1("DEBUG C_EncryptInit: created pMech = %p\n", |
|
86 ckpMechanism); |
|
87 |
84 if ((*env)->ExceptionCheck(env)) { return; } |
88 if ((*env)->ExceptionCheck(env)) { return; } |
85 |
89 |
86 rv = (*ckpFunctions->C_EncryptInit)(ckSessionHandle, ckpMechanism, |
90 rv = (*ckpFunctions->C_EncryptInit)(ckSessionHandle, ckpMechanism, |
87 ckKeyHandle); |
91 ckKeyHandle); |
88 |
92 |
89 // if OAEP, then cannot free here |
93 if (ckpMechanism->mechanism == CKM_AES_GCM) { |
|
94 if (rv == CKR_ARGUMENTS_BAD || rv == CKR_MECHANISM_PARAM_INVALID) { |
|
95 // retry with CKM_GCM_PARAMS structure in pkcs11t.h |
|
96 TRACE0("DEBUG C_EncryptInit: retry with CK_GCM_PARAMS\n"); |
|
97 ckpTemp = updateGCMParams(env, ckpMechanism); |
|
98 if (ckpTemp != NULL) { // only re-call if conversion succeeds |
|
99 ckpMechanism = ckpTemp; |
|
100 rv = (*ckpFunctions->C_EncryptInit)(ckSessionHandle, ckpMechanism, |
|
101 ckKeyHandle); |
|
102 } |
|
103 } |
|
104 } |
|
105 |
|
106 TRACE1("DEBUG C_EncryptInit: freed pMech = %p\n", ckpMechanism); |
90 freeCKMechanismPtr(ckpMechanism); |
107 freeCKMechanismPtr(ckpMechanism); |
91 |
|
92 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } |
108 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } |
|
109 |
|
110 TRACE0("FINISHED\n"); |
93 } |
111 } |
94 #endif |
112 #endif |
95 |
113 |
96 #ifdef P11_ENABLE_C_ENCRYPT |
114 #ifdef P11_ENABLE_C_ENCRYPT |
97 /* |
115 /* |
290 (JNIEnv *env, jobject obj, jlong jSessionHandle, |
308 (JNIEnv *env, jobject obj, jlong jSessionHandle, |
291 jobject jMechanism, jlong jKeyHandle) |
309 jobject jMechanism, jlong jKeyHandle) |
292 { |
310 { |
293 CK_SESSION_HANDLE ckSessionHandle; |
311 CK_SESSION_HANDLE ckSessionHandle; |
294 CK_MECHANISM_PTR ckpMechanism = NULL; |
312 CK_MECHANISM_PTR ckpMechanism = NULL; |
|
313 CK_MECHANISM_PTR ckpTemp; |
295 CK_OBJECT_HANDLE ckKeyHandle; |
314 CK_OBJECT_HANDLE ckKeyHandle; |
296 CK_RV rv; |
315 CK_RV rv; |
297 |
316 |
298 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
317 CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); |
299 if (ckpFunctions == NULL) { return; } |
318 if (ckpFunctions == NULL) { return; } |
300 |
319 |
301 ckSessionHandle = jLongToCKULong(jSessionHandle); |
320 ckSessionHandle = jLongToCKULong(jSessionHandle); |
302 ckKeyHandle = jLongToCKULong(jKeyHandle); |
321 ckKeyHandle = jLongToCKULong(jKeyHandle); |
303 ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); |
322 ckpMechanism = jMechanismToCKMechanismPtr(env, jMechanism); |
|
323 TRACE1("DEBUG C_DecryptInit: created pMech = %p\n", |
|
324 ckpMechanism); |
|
325 |
304 if ((*env)->ExceptionCheck(env)) { return; } |
326 if ((*env)->ExceptionCheck(env)) { return; } |
305 |
327 |
306 rv = (*ckpFunctions->C_DecryptInit)(ckSessionHandle, ckpMechanism, |
328 rv = (*ckpFunctions->C_DecryptInit)(ckSessionHandle, ckpMechanism, |
307 ckKeyHandle); |
329 ckKeyHandle); |
308 |
330 |
309 // if OAEP, then cannot free here |
331 if (ckpMechanism->mechanism == CKM_AES_GCM) { |
|
332 if (rv == CKR_ARGUMENTS_BAD || rv == CKR_MECHANISM_PARAM_INVALID) { |
|
333 // retry with CKM_GCM_PARAMS structure in pkcs11t.h |
|
334 TRACE0("DEBUG C_DecryptInit: retry with CK_GCM_PARAMS\n"); |
|
335 ckpTemp = updateGCMParams(env, ckpMechanism); |
|
336 if (ckpTemp != NULL) { // only re-call if conversion succeeds |
|
337 ckpMechanism = ckpTemp; |
|
338 rv = (*ckpFunctions->C_DecryptInit)(ckSessionHandle, ckpMechanism, |
|
339 ckKeyHandle); |
|
340 } |
|
341 } |
|
342 } |
|
343 |
|
344 TRACE1("DEBUG C_DecryptInit: freed pMech = %p\n", ckpMechanism); |
310 freeCKMechanismPtr(ckpMechanism); |
345 freeCKMechanismPtr(ckpMechanism); |
311 |
|
312 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } |
346 if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } |
|
347 |
|
348 TRACE0("FINISHED\n"); |
313 } |
349 } |
314 #endif |
350 #endif |
315 |
351 |
316 #ifdef P11_ENABLE_C_DECRYPT |
352 #ifdef P11_ENABLE_C_DECRYPT |
317 /* |
353 /* |