1 /*
2 * Copyright (c) 2003, 2016, 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 * pkcs11wrapper.h
50 * 18.05.2001
51 *
52 * declaration of all functions used by pkcs11wrapper.c
53 *
54 * @author Karl Scheibelhofer <Karl.Scheibelhofer@iaik.at>
55 * @author Martin Schlaeffer <schlaeff@sbox.tugraz.at>
56 */
57
58 #ifndef _PKCS11WRAPPER_H
59 #define _PKCS11WRAPPER_H 1
60
61 /* disable asserts in product mode */
62 #ifndef DEBUG
63 #ifndef NDEBUG
64 #define NDEBUG
65 #endif
66 #endif
67
68 /* extra PKCS#11 constants not in the standard include files */
69
70 #define CKA_NETSCAPE_BASE (0x80000000 + 0x4E534350)
71 #define CKA_NETSCAPE_TRUST_BASE (CKA_NETSCAPE_BASE + 0x2000)
72
73 #define CKA_NETSCAPE_TRUST_SERVER_AUTH (CKA_NETSCAPE_TRUST_BASE + 8)
74 #define CKA_NETSCAPE_TRUST_CLIENT_AUTH (CKA_NETSCAPE_TRUST_BASE + 9)
75 #define CKA_NETSCAPE_TRUST_CODE_SIGNING (CKA_NETSCAPE_TRUST_BASE + 10)
76 #define CKA_NETSCAPE_TRUST_EMAIL_PROTECTION (CKA_NETSCAPE_TRUST_BASE + 11)
77
78 /*
79
80 Define the PKCS#11 functions to include and exclude. Reduces the size
81 of the binary somewhat.
82
83 This list needs to be kept in sync with the mapfile and PKCS11.java
84
85 */
86
87 #define P11_ENABLE_C_INITIALIZE
88 #define P11_ENABLE_C_FINALIZE
89 #define P11_ENABLE_C_GETINFO
90 #define P11_ENABLE_C_GETSLOTLIST
91 #define P11_ENABLE_C_GETSLOTINFO
92 #define P11_ENABLE_C_GETTOKENINFO
93 #define P11_ENABLE_C_GETMECHANISMLIST
94 #define P11_ENABLE_C_GETMECHANISMINFO
95 #undef P11_ENABLE_C_INITTOKEN
96 #undef P11_ENABLE_C_INITPIN
97 #undef P11_ENABLE_C_SETPIN
98 #define P11_ENABLE_C_OPENSESSION
99 #define P11_ENABLE_C_CLOSESESSION
100 #undef P11_ENABLE_C_CLOSEALLSESSIONS
101 #define P11_ENABLE_C_GETSESSIONINFO
102 #define P11_ENABLE_C_GETOPERATIONSTATE
103 #define P11_ENABLE_C_SETOPERATIONSTATE
104 #define P11_ENABLE_C_LOGIN
105 #define P11_ENABLE_C_LOGOUT
106 #define P11_ENABLE_C_CREATEOBJECT
107 #define P11_ENABLE_C_COPYOBJECT
108 #define P11_ENABLE_C_DESTROYOBJECT
109 #undef P11_ENABLE_C_GETOBJECTSIZE
110 #define P11_ENABLE_C_GETATTRIBUTEVALUE
111 #define P11_ENABLE_C_SETATTRIBUTEVALUE
112 #define P11_ENABLE_C_FINDOBJECTSINIT
113 #define P11_ENABLE_C_FINDOBJECTS
114 #define P11_ENABLE_C_FINDOBJECTSFINAL
115 #define P11_ENABLE_C_ENCRYPTINIT
116 #define P11_ENABLE_C_ENCRYPT
117 #define P11_ENABLE_C_ENCRYPTUPDATE
118 #define P11_ENABLE_C_ENCRYPTFINAL
119 #define P11_ENABLE_C_DECRYPTINIT
120 #define P11_ENABLE_C_DECRYPT
121 #define P11_ENABLE_C_DECRYPTUPDATE
122 #define P11_ENABLE_C_DECRYPTFINAL
123 #define P11_ENABLE_C_DIGESTINIT
124 #define P11_ENABLE_C_DIGEST
125 #define P11_ENABLE_C_DIGESTUPDATE
126 #define P11_ENABLE_C_DIGESTKEY
127 #define P11_ENABLE_C_DIGESTFINAL
128 #define P11_ENABLE_C_SIGNINIT
129 #define P11_ENABLE_C_SIGN
130 #define P11_ENABLE_C_SIGNUPDATE
131 #define P11_ENABLE_C_SIGNFINAL
132 #define P11_ENABLE_C_SIGNRECOVERINIT
133 #define P11_ENABLE_C_SIGNRECOVER
134 #define P11_ENABLE_C_VERIFYINIT
135 #define P11_ENABLE_C_VERIFY
136 #define P11_ENABLE_C_VERIFYUPDATE
137 #define P11_ENABLE_C_VERIFYFINAL
138 #define P11_ENABLE_C_VERIFYRECOVERINIT
139 #define P11_ENABLE_C_VERIFYRECOVER
140 #undef P11_ENABLE_C_DIGESTENCRYPTUPDATE
141 #undef P11_ENABLE_C_DECRYPTDIGESTUPDATE
142 #undef P11_ENABLE_C_SIGNENCRYPTUPDATE
143 #undef P11_ENABLE_C_DECRYPTVERIFYUPDATE
144 #define P11_ENABLE_C_GENERATEKEY
145 #define P11_ENABLE_C_GENERATEKEYPAIR
146 #define P11_ENABLE_C_WRAPKEY
147 #define P11_ENABLE_C_UNWRAPKEY
148 #define P11_ENABLE_C_DERIVEKEY
149 #define P11_ENABLE_C_SEEDRANDOM
150 #define P11_ENABLE_C_GENERATERANDOM
151 #undef P11_ENABLE_C_GETFUNCTIONSTATUS
152 #undef P11_ENABLE_C_CANCELFUNCTION
153 #undef P11_ENABLE_C_WAITFORSLOTEVENT
154
155 /* include the platform dependent part of the header */
156 #include "p11_md.h"
157
158 #include "pkcs11.h"
159 #include "pkcs-11v2-20a3.h"
160 #include <jni.h>
161 #include <jni_util.h>
162 #include <stdarg.h>
163
164 #define MAX_STACK_BUFFER_LEN (4 * 1024)
165 #define MAX_HEAP_BUFFER_LEN (64 * 1024)
166
167 #define MAX_DIGEST_LEN (64)
168
169 #ifndef min
170 #define min(a, b) (((a) < (b)) ? (a) : (b))
171 #endif
172
173 #define ckBBoolToJBoolean(x) ((x == TRUE) ? JNI_TRUE : JNI_FALSE);
174 #define jBooleanToCKBBool(x) ((x == JNI_TRUE) ? TRUE : FALSE);
175
176 #define ckByteToJByte(x) ((jbyte) x)
177 #define jByteToCKByte(x) ((CK_BYTE) x)
178
179 #define ckLongToJLong(x) ((jlong) x)
180 #define jLongToCKLong(x) ((CK_LONG) x)
181
182 #define ckULongToJLong(x) ((jlong) x)
183 #define jLongToCKULong(x) ((CK_ULONG) x)
184
185 // For CK_UNAVAILABLE_INFORMATION, always return -1 to avoid 32/64 bit problems.
186 #define ckULongSpecialToJLong(x) (((x) == CK_UNAVAILABLE_INFORMATION) \
187 ? (jlong)-1 : ((jlong) x))
188
189 #define ckCharToJChar(x) ((jchar) x)
190 #define jCharToCKChar(x) ((CK_CHAR) x)
191
192 #define ckUTF8CharToJChar(x) ((jchar) x)
193 #define jCharToCKUTF8Char(x) ((CK_UTF8CHAR) x)
194
195 #define ckFlageToJLong(x) ((jlong) x)
196
197 #define ckVoidPtrToJObject(x) ((jobject) x)
198 #define jObjectToCKVoidPtr(x) ((CK_VOID_PTR) x)
199
200 #define jIntToCKLong(x) ((CK_LONG) x)
201 #define jIntToCKULong(x) ((CK_ULONG) x)
202 #define ckLongToJInt(x) ((jint) x)
203 #define ckULongToJInt(x) ((jint) x)
204 #define ckULongToJSize(x) ((jsize) x)
205 #define unsignedIntToCKULong(x) ((CK_ULONG) x)
206
207 #ifdef P11_DEBUG
208 #define TRACE0(s) { printf(s); fflush(stdout); }
209 #define TRACE1(s, p1) { printf(s, p1); fflush(stdout); }
210 #define TRACE2(s, p1, p2) { printf(s, p1, p2); fflush(stdout); }
211 #define TRACE3(s, p1, p2, p3) { printf(s, p1, p2, p3); fflush(stdout); }
212 #else
213 #define TRACE0(s)
214 #define TRACE1(s, p1)
215 #define TRACE2(s, p1, p2)
216 #define TRACE3(s, p1, p2, p3)
217 #define TRACE_INTEND
218 #define TRACE_UNINTEND
219 #endif
220
221 /* debug output */
222 extern jboolean debug;
223 void printDebug(const char *format, ...);
224
225 #define CK_ASSERT_OK 0L
226
227 #define CLASS_INFO "sun/security/pkcs11/wrapper/CK_INFO"
228 #define CLASS_VERSION "sun/security/pkcs11/wrapper/CK_VERSION"
229 #define CLASS_SLOT_INFO "sun/security/pkcs11/wrapper/CK_SLOT_INFO"
230 #define CLASS_TOKEN_INFO "sun/security/pkcs11/wrapper/CK_TOKEN_INFO"
231 #define CLASS_MECHANISM "sun/security/pkcs11/wrapper/CK_MECHANISM"
232 #define CLASS_MECHANISM_INFO "sun/security/pkcs11/wrapper/CK_MECHANISM_INFO"
233 #define CLASS_SESSION_INFO "sun/security/pkcs11/wrapper/CK_SESSION_INFO"
234 #define CLASS_ATTRIBUTE "sun/security/pkcs11/wrapper/CK_ATTRIBUTE"
235 #define CLASS_DATE "sun/security/pkcs11/wrapper/CK_DATE"
236 #define CLASS_PKCS11EXCEPTION "sun/security/pkcs11/wrapper/PKCS11Exception"
237 #define CLASS_PKCS11RUNTIMEEXCEPTION "sun/security/pkcs11/wrapper/PKCS11RuntimeException"
238 #define CLASS_FILE_NOT_FOUND_EXCEPTION "java/io/FileNotFoundException"
239 #define CLASS_C_INITIALIZE_ARGS "sun/security/pkcs11/wrapper/CK_C_INITIALIZE_ARGS"
240 #define CLASS_CREATEMUTEX "sun/security/pkcs11/wrapper/CK_CREATEMUTEX"
241 #define CLASS_DESTROYMUTEX "sun/security/pkcs11/wrapper/CK_DESTROYMUTEX"
242 #define CLASS_LOCKMUTEX "sun/security/pkcs11/wrapper/CK_LOCKMUTEX"
243 #define CLASS_UNLOCKMUTEX "sun/security/pkcs11/wrapper/CK_UNLOCKMUTEX"
244 #define CLASS_NOTIFY "sun/security/pkcs11/wrapper/CK_NOTIFY"
245
246
247 /* mechanism parameter classes */
248
249 #define CLASS_RSA_PKCS_OAEP_PARAMS "sun/security/pkcs11/wrapper/CK_RSA_PKCS_OAEP_PARAMS"
250 #define CLASS_MAC_GENERAL_PARAMS "sun/security/pkcs11/wrapper/CK_MAC_GENERAL_PARAMS"
251 #define CLASS_PBE_PARAMS "sun/security/pkcs11/wrapper/CK_PBE_PARAMS"
252 #define PBE_INIT_VECTOR_SIZE 8
253 #define CLASS_PKCS5_PBKD2_PARAMS "sun/security/pkcs11/wrapper/CK_PKCS5_PBKD2_PARAMS"
254 #define CLASS_EXTRACT_PARAMS "sun/security/pkcs11/wrapper/CK_EXTRACT_PARAMS"
255
256 #define CLASS_RSA_PKCS_PSS_PARAMS "sun/security/pkcs11/wrapper/CK_RSA_PKCS_PSS_PARAMS"
257 #define CLASS_ECDH1_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_ECDH1_DERIVE_PARAMS"
258 #define CLASS_ECDH2_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_ECDH2_DERIVE_PARAMS"
259 #define CLASS_X9_42_DH1_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_X9_42_DH1_DERIVE_PARAMS"
260 #define CLASS_X9_42_DH2_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_X9_42_DH2_DERIVE_PARAMS"
261
262 /*
263 #define CLASS_KEA_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_KEA_DERIVE_PARAMS"
264 #define CLASS_RC2_PARAMS "sun/security/pkcs11/wrapper/CK_RC2_PARAMS"
265 #define CLASS_RC2_CBC_PARAMS "sun/security/pkcs11/wrapper/CK_RC2_CBC_PARAMS"
266 #define CLASS_RC2_MAC_GENERAL_PARAMS "sun/security/pkcs11/wrapper/CK_RC2_MAC_GENERAL_PARAMS"
267 #define CLASS_RC5_PARAMS "sun/security/pkcs11/wrapper/CK_RC5_PARAMS"
268 #define CLASS_RC5_CBC_PARAMS "sun/security/pkcs11/wrapper/CK_RC5_CBC_PARAMS"
269 #define CLASS_RC5_MAC_GENERAL_PARAMS "sun/security/pkcs11/wrapper/CK_RC5_MAC_GENERAL_PARAMS"
270 #define CLASS_SKIPJACK_PRIVATE_WRAP_PARAMS "sun/security/pkcs11/wrapper/CK_SKIPJACK_PRIVATE_WRAP_PARAMS"
271 #define CLASS_SKIPJACK_RELAYX_PARAMS "sun/security/pkcs11/wrapper/CK_SKIPJACK_RELAYX_PARAMS"
272 #define CLASS_KEY_WRAP_SET_OAEP_PARAMS "sun/security/pkcs11/wrapper/CK_KEY_WRAP_SET_OAEP_PARAMS"
273 #define CLASS_KEY_DERIVATION_STRING_DATA "sun/security/pkcs11/wrapper/CK_KEY_DERIVATION_STRING_DATA"
274 */
275
276 #define CLASS_SSL3_RANDOM_DATA "sun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA"
277 // CLASS_SSL3_RANDOM_DATA is used by CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS
278 #define CLASS_SSL3_KEY_MAT_OUT "sun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_OUT"
279 // CLASS_SSL3_KEY_MAT_OUT is used by CLASS_SSL3_KEY_MAT_PARAMS
280 #define CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_SSL3_MASTER_KEY_DERIVE_PARAMS"
281 #define CLASS_SSL3_KEY_MAT_PARAMS "sun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_PARAMS"
282 #define CLASS_TLS_PRF_PARAMS "sun/security/pkcs11/wrapper/CK_TLS_PRF_PARAMS"
283 #define CLASS_AES_CTR_PARAMS "sun/security/pkcs11/wrapper/CK_AES_CTR_PARAMS"
284
285 /* function to convert a PKCS#11 return value other than CK_OK into a Java Exception
286 * or to throw a PKCS11RuntimeException
287 */
288
289 jlong ckAssertReturnValueOK(JNIEnv *env, CK_RV returnValue);
290 void throwOutOfMemoryError(JNIEnv *env, const char *message);
291 void throwNullPointerException(JNIEnv *env, const char *message);
292 void throwIOException(JNIEnv *env, const char *message);
293 void throwPKCS11RuntimeException(JNIEnv *env, const char *message);
294 void throwDisconnectedRuntimeException(JNIEnv *env);
295
296 /* function to free CK_ATTRIBUTE array
297 */
298 void freeCKAttributeArray(CK_ATTRIBUTE_PTR attrPtr, int len);
299
300 /* funktions to convert Java arrays to a CK-type array and the array length */
301
302 void jBooleanArrayToCKBBoolArray(JNIEnv *env, const jbooleanArray jArray, CK_BBOOL **ckpArray, CK_ULONG_PTR ckLength);
303 void jByteArrayToCKByteArray(JNIEnv *env, const jbyteArray jArray, CK_BYTE_PTR *ckpArray, CK_ULONG_PTR ckLength);
304 void jLongArrayToCKULongArray(JNIEnv *env, const jlongArray jArray, CK_ULONG_PTR *ckpArray, CK_ULONG_PTR ckLength);
305 void jCharArrayToCKCharArray(JNIEnv *env, const jcharArray jArray, CK_CHAR_PTR *ckpArray, CK_ULONG_PTR ckLength);
306 void jCharArrayToCKUTF8CharArray(JNIEnv *env, const jcharArray jArray, CK_UTF8CHAR_PTR *ckpArray, CK_ULONG_PTR ckLength);
307 void jStringToCKUTF8CharArray(JNIEnv *env, const jstring jArray, CK_UTF8CHAR_PTR *ckpArray, CK_ULONG_PTR ckpLength);
308 void jAttributeArrayToCKAttributeArray(JNIEnv *env, jobjectArray jAArray, CK_ATTRIBUTE_PTR *ckpArray, CK_ULONG_PTR ckpLength);
309 /*void jObjectArrayToCKVoidPtrArray(JNIEnv *env, const jobjectArray jArray, CK_VOID_PTR_PTR ckpArray, CK_ULONG_PTR ckpLength); */
310
311
312 /* funktions to convert a CK-type array and the array length to a Java array */
313
314 jbyteArray ckByteArrayToJByteArray(JNIEnv *env, const CK_BYTE_PTR ckpArray, CK_ULONG ckLength);
315 jlongArray ckULongArrayToJLongArray(JNIEnv *env, const CK_ULONG_PTR ckpArray, CK_ULONG ckLength);
316 jcharArray ckCharArrayToJCharArray(JNIEnv *env, const CK_CHAR_PTR ckpArray, CK_ULONG length);
317 jcharArray ckUTF8CharArrayToJCharArray(JNIEnv *env, const CK_UTF8CHAR_PTR ckpArray, CK_ULONG ckLength);
318
319
320 /* funktions to convert a CK-type structure or a pointer to a CK-value to a Java object */
321
322 jobject ckBBoolPtrToJBooleanObject(JNIEnv *env, const CK_BBOOL* ckpValue);
323 jobject ckULongPtrToJLongObject(JNIEnv *env, const CK_ULONG_PTR ckpValue);
324 jobject ckDatePtrToJDateObject(JNIEnv *env, const CK_DATE *ckpValue);
325 jobject ckVersionPtrToJVersion(JNIEnv *env, const CK_VERSION_PTR ckpVersion);
326 jobject ckSessionInfoPtrToJSessionInfo(JNIEnv *env, const CK_SESSION_INFO_PTR ckpSessionInfo);
327 jobject ckAttributePtrToJAttribute(JNIEnv *env, const CK_ATTRIBUTE_PTR ckpAttribute);
328
329
330 /* funktion to convert the CK-value used by the CK_ATTRIBUTE structure to a Java object */
331
332 jobject ckAttributeValueToJObject(JNIEnv *env, const CK_ATTRIBUTE_PTR ckpAttribute);
333
334
335 /* funktions to convert a Java object to a CK-type structure or a pointer to a CK-value */
336
337 CK_BBOOL* jBooleanObjectToCKBBoolPtr(JNIEnv *env, jobject jObject);
338 CK_BYTE_PTR jByteObjectToCKBytePtr(JNIEnv *env, jobject jObject);
339 CK_ULONG* jIntegerObjectToCKULongPtr(JNIEnv *env, jobject jObject);
340 CK_ULONG* jLongObjectToCKULongPtr(JNIEnv *env, jobject jObject);
341 CK_CHAR_PTR jCharObjectToCKCharPtr(JNIEnv *env, jobject jObject);
342 CK_VERSION_PTR jVersionToCKVersionPtr(JNIEnv *env, jobject jVersion);
343 CK_DATE * jDateObjectPtrToCKDatePtr(JNIEnv *env, jobject jDate);
344 CK_ATTRIBUTE jAttributeToCKAttribute(JNIEnv *env, jobject jAttribute);
345 /*CK_MECHANISM jMechanismToCKMechanism(JNIEnv *env, jobject jMechanism);*/
346 void jMechanismToCKMechanism(JNIEnv *env, jobject jMechanism, CK_MECHANISM_PTR ckMechanismPtr);
347
348
349 /* funktions to convert Java objects used by the Mechanism and Attribute class to a CK-type structure */
350
351 void jObjectToPrimitiveCKObjectPtrPtr(JNIEnv *env, jobject jObject, CK_VOID_PTR *ckpObjectPtr, CK_ULONG *pLength);
352 void jMechanismParameterToCKMechanismParameter(JNIEnv *env, jobject jParam, CK_VOID_PTR *ckpParamPtr, CK_ULONG *ckpLength);
353
354
355 /* functions to convert a specific Java mechanism parameter object to a CK-mechanism parameter structure */
356
357 CK_RSA_PKCS_OAEP_PARAMS jRsaPkcsOaepParamToCKRsaPkcsOaepParam(JNIEnv *env, jobject jParam);
358 CK_KEA_DERIVE_PARAMS jKeaDeriveParamToCKKeaDeriveParam(JNIEnv *env, jobject jParam);
359 CK_RC2_CBC_PARAMS jRc2CbcParamToCKRc2CbcParam(JNIEnv *env, jobject jParam);
360 CK_RC2_MAC_GENERAL_PARAMS jRc2MacGeneralParamToCKRc2MacGeneralParam(JNIEnv *env, jobject jParam);
361 CK_RC5_PARAMS jRc5ParamToCKRc5Param(JNIEnv *env, jobject jParam);
362 CK_RC5_CBC_PARAMS jRc5CbcParamToCKRc5CbcParam(JNIEnv *env, jobject jParam);
363 CK_RC5_MAC_GENERAL_PARAMS jRc5MacGeneralParamToCKRc5MacGeneralParam(JNIEnv *env, jobject jParam);
364 CK_SKIPJACK_PRIVATE_WRAP_PARAMS jSkipjackPrivateWrapParamToCKSkipjackPrivateWrapParam(JNIEnv *env, jobject jParam);
365 CK_SKIPJACK_RELAYX_PARAMS jSkipjackRelayxParamToCKSkipjackRelayxParam(JNIEnv *env, jobject jParam);
366 CK_PBE_PARAMS jPbeParamToCKPbeParam(JNIEnv *env, jobject jParam);
367 void copyBackPBEInitializationVector(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism);
368 CK_PKCS5_PBKD2_PARAMS jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(JNIEnv *env, jobject jParam);
369 CK_KEY_WRAP_SET_OAEP_PARAMS jKeyWrapSetOaepParamToCKKeyWrapSetOaepParam(JNIEnv *env, jobject jParam);
370 void copyBackSetUnwrappedKey(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism);
371 CK_SSL3_MASTER_KEY_DERIVE_PARAMS jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(JNIEnv *env, jobject jParam);
372 void copyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism);
373 CK_SSL3_KEY_MAT_PARAMS jSsl3KeyMatParamToCKSsl3KeyMatParam(JNIEnv *env, jobject jParam);
374 void copyBackSSLKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism);
375 CK_KEY_DERIVATION_STRING_DATA jKeyDerivationStringDataToCKKeyDerivationStringData(JNIEnv *env, jobject jParam);
376 CK_RSA_PKCS_PSS_PARAMS jRsaPkcsPssParamToCKRsaPkcsPssParam(JNIEnv *env, jobject jParam);
377 CK_ECDH1_DERIVE_PARAMS jEcdh1DeriveParamToCKEcdh1DeriveParam(JNIEnv *env, jobject jParam);
378 CK_ECDH2_DERIVE_PARAMS jEcdh2DeriveParamToCKEcdh2DeriveParam(JNIEnv *env, jobject jParam);
379 CK_X9_42_DH1_DERIVE_PARAMS jX942Dh1DeriveParamToCKX942Dh1DeriveParam(JNIEnv *env, jobject jParam);
380 CK_X9_42_DH2_DERIVE_PARAMS jX942Dh2DeriveParamToCKX942Dh2DeriveParam(JNIEnv *env, jobject jParam);
381
382
383 /* functions to convert the InitArgs object for calling the right Java mutex functions */
384
385 CK_C_INITIALIZE_ARGS_PTR makeCKInitArgsAdapter(JNIEnv *env, jobject pInitArgs);
386
387 #ifndef NO_CALLBACKS /* if the library should not make callbacks; e.g. no javai.lib or jvm.lib available */
388 CK_RV callJCreateMutex(CK_VOID_PTR_PTR ppMutex);
389 CK_RV callJDestroyMutex(CK_VOID_PTR pMutex);
390 CK_RV callJLockMutex(CK_VOID_PTR pMutex);
391 CK_RV callJUnlockMutex(CK_VOID_PTR pMutex);
392 #endif /* NO_CALLBACKS */
393
394 void putModuleEntry(JNIEnv *env, jobject pkcs11Implementation, ModuleData *moduleData);
395 ModuleData * removeModuleEntry(JNIEnv *env, jobject pkcs11Implementation);
396 CK_FUNCTION_LIST_PTR getFunctionList(JNIEnv *env, jobject pkcs11Implementation);
397
398 /* A structure to encapsulate the required data for a Notify callback */
399 struct NotifyEncapsulation {
400
401 /* The object that implements the CK_NOTIFY interface and which should be
402 * notified.
403 */
404 jobject jNotifyObject;
405
406 /* The data object to pass back to the Notify object upon callback. */
407 jobject jApplicationData;
408 };
409 typedef struct NotifyEncapsulation NotifyEncapsulation;
410
411 /* The function for handling notify callbacks. */
412 CK_RV notifyCallback(
413 CK_SESSION_HANDLE hSession, /* the session's handle */
414 CK_NOTIFICATION event,
415 CK_VOID_PTR pApplication /* passed to C_OpenSession */
416 );
417
418
419 /* A node of the list of notify callbacks. To be able to free the resources after use. */
420 struct NotifyListNode {
421
422 /* The handle of the session this notify object is attached to*/
423 CK_SESSION_HANDLE hSession;
424
425 /* Reference to the Notify encapsulation object that was passed to C_OpenSession. */
426 NotifyEncapsulation *notifyEncapsulation;
427
428 /* Pointer to the next node in the list. */
429 struct NotifyListNode *next;
430
431 };
432 typedef struct NotifyListNode NotifyListNode;
433
434 void putNotifyEntry(JNIEnv *env, CK_SESSION_HANDLE hSession, NotifyEncapsulation *notifyEncapsulation);
435 NotifyEncapsulation * removeNotifyEntry(JNIEnv *env, CK_SESSION_HANDLE hSession);
436 NotifyEncapsulation * removeFirstNotifyEntry(JNIEnv *env);
437
438 jobject createLockObject(JNIEnv *env);
439 void destroyLockObject(JNIEnv *env, jobject jLockObject);
440
441 extern jfieldID pNativeDataID;
442 extern jfieldID mech_mechanismID;
443 extern jfieldID mech_pParameterID;
444
445 extern jclass jByteArrayClass;
446 extern jclass jLongClass;
447
448 #ifndef NO_CALLBACKS
449 extern NotifyListNode *notifyListHead;
450 extern jobject notifyListLock;
451
452 extern jobject jInitArgsObject;
453 extern CK_C_INITIALIZE_ARGS_PTR ckpGlobalInitArgs;
454 #endif /* NO_CALLBACKS */
455
456 #ifdef P11_MEMORYDEBUG
457 #include <stdlib.h>
458
459 /* Simple malloc/free dumper */
460 void *p11malloc(size_t c, char *file, int line);
461 void p11free(void *p, char *file, int line);
462
463 /* Use THIS_FILE when it is available. */
464 #ifndef THIS_FILE
465 #define THIS_FILE __FILE__
466 #endif
467
468 #define malloc(c) (p11malloc((c), THIS_FILE, __LINE__))
469 #define free(c) (p11free((c), THIS_FILE, __LINE__))
470
471 #endif
472
473 #endif /* _PKCS11WRAPPER_H */