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 */ |
225 | extern jboolean debug; |
226 | void 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 "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 | |
300 | jlong ckAssertReturnValueOK(JNIEnv *env, CK_RV returnValue); |
301 | void throwOutOfMemoryError(JNIEnv *env, const char *message); |
302 | void throwNullPointerException(JNIEnv *env, const char *message); |
303 | void throwIOException(JNIEnv *env, const char *message); |
304 | void throwPKCS11RuntimeException(JNIEnv *env, const char *message); |
305 | void throwDisconnectedRuntimeException(JNIEnv *env); |
306 | |
307 | /* functions to free CK structures and pointers |
308 | */ |
309 | void freeCKAttributeArray(CK_ATTRIBUTE_PTR attrPtr, int len); |
310 | void freeCKMechanismPtr(CK_MECHANISM_PTR mechPtr); |
311 | |
312 | /* functions to convert Java arrays to a CK-type array and the array length */ |
313 | |
314 | void jBooleanArrayToCKBBoolArray(JNIEnv *env, const jbooleanArray jArray, CK_BBOOL **ckpArray, CK_ULONG_PTR ckLength); |
315 | void jByteArrayToCKByteArray(JNIEnv *env, const jbyteArray jArray, CK_BYTE_PTR *ckpArray, CK_ULONG_PTR ckLength); |
316 | void jLongArrayToCKULongArray(JNIEnv *env, const jlongArray jArray, CK_ULONG_PTR *ckpArray, CK_ULONG_PTR ckLength); |
317 | void jCharArrayToCKCharArray(JNIEnv *env, const jcharArray jArray, CK_CHAR_PTR *ckpArray, CK_ULONG_PTR ckLength); |
318 | void jCharArrayToCKUTF8CharArray(JNIEnv *env, const jcharArray jArray, CK_UTF8CHAR_PTR *ckpArray, CK_ULONG_PTR ckLength); |
319 | void jStringToCKUTF8CharArray(JNIEnv *env, const jstring jArray, CK_UTF8CHAR_PTR *ckpArray, CK_ULONG_PTR ckpLength); |
320 | void 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 | |
326 | jbyteArray ckByteArrayToJByteArray(JNIEnv *env, const CK_BYTE_PTR ckpArray, CK_ULONG ckLength); |
327 | jlongArray ckULongArrayToJLongArray(JNIEnv *env, const CK_ULONG_PTR ckpArray, CK_ULONG ckLength); |
328 | jcharArray ckCharArrayToJCharArray(JNIEnv *env, const CK_CHAR_PTR ckpArray, CK_ULONG length); |
329 | jcharArray 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 | |
334 | jobject ckBBoolPtrToJBooleanObject(JNIEnv *env, const CK_BBOOL* ckpValue); |
335 | jobject ckULongPtrToJLongObject(JNIEnv *env, const CK_ULONG_PTR ckpValue); |
336 | jobject ckDatePtrToJDateObject(JNIEnv *env, const CK_DATE *ckpValue); |
337 | jobject ckVersionPtrToJVersion(JNIEnv *env, const CK_VERSION_PTR ckpVersion); |
338 | jobject ckSessionInfoPtrToJSessionInfo(JNIEnv *env, const CK_SESSION_INFO_PTR ckpSessionInfo); |
339 | jobject 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 | |
344 | jobject 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 | |
349 | CK_BBOOL* jBooleanObjectToCKBBoolPtr(JNIEnv *env, jobject jObject); |
350 | CK_BYTE_PTR jByteObjectToCKBytePtr(JNIEnv *env, jobject jObject); |
351 | CK_ULONG* jIntegerObjectToCKULongPtr(JNIEnv *env, jobject jObject); |
352 | CK_ULONG* jLongObjectToCKULongPtr(JNIEnv *env, jobject jObject); |
353 | CK_CHAR_PTR jCharObjectToCKCharPtr(JNIEnv *env, jobject jObject); |
354 | CK_VERSION_PTR jVersionToCKVersionPtr(JNIEnv *env, jobject jVersion); |
355 | CK_DATE * jDateObjectPtrToCKDatePtr(JNIEnv *env, jobject jDate); |
356 | CK_ATTRIBUTE jAttributeToCKAttribute(JNIEnv *env, jobject jAttribute); |
357 | CK_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 */ |
361 | CK_VOID_PTR jObjectToPrimitiveCKObjectPtr(JNIEnv *env, jobject jObject, CK_ULONG *ckpLength); |
362 | CK_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 | |
368 | void jRsaPkcsOaepParamToCKRsaPkcsOaepParam(JNIEnv *env, jobject jParam, CK_RSA_PKCS_OAEP_PARAMS_PTR ckParamPtr); |
369 | void jPbeParamToCKPbeParam(JNIEnv *env, jobject jParam, CK_PBE_PARAMS_PTR ckParamPtr); |
370 | void copyBackPBEInitializationVector(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); |
371 | void jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(JNIEnv *env, jobject jParam, CK_PKCS5_PBKD2_PARAMS_PTR ckParamPtr); |
372 | void copyBackSetUnwrappedKey(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); |
373 | void jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(JNIEnv *env, jobject jParam, CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR ckParamPtr); |
374 | void ssl3CopyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); |
375 | void tls12CopyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); |
376 | void jSsl3KeyMatParamToCKSsl3KeyMatParam(JNIEnv *env, jobject jParam, CK_SSL3_KEY_MAT_PARAMS_PTR ckParamPtr); |
377 | void ssl3CopyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); |
378 | void tls12CopyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); |
379 | CK_KEY_DERIVATION_STRING_DATA jKeyDerivationStringDataToCKKeyDerivationStringData(JNIEnv *env, jobject jParam); |
380 | void jRsaPkcsPssParamToCKRsaPkcsPssParam(JNIEnv *env, jobject jParam, CK_RSA_PKCS_PSS_PARAMS_PTR ckParamPtr); |
381 | void jEcdh1DeriveParamToCKEcdh1DeriveParam(JNIEnv *env, jobject jParam, CK_ECDH1_DERIVE_PARAMS_PTR ckParamPtr); |
382 | void jEcdh2DeriveParamToCKEcdh2DeriveParam(JNIEnv *env, jobject jParam, |
383 | CK_ECDH2_DERIVE_PARAMS_PTR ckParamPtr); |
384 | void jX942Dh1DeriveParamToCKX942Dh1DeriveParam(JNIEnv *env, jobject jParam, CK_X9_42_DH1_DERIVE_PARAMS_PTR ckParamPtr); |
385 | void 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 | |
390 | CK_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 */ |
393 | CK_RV callJCreateMutex(CK_VOID_PTR_PTR ppMutex); |
394 | CK_RV callJDestroyMutex(CK_VOID_PTR pMutex); |
395 | CK_RV callJLockMutex(CK_VOID_PTR pMutex); |
396 | CK_RV callJUnlockMutex(CK_VOID_PTR pMutex); |
397 | #endif /* NO_CALLBACKS */ |
398 | |
399 | void putModuleEntry(JNIEnv *env, jobject pkcs11Implementation, ModuleData *moduleData); |
400 | ModuleData * removeModuleEntry(JNIEnv *env, jobject pkcs11Implementation); |
401 | CK_FUNCTION_LIST_PTR getFunctionList(JNIEnv *env, jobject pkcs11Implementation); |
402 | |
403 | /* A structure to encapsulate the required data for a Notify callback */ |
404 | struct 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 | }; |
414 | typedef struct NotifyEncapsulation NotifyEncapsulation; |
415 | |
416 | /* The function for handling notify callbacks. */ |
417 | CK_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. */ |
425 | struct 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 | }; |
437 | typedef struct NotifyListNode NotifyListNode; |
438 | |
439 | void putNotifyEntry(JNIEnv *env, CK_SESSION_HANDLE hSession, NotifyEncapsulation *notifyEncapsulation); |
440 | NotifyEncapsulation * removeNotifyEntry(JNIEnv *env, CK_SESSION_HANDLE hSession); |
441 | NotifyEncapsulation * removeFirstNotifyEntry(JNIEnv *env); |
442 | |
443 | jobject createLockObject(JNIEnv *env); |
444 | void destroyLockObject(JNIEnv *env, jobject jLockObject); |
445 | |
446 | extern jfieldID pNativeDataID; |
447 | extern jfieldID mech_mechanismID; |
448 | extern jfieldID mech_pParameterID; |
449 | extern jfieldID mech_pHandleID; |
450 | |
451 | extern jclass jByteArrayClass; |
452 | extern jclass jLongClass; |
453 | |
454 | #ifndef NO_CALLBACKS |
455 | extern NotifyListNode *notifyListHead; |
456 | extern jobject notifyListLock; |
457 | |
458 | extern jobject jInitArgsObject; |
459 | extern 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 */ |
466 | void *p11malloc(size_t c, char *file, int line); |
467 | void 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 | |