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