| 1 | /* |
| 2 | * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. |
| 3 | */ |
| 4 | |
| 5 | /* Copyright (c) 2002 Graz University of Technology. All rights reserved. |
| 6 | * |
| 7 | * Redistribution and use in source and binary forms, with or without |
| 8 | * modification, are permitted provided that the following conditions are met: |
| 9 | * |
| 10 | * 1. Redistributions of source code must retain the above copyright notice, |
| 11 | * this list of conditions and the following disclaimer. |
| 12 | * |
| 13 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
| 14 | * this list of conditions and the following disclaimer in the documentation |
| 15 | * and/or other materials provided with the distribution. |
| 16 | * |
| 17 | * 3. The end-user documentation included with the redistribution, if any, must |
| 18 | * include the following acknowledgment: |
| 19 | * |
| 20 | * "This product includes software developed by IAIK of Graz University of |
| 21 | * Technology." |
| 22 | * |
| 23 | * Alternately, this acknowledgment may appear in the software itself, if |
| 24 | * and wherever such third-party acknowledgments normally appear. |
| 25 | * |
| 26 | * 4. The names "Graz University of Technology" and "IAIK of Graz University of |
| 27 | * Technology" must not be used to endorse or promote products derived from |
| 28 | * this software without prior written permission. |
| 29 | * |
| 30 | * 5. Products derived from this software may not be called |
| 31 | * "IAIK PKCS Wrapper", nor may "IAIK" appear in their name, without prior |
| 32 | * written permission of Graz University of Technology. |
| 33 | * |
| 34 | * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED |
| 35 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| 36 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| 37 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE LICENSOR BE |
| 38 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, |
| 39 | * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| 40 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, |
| 41 | * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
| 42 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| 43 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| 44 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| 45 | * POSSIBILITY OF SUCH DAMAGE. |
| 46 | */ |
| 47 | |
| 48 | /* |
| 49 | * pkcs11wrapper.h |
| 50 | * 18.05.2001 |
| 51 | * |
| 52 | * declaration of all functions used by pkcs11wrapper.c |
| 53 | * |
| 54 | * @author Karl Scheibelhofer <Karl.Scheibelhofer@iaik.at> |
| 55 | * @author Martin Schlaeffer <schlaeff@sbox.tugraz.at> |
| 56 | */ |
| 57 | |
| 58 | #ifndef _PKCS11WRAPPER_H |
| 59 | #define _PKCS11WRAPPER_H 1 |
| 60 | |
| 61 | /* disable asserts in product mode */ |
| 62 | #ifndef DEBUG |
| 63 | #ifndef NDEBUG |
| 64 | #define NDEBUG |
| 65 | #endif |
| 66 | #endif |
| 67 | |
| 68 | /* extra PKCS#11 constants not in the standard include files */ |
| 69 | |
| 70 | #define CKA_NETSCAPE_BASE (0x80000000 + 0x4E534350) |
| 71 | #define CKA_NETSCAPE_TRUST_BASE (CKA_NETSCAPE_BASE + 0x2000) |
| 72 | #define CKA_NETSCAPE_TRUST_SERVER_AUTH (CKA_NETSCAPE_TRUST_BASE + 8) |
| 73 | #define CKA_NETSCAPE_TRUST_CLIENT_AUTH (CKA_NETSCAPE_TRUST_BASE + 9) |
| 74 | #define CKA_NETSCAPE_TRUST_CODE_SIGNING (CKA_NETSCAPE_TRUST_BASE + 10) |
| 75 | #define CKA_NETSCAPE_TRUST_EMAIL_PROTECTION (CKA_NETSCAPE_TRUST_BASE + 11) |
| 76 | #define CKA_NETSCAPE_DB 0xD5A0DB00 |
| 77 | #define CKM_NSS_TLS_PRF_GENERAL 0x80000373 |
| 78 | |
| 79 | /* |
| 80 | |
| 81 | Define the PKCS#11 functions to include and exclude. Reduces the size |
| 82 | of the binary somewhat. |
| 83 | |
| 84 | This list needs to be kept in sync with the mapfile and PKCS11.java |
| 85 | |
| 86 | */ |
| 87 | |
| 88 | #define P11_ENABLE_C_INITIALIZE |
| 89 | #define P11_ENABLE_C_FINALIZE |
| 90 | #define P11_ENABLE_C_GETINFO |
| 91 | #define P11_ENABLE_C_GETSLOTLIST |
| 92 | #define P11_ENABLE_C_GETSLOTINFO |
| 93 | #define P11_ENABLE_C_GETTOKENINFO |
| 94 | #define P11_ENABLE_C_GETMECHANISMLIST |
| 95 | #define P11_ENABLE_C_GETMECHANISMINFO |
| 96 | #undef P11_ENABLE_C_INITTOKEN |
| 97 | #undef P11_ENABLE_C_INITPIN |
| 98 | #undef P11_ENABLE_C_SETPIN |
| 99 | #define P11_ENABLE_C_OPENSESSION |
| 100 | #define P11_ENABLE_C_CLOSESESSION |
| 101 | #undef P11_ENABLE_C_CLOSEALLSESSIONS |
| 102 | #define P11_ENABLE_C_GETSESSIONINFO |
| 103 | #define P11_ENABLE_C_GETOPERATIONSTATE |
| 104 | #define P11_ENABLE_C_SETOPERATIONSTATE |
| 105 | #define P11_ENABLE_C_LOGIN |
| 106 | #define P11_ENABLE_C_LOGOUT |
| 107 | #define P11_ENABLE_C_CREATEOBJECT |
| 108 | #define P11_ENABLE_C_COPYOBJECT |
| 109 | #define P11_ENABLE_C_DESTROYOBJECT |
| 110 | #undef P11_ENABLE_C_GETOBJECTSIZE |
| 111 | #define P11_ENABLE_C_GETATTRIBUTEVALUE |
| 112 | #define P11_ENABLE_C_SETATTRIBUTEVALUE |
| 113 | #define P11_ENABLE_C_FINDOBJECTSINIT |
| 114 | #define P11_ENABLE_C_FINDOBJECTS |
| 115 | #define P11_ENABLE_C_FINDOBJECTSFINAL |
| 116 | #define P11_ENABLE_C_ENCRYPTINIT |
| 117 | #define P11_ENABLE_C_ENCRYPT |
| 118 | #define P11_ENABLE_C_ENCRYPTUPDATE |
| 119 | #define P11_ENABLE_C_ENCRYPTFINAL |
| 120 | #define P11_ENABLE_C_DECRYPTINIT |
| 121 | #define P11_ENABLE_C_DECRYPT |
| 122 | #define P11_ENABLE_C_DECRYPTUPDATE |
| 123 | #define P11_ENABLE_C_DECRYPTFINAL |
| 124 | #define P11_ENABLE_C_DIGESTINIT |
| 125 | #define P11_ENABLE_C_DIGEST |
| 126 | #define P11_ENABLE_C_DIGESTUPDATE |
| 127 | #define P11_ENABLE_C_DIGESTKEY |
| 128 | #define P11_ENABLE_C_DIGESTFINAL |
| 129 | #define P11_ENABLE_C_SIGNINIT |
| 130 | #define P11_ENABLE_C_SIGN |
| 131 | #define P11_ENABLE_C_SIGNUPDATE |
| 132 | #define P11_ENABLE_C_SIGNFINAL |
| 133 | #define P11_ENABLE_C_SIGNRECOVERINIT |
| 134 | #define P11_ENABLE_C_SIGNRECOVER |
| 135 | #define P11_ENABLE_C_VERIFYINIT |
| 136 | #define P11_ENABLE_C_VERIFY |
| 137 | #define P11_ENABLE_C_VERIFYUPDATE |
| 138 | #define P11_ENABLE_C_VERIFYFINAL |
| 139 | #define P11_ENABLE_C_VERIFYRECOVERINIT |
| 140 | #define P11_ENABLE_C_VERIFYRECOVER |
| 141 | #undef P11_ENABLE_C_DIGESTENCRYPTUPDATE |
| 142 | #undef P11_ENABLE_C_DECRYPTDIGESTUPDATE |
| 143 | #undef P11_ENABLE_C_SIGNENCRYPTUPDATE |
| 144 | #undef P11_ENABLE_C_DECRYPTVERIFYUPDATE |
| 145 | #define P11_ENABLE_C_GENERATEKEY |
| 146 | #define P11_ENABLE_C_GENERATEKEYPAIR |
| 147 | #define P11_ENABLE_C_WRAPKEY |
| 148 | #define P11_ENABLE_C_UNWRAPKEY |
| 149 | #define P11_ENABLE_C_DERIVEKEY |
| 150 | #define P11_ENABLE_C_SEEDRANDOM |
| 151 | #define P11_ENABLE_C_GENERATERANDOM |
| 152 | #undef P11_ENABLE_C_GETFUNCTIONSTATUS |
| 153 | #undef P11_ENABLE_C_CANCELFUNCTION |
| 154 | #undef P11_ENABLE_C_WAITFORSLOTEVENT |
| 155 | #define P11_ENABLE_GETNATIVEKEYINFO |
| 156 | #define P11_ENABLE_CREATENATIVEKEY |
| 157 | |
| 158 | |
| 159 | /* include the platform dependent part of the header */ |
| 160 | #include "p11_md.h" |
| 161 | |
| 162 | #include "pkcs11.h" |
| 163 | #include <jni.h> |
| 164 | #include <jni_util.h> |
| 165 | #include <stdarg.h> |
| 166 | |
| 167 | #define MAX_STACK_BUFFER_LEN (4 * 1024) |
| 168 | #define MAX_HEAP_BUFFER_LEN (64 * 1024) |
| 169 | |
| 170 | #define MAX_DIGEST_LEN (64) |
| 171 | |
| 172 | #ifndef min |
| 173 | #define min(a, b) (((a) < (b)) ? (a) : (b)) |
| 174 | #endif |
| 175 | |
| 176 | #define ckBBoolToJBoolean(x) ((x == TRUE) ? JNI_TRUE : JNI_FALSE); |
| 177 | #define jBooleanToCKBBool(x) ((x == JNI_TRUE) ? TRUE : FALSE); |
| 178 | |
| 179 | #define ckByteToJByte(x) ((jbyte) x) |
| 180 | #define jByteToCKByte(x) ((CK_BYTE) x) |
| 181 | |
| 182 | #define ckLongToJLong(x) ((jlong) x) |
| 183 | #define jLongToCKLong(x) ((CK_LONG) x) |
| 184 | |
| 185 | #define ckULongToJLong(x) ((jlong) x) |
| 186 | #define jLongToCKULong(x) ((CK_ULONG) x) |
| 187 | |
| 188 | // For CK_UNAVAILABLE_INFORMATION, always return -1 to avoid 32/64 bit problems. |
| 189 | #define ckULongSpecialToJLong(x) (((x) == CK_UNAVAILABLE_INFORMATION) \ |
| 190 | ? (jlong)-1 : ((jlong) x)) |
| 191 | |
| 192 | #define ckCharToJChar(x) ((jchar) x) |
| 193 | #define jCharToCKChar(x) ((CK_CHAR) x) |
| 194 | |
| 195 | #define ckUTF8CharToJChar(x) ((jchar) x) |
| 196 | #define jCharToCKUTF8Char(x) ((CK_UTF8CHAR) x) |
| 197 | |
| 198 | #define ckFlageToJLong(x) ((jlong) x) |
| 199 | |
| 200 | #define ckVoidPtrToJObject(x) ((jobject) x) |
| 201 | #define jObjectToCKVoidPtr(x) ((CK_VOID_PTR) x) |
| 202 | |
| 203 | #define jIntToCKLong(x) ((CK_LONG) x) |
| 204 | #define jIntToCKULong(x) ((CK_ULONG) x) |
| 205 | #define ckLongToJInt(x) ((jint) x) |
| 206 | #define ckULongToJInt(x) ((jint) x) |
| 207 | #define ckULongToJSize(x) ((jsize) x) |
| 208 | #define unsignedIntToCKULong(x) ((CK_ULONG) x) |
| 209 | |
| 210 | #ifdef P11_DEBUG |
| 211 | #define TRACE0(s) { printf(s); fflush(stdout); } |
| 212 | #define TRACE1(s, p1) { printf(s, p1); fflush(stdout); } |
| 213 | #define TRACE2(s, p1, p2) { printf(s, p1, p2); fflush(stdout); } |
| 214 | #define TRACE3(s, p1, p2, p3) { printf(s, p1, p2, p3); fflush(stdout); } |
| 215 | #else |
| 216 | #define TRACE0(s) |
| 217 | #define TRACE1(s, p1) |
| 218 | #define TRACE2(s, p1, p2) |
| 219 | #define TRACE3(s, p1, p2, p3) |
| 220 | #define TRACE_INTEND |
| 221 | #define TRACE_UNINTEND |
| 222 | #endif |
| 223 | |
| 224 | /* debug output */ |
| 225 | extern jboolean debug; |
| 226 | void printDebug(const char *format, ...); |
| 227 | |
| 228 | #define CK_ASSERT_OK 0L |
| 229 | |
| 230 | #define CLASS_P11PSSSIGNATURE "sun/security/pkcs11/P11PSSSignature" |
| 231 | |
| 232 | #define CLASS_INFO "sun/security/pkcs11/wrapper/CK_INFO" |
| 233 | #define CLASS_VERSION "sun/security/pkcs11/wrapper/CK_VERSION" |
| 234 | #define CLASS_SLOT_INFO "sun/security/pkcs11/wrapper/CK_SLOT_INFO" |
| 235 | #define CLASS_TOKEN_INFO "sun/security/pkcs11/wrapper/CK_TOKEN_INFO" |
| 236 | #define CLASS_MECHANISM "sun/security/pkcs11/wrapper/CK_MECHANISM" |
| 237 | #define CLASS_MECHANISM_INFO "sun/security/pkcs11/wrapper/CK_MECHANISM_INFO" |
| 238 | #define CLASS_SESSION_INFO "sun/security/pkcs11/wrapper/CK_SESSION_INFO" |
| 239 | #define CLASS_ATTRIBUTE "sun/security/pkcs11/wrapper/CK_ATTRIBUTE" |
| 240 | #define CLASS_DATE "sun/security/pkcs11/wrapper/CK_DATE" |
| 241 | #define CLASS_PKCS11EXCEPTION "sun/security/pkcs11/wrapper/PKCS11Exception" |
| 242 | #define CLASS_PKCS11RUNTIMEEXCEPTION "sun/security/pkcs11/wrapper/PKCS11RuntimeException" |
| 243 | #define CLASS_FILE_NOT_FOUND_EXCEPTION "java/io/FileNotFoundException" |
| 244 | #define CLASS_C_INITIALIZE_ARGS "sun/security/pkcs11/wrapper/CK_C_INITIALIZE_ARGS" |
| 245 | #define CLASS_CREATEMUTEX "sun/security/pkcs11/wrapper/CK_CREATEMUTEX" |
| 246 | #define CLASS_DESTROYMUTEX "sun/security/pkcs11/wrapper/CK_DESTROYMUTEX" |
| 247 | #define CLASS_LOCKMUTEX "sun/security/pkcs11/wrapper/CK_LOCKMUTEX" |
| 248 | #define CLASS_UNLOCKMUTEX "sun/security/pkcs11/wrapper/CK_UNLOCKMUTEX" |
| 249 | #define CLASS_NOTIFY "sun/security/pkcs11/wrapper/CK_NOTIFY" |
| 250 | |
| 251 | |
| 252 | /* mechanism parameter classes */ |
| 253 | #define CLASS_AES_CTR_PARAMS "sun/security/pkcs11/wrapper/CK_AES_CTR_PARAMS" |
| 254 | #define CLASS_GCM_PARAMS "sun/security/pkcs11/wrapper/CK_GCM_PARAMS" |
| 255 | #define CLASS_CCM_PARAMS "sun/security/pkcs11/wrapper/CK_CCM_PARAMS" |
| 256 | #define CLASS_RSA_PKCS_PSS_PARAMS "sun/security/pkcs11/wrapper/CK_RSA_PKCS_PSS_PARAMS" |
| 257 | #define CLASS_RSA_PKCS_OAEP_PARAMS "sun/security/pkcs11/wrapper/CK_RSA_PKCS_OAEP_PARAMS" |
| 258 | |
| 259 | #define CLASS_MAC_GENERAL_PARAMS "sun/security/pkcs11/wrapper/CK_MAC_GENERAL_PARAMS" |
| 260 | #define CLASS_PBE_PARAMS "sun/security/pkcs11/wrapper/CK_PBE_PARAMS" |
| 261 | #define PBE_INIT_VECTOR_SIZE 8 |
| 262 | #define CLASS_PKCS5_PBKD2_PARAMS "sun/security/pkcs11/wrapper/CK_PKCS5_PBKD2_PARAMS" |
| 263 | #define "sun/security/pkcs11/wrapper/CK_EXTRACT_PARAMS" |
| 264 | |
| 265 | #define CLASS_ECDH1_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_ECDH1_DERIVE_PARAMS" |
| 266 | #define CLASS_ECDH2_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_ECDH2_DERIVE_PARAMS" |
| 267 | #define CLASS_X9_42_DH1_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_X9_42_DH1_DERIVE_PARAMS" |
| 268 | #define CLASS_X9_42_DH2_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_X9_42_DH2_DERIVE_PARAMS" |
| 269 | |
| 270 | /* |
| 271 | #define CLASS_KEA_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_KEA_DERIVE_PARAMS" |
| 272 | #define CLASS_RC2_PARAMS "sun/security/pkcs11/wrapper/CK_RC2_PARAMS" |
| 273 | #define CLASS_RC2_CBC_PARAMS "sun/security/pkcs11/wrapper/CK_RC2_CBC_PARAMS" |
| 274 | #define CLASS_RC2_MAC_GENERAL_PARAMS "sun/security/pkcs11/wrapper/CK_RC2_MAC_GENERAL_PARAMS" |
| 275 | #define CLASS_RC5_PARAMS "sun/security/pkcs11/wrapper/CK_RC5_PARAMS" |
| 276 | #define CLASS_RC5_CBC_PARAMS "sun/security/pkcs11/wrapper/CK_RC5_CBC_PARAMS" |
| 277 | #define CLASS_RC5_MAC_GENERAL_PARAMS "sun/security/pkcs11/wrapper/CK_RC5_MAC_GENERAL_PARAMS" |
| 278 | #define CLASS_SKIPJACK_PRIVATE_WRAP_PARAMS "sun/security/pkcs11/wrapper/CK_SKIPJACK_PRIVATE_WRAP_PARAMS" |
| 279 | #define CLASS_SKIPJACK_RELAYX_PARAMS "sun/security/pkcs11/wrapper/CK_SKIPJACK_RELAYX_PARAMS" |
| 280 | #define CLASS_KEY_WRAP_SET_OAEP_PARAMS "sun/security/pkcs11/wrapper/CK_KEY_WRAP_SET_OAEP_PARAMS" |
| 281 | #define CLASS_KEY_DERIVATION_STRING_DATA "sun/security/pkcs11/wrapper/CK_KEY_DERIVATION_STRING_DATA" |
| 282 | */ |
| 283 | |
| 284 | #define CLASS_SSL3_RANDOM_DATA "sun/security/pkcs11/wrapper/CK_SSL3_RANDOM_DATA" |
| 285 | // CLASS_SSL3_RANDOM_DATA is used by CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS |
| 286 | #define CLASS_SSL3_KEY_MAT_OUT "sun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_OUT" |
| 287 | // CLASS_SSL3_KEY_MAT_OUT is used by CLASS_SSL3_KEY_MAT_PARAMS and CK_TLS12_KEY_MAT_PARAMS |
| 288 | #define CLASS_SSL3_MASTER_KEY_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_SSL3_MASTER_KEY_DERIVE_PARAMS" |
| 289 | #define CLASS_TLS12_MASTER_KEY_DERIVE_PARAMS "sun/security/pkcs11/wrapper/CK_TLS12_MASTER_KEY_DERIVE_PARAMS" |
| 290 | #define CLASS_SSL3_KEY_MAT_PARAMS "sun/security/pkcs11/wrapper/CK_SSL3_KEY_MAT_PARAMS" |
| 291 | #define CLASS_TLS12_KEY_MAT_PARAMS "sun/security/pkcs11/wrapper/CK_TLS12_KEY_MAT_PARAMS" |
| 292 | #define CLASS_TLS_PRF_PARAMS "sun/security/pkcs11/wrapper/CK_TLS_PRF_PARAMS" |
| 293 | #define CLASS_TLS_MAC_PARAMS "sun/security/pkcs11/wrapper/CK_TLS_MAC_PARAMS" |
| 294 | |
| 295 | |
| 296 | /* function to convert a PKCS#11 return value other than CK_OK into a Java Exception |
| 297 | * or to throw a PKCS11RuntimeException |
| 298 | */ |
| 299 | |
| 300 | jlong ckAssertReturnValueOK(JNIEnv *env, CK_RV returnValue); |
| 301 | void throwOutOfMemoryError(JNIEnv *env, const char *message); |
| 302 | void throwNullPointerException(JNIEnv *env, const char *message); |
| 303 | void throwIOException(JNIEnv *env, const char *message); |
| 304 | void throwPKCS11RuntimeException(JNIEnv *env, const char *message); |
| 305 | void throwDisconnectedRuntimeException(JNIEnv *env); |
| 306 | |
| 307 | /* functions to free CK structures and pointers |
| 308 | */ |
| 309 | void freeCKAttributeArray(CK_ATTRIBUTE_PTR attrPtr, int len); |
| 310 | void freeCKMechanismPtr(CK_MECHANISM_PTR mechPtr); |
| 311 | |
| 312 | /* functions to convert Java arrays to a CK-type array and the array length */ |
| 313 | |
| 314 | void jBooleanArrayToCKBBoolArray(JNIEnv *env, const jbooleanArray jArray, CK_BBOOL **ckpArray, CK_ULONG_PTR ckLength); |
| 315 | void jByteArrayToCKByteArray(JNIEnv *env, const jbyteArray jArray, CK_BYTE_PTR *ckpArray, CK_ULONG_PTR ckLength); |
| 316 | void jLongArrayToCKULongArray(JNIEnv *env, const jlongArray jArray, CK_ULONG_PTR *ckpArray, CK_ULONG_PTR ckLength); |
| 317 | void jCharArrayToCKCharArray(JNIEnv *env, const jcharArray jArray, CK_CHAR_PTR *ckpArray, CK_ULONG_PTR ckLength); |
| 318 | void jCharArrayToCKUTF8CharArray(JNIEnv *env, const jcharArray jArray, CK_UTF8CHAR_PTR *ckpArray, CK_ULONG_PTR ckLength); |
| 319 | void jStringToCKUTF8CharArray(JNIEnv *env, const jstring jArray, CK_UTF8CHAR_PTR *ckpArray, CK_ULONG_PTR ckpLength); |
| 320 | void jAttributeArrayToCKAttributeArray(JNIEnv *env, jobjectArray jAArray, CK_ATTRIBUTE_PTR *ckpArray, CK_ULONG_PTR ckpLength); |
| 321 | /*void jObjectArrayToCKVoidPtrArray(JNIEnv *env, const jobjectArray jArray, CK_VOID_PTR_PTR ckpArray, CK_ULONG_PTR ckpLength); */ |
| 322 | |
| 323 | |
| 324 | /* functions to convert a CK-type array and the array length to a Java array */ |
| 325 | |
| 326 | jbyteArray ckByteArrayToJByteArray(JNIEnv *env, const CK_BYTE_PTR ckpArray, CK_ULONG ckLength); |
| 327 | jlongArray ckULongArrayToJLongArray(JNIEnv *env, const CK_ULONG_PTR ckpArray, CK_ULONG ckLength); |
| 328 | jcharArray ckCharArrayToJCharArray(JNIEnv *env, const CK_CHAR_PTR ckpArray, CK_ULONG length); |
| 329 | jcharArray ckUTF8CharArrayToJCharArray(JNIEnv *env, const CK_UTF8CHAR_PTR ckpArray, CK_ULONG ckLength); |
| 330 | |
| 331 | |
| 332 | /* functions to convert a CK-type structure or a pointer to a CK-value to a Java object */ |
| 333 | |
| 334 | jobject ckBBoolPtrToJBooleanObject(JNIEnv *env, const CK_BBOOL* ckpValue); |
| 335 | jobject ckULongPtrToJLongObject(JNIEnv *env, const CK_ULONG_PTR ckpValue); |
| 336 | jobject ckDatePtrToJDateObject(JNIEnv *env, const CK_DATE *ckpValue); |
| 337 | jobject ckVersionPtrToJVersion(JNIEnv *env, const CK_VERSION_PTR ckpVersion); |
| 338 | jobject ckSessionInfoPtrToJSessionInfo(JNIEnv *env, const CK_SESSION_INFO_PTR ckpSessionInfo); |
| 339 | jobject ckAttributePtrToJAttribute(JNIEnv *env, const CK_ATTRIBUTE_PTR ckpAttribute); |
| 340 | |
| 341 | |
| 342 | /* function to convert the CK-value used by the CK_ATTRIBUTE structure to a Java object */ |
| 343 | |
| 344 | jobject ckAttributeValueToJObject(JNIEnv *env, const CK_ATTRIBUTE_PTR ckpAttribute); |
| 345 | |
| 346 | |
| 347 | /* functions to convert a Java object to a CK-type structure or a pointer to a CK-value */ |
| 348 | |
| 349 | CK_BBOOL* jBooleanObjectToCKBBoolPtr(JNIEnv *env, jobject jObject); |
| 350 | CK_BYTE_PTR jByteObjectToCKBytePtr(JNIEnv *env, jobject jObject); |
| 351 | CK_ULONG* jIntegerObjectToCKULongPtr(JNIEnv *env, jobject jObject); |
| 352 | CK_ULONG* jLongObjectToCKULongPtr(JNIEnv *env, jobject jObject); |
| 353 | CK_CHAR_PTR jCharObjectToCKCharPtr(JNIEnv *env, jobject jObject); |
| 354 | CK_VERSION_PTR jVersionToCKVersionPtr(JNIEnv *env, jobject jVersion); |
| 355 | CK_DATE * jDateObjectPtrToCKDatePtr(JNIEnv *env, jobject jDate); |
| 356 | CK_ATTRIBUTE jAttributeToCKAttribute(JNIEnv *env, jobject jAttribute); |
| 357 | CK_MECHANISM_PTR jMechanismToCKMechanismPtr(JNIEnv *env, jobject jMechanism); |
| 358 | |
| 359 | |
| 360 | /* functions to convert Java objects used by the Mechanism and Attribute class to a CK-type structure */ |
| 361 | CK_VOID_PTR jObjectToPrimitiveCKObjectPtr(JNIEnv *env, jobject jObject, CK_ULONG *ckpLength); |
| 362 | CK_VOID_PTR jMechParamToCKMechParamPtr(JNIEnv *env, jobject jParam, CK_MECHANISM_TYPE, CK_ULONG |
| 363 | *ckpLength); |
| 364 | |
| 365 | |
| 366 | /* functions to convert a specific Java mechanism parameter object to a CK-mechanism parameter structure */ |
| 367 | |
| 368 | void jRsaPkcsOaepParamToCKRsaPkcsOaepParam(JNIEnv *env, jobject jParam, CK_RSA_PKCS_OAEP_PARAMS_PTR ckParamPtr); |
| 369 | void jPbeParamToCKPbeParam(JNIEnv *env, jobject jParam, CK_PBE_PARAMS_PTR ckParamPtr); |
| 370 | void copyBackPBEInitializationVector(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); |
| 371 | void jPkcs5Pbkd2ParamToCKPkcs5Pbkd2Param(JNIEnv *env, jobject jParam, CK_PKCS5_PBKD2_PARAMS_PTR ckParamPtr); |
| 372 | void copyBackSetUnwrappedKey(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); |
| 373 | void jSsl3MasterKeyDeriveParamToCKSsl3MasterKeyDeriveParam(JNIEnv *env, jobject jParam, CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR ckParamPtr); |
| 374 | void ssl3CopyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); |
| 375 | void tls12CopyBackClientVersion(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); |
| 376 | void jSsl3KeyMatParamToCKSsl3KeyMatParam(JNIEnv *env, jobject jParam, CK_SSL3_KEY_MAT_PARAMS_PTR ckParamPtr); |
| 377 | void ssl3CopyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); |
| 378 | void tls12CopyBackKeyMatParams(JNIEnv *env, CK_MECHANISM *ckMechanism, jobject jMechanism); |
| 379 | CK_KEY_DERIVATION_STRING_DATA jKeyDerivationStringDataToCKKeyDerivationStringData(JNIEnv *env, jobject jParam); |
| 380 | void jRsaPkcsPssParamToCKRsaPkcsPssParam(JNIEnv *env, jobject jParam, CK_RSA_PKCS_PSS_PARAMS_PTR ckParamPtr); |
| 381 | void jEcdh1DeriveParamToCKEcdh1DeriveParam(JNIEnv *env, jobject jParam, CK_ECDH1_DERIVE_PARAMS_PTR ckParamPtr); |
| 382 | void jEcdh2DeriveParamToCKEcdh2DeriveParam(JNIEnv *env, jobject jParam, |
| 383 | CK_ECDH2_DERIVE_PARAMS_PTR ckParamPtr); |
| 384 | void jX942Dh1DeriveParamToCKX942Dh1DeriveParam(JNIEnv *env, jobject jParam, CK_X9_42_DH1_DERIVE_PARAMS_PTR ckParamPtr); |
| 385 | void jX942Dh2DeriveParamToCKX942Dh2DeriveParam(JNIEnv *env, jobject jParam, CK_X9_42_DH2_DERIVE_PARAMS_PTR ckParamPtr); |
| 386 | |
| 387 | |
| 388 | /* functions to convert the InitArgs object for calling the right Java mutex functions */ |
| 389 | |
| 390 | CK_C_INITIALIZE_ARGS_PTR makeCKInitArgsAdapter(JNIEnv *env, jobject pInitArgs); |
| 391 | |
| 392 | #ifndef NO_CALLBACKS /* if the library should not make callbacks; e.g. no javai.lib or jvm.lib available */ |
| 393 | CK_RV callJCreateMutex(CK_VOID_PTR_PTR ppMutex); |
| 394 | CK_RV callJDestroyMutex(CK_VOID_PTR pMutex); |
| 395 | CK_RV callJLockMutex(CK_VOID_PTR pMutex); |
| 396 | CK_RV callJUnlockMutex(CK_VOID_PTR pMutex); |
| 397 | #endif /* NO_CALLBACKS */ |
| 398 | |
| 399 | void putModuleEntry(JNIEnv *env, jobject pkcs11Implementation, ModuleData *moduleData); |
| 400 | ModuleData * removeModuleEntry(JNIEnv *env, jobject pkcs11Implementation); |
| 401 | CK_FUNCTION_LIST_PTR getFunctionList(JNIEnv *env, jobject pkcs11Implementation); |
| 402 | |
| 403 | /* A structure to encapsulate the required data for a Notify callback */ |
| 404 | struct NotifyEncapsulation { |
| 405 | |
| 406 | /* The object that implements the CK_NOTIFY interface and which should be |
| 407 | * notified. |
| 408 | */ |
| 409 | jobject jNotifyObject; |
| 410 | |
| 411 | /* The data object to pass back to the Notify object upon callback. */ |
| 412 | jobject jApplicationData; |
| 413 | }; |
| 414 | typedef struct NotifyEncapsulation NotifyEncapsulation; |
| 415 | |
| 416 | /* The function for handling notify callbacks. */ |
| 417 | CK_RV notifyCallback( |
| 418 | CK_SESSION_HANDLE hSession, /* the session's handle */ |
| 419 | CK_NOTIFICATION event, |
| 420 | CK_VOID_PTR pApplication /* passed to C_OpenSession */ |
| 421 | ); |
| 422 | |
| 423 | |
| 424 | /* A node of the list of notify callbacks. To be able to free the resources after use. */ |
| 425 | struct NotifyListNode { |
| 426 | |
| 427 | /* The handle of the session this notify object is attached to*/ |
| 428 | CK_SESSION_HANDLE hSession; |
| 429 | |
| 430 | /* Reference to the Notify encapsulation object that was passed to C_OpenSession. */ |
| 431 | NotifyEncapsulation *notifyEncapsulation; |
| 432 | |
| 433 | /* Pointer to the next node in the list. */ |
| 434 | struct NotifyListNode *next; |
| 435 | |
| 436 | }; |
| 437 | typedef struct NotifyListNode NotifyListNode; |
| 438 | |
| 439 | void putNotifyEntry(JNIEnv *env, CK_SESSION_HANDLE hSession, NotifyEncapsulation *notifyEncapsulation); |
| 440 | NotifyEncapsulation * removeNotifyEntry(JNIEnv *env, CK_SESSION_HANDLE hSession); |
| 441 | NotifyEncapsulation * removeFirstNotifyEntry(JNIEnv *env); |
| 442 | |
| 443 | jobject createLockObject(JNIEnv *env); |
| 444 | void destroyLockObject(JNIEnv *env, jobject jLockObject); |
| 445 | |
| 446 | extern jfieldID pNativeDataID; |
| 447 | extern jfieldID mech_mechanismID; |
| 448 | extern jfieldID mech_pParameterID; |
| 449 | extern jfieldID mech_pHandleID; |
| 450 | |
| 451 | extern jclass jByteArrayClass; |
| 452 | extern jclass jLongClass; |
| 453 | |
| 454 | #ifndef NO_CALLBACKS |
| 455 | extern NotifyListNode *notifyListHead; |
| 456 | extern jobject notifyListLock; |
| 457 | |
| 458 | extern jobject jInitArgsObject; |
| 459 | extern CK_C_INITIALIZE_ARGS_PTR ckpGlobalInitArgs; |
| 460 | #endif /* NO_CALLBACKS */ |
| 461 | |
| 462 | #ifdef P11_MEMORYDEBUG |
| 463 | #include <stdlib.h> |
| 464 | |
| 465 | /* Simple malloc/free dumper */ |
| 466 | void *p11malloc(size_t c, char *file, int line); |
| 467 | void p11free(void *p, char *file, int line); |
| 468 | |
| 469 | /* Use THIS_FILE when it is available. */ |
| 470 | #ifndef THIS_FILE |
| 471 | #define THIS_FILE __FILE__ |
| 472 | #endif |
| 473 | |
| 474 | #define malloc(c) (p11malloc((c), THIS_FILE, __LINE__)) |
| 475 | #define free(c) (p11free((c), THIS_FILE, __LINE__)) |
| 476 | |
| 477 | #endif |
| 478 | |
| 479 | #endif /* _PKCS11WRAPPER_H */ |
| 480 | |