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 <jni.h> 163 #include <jni_util.h> 164 #include <stdarg.h> 165 166 #define MAX_STACK_BUFFER_LEN (4 * 1024) 167 #define MAX_HEAP_BUFFER_LEN (64 * 1024) 168 169 #define MAX_DIGEST_LEN (64) 170 171 #ifndef min 172 #define min(a, b) (((a) < (b)) ? (a) : (b)) 173 #endif 174 175 #define ckBBoolToJBoolean(x) ((x == TRUE) ? JNI_TRUE : JNI_FALSE); 176 #define jBooleanToCKBBool(x) ((x == JNI_TRUE) ? TRUE : FALSE); 177 178 #define ckByteToJByte(x) ((jbyte) x) 179 #define jByteToCKByte(x) ((CK_BYTE) x) 180 181 #define ckLongToJLong(x) ((jlong) x) 182 #define jLongToCKLong(x) ((CK_LONG) x) 183 184 #define ckULongToJLong(x) ((jlong) x) 185 #define jLongToCKULong(x) ((CK_ULONG) x) 186 187 // For CK_UNAVAILABLE_INFORMATION, always return -1 to avoid 32/64 bit problems. 188 #define ckULongSpecialToJLong(x) (((x) == CK_UNAVAILABLE_INFORMATION) \ 189 ? (jlong)-1 : ((jlong) x)) 190 191 #define ckCharToJChar(x) ((jchar) x) 192 #define jCharToCKChar(x) ((CK_CHAR) x) 193 194 #define ckUTF8CharToJChar(x) ((jchar) x) 195 #define jCharToCKUTF8Char(x) ((CK_UTF8CHAR) x) 196 197 #define ckFlageToJLong(x) ((jlong) x) 198 199 #define ckVoidPtrToJObject(x) ((jobject) x) 200 #define jObjectToCKVoidPtr(x) ((CK_VOID_PTR) x) 201 202 #define jIntToCKLong(x) ((CK_LONG) x) 203 #define jIntToCKULong(x) ((CK_ULONG) x) 204 #define ckLongToJInt(x) ((jint) x) 205 #define ckULongToJInt(x) ((jint) x) 206 #define ckULongToJSize(x) ((jsize) x) 207 #define unsignedIntToCKULong(x) ((CK_ULONG) x) 208 209 //#define TRACE0d(s) { printf(s); fflush(stdout); } 210 //#define TRACE1d(s, p1) { printf(s, p1); fflush(stdout); } 211 //#define TRACE2d(s, p1, p2) { printf(s, p1, p2); fflush(stdout); } 212 213 #ifdef P11_DEBUG 214 #define TRACE0(s) { printf(s); fflush(stdout); } 215 #define TRACE1(s, p1) { printf(s, p1); fflush(stdout); } 216 #define TRACE2(s, p1, p2) { printf(s, p1, p2); fflush(stdout); } 217 #define TRACE3(s, p1, p2, p3) { printf(s, p1, p2, p3); fflush(stdout); } 218 #else 219 #define TRACE0(s) 220 #define TRACE1(s, p1) 221 #define TRACE2(s, p1, p2) 222 #define TRACE3(s, p1, p2, p3) 223 #define TRACE_INTEND 224 #define TRACE_UNINTEND 225 #endif 226 227 /* debug output */ 228 extern jboolean debug; 229 void printDebug(const char *format, ...); 230 231 #define CK_ASSERT_OK 0L 232 233 #define CLASS_P11PSSSIGNATURE "sun/security/pkcs11/P11PSSSignature" 234 235 #define CLASS_INFO "sun/security/pkcs11/wrapper/CK_INFO" 236 #define CLASS_VERSION "sun/security/pkcs11/wrapper/CK_VERSION" 237 #define CLASS_SLOT_INFO "sun/security/pkcs11/wrapper/CK_SLOT_INFO" 238 #define CLASS_TOKEN_INFO "sun/security/pkcs11/wrapper/CK_TOKEN_INFO" 239 #define CLASS_MECHANISM "sun/security/pkcs11/wrapper/CK_MECHANISM" 240 #define CLASS_MECHANISM_INFO "sun/security/pkcs11/wrapper/CK_MECHANISM_INFO" 241 #define CLASS_SESSION_INFO "sun/security/pkcs11/wrapper/CK_SESSION_INFO" 242 #define CLASS_ATTRIBUTE "sun/security/pkcs11/wrapper/CK_ATTRIBUTE" 243 #define CLASS_DATE "sun/security/pkcs11/wrapper/CK_DATE" 244 #define CLASS_PKCS11EXCEPTION "sun/security/pkcs11/wrapper/PKCS11Exception" 245 #define CLASS_PKCS11RUNTIMEEXCEPTION "sun/security/pkcs11/wrapper/PKCS11RuntimeException" 246 #define CLASS_FILE_NOT_FOUND_EXCEPTION "java/io/FileNotFoundException" 247 #define CLASS_C_INITIALIZE_ARGS "sun/security/pkcs11/wrapper/CK_C_INITIALIZE_ARGS" 248 #define CLASS_CREATEMUTEX "sun/security/pkcs11/wrapper/CK_CREATEMUTEX" 249 #define CLASS_DESTROYMUTEX "sun/security/pkcs11/wrapper/CK_DESTROYMUTEX" 250 #define CLASS_LOCKMUTEX "sun/security/pkcs11/wrapper/CK_LOCKMUTEX" 251 #define CLASS_UNLOCKMUTEX "sun/security/pkcs11/wrapper/CK_UNLOCKMUTEX" 252 #define CLASS_NOTIFY "sun/security/pkcs11/wrapper/CK_NOTIFY" 253 254 255 /* mechanism parameter classes */ 256 #define CLASS_AES_CTR_PARAMS "sun/security/pkcs11/wrapper/CK_AES_CTR_PARAMS" 257 #define CLASS_GCM_PARAMS "sun/security/pkcs11/wrapper/CK_GCM_PARAMS" 258 #define CLASS_CCM_PARAMS "sun/security/pkcs11/wrapper/CK_CCM_PARAMS" 259 #define CLASS_RSA_PKCS_PSS_PARAMS "sun/security/pkcs11/wrapper/CK_RSA_PKCS_PSS_PARAMS" 260 #define CLASS_RSA_PKCS_OAEP_PARAMS "sun/security/pkcs11/wrapper/CK_RSA_PKCS_OAEP_PARAMS" 261 262 #define CLASS_MAC_GENERAL_PARAMS "sun/security/pkcs11/wrapper/CK_MAC_GENERAL_PARAMS" 263 #define CLASS_PBE_PARAMS "sun/security/pkcs11/wrapper/CK_PBE_PARAMS" 264 #define PBE_INIT_VECTOR_SIZE 8 265 #define CLASS_PKCS5_PBKD2_PARAMS "sun/security/pkcs11/wrapper/CK_PKCS5_PBKD2_PARAMS" 266 #define CLASS_EXTRACT_PARAMS "sun/security/pkcs11/wrapper/CK_EXTRACT_PARAMS" 267 268 #define CLASS_ECDH1_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_ECDH1_DERIVE_PARAMS" 269 #define CLASS_ECDH2_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_ECDH2_DERIVE_PARAMS" 270 #define CLASS_X9_42_DH1_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_X9_42_DH1_DERIVE_PARAMS" 271 #define CLASS_X9_42_DH2_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_X9_42_DH2_DERIVE_PARAMS" 272 273 /* 274 #define CLASS_KEA_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_KEA_DERIVE_PARAMS" 275 #define CLASS_RC2_PARAMS "sun/security/pkcs11/wrapper/CK_RC2_PARAMS" 276 #define CLASS_RC2_CBC_PARAMS "sun/security/pkcs11/wrapper/CK_RC2_CBC_PARAMS" 277 #define CLASS_RC2_MAC_GENERAL_PARAMS "sun/security/pkcs11/wrapper/CK_RC2_MAC_GENERAL_PARAMS" 278 #define CLASS_RC5_PARAMS "sun/security/pkcs11/wrapper/CK_RC5_PARAMS" 279 #define CLASS_RC5_CBC_PARAMS "sun/security/pkcs11/wrapper/CK_RC5_CBC_PARAMS" 280 #define CLASS_RC5_MAC_GENERAL_PARAMS "sun/security/pkcs11/wrapper/CK_RC5_MAC_GENERAL_PARAMS" 281 #define CLASS_SKIPJACK_PRIVATE_WRAP_PARAMS "sun/security/pkcs11/wrapper/CK_SKIPJACK_PRIVATE_WRAP_PARAMS" 282 #define CLASS_SKIPJACK_RELAYX_PARAMS "sun/security/pkcs11/wrapper/CK_SKIPJACK_RELAYX_PARAMS" 283 #define CLASS_KEY_WRAP_SET_OAEP_PARAMS "sun/security/pkcs11/wrapper/CK_KEY_WRAP_SET_OAEP_PARAMS" 284 #define CLASS_KEY_DERIVATION_STRING_DATA "sun/security/pkcs11/wrapper/CK_KEY_DERIVATION_STRING_DATA" 285 */ 286 287 #define CLASS_SSL3_RANDOM_DATA "sun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA" 288 // CLASS_SSL3_RANDOM_DATA is used by CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS 289 #define CLASS_SSL3_KEY_MAT_OUT "sun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_OUT" 290 // CLASS_SSL3_KEY_MAT_OUT is used by CLASS_SSL3_KEY_MAT_PARAMS and CK_TLS12_KEY_MAT_PARAMS 291 #define CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_SSL3_MASTER_KEY_DERIVE_PARAMS" 292 #define CLASS_TLS12_MASTER_KEY_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_TLS12_MASTER_KEY_DERIVE_PARAMS" 293 #define CLASS_SSL3_KEY_MAT_PARAMS "sun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_PARAMS" 294 #define CLASS_TLS12_KEY_MAT_PARAMS "sun/security/pkcs11/wrapper/CK_TLS12_KEY_MAT_PARAMS" 295 #define CLASS_TLS_PRF_PARAMS "sun/security/pkcs11/wrapper/CK_TLS_PRF_PARAMS" 296 #define CLASS_TLS_MAC_PARAMS "sun/security/pkcs11/wrapper/CK_TLS_MAC_PARAMS" 297 298 /* function to update the CK_NSS_GCM_PARAMS in mechanism pointer with 299 * CK_GCM_PARAMS 300 */ 301 CK_MECHANISM_PTR updateGCMParams(JNIEnv *env, CK_MECHANISM_PTR mechPtr); 302 303 /* function to convert a PKCS#11 return value other than CK_OK into a Java Exception 304 * or to throw a PKCS11RuntimeException 305 */ 306 307 jlong ckAssertReturnValueOK(JNIEnv *env, CK_RV returnValue); 308 void throwOutOfMemoryError(JNIEnv *env, const char *message); 309 void throwNullPointerException(JNIEnv *env, const char *message); 310 void throwIOException(JNIEnv *env, const char *message); 311 void throwPKCS11RuntimeException(JNIEnv *env, const char *message); 312 void throwDisconnectedRuntimeException(JNIEnv *env); 313 314 /* functions to free CK structures and pointers 315 */ 316 void freeCKAttributeArray(CK_ATTRIBUTE_PTR attrPtr, int len); 317 void freeCKMechanismPtr(CK_MECHANISM_PTR mechPtr); 318 319 /* functions to convert Java arrays to a CK-type array and the array length */ 320 321 void jBooleanArrayToCKBBoolArray(JNIEnv *env, const jbooleanArray jArray, CK_BBOOL **ckpArray, CK_ULONG_PTR ckLength); 322 void jByteArrayToCKByteArray(JNIEnv *env, const jbyteArray jArray, CK_BYTE_PTR *ckpArray, CK_ULONG_PTR ckLength); 323 void jLongArrayToCKULongArray(JNIEnv *env, const jlongArray jArray, CK_ULONG_PTR *ckpArray, CK_ULONG_PTR ckLength); 324 void jCharArrayToCKCharArray(JNIEnv *env, const jcharArray jArray, CK_CHAR_PTR *ckpArray, CK_ULONG_PTR ckLength); 325 void jCharArrayToCKUTF8CharArray(JNIEnv *env, const jcharArray jArray, CK_UTF8CHAR_PTR *ckpArray, CK_ULONG_PTR ckLength); 326 void jStringToCKUTF8CharArray(JNIEnv *env, const jstring jArray, CK_UTF8CHAR_PTR *ckpArray, CK_ULONG_PTR ckpLength); 327 void jAttributeArrayToCKAttributeArray(JNIEnv *env, jobjectArray jAArray, CK_ATTRIBUTE_PTR *ckpArray, CK_ULONG_PTR ckpLength); 328 /*void jObjectArrayToCKVoidPtrArray(JNIEnv *env, const jobjectArray jArray, CK_VOID_PTR_PTR ckpArray, CK_ULONG_PTR ckpLength); */ 329 330 331 /* functions to convert a CK-type array and the array length to a Java array */ 332 333 jbyteArray ckByteArrayToJByteArray(JNIEnv *env, const CK_BYTE_PTR ckpArray, CK_ULONG ckLength); 334 jlongArray ckULongArrayToJLongArray(JNIEnv *env, const CK_ULONG_PTR ckpArray, CK_ULONG ckLength); 335 jcharArray ckCharArrayToJCharArray(JNIEnv *env, const CK_CHAR_PTR ckpArray, CK_ULONG length); 336 jcharArray ckUTF8CharArrayToJCharArray(JNIEnv *env, const CK_UTF8CHAR_PTR ckpArray, CK_ULONG ckLength); 337 338 339 /* functions to convert a CK-type structure or a pointer to a CK-value to a Java object */ 340 341 jobject ckBBoolPtrToJBooleanObject(JNIEnv *env, const CK_BBOOL* ckpValue); 342 jobject ckULongPtrToJLongObject(JNIEnv *env, const CK_ULONG_PTR ckpValue); 343 jobject ckDatePtrToJDateObject(JNIEnv *env, const CK_DATE *ckpValue); 344 jobject ckVersionPtrToJVersion(JNIEnv *env, const CK_VERSION_PTR ckpVersion); 345 jobject ckSessionInfoPtrToJSessionInfo(JNIEnv *env, const CK_SESSION_INFO_PTR ckpSessionInfo); 346 jobject ckAttributePtrToJAttribute(JNIEnv *env, const CK_ATTRIBUTE_PTR ckpAttribute); 347 348 349 /* function to convert the CK-value used by the CK_ATTRIBUTE structure to a Java object */ 350 351 jobject ckAttributeValueToJObject(JNIEnv *env, const CK_ATTRIBUTE_PTR ckpAttribute); 352 353 354 /* functions to convert a Java object to a CK-type structure or a pointer to a CK-value */ 355 356 CK_BBOOL* jBooleanObjectToCKBBoolPtr(JNIEnv *env, jobject jObject); 357 CK_BYTE_PTR jByteObjectToCKBytePtr(JNIEnv *env, jobject jObject); 358 CK_ULONG* jIntegerObjectToCKULongPtr(JNIEnv *env, jobject jObject); 359 CK_ULONG* jLongObjectToCKULongPtr(JNIEnv *env, jobject jObject); 360 CK_CHAR_PTR jCharObjectToCKCharPtr(JNIEnv *env, jobject jObject); 361 CK_VERSION_PTR jVersionToCKVersionPtr(JNIEnv *env, jobject jVersion); 362 CK_DATE * jDateObjectToCKDatePtr(JNIEnv *env, jobject jDate); 363 CK_ATTRIBUTE jAttributeToCKAttribute(JNIEnv *env, jobject jAttribute); 364 CK_MECHANISM_PTR jMechanismToCKMechanismPtr(JNIEnv *env, jobject jMechanism); 365 366 367 /* functions to convert Java objects used by the Mechanism and Attribute class to a CK-type structure */ 368 CK_VOID_PTR jObjectToPrimitiveCKObjectPtr(JNIEnv *env, jobject jObject, CK_ULONG *ckpLength); 369 CK_VOID_PTR jMechParamToCKMechParamPtr(JNIEnv *env, jobject jParam, CK_MECHANISM_TYPE, CK_ULONG 370 *ckpLength); 371 372 373 /* functions to convert a specific Java mechanism parameter object to a CK-mechanism parameter pointer */ 374 375 CK_RSA_PKCS_OAEP_PARAMS_PTR jRsaPkcsOaepParamToCKRsaPkcsOaepParamPtr(JNIEnv *env, 376 jobject jParam, CK_ULONG* pLength); 377 CK_PBE_PARAMS_PTR jPbeParamToCKPbeParamPtr(JNIEnv *env, jobject jParam, CK_ULONG* pLength); 378 CK_PKCS5_PBKD2_PARAMS_PTR jPkcs5Pbkd2ParamToCKPkcs5Pbkd2ParamPtr(JNIEnv *env, jobject jParam, CK_ULONG* pLength); 379 CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParamPtr(JNIEnv *env, jobject jParam, CK_ULONG* pLength); 380 CK_SSL3_KEY_MAT_PARAMS_PTR jSsl3KeyMatParamToCKSsl3KeyMatParamPtr(JNIEnv *env, jobject jParam, CK_ULONG* pLength); 381 CK_KEY_DERIVATION_STRING_DATA jKeyDerivationStringDataToCKKeyDerivationStringData(JNIEnv *env, jobject jParam); 382 CK_RSA_PKCS_PSS_PARAMS_PTR jRsaPkcsPssParamToCKRsaPkcsPssParamPtr(JNIEnv *env, jobject jParam, CK_ULONG* pLength); 383 CK_ECDH1_DERIVE_PARAMS_PTR jEcdh1DeriveParamToCKEcdh1DeriveParamPtr(JNIEnv *env, jobject jParam, CK_ULONG* pLength); 384 CK_ECDH2_DERIVE_PARAMS_PTR jEcdh2DeriveParamToCKEcdh2DeriveParamPtr(JNIEnv *env, jobject jParam, CK_ULONG* pLength); 385 CK_X9_42_DH1_DERIVE_PARAMS_PTR jX942Dh1DeriveParamToCKX942Dh1DeriveParamPtr(JNIEnv *env, jobject jParam, CK_ULONG* pLength); 386 CK_X9_42_DH2_DERIVE_PARAMS_PTR jX942Dh2DeriveParamToCKX942Dh2DeriveParamPtr(JNIEnv *env, jobject jParam, CK_ULONG* pLength); 387 388 /* functions to copy the returned values inside CK-mechanism back to Java object */ 389 390 void copyBackPBEInitializationVector(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); 391 void copyBackSetUnwrappedKey(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); 392 void ssl3CopyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); 393 void tls12CopyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); 394 void ssl3CopyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); 395 void tls12CopyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); 396 397 398 /* functions to convert the InitArgs object for calling the right Java mutex functions */ 399 400 CK_C_INITIALIZE_ARGS_PTR makeCKInitArgsAdapter(JNIEnv *env, jobject pInitArgs); 401 402 #ifndef NO_CALLBACKS /* if the library should not make callbacks; e.g. no javai.lib or jvm.lib available */ 403 CK_RV callJCreateMutex(CK_VOID_PTR_PTR ppMutex); 404 CK_RV callJDestroyMutex(CK_VOID_PTR pMutex); 405 CK_RV callJLockMutex(CK_VOID_PTR pMutex); 406 CK_RV callJUnlockMutex(CK_VOID_PTR pMutex); 407 #endif /* NO_CALLBACKS */ 408 409 void putModuleEntry(JNIEnv *env, jobject pkcs11Implementation, ModuleData *moduleData); 410 ModuleData * removeModuleEntry(JNIEnv *env, jobject pkcs11Implementation); 411 CK_FUNCTION_LIST_PTR getFunctionList(JNIEnv *env, jobject pkcs11Implementation); 412 413 /* A structure to encapsulate the required data for a Notify callback */ 414 struct NotifyEncapsulation { 415 416 /* The object that implements the CK_NOTIFY interface and which should be 417 * notified. 418 */ 419 jobject jNotifyObject; 420 421 /* The data object to pass back to the Notify object upon callback. */ 422 jobject jApplicationData; 423 }; 424 typedef struct NotifyEncapsulation NotifyEncapsulation; 425 426 /* The function for handling notify callbacks. */ 427 CK_RV notifyCallback( 428 CK_SESSION_HANDLE hSession, /* the session's handle */ 429 CK_NOTIFICATION event, 430 CK_VOID_PTR pApplication /* passed to C_OpenSession */ 431 ); 432 433 434 /* A node of the list of notify callbacks. To be able to free the resources after use. */ 435 struct NotifyListNode { 436 437 /* The handle of the session this notify object is attached to*/ 438 CK_SESSION_HANDLE hSession; 439 440 /* Reference to the Notify encapsulation object that was passed to C_OpenSession. */ 441 NotifyEncapsulation *notifyEncapsulation; 442 443 /* Pointer to the next node in the list. */ 444 struct NotifyListNode *next; 445 446 }; 447 typedef struct NotifyListNode NotifyListNode; 448 449 void putNotifyEntry(JNIEnv *env, CK_SESSION_HANDLE hSession, NotifyEncapsulation *notifyEncapsulation); 450 NotifyEncapsulation * removeNotifyEntry(JNIEnv *env, CK_SESSION_HANDLE hSession); 451 NotifyEncapsulation * removeFirstNotifyEntry(JNIEnv *env); 452 453 jobject createLockObject(JNIEnv *env); 454 void destroyLockObject(JNIEnv *env, jobject jLockObject); 455 456 extern jfieldID pNativeDataID; 457 extern jfieldID mech_mechanismID; 458 extern jfieldID mech_pParameterID; 459 extern jfieldID mech_pHandleID; 460 461 extern jclass jByteArrayClass; 462 extern jclass jLongClass; 463 464 #ifndef NO_CALLBACKS 465 extern NotifyListNode *notifyListHead; 466 extern jobject notifyListLock; 467 468 extern jobject jInitArgsObject; 469 extern CK_C_INITIALIZE_ARGS_PTR ckpGlobalInitArgs; 470 #endif /* NO_CALLBACKS */ 471 472 #ifdef P11_MEMORYDEBUG 473 #include <stdlib.h> 474 475 /* Simple malloc/calloc/free dumper */ 476 void *p11malloc(size_t c, char *file, int line); 477 void *p11calloc(size_t c, size_t s, char *file, int line); 478 void p11free(void *p, char *file, int line); 479 480 #define malloc(c) (p11malloc((c), __FILE__, __LINE__)) 481 #define calloc(c, s) (p11calloc((c), (s), __FILE__, __LINE__)) 482 #define free(c) (p11free((c), __FILE__, __LINE__)) 483 484 #endif 485 486 #endif /* _PKCS11WRAPPER_H */ 487