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