/* * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. */ /* Copyright (c) 2002 Graz University of Technology. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The end-user documentation included with the redistribution, if any, must * include the following acknowledgment: * * "This product includes software developed by IAIK of Graz University of * Technology." * * Alternately, this acknowledgment may appear in the software itself, if * and wherever such third-party acknowledgments normally appear. * * 4. The names "Graz University of Technology" and "IAIK of Graz University of * Technology" must not be used to endorse or promote products derived from * this software without prior written permission. * * 5. Products derived from this software may not be called * "IAIK PKCS Wrapper", nor may "IAIK" appear in their name, without prior * written permission of Graz University of Technology. * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE LICENSOR BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * pkcs11wrapper.h * 18.05.2001 * * declaration of all functions used by pkcs11wrapper.c * * @author Karl Scheibelhofer * @author Martin Schlaeffer */ #ifndef _PKCS11WRAPPER_H #define _PKCS11WRAPPER_H 1 /* disable asserts in product mode */ #ifndef DEBUG #ifndef NDEBUG #define NDEBUG #endif #endif /* extra PKCS#11 constants not in the standard include files */ #define CKA_NETSCAPE_BASE (0x80000000 + 0x4E534350) #define CKA_NETSCAPE_TRUST_BASE (CKA_NETSCAPE_BASE + 0x2000) #define CKA_NETSCAPE_TRUST_SERVER_AUTH (CKA_NETSCAPE_TRUST_BASE + 8) #define CKA_NETSCAPE_TRUST_CLIENT_AUTH (CKA_NETSCAPE_TRUST_BASE + 9) #define CKA_NETSCAPE_TRUST_CODE_SIGNING (CKA_NETSCAPE_TRUST_BASE + 10) #define CKA_NETSCAPE_TRUST_EMAIL_PROTECTION (CKA_NETSCAPE_TRUST_BASE + 11) /* Define the PKCS#11 functions to include and exclude. Reduces the size of the binary somewhat. This list needs to be kept in sync with the mapfile and PKCS11.java */ #define P11_ENABLE_C_INITIALIZE #define P11_ENABLE_C_FINALIZE #define P11_ENABLE_C_GETINFO #define P11_ENABLE_C_GETSLOTLIST #define P11_ENABLE_C_GETSLOTINFO #define P11_ENABLE_C_GETTOKENINFO #define P11_ENABLE_C_GETMECHANISMLIST #define P11_ENABLE_C_GETMECHANISMINFO #undef P11_ENABLE_C_INITTOKEN #undef P11_ENABLE_C_INITPIN #undef P11_ENABLE_C_SETPIN #define P11_ENABLE_C_OPENSESSION #define P11_ENABLE_C_CLOSESESSION #undef P11_ENABLE_C_CLOSEALLSESSIONS #define P11_ENABLE_C_GETSESSIONINFO #define P11_ENABLE_C_GETOPERATIONSTATE #define P11_ENABLE_C_SETOPERATIONSTATE #define P11_ENABLE_C_LOGIN #define P11_ENABLE_C_LOGOUT #define P11_ENABLE_C_CREATEOBJECT #define P11_ENABLE_C_COPYOBJECT #define P11_ENABLE_C_DESTROYOBJECT #undef P11_ENABLE_C_GETOBJECTSIZE #define P11_ENABLE_C_GETATTRIBUTEVALUE #define P11_ENABLE_C_SETATTRIBUTEVALUE #define P11_ENABLE_C_FINDOBJECTSINIT #define P11_ENABLE_C_FINDOBJECTS #define P11_ENABLE_C_FINDOBJECTSFINAL #define P11_ENABLE_C_ENCRYPTINIT #define P11_ENABLE_C_ENCRYPT #define P11_ENABLE_C_ENCRYPTUPDATE #define P11_ENABLE_C_ENCRYPTFINAL #define P11_ENABLE_C_DECRYPTINIT #define P11_ENABLE_C_DECRYPT #define P11_ENABLE_C_DECRYPTUPDATE #define P11_ENABLE_C_DECRYPTFINAL #define P11_ENABLE_C_DIGESTINIT #define P11_ENABLE_C_DIGEST #define P11_ENABLE_C_DIGESTUPDATE #define P11_ENABLE_C_DIGESTKEY #define P11_ENABLE_C_DIGESTFINAL #define P11_ENABLE_C_SIGNINIT #define P11_ENABLE_C_SIGN #define P11_ENABLE_C_SIGNUPDATE #define P11_ENABLE_C_SIGNFINAL #define P11_ENABLE_C_SIGNRECOVERINIT #define P11_ENABLE_C_SIGNRECOVER #define P11_ENABLE_C_VERIFYINIT #define P11_ENABLE_C_VERIFY #define P11_ENABLE_C_VERIFYUPDATE #define P11_ENABLE_C_VERIFYFINAL #define P11_ENABLE_C_VERIFYRECOVERINIT #define P11_ENABLE_C_VERIFYRECOVER #undef P11_ENABLE_C_DIGESTENCRYPTUPDATE #undef P11_ENABLE_C_DECRYPTDIGESTUPDATE #undef P11_ENABLE_C_SIGNENCRYPTUPDATE #undef P11_ENABLE_C_DECRYPTVERIFYUPDATE #define P11_ENABLE_C_GENERATEKEY #define P11_ENABLE_C_GENERATEKEYPAIR #define P11_ENABLE_C_WRAPKEY #define P11_ENABLE_C_UNWRAPKEY #define P11_ENABLE_C_DERIVEKEY #define P11_ENABLE_C_SEEDRANDOM #define P11_ENABLE_C_GENERATERANDOM #undef P11_ENABLE_C_GETFUNCTIONSTATUS #undef P11_ENABLE_C_CANCELFUNCTION #undef P11_ENABLE_C_WAITFORSLOTEVENT #define P11_ENABLE_GETNATIVEKEYINFO #define P11_ENABLE_CREATENATIVEKEY /* include the platform dependent part of the header */ #include "p11_md.h" #include "pkcs11.h" #include "pkcs-11v2-20a3.h" #include #include #include #define MAX_STACK_BUFFER_LEN (4 * 1024) #define MAX_HEAP_BUFFER_LEN (64 * 1024) #define MAX_DIGEST_LEN (64) #ifndef min #define min(a, b) (((a) < (b)) ? (a) : (b)) #endif #define ckBBoolToJBoolean(x) ((x == TRUE) ? JNI_TRUE : JNI_FALSE); #define jBooleanToCKBBool(x) ((x == JNI_TRUE) ? TRUE : FALSE); #define ckByteToJByte(x) ((jbyte) x) #define jByteToCKByte(x) ((CK_BYTE) x) #define ckLongToJLong(x) ((jlong) x) #define jLongToCKLong(x) ((CK_LONG) x) #define ckULongToJLong(x) ((jlong) x) #define jLongToCKULong(x) ((CK_ULONG) x) // For CK_UNAVAILABLE_INFORMATION, always return -1 to avoid 32/64 bit problems. #define ckULongSpecialToJLong(x) (((x) == CK_UNAVAILABLE_INFORMATION) \ ? (jlong)-1 : ((jlong) x)) #define ckCharToJChar(x) ((jchar) x) #define jCharToCKChar(x) ((CK_CHAR) x) #define ckUTF8CharToJChar(x) ((jchar) x) #define jCharToCKUTF8Char(x) ((CK_UTF8CHAR) x) #define ckFlageToJLong(x) ((jlong) x) #define ckVoidPtrToJObject(x) ((jobject) x) #define jObjectToCKVoidPtr(x) ((CK_VOID_PTR) x) #define jIntToCKLong(x) ((CK_LONG) x) #define jIntToCKULong(x) ((CK_ULONG) x) #define ckLongToJInt(x) ((jint) x) #define ckULongToJInt(x) ((jint) x) #define ckULongToJSize(x) ((jsize) x) #define unsignedIntToCKULong(x) ((CK_ULONG) x) #ifdef P11_DEBUG #define TRACE0(s) { printf(s); fflush(stdout); } #define TRACE1(s, p1) { printf(s, p1); fflush(stdout); } #define TRACE2(s, p1, p2) { printf(s, p1, p2); fflush(stdout); } #define TRACE3(s, p1, p2, p3) { printf(s, p1, p2, p3); fflush(stdout); } #else #define TRACE0(s) #define TRACE1(s, p1) #define TRACE2(s, p1, p2) #define TRACE3(s, p1, p2, p3) #define TRACE_INTEND #define TRACE_UNINTEND #endif /* debug output */ extern jboolean debug; void printDebug(const char *format, ...); #define CK_ASSERT_OK 0L #define CLASS_INFO "sun/security/pkcs11/wrapper/CK_INFO" #define CLASS_VERSION "sun/security/pkcs11/wrapper/CK_VERSION" #define CLASS_SLOT_INFO "sun/security/pkcs11/wrapper/CK_SLOT_INFO" #define CLASS_TOKEN_INFO "sun/security/pkcs11/wrapper/CK_TOKEN_INFO" #define CLASS_MECHANISM "sun/security/pkcs11/wrapper/CK_MECHANISM" #define CLASS_MECHANISM_INFO "sun/security/pkcs11/wrapper/CK_MECHANISM_INFO" #define CLASS_SESSION_INFO "sun/security/pkcs11/wrapper/CK_SESSION_INFO" #define CLASS_ATTRIBUTE "sun/security/pkcs11/wrapper/CK_ATTRIBUTE" #define CLASS_DATE "sun/security/pkcs11/wrapper/CK_DATE" #define CLASS_PKCS11EXCEPTION "sun/security/pkcs11/wrapper/PKCS11Exception" #define CLASS_PKCS11RUNTIMEEXCEPTION "sun/security/pkcs11/wrapper/PKCS11RuntimeException" #define CLASS_FILE_NOT_FOUND_EXCEPTION "java/io/FileNotFoundException" #define CLASS_C_INITIALIZE_ARGS "sun/security/pkcs11/wrapper/CK_C_INITIALIZE_ARGS" #define CLASS_CREATEMUTEX "sun/security/pkcs11/wrapper/CK_CREATEMUTEX" #define CLASS_DESTROYMUTEX "sun/security/pkcs11/wrapper/CK_DESTROYMUTEX" #define CLASS_LOCKMUTEX "sun/security/pkcs11/wrapper/CK_LOCKMUTEX" #define CLASS_UNLOCKMUTEX "sun/security/pkcs11/wrapper/CK_UNLOCKMUTEX" #define CLASS_NOTIFY "sun/security/pkcs11/wrapper/CK_NOTIFY" /* mechanism parameter classes */ #define CLASS_RSA_PKCS_OAEP_PARAMS "sun/security/pkcs11/wrapper/CK_RSA_PKCS_OAEP_PARAMS" #define CLASS_MAC_GENERAL_PARAMS "sun/security/pkcs11/wrapper/CK_MAC_GENERAL_PARAMS" #define CLASS_PBE_PARAMS "sun/security/pkcs11/wrapper/CK_PBE_PARAMS" #define PBE_INIT_VECTOR_SIZE 8 #define CLASS_PKCS5_PBKD2_PARAMS "sun/security/pkcs11/wrapper/CK_PKCS5_PBKD2_PARAMS" #define CLASS_EXTRACT_PARAMS "sun/security/pkcs11/wrapper/CK_EXTRACT_PARAMS" #define CLASS_RSA_PKCS_PSS_PARAMS "sun/security/pkcs11/wrapper/CK_RSA_PKCS_PSS_PARAMS" #define CLASS_ECDH1_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_ECDH1_DERIVE_PARAMS" #define CLASS_ECDH2_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_ECDH2_DERIVE_PARAMS" #define CLASS_X9_42_DH1_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_X9_42_DH1_DERIVE_PARAMS" #define CLASS_X9_42_DH2_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_X9_42_DH2_DERIVE_PARAMS" /* #define CLASS_KEA_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_KEA_DERIVE_PARAMS" #define CLASS_RC2_PARAMS "sun/security/pkcs11/wrapper/CK_RC2_PARAMS" #define CLASS_RC2_CBC_PARAMS "sun/security/pkcs11/wrapper/CK_RC2_CBC_PARAMS" #define CLASS_RC2_MAC_GENERAL_PARAMS "sun/security/pkcs11/wrapper/CK_RC2_MAC_GENERAL_PARAMS" #define CLASS_RC5_PARAMS "sun/security/pkcs11/wrapper/CK_RC5_PARAMS" #define CLASS_RC5_CBC_PARAMS "sun/security/pkcs11/wrapper/CK_RC5_CBC_PARAMS" #define CLASS_RC5_MAC_GENERAL_PARAMS "sun/security/pkcs11/wrapper/CK_RC5_MAC_GENERAL_PARAMS" #define CLASS_SKIPJACK_PRIVATE_WRAP_PARAMS "sun/security/pkcs11/wrapper/CK_SKIPJACK_PRIVATE_WRAP_PARAMS" #define CLASS_SKIPJACK_RELAYX_PARAMS "sun/security/pkcs11/wrapper/CK_SKIPJACK_RELAYX_PARAMS" #define CLASS_KEY_WRAP_SET_OAEP_PARAMS "sun/security/pkcs11/wrapper/CK_KEY_WRAP_SET_OAEP_PARAMS" #define CLASS_KEY_DERIVATION_STRING_DATA "sun/security/pkcs11/wrapper/CK_KEY_DERIVATION_STRING_DATA" */ #define CLASS_SSL3_RANDOM_DATA "sun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA" // CLASS_SSL3_RANDOM_DATA is used by CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS #define CLASS_SSL3_KEY_MAT_OUT "sun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_OUT" // CLASS_SSL3_KEY_MAT_OUT is used by CLASS_SSL3_KEY_MAT_PARAMS #define CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_SSL3_MASTER_KEY_DERIVE_PARAMS" #define CLASS_SSL3_KEY_MAT_PARAMS "sun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_PARAMS" #define CLASS_TLS_PRF_PARAMS "sun/security/pkcs11/wrapper/CK_TLS_PRF_PARAMS" #define CLASS_AES_CTR_PARAMS "sun/security/pkcs11/wrapper/CK_AES_CTR_PARAMS" /* function to convert a PKCS#11 return value other than CK_OK into a Java Exception * or to throw a PKCS11RuntimeException */ jlong ckAssertReturnValueOK(JNIEnv *env, CK_RV returnValue); void throwOutOfMemoryError(JNIEnv *env, const char *message); void throwNullPointerException(JNIEnv *env, const char *message); void throwIOException(JNIEnv *env, const char *message); void throwPKCS11RuntimeException(JNIEnv *env, const char *message); void throwDisconnectedRuntimeException(JNIEnv *env); /* function to free CK_ATTRIBUTE array */ void freeCKAttributeArray(CK_ATTRIBUTE_PTR attrPtr, int len); /* funktions to convert Java arrays to a CK-type array and the array length */ void jBooleanArrayToCKBBoolArray(JNIEnv *env, const jbooleanArray jArray, CK_BBOOL **ckpArray, CK_ULONG_PTR ckLength); void jByteArrayToCKByteArray(JNIEnv *env, const jbyteArray jArray, CK_BYTE_PTR *ckpArray, CK_ULONG_PTR ckLength); void jLongArrayToCKULongArray(JNIEnv *env, const jlongArray jArray, CK_ULONG_PTR *ckpArray, CK_ULONG_PTR ckLength); void jCharArrayToCKCharArray(JNIEnv *env, const jcharArray jArray, CK_CHAR_PTR *ckpArray, CK_ULONG_PTR ckLength); void jCharArrayToCKUTF8CharArray(JNIEnv *env, const jcharArray jArray, CK_UTF8CHAR_PTR *ckpArray, CK_ULONG_PTR ckLength); void jStringToCKUTF8CharArray(JNIEnv *env, const jstring jArray, CK_UTF8CHAR_PTR *ckpArray, CK_ULONG_PTR ckpLength); void jAttributeArrayToCKAttributeArray(JNIEnv *env, jobjectArray jAArray, CK_ATTRIBUTE_PTR *ckpArray, CK_ULONG_PTR ckpLength); /*void jObjectArrayToCKVoidPtrArray(JNIEnv *env, const jobjectArray jArray, CK_VOID_PTR_PTR ckpArray, CK_ULONG_PTR ckpLength); */ /* funktions to convert a CK-type array and the array length to a Java array */ jbyteArray ckByteArrayToJByteArray(JNIEnv *env, const CK_BYTE_PTR ckpArray, CK_ULONG ckLength); jlongArray ckULongArrayToJLongArray(JNIEnv *env, const CK_ULONG_PTR ckpArray, CK_ULONG ckLength); jcharArray ckCharArrayToJCharArray(JNIEnv *env, const CK_CHAR_PTR ckpArray, CK_ULONG length); jcharArray ckUTF8CharArrayToJCharArray(JNIEnv *env, const CK_UTF8CHAR_PTR ckpArray, CK_ULONG ckLength); /* funktions to convert a CK-type structure or a pointer to a CK-value to a Java object */ jobject ckBBoolPtrToJBooleanObject(JNIEnv *env, const CK_BBOOL* ckpValue); jobject ckULongPtrToJLongObject(JNIEnv *env, const CK_ULONG_PTR ckpValue); jobject ckDatePtrToJDateObject(JNIEnv *env, const CK_DATE *ckpValue); jobject ckVersionPtrToJVersion(JNIEnv *env, const CK_VERSION_PTR ckpVersion); jobject ckSessionInfoPtrToJSessionInfo(JNIEnv *env, const CK_SESSION_INFO_PTR ckpSessionInfo); jobject ckAttributePtrToJAttribute(JNIEnv *env, const CK_ATTRIBUTE_PTR ckpAttribute); /* funktion to convert the CK-value used by the CK_ATTRIBUTE structure to a Java object */ jobject ckAttributeValueToJObject(JNIEnv *env, const CK_ATTRIBUTE_PTR ckpAttribute); /* funktions to convert a Java object to a CK-type structure or a pointer to a CK-value */ CK_BBOOL* jBooleanObjectToCKBBoolPtr(JNIEnv *env, jobject jObject); CK_BYTE_PTR jByteObjectToCKBytePtr(JNIEnv *env, jobject jObject); CK_ULONG* jIntegerObjectToCKULongPtr(JNIEnv *env, jobject jObject); CK_ULONG* jLongObjectToCKULongPtr(JNIEnv *env, jobject jObject); CK_CHAR_PTR jCharObjectToCKCharPtr(JNIEnv *env, jobject jObject); CK_VERSION_PTR jVersionToCKVersionPtr(JNIEnv *env, jobject jVersion); CK_DATE * jDateObjectPtrToCKDatePtr(JNIEnv *env, jobject jDate); CK_ATTRIBUTE jAttributeToCKAttribute(JNIEnv *env, jobject jAttribute); /*CK_MECHANISM jMechanismToCKMechanism(JNIEnv *env, jobject jMechanism);*/ void jMechanismToCKMechanism(JNIEnv *env, jobject jMechanism, CK_MECHANISM_PTR ckMechanismPtr); /* funktions to convert Java objects used by the Mechanism and Attribute class to a CK-type structure */ void jObjectToPrimitiveCKObjectPtrPtr(JNIEnv *env, jobject jObject, CK_VOID_PTR *ckpObjectPtr, CK_ULONG *pLength); void jMechanismParameterToCKMechanismParameter(JNIEnv *env, jobject jParam, CK_VOID_PTR *ckpParamPtr, CK_ULONG *ckpLength); /* functions to convert a specific Java mechanism parameter object to a CK-mechanism parameter structure */ CK_RSA_PKCS_OAEP_PARAMS jRsaPkcsOaepParamToCKRsaPkcsOaepParam(JNIEnv *env, jobject jParam); CK_KEA_DERIVE_PARAMS jKeaDeriveParamToCKKeaDeriveParam(JNIEnv *env, jobject jParam); CK_RC2_CBC_PARAMS jRc2CbcParamToCKRc2CbcParam(JNIEnv *env, jobject jParam); CK_RC2_MAC_GENERAL_PARAMS jRc2MacGeneralParamToCKRc2MacGeneralParam(JNIEnv *env, jobject jParam); CK_RC5_PARAMS jRc5ParamToCKRc5Param(JNIEnv *env, jobject jParam); CK_RC5_CBC_PARAMS jRc5CbcParamToCKRc5CbcParam(JNIEnv *env, jobject jParam); CK_RC5_MAC_GENERAL_PARAMS jRc5MacGeneralParamToCKRc5MacGeneralParam(JNIEnv *env, jobject jParam); CK_SKIPJACK_PRIVATE_WRAP_PARAMS jSkipjackPrivateWrapParamToCKSkipjackPrivateWrapParam(JNIEnv *env, jobject jParam); CK_SKIPJACK_RELAYX_PARAMS jSkipjackRelayxParamToCKSkipjackRelayxParam(JNIEnv *env, jobject jParam); CK_PBE_PARAMS jPbeParamToCKPbeParam(JNIEnv *env, jobject jParam); void copyBackPBEInitializationVector(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); CK_PKCS5_PBKD2_PARAMS jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(JNIEnv *env, jobject jParam); CK_KEY_WRAP_SET_OAEP_PARAMS jKeyWrapSetOaepParamToCKKeyWrapSetOaepParam(JNIEnv *env, jobject jParam); void copyBackSetUnwrappedKey(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); CK_SSL3_MASTER_KEY_DERIVE_PARAMS jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(JNIEnv *env, jobject jParam); void copyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); CK_SSL3_KEY_MAT_PARAMS jSsl3KeyMatParamToCKSsl3KeyMatParam(JNIEnv *env, jobject jParam); void copyBackSSLKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); CK_KEY_DERIVATION_STRING_DATA jKeyDerivationStringDataToCKKeyDerivationStringData(JNIEnv *env, jobject jParam); CK_RSA_PKCS_PSS_PARAMS jRsaPkcsPssParamToCKRsaPkcsPssParam(JNIEnv *env, jobject jParam); CK_ECDH1_DERIVE_PARAMS jEcdh1DeriveParamToCKEcdh1DeriveParam(JNIEnv *env, jobject jParam); CK_ECDH2_DERIVE_PARAMS jEcdh2DeriveParamToCKEcdh2DeriveParam(JNIEnv *env, jobject jParam); CK_X9_42_DH1_DERIVE_PARAMS jX942Dh1DeriveParamToCKX942Dh1DeriveParam(JNIEnv *env, jobject jParam); CK_X9_42_DH2_DERIVE_PARAMS jX942Dh2DeriveParamToCKX942Dh2DeriveParam(JNIEnv *env, jobject jParam); /* functions to convert the InitArgs object for calling the right Java mutex functions */ CK_C_INITIALIZE_ARGS_PTR makeCKInitArgsAdapter(JNIEnv *env, jobject pInitArgs); #ifndef NO_CALLBACKS /* if the library should not make callbacks; e.g. no javai.lib or jvm.lib available */ CK_RV callJCreateMutex(CK_VOID_PTR_PTR ppMutex); CK_RV callJDestroyMutex(CK_VOID_PTR pMutex); CK_RV callJLockMutex(CK_VOID_PTR pMutex); CK_RV callJUnlockMutex(CK_VOID_PTR pMutex); #endif /* NO_CALLBACKS */ void putModuleEntry(JNIEnv *env, jobject pkcs11Implementation, ModuleData *moduleData); ModuleData * removeModuleEntry(JNIEnv *env, jobject pkcs11Implementation); CK_FUNCTION_LIST_PTR getFunctionList(JNIEnv *env, jobject pkcs11Implementation); /* A structure to encapsulate the required data for a Notify callback */ struct NotifyEncapsulation { /* The object that implements the CK_NOTIFY interface and which should be * notified. */ jobject jNotifyObject; /* The data object to pass back to the Notify object upon callback. */ jobject jApplicationData; }; typedef struct NotifyEncapsulation NotifyEncapsulation; /* The function for handling notify callbacks. */ CK_RV notifyCallback( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_NOTIFICATION event, CK_VOID_PTR pApplication /* passed to C_OpenSession */ ); /* A node of the list of notify callbacks. To be able to free the resources after use. */ struct NotifyListNode { /* The handle of the session this notify object is attached to*/ CK_SESSION_HANDLE hSession; /* Reference to the Notify encapsulation object that was passed to C_OpenSession. */ NotifyEncapsulation *notifyEncapsulation; /* Pointer to the next node in the list. */ struct NotifyListNode *next; }; typedef struct NotifyListNode NotifyListNode; void putNotifyEntry(JNIEnv *env, CK_SESSION_HANDLE hSession, NotifyEncapsulation *notifyEncapsulation); NotifyEncapsulation * removeNotifyEntry(JNIEnv *env, CK_SESSION_HANDLE hSession); NotifyEncapsulation * removeFirstNotifyEntry(JNIEnv *env); jobject createLockObject(JNIEnv *env); void destroyLockObject(JNIEnv *env, jobject jLockObject); extern jfieldID pNativeDataID; extern jfieldID mech_mechanismID; extern jfieldID mech_pParameterID; extern jclass jByteArrayClass; extern jclass jLongClass; #ifndef NO_CALLBACKS extern NotifyListNode *notifyListHead; extern jobject notifyListLock; extern jobject jInitArgsObject; extern CK_C_INITIALIZE_ARGS_PTR ckpGlobalInitArgs; #endif /* NO_CALLBACKS */ #ifdef P11_MEMORYDEBUG #include /* Simple malloc/free dumper */ void *p11malloc(size_t c, char *file, int line); void p11free(void *p, char *file, int line); /* Use THIS_FILE when it is available. */ #ifndef THIS_FILE #define THIS_FILE __FILE__ #endif #define malloc(c) (p11malloc((c), THIS_FILE, __LINE__)) #define free(c) (p11free((c), THIS_FILE, __LINE__)) #endif #endif /* _PKCS11WRAPPER_H */