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 */
222extern jboolean debug;
223void 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
289jlong ckAssertReturnValueOK(JNIEnv *env, CK_RV returnValue);
290void throwOutOfMemoryError(JNIEnv *env, const char *message);
291void throwNullPointerException(JNIEnv *env, const char *message);
292void throwIOException(JNIEnv *env, const char *message);
293void throwPKCS11RuntimeException(JNIEnv *env, const char *message);
294void throwDisconnectedRuntimeException(JNIEnv *env);
295
296/* function to free CK_ATTRIBUTE array
297 */
298void freeCKAttributeArray(CK_ATTRIBUTE_PTR attrPtr, int len);
299
300/* funktions to convert Java arrays to a CK-type array and the array length */
301
302void jBooleanArrayToCKBBoolArray(JNIEnv *env, const jbooleanArray jArray, CK_BBOOL **ckpArray, CK_ULONG_PTR ckLength);
303void jByteArrayToCKByteArray(JNIEnv *env, const jbyteArray jArray, CK_BYTE_PTR *ckpArray, CK_ULONG_PTR ckLength);
304void jLongArrayToCKULongArray(JNIEnv *env, const jlongArray jArray, CK_ULONG_PTR *ckpArray, CK_ULONG_PTR ckLength);
305void jCharArrayToCKCharArray(JNIEnv *env, const jcharArray jArray, CK_CHAR_PTR *ckpArray, CK_ULONG_PTR ckLength);
306void jCharArrayToCKUTF8CharArray(JNIEnv *env, const jcharArray jArray, CK_UTF8CHAR_PTR *ckpArray, CK_ULONG_PTR ckLength);
307void jStringToCKUTF8CharArray(JNIEnv *env, const jstring jArray, CK_UTF8CHAR_PTR *ckpArray, CK_ULONG_PTR ckpLength);
308void 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
314jbyteArray ckByteArrayToJByteArray(JNIEnv *env, const CK_BYTE_PTR ckpArray, CK_ULONG ckLength);
315jlongArray ckULongArrayToJLongArray(JNIEnv *env, const CK_ULONG_PTR ckpArray, CK_ULONG ckLength);
316jcharArray ckCharArrayToJCharArray(JNIEnv *env, const CK_CHAR_PTR ckpArray, CK_ULONG length);
317jcharArray 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
322jobject ckBBoolPtrToJBooleanObject(JNIEnv *env, const CK_BBOOL* ckpValue);
323jobject ckULongPtrToJLongObject(JNIEnv *env, const CK_ULONG_PTR ckpValue);
324jobject ckDatePtrToJDateObject(JNIEnv *env, const CK_DATE *ckpValue);
325jobject ckVersionPtrToJVersion(JNIEnv *env, const CK_VERSION_PTR ckpVersion);
326jobject ckSessionInfoPtrToJSessionInfo(JNIEnv *env, const CK_SESSION_INFO_PTR ckpSessionInfo);
327jobject 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
332jobject 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
337CK_BBOOL* jBooleanObjectToCKBBoolPtr(JNIEnv *env, jobject jObject);
338CK_BYTE_PTR jByteObjectToCKBytePtr(JNIEnv *env, jobject jObject);
339CK_ULONG* jIntegerObjectToCKULongPtr(JNIEnv *env, jobject jObject);
340CK_ULONG* jLongObjectToCKULongPtr(JNIEnv *env, jobject jObject);
341CK_CHAR_PTR jCharObjectToCKCharPtr(JNIEnv *env, jobject jObject);
342CK_VERSION_PTR jVersionToCKVersionPtr(JNIEnv *env, jobject jVersion);
343CK_DATE * jDateObjectPtrToCKDatePtr(JNIEnv *env, jobject jDate);
344CK_ATTRIBUTE jAttributeToCKAttribute(JNIEnv *env, jobject jAttribute);
345/*CK_MECHANISM jMechanismToCKMechanism(JNIEnv *env, jobject jMechanism);*/
346void 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
351void jObjectToPrimitiveCKObjectPtrPtr(JNIEnv *env, jobject jObject, CK_VOID_PTR *ckpObjectPtr, CK_ULONG *pLength);
352void 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
357CK_RSA_PKCS_OAEP_PARAMS jRsaPkcsOaepParamToCKRsaPkcsOaepParam(JNIEnv *env, jobject jParam);
358CK_KEA_DERIVE_PARAMS jKeaDeriveParamToCKKeaDeriveParam(JNIEnv *env, jobject jParam);
359CK_RC2_CBC_PARAMS jRc2CbcParamToCKRc2CbcParam(JNIEnv *env, jobject jParam);
360CK_RC2_MAC_GENERAL_PARAMS jRc2MacGeneralParamToCKRc2MacGeneralParam(JNIEnv *env, jobject jParam);
361CK_RC5_PARAMS jRc5ParamToCKRc5Param(JNIEnv *env, jobject jParam);
362CK_RC5_CBC_PARAMS jRc5CbcParamToCKRc5CbcParam(JNIEnv *env, jobject jParam);
363CK_RC5_MAC_GENERAL_PARAMS jRc5MacGeneralParamToCKRc5MacGeneralParam(JNIEnv *env, jobject jParam);
364CK_SKIPJACK_PRIVATE_WRAP_PARAMS jSkipjackPrivateWrapParamToCKSkipjackPrivateWrapParam(JNIEnv *env, jobject jParam);
365CK_SKIPJACK_RELAYX_PARAMS jSkipjackRelayxParamToCKSkipjackRelayxParam(JNIEnv *env, jobject jParam);
366CK_PBE_PARAMS jPbeParamToCKPbeParam(JNIEnv *env, jobject jParam);
367void copyBackPBEInitializationVector(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism);
368CK_PKCS5_PBKD2_PARAMS jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(JNIEnv *env, jobject jParam);
369CK_KEY_WRAP_SET_OAEP_PARAMS jKeyWrapSetOaepParamToCKKeyWrapSetOaepParam(JNIEnv *env, jobject jParam);
370void copyBackSetUnwrappedKey(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism);
371CK_SSL3_MASTER_KEY_DERIVE_PARAMS jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(JNIEnv *env, jobject jParam);
372void copyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism);
373CK_SSL3_KEY_MAT_PARAMS jSsl3KeyMatParamToCKSsl3KeyMatParam(JNIEnv *env, jobject jParam);
374void copyBackSSLKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism);
375CK_KEY_DERIVATION_STRING_DATA jKeyDerivationStringDataToCKKeyDerivationStringData(JNIEnv *env, jobject jParam);
376CK_RSA_PKCS_PSS_PARAMS jRsaPkcsPssParamToCKRsaPkcsPssParam(JNIEnv *env, jobject jParam);
377CK_ECDH1_DERIVE_PARAMS jEcdh1DeriveParamToCKEcdh1DeriveParam(JNIEnv *env, jobject jParam);
378CK_ECDH2_DERIVE_PARAMS jEcdh2DeriveParamToCKEcdh2DeriveParam(JNIEnv *env, jobject jParam);
379CK_X9_42_DH1_DERIVE_PARAMS jX942Dh1DeriveParamToCKX942Dh1DeriveParam(JNIEnv *env, jobject jParam);
380CK_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
385CK_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 */
388CK_RV callJCreateMutex(CK_VOID_PTR_PTR ppMutex);
389CK_RV callJDestroyMutex(CK_VOID_PTR pMutex);
390CK_RV callJLockMutex(CK_VOID_PTR pMutex);
391CK_RV callJUnlockMutex(CK_VOID_PTR pMutex);
392#endif /* NO_CALLBACKS */
393
394void putModuleEntry(JNIEnv *env, jobject pkcs11Implementation, ModuleData *moduleData);
395ModuleData * removeModuleEntry(JNIEnv *env, jobject pkcs11Implementation);
396CK_FUNCTION_LIST_PTR getFunctionList(JNIEnv *env, jobject pkcs11Implementation);
397
398/* A structure to encapsulate the required data for a Notify callback */
399struct 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};
409typedef struct NotifyEncapsulation NotifyEncapsulation;
410
411/* The function for handling notify callbacks. */
412CK_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. */
420struct 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};
432typedef struct NotifyListNode NotifyListNode;
433
434void putNotifyEntry(JNIEnv *env, CK_SESSION_HANDLE hSession, NotifyEncapsulation *notifyEncapsulation);
435NotifyEncapsulation * removeNotifyEntry(JNIEnv *env, CK_SESSION_HANDLE hSession);
436NotifyEncapsulation * removeFirstNotifyEntry(JNIEnv *env);
437
438jobject createLockObject(JNIEnv *env);
439void destroyLockObject(JNIEnv *env, jobject jLockObject);
440
441extern jfieldID pNativeDataID;
442extern jfieldID mech_mechanismID;
443extern jfieldID mech_pParameterID;
444
445extern jclass jByteArrayClass;
446extern jclass jLongClass;
447
448#ifndef NO_CALLBACKS
449extern NotifyListNode *notifyListHead;
450extern jobject notifyListLock;
451
452extern jobject jInitArgsObject;
453extern 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 */
460void *p11malloc(size_t c, char *file, int line);
461void 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 */
474