1 /* 2 * Copyright (c) 2003, 2005, 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.c 50 * 18.05.2001 51 * 52 * This module contains the native functions of the Java to PKCS#11 interface 53 * which are platform dependent. This includes loading a dynamic link libary, 54 * retrieving the function list and unloading the dynamic link library. 55 * 56 * @author Karl Scheibelhofer <Karl.Scheibelhofer@iaik.at> 57 */ 58 59 #include "pkcs11wrapper.h" 60 61 #include <stdio.h> 62 #include <stdlib.h> 63 #include <string.h> 64 #include <assert.h> 65 66 #include <windows.h> 67 68 #include <jni.h> 69 70 #include "sun_security_pkcs11_wrapper_PKCS11.h" 71 72 /* 73 * Class: sun_security_pkcs11_wrapper_PKCS11 74 * Method: connect 75 * Signature: (Ljava/lang/String;)V 76 */ 77 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_connect 78 (JNIEnv *env, jobject obj, jstring jPkcs11ModulePath, jstring jGetFunctionList) 79 { 80 HINSTANCE hModule; 81 CK_C_GetFunctionList C_GetFunctionList; 82 CK_RV rv; 83 ModuleData *moduleData; 84 jobject globalPKCS11ImplementationReference; 85 LPVOID lpMsgBuf; 86 char *exceptionMessage; 87 const char *getFunctionListStr; 88 89 const char *libraryNameStr = (*env)->GetStringUTFChars(env, jPkcs11ModulePath, 0); 90 TRACE1("DEBUG: connect to PKCS#11 module: %s ... ", libraryNameStr); 91 92 93 /* 94 * Load the PKCS #11 DLL 95 */ 96 hModule = LoadLibrary(libraryNameStr); 97 if (hModule == NULL) { 98 FormatMessage( 99 FORMAT_MESSAGE_ALLOCATE_BUFFER | 100 FORMAT_MESSAGE_FROM_SYSTEM | 101 FORMAT_MESSAGE_IGNORE_INSERTS, 102 NULL, 103 GetLastError(), 104 0, /* Default language */ 105 (LPTSTR) &lpMsgBuf, 106 0, 107 NULL 108 ); 109 exceptionMessage = (char *) malloc(sizeof(char) * (strlen((LPTSTR) lpMsgBuf) + strlen(libraryNameStr) + 1)); 110 strcpy(exceptionMessage, (LPTSTR) lpMsgBuf); 111 strcat(exceptionMessage, libraryNameStr); 112 throwIOException(env, (LPTSTR) exceptionMessage); 113 /* Free the buffer. */ 114 free(exceptionMessage); 115 LocalFree(lpMsgBuf); 116 return; 117 } 118 119 /* 120 * Get function pointer to C_GetFunctionList 121 */ 122 getFunctionListStr = (*env)->GetStringUTFChars(env, jGetFunctionList, 0); 123 C_GetFunctionList = (CK_C_GetFunctionList) GetProcAddress(hModule, getFunctionListStr); 124 (*env)->ReleaseStringUTFChars(env, jGetFunctionList, getFunctionListStr); 125 if (C_GetFunctionList == NULL) { 126 FormatMessage( 127 FORMAT_MESSAGE_ALLOCATE_BUFFER | 128 FORMAT_MESSAGE_FROM_SYSTEM | 129 FORMAT_MESSAGE_IGNORE_INSERTS, 130 NULL, 131 GetLastError(), 132 0, /* Default language */ 133 (LPTSTR) &lpMsgBuf, 134 0, 135 NULL 136 ); 137 throwIOException(env, (LPTSTR) lpMsgBuf); 138 /* Free the buffer. */ 139 LocalFree( lpMsgBuf ); 140 return; 141 } 142 143 /* 144 * Get function pointers to all PKCS #11 functions 145 */ 146 moduleData = (ModuleData *) malloc(sizeof(ModuleData)); 147 moduleData->hModule = hModule; 148 moduleData->applicationMutexHandler = NULL; 149 rv = (C_GetFunctionList)(&(moduleData->ckFunctionListPtr)); 150 globalPKCS11ImplementationReference = (*env)->NewGlobalRef(env, obj); 151 putModuleEntry(env, globalPKCS11ImplementationReference, moduleData); 152 153 (*env)->ReleaseStringUTFChars(env, jPkcs11ModulePath, libraryNameStr); 154 TRACE0("FINISHED\n"); 155 156 if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; } 157 } 158 159 /* 160 * Class: sun_security_pkcs11_wrapper_PKCS11 161 * Method: disconnect 162 * Signature: ()V 163 */ 164 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_disconnect 165 (JNIEnv *env, jobject obj) 166 { 167 ModuleData *moduleData; 168 TRACE0("DEBUG: disconnecting module..."); 169 moduleData = removeModuleEntry(env, obj); 170 171 if (moduleData != NULL) { 172 FreeLibrary(moduleData->hModule); 173 } 174 175 free(moduleData); 176 TRACE0("FINISHED\n"); 177 }