2
|
1 |
/*
|
53318
|
2 |
* Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
|
2
|
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
|
53318
|
78 |
(JNIEnv *env, jobject obj, jstring jPkcs11ModulePath,
|
|
79 |
jstring jGetFunctionList)
|
2
|
80 |
{
|
|
81 |
HINSTANCE hModule;
|
|
82 |
CK_C_GetFunctionList C_GetFunctionList;
|
53318
|
83 |
CK_RV rv = CK_ASSERT_OK;
|
2
|
84 |
ModuleData *moduleData;
|
|
85 |
jobject globalPKCS11ImplementationReference;
|
53318
|
86 |
LPVOID lpMsgBuf = NULL;
|
|
87 |
char *exceptionMessage = NULL;
|
2
|
88 |
const char *getFunctionListStr;
|
|
89 |
|
53318
|
90 |
const char *libraryNameStr = (*env)->GetStringUTFChars(env,
|
|
91 |
jPkcs11ModulePath, 0);
|
2
|
92 |
TRACE1("DEBUG: connect to PKCS#11 module: %s ... ", libraryNameStr);
|
|
93 |
|
|
94 |
|
|
95 |
/*
|
|
96 |
* Load the PKCS #11 DLL
|
|
97 |
*/
|
|
98 |
hModule = LoadLibrary(libraryNameStr);
|
|
99 |
if (hModule == NULL) {
|
|
100 |
FormatMessage(
|
|
101 |
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
102 |
FORMAT_MESSAGE_FROM_SYSTEM |
|
|
103 |
FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
104 |
NULL,
|
|
105 |
GetLastError(),
|
|
106 |
0, /* Default language */
|
|
107 |
(LPTSTR) &lpMsgBuf,
|
|
108 |
0,
|
|
109 |
NULL
|
|
110 |
);
|
53318
|
111 |
exceptionMessage = (char *) malloc(sizeof(char) *
|
|
112 |
(strlen((LPTSTR) lpMsgBuf) + strlen(libraryNameStr) + 1));
|
|
113 |
if (exceptionMessage == NULL) {
|
|
114 |
throwOutOfMemoryError(env, 0);
|
|
115 |
goto cleanup;
|
|
116 |
}
|
2
|
117 |
strcpy(exceptionMessage, (LPTSTR) lpMsgBuf);
|
|
118 |
strcat(exceptionMessage, libraryNameStr);
|
|
119 |
throwIOException(env, (LPTSTR) exceptionMessage);
|
53318
|
120 |
goto cleanup;
|
2
|
121 |
}
|
|
122 |
|
|
123 |
/*
|
|
124 |
* Get function pointer to C_GetFunctionList
|
|
125 |
*/
|
|
126 |
getFunctionListStr = (*env)->GetStringUTFChars(env, jGetFunctionList, 0);
|
53318
|
127 |
C_GetFunctionList = (CK_C_GetFunctionList) GetProcAddress(hModule,
|
|
128 |
getFunctionListStr);
|
2
|
129 |
(*env)->ReleaseStringUTFChars(env, jGetFunctionList, getFunctionListStr);
|
|
130 |
if (C_GetFunctionList == NULL) {
|
|
131 |
FormatMessage(
|
|
132 |
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
133 |
FORMAT_MESSAGE_FROM_SYSTEM |
|
|
134 |
FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
135 |
NULL,
|
|
136 |
GetLastError(),
|
|
137 |
0, /* Default language */
|
|
138 |
(LPTSTR) &lpMsgBuf,
|
|
139 |
0,
|
|
140 |
NULL
|
|
141 |
);
|
|
142 |
throwIOException(env, (LPTSTR) lpMsgBuf);
|
53318
|
143 |
goto cleanup;
|
2
|
144 |
}
|
|
145 |
|
|
146 |
/*
|
|
147 |
* Get function pointers to all PKCS #11 functions
|
|
148 |
*/
|
|
149 |
moduleData = (ModuleData *) malloc(sizeof(ModuleData));
|
53318
|
150 |
if (moduleData == NULL) {
|
|
151 |
throwOutOfMemoryError(env, 0);
|
|
152 |
goto cleanup;
|
|
153 |
}
|
2
|
154 |
moduleData->hModule = hModule;
|
|
155 |
moduleData->applicationMutexHandler = NULL;
|
|
156 |
rv = (C_GetFunctionList)(&(moduleData->ckFunctionListPtr));
|
|
157 |
globalPKCS11ImplementationReference = (*env)->NewGlobalRef(env, obj);
|
|
158 |
putModuleEntry(env, globalPKCS11ImplementationReference, moduleData);
|
|
159 |
|
|
160 |
TRACE0("FINISHED\n");
|
|
161 |
|
53318
|
162 |
cleanup:
|
|
163 |
/* Free up allocated buffers we no longer need */
|
|
164 |
if (lpMsgBuf != NULL) {
|
|
165 |
LocalFree( lpMsgBuf );
|
|
166 |
}
|
|
167 |
if (libraryNameStr != NULL) {
|
|
168 |
(*env)->ReleaseStringUTFChars(env, jPkcs11ModulePath, libraryNameStr);
|
|
169 |
}
|
|
170 |
if (exceptionMessage != NULL) {
|
|
171 |
free(exceptionMessage);
|
|
172 |
}
|
|
173 |
|
2
|
174 |
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
|
|
175 |
}
|
|
176 |
|
|
177 |
/*
|
|
178 |
* Class: sun_security_pkcs11_wrapper_PKCS11
|
|
179 |
* Method: disconnect
|
|
180 |
* Signature: ()V
|
|
181 |
*/
|
|
182 |
JNIEXPORT void JNICALL Java_sun_security_pkcs11_wrapper_PKCS11_disconnect
|
|
183 |
(JNIEnv *env, jobject obj)
|
|
184 |
{
|
|
185 |
ModuleData *moduleData;
|
|
186 |
TRACE0("DEBUG: disconnecting module...");
|
|
187 |
moduleData = removeModuleEntry(env, obj);
|
|
188 |
|
|
189 |
if (moduleData != NULL) {
|
|
190 |
FreeLibrary(moduleData->hModule);
|
|
191 |
}
|
|
192 |
|
|
193 |
free(moduleData);
|
|
194 |
TRACE0("FINISHED\n");
|
|
195 |
}
|