--- old/src/jdk.crypto.token/share/native/libj2pkcs11/pkcs11wrapper.h 2017-01-20 09:53:00.790288108 -0800 +++ /dev/null 2017-01-18 09:30:05.425422781 -0800 @@ -1,473 +0,0 @@ -/* - * 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 - -/* 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 */ --- /dev/null 2017-01-18 09:30:05.425422781 -0800 +++ new/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/pkcs11wrapper.h 2017-01-20 09:53:00.570288117 -0800 @@ -0,0 +1,473 @@ +/* + * 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 + +/* 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 */