comparison src/solaris/native/sun/security/pkcs11/wrapper/p11_md.c @ 0:37a05a11f281

Initial load
author duke
date Sat, 01 Dec 2007 00:00:00 +0000
parents
children e1bf7407c933
comparison
equal deleted inserted replaced
-1:000000000000 0:a83f25436543
1 /*
2 * Portions Copyright 2003-2005 Sun Microsystems, Inc. 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 <dlfcn.h>
67 #include <link.h>
68
69 #include <jni.h>
70
71 #include "sun_security_pkcs11_wrapper_PKCS11.h"
72
73 /*
74 * Class: sun_security_pkcs11_wrapper_PKCS11
75 * Method: connect
76 * Signature: (Ljava/lang/String;)V
77 */
78 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_connect
79 (JNIEnv *env, jobject obj, jstring jPkcs11ModulePath, jstring jGetFunctionList)
80 {
81 void *hModule;
82 char *error;
83 CK_C_GetFunctionList C_GetFunctionList;
84 CK_RV rv;
85 ModuleData *moduleData;
86 jobject globalPKCS11ImplementationReference;
87 char *systemErrorMessage;
88 char *exceptionMessage;
89 const char *getFunctionListStr;
90
91 const char *libraryNameStr = (*env)->GetStringUTFChars(env, jPkcs11ModulePath, 0);
92 TRACE1("DEBUG: connect to PKCS#11 module: %s ... ", libraryNameStr);
93
94
95 /*
96 * Load the PKCS #11 DLL
97 */
98 dlerror(); /* clear any old error message not fetched */
99 #ifdef DEBUG
100 hModule = dlopen(libraryNameStr, RTLD_NOW);
101 #else
102 hModule = dlopen(libraryNameStr, RTLD_LAZY);
103 #endif /* DEBUG */
104
105 if (hModule == NULL) {
106 systemErrorMessage = dlerror();
107 exceptionMessage = (char *) malloc(sizeof(char) * (strlen(systemErrorMessage) + strlen(libraryNameStr) + 1));
108 strcpy(exceptionMessage, systemErrorMessage);
109 strcat(exceptionMessage, libraryNameStr);
110 throwIOException(env, exceptionMessage);
111 (*env)->ReleaseStringUTFChars(env, jPkcs11ModulePath, libraryNameStr);
112 free(exceptionMessage);
113 return;
114 }
115
116 /*
117 * Get function pointer to C_GetFunctionList
118 */
119 dlerror(); /* clear any old error message not fetched */
120 // with the old JAR file jGetFunctionList is null, temporarily check for that
121 if (jGetFunctionList != NULL) {
122 getFunctionListStr = (*env)->GetStringUTFChars(env, jGetFunctionList, 0);
123 C_GetFunctionList = (CK_C_GetFunctionList) dlsym(hModule, getFunctionListStr);
124 (*env)->ReleaseStringUTFChars(env, jGetFunctionList, getFunctionListStr);
125 }
126 if ((C_GetFunctionList == NULL) || ((systemErrorMessage = dlerror()) != NULL)){
127 throwIOException(env, systemErrorMessage);
128 return;
129 }
130
131 /*
132 * Get function pointers to all PKCS #11 functions
133 */
134 moduleData = (ModuleData *) malloc(sizeof(ModuleData));
135 moduleData->hModule = hModule;
136 moduleData->applicationMutexHandler = NULL;
137 rv = (C_GetFunctionList)(&(moduleData->ckFunctionListPtr));
138 globalPKCS11ImplementationReference = (*env)->NewGlobalRef(env, obj);
139 putModuleEntry(env, globalPKCS11ImplementationReference, moduleData);
140
141 (*env)->ReleaseStringUTFChars(env, jPkcs11ModulePath, libraryNameStr);
142 TRACE0("FINISHED\n");
143
144 if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
145 }
146
147 /*
148 * Class: sun_security_pkcs11_wrapper_PKCS11
149 * Method: disconnect
150 * Signature: ()V
151 */
152 JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_disconnect
153 (JNIEnv *env, jobject obj)
154 {
155 ModuleData *moduleData;
156 TRACE0("DEBUG: disconnecting module...");
157 moduleData = removeModuleEntry(env, obj);
158
159 if (moduleData != NULL) {
160 dlclose(moduleData->hModule);
161 }
162
163 free(moduleData);
164 TRACE0("FINISHED\n");
165
166 }