1/*
2 * Copyright (C) 2009  Internet Systems Consortium, Inc. ("ISC")
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10 * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14 * PERFORMANCE OF THIS SOFTWARE.
15 */
16
17/* $Id: unix.c,v 1.4 2009/10/26 23:47:35 tbox Exp $ */
18
19/* $Id */
20
21/*! \file */
22
23/* dynamic loader (ifndef FORCE_STATIC_PROVIDER) */
24
25#include <dlfcn.h>
26
27/* load PKCS11 dynamic object */
28
29#ifndef PK11_LIB_LOCATION
30#error "PK11_LIB_LOCATION is not set"
31#endif
32
33const char *pk11_libname = PK11_LIB_LOCATION;
34
35void *hPK11 = NULL;
36
37#define C_Initialize isc_C_Initialize
38
39CK_RV
40C_Initialize(CK_VOID_PTR pReserved);
41
42CK_RV
43C_Initialize(CK_VOID_PTR pReserved)
44{
45	CK_C_Initialize sym;
46
47	hPK11 = dlopen(pk11_libname, RTLD_NOW);
48
49	if (hPK11 == NULL)
50		return 0xfe;
51	sym = (CK_C_Initialize)dlsym(hPK11, "C_Initialize");
52	if (sym == NULL)
53		return 0xff;
54	return (*sym)(pReserved);
55}
56
57#define C_Finalize isc_C_Finalize
58
59CK_RV
60C_Finalize(CK_VOID_PTR pReserved);
61
62CK_RV
63C_Finalize(CK_VOID_PTR pReserved)
64{
65	CK_C_Finalize sym;
66
67	if (hPK11 == NULL)
68		return 0xfe;
69	sym = (CK_C_Finalize)dlsym(hPK11, "C_Finalize");
70	if (sym == NULL)
71		return 0xff;
72	return (*sym)(pReserved);
73}
74
75#define C_OpenSession isc_C_OpenSession
76
77CK_RV
78C_OpenSession(CK_SLOT_ID slotID,
79	      CK_FLAGS flags,
80	      CK_VOID_PTR pApplication,
81	      CK_RV  (*Notify) (CK_SESSION_HANDLE hSession,
82				CK_NOTIFICATION event,
83				CK_VOID_PTR pApplication),
84	      CK_SESSION_HANDLE_PTR phSession);
85
86CK_RV
87C_OpenSession(CK_SLOT_ID slotID,
88	      CK_FLAGS flags,
89	      CK_VOID_PTR pApplication,
90	      CK_RV  (*Notify) (CK_SESSION_HANDLE hSession,
91				CK_NOTIFICATION event,
92				CK_VOID_PTR pApplication),
93	      CK_SESSION_HANDLE_PTR phSession)
94{
95	CK_C_OpenSession sym;
96
97	if (hPK11 == NULL)
98		hPK11 = dlopen(pk11_libname, RTLD_NOW);
99	if (hPK11 == NULL)
100		return 0xfe;
101	sym = (CK_C_OpenSession)dlsym(hPK11, "C_OpenSession");
102	if (sym == NULL)
103		return 0xff;
104	return (*sym)(slotID, flags, pApplication, Notify, phSession);
105}
106
107#define C_CloseSession isc_C_CloseSession
108
109CK_RV
110C_CloseSession(CK_SESSION_HANDLE hSession);
111
112CK_RV
113C_CloseSession(CK_SESSION_HANDLE hSession)
114{
115	CK_C_CloseSession sym;
116
117	if (hPK11 == NULL)
118		return 0xfe;
119	sym = (CK_C_CloseSession)dlsym(hPK11, "C_CloseSession");
120	if (sym == NULL)
121		return 0xff;
122	return (*sym)(hSession);
123}
124
125#define C_Login isc_C_Login
126
127CK_RV
128C_Login(CK_SESSION_HANDLE hSession,
129	CK_USER_TYPE userType,
130	CK_CHAR_PTR pPin,
131	CK_ULONG usPinLen);
132
133CK_RV
134C_Login(CK_SESSION_HANDLE hSession,
135	CK_USER_TYPE userType,
136	CK_CHAR_PTR pPin,
137	CK_ULONG usPinLen)
138{
139	CK_C_Login sym;
140
141	if (hPK11 == NULL)
142		return 0xfe;
143	sym = (CK_C_Login)dlsym(hPK11, "C_Login");
144	if (sym == NULL)
145		return 0xff;
146	return (*sym)(hSession, userType, pPin, usPinLen);
147}
148
149#define C_CreateObject isc_C_CreateObject
150
151CK_RV
152C_CreateObject(CK_SESSION_HANDLE hSession,
153	       CK_ATTRIBUTE_PTR pTemplate,
154	       CK_ULONG usCount,
155	       CK_OBJECT_HANDLE_PTR phObject);
156
157CK_RV
158C_CreateObject(CK_SESSION_HANDLE hSession,
159	       CK_ATTRIBUTE_PTR pTemplate,
160	       CK_ULONG usCount,
161	       CK_OBJECT_HANDLE_PTR phObject)
162{
163	CK_C_CreateObject sym;
164
165	if (hPK11 == NULL)
166		return 0xfe;
167	sym = (CK_C_CreateObject)dlsym(hPK11, "C_CreateObject");
168	if (sym == NULL)
169		return 0xff;
170	return (*sym)(hSession, pTemplate, usCount, phObject);
171}
172
173#define C_DestroyObject isc_C_DestroyObject
174
175CK_RV
176C_DestroyObject(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject);
177
178CK_RV
179C_DestroyObject(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject)
180{
181	CK_C_DestroyObject sym;
182
183	if (hPK11 == NULL)
184		return 0xfe;
185	sym = (CK_C_DestroyObject)dlsym(hPK11, "C_DestroyObject");
186	if (sym == NULL)
187		return 0xff;
188	return (*sym)(hSession, hObject);
189}
190
191#define C_GetAttributeValue isc_C_GetAttributeValue
192
193CK_RV
194C_GetAttributeValue(CK_SESSION_HANDLE hSession,
195		    CK_OBJECT_HANDLE hObject,
196		    CK_ATTRIBUTE_PTR pTemplate,
197		    CK_ULONG usCount);
198
199CK_RV
200C_GetAttributeValue(CK_SESSION_HANDLE hSession,
201		    CK_OBJECT_HANDLE hObject,
202		    CK_ATTRIBUTE_PTR pTemplate,
203		    CK_ULONG usCount)
204{
205	CK_C_GetAttributeValue sym;
206
207	if (hPK11 == NULL)
208		return 0xfe;
209	sym = (CK_C_GetAttributeValue)dlsym(hPK11, "C_GetAttributeValue");
210	if (sym == NULL)
211		return 0xff;
212	return (*sym)(hSession, hObject, pTemplate, usCount);
213}
214
215#define C_SetAttributeValue isc_C_SetAttributeValue
216
217CK_RV
218C_SetAttributeValue(CK_SESSION_HANDLE hSession,
219		    CK_OBJECT_HANDLE hObject,
220		    CK_ATTRIBUTE_PTR pTemplate,
221		    CK_ULONG usCount);
222
223CK_RV
224C_SetAttributeValue(CK_SESSION_HANDLE hSession,
225		    CK_OBJECT_HANDLE hObject,
226		    CK_ATTRIBUTE_PTR pTemplate,
227		    CK_ULONG usCount)
228{
229	CK_C_SetAttributeValue sym;
230
231	if (hPK11 == NULL)
232		return 0xfe;
233	sym = (CK_C_SetAttributeValue)dlsym(hPK11, "C_SetAttributeValue");
234	if (sym == NULL)
235		return 0xff;
236	return (*sym)(hSession, hObject, pTemplate, usCount);
237}
238
239#define C_FindObjectsInit isc_C_FindObjectsInit
240
241CK_RV
242C_FindObjectsInit(CK_SESSION_HANDLE hSession,
243		  CK_ATTRIBUTE_PTR pTemplate,
244		  CK_ULONG usCount);
245
246CK_RV
247C_FindObjectsInit(CK_SESSION_HANDLE hSession,
248		  CK_ATTRIBUTE_PTR pTemplate,
249		  CK_ULONG usCount)
250{
251	CK_C_FindObjectsInit sym;
252
253	if (hPK11 == NULL)
254		return 0xfe;
255	sym = (CK_C_FindObjectsInit)dlsym(hPK11, "C_FindObjectsInit");
256	if (sym == NULL)
257		return 0xff;
258	return (*sym)(hSession, pTemplate, usCount);
259}
260
261#define C_FindObjects isc_C_FindObjects
262
263CK_RV
264C_FindObjects(CK_SESSION_HANDLE hSession,
265	      CK_OBJECT_HANDLE_PTR phObject,
266	      CK_ULONG usMaxObjectCount,
267	      CK_ULONG_PTR pusObjectCount);
268
269CK_RV
270C_FindObjects(CK_SESSION_HANDLE hSession,
271	      CK_OBJECT_HANDLE_PTR phObject,
272	      CK_ULONG usMaxObjectCount,
273	      CK_ULONG_PTR pusObjectCount)
274{
275	CK_C_FindObjects sym;
276
277	if (hPK11 == NULL)
278		return 0xfe;
279	sym = (CK_C_FindObjects)dlsym(hPK11, "C_FindObjects");
280	if (sym == NULL)
281		return 0xff;
282	return (*sym)(hSession, phObject, usMaxObjectCount, pusObjectCount);
283}
284
285#define C_FindObjectsFinal isc_C_FindObjectsFinal
286
287CK_RV
288C_FindObjectsFinal(CK_SESSION_HANDLE hSession);
289
290CK_RV
291C_FindObjectsFinal(CK_SESSION_HANDLE hSession)
292{
293	CK_C_FindObjectsFinal sym;
294
295	if (hPK11 == NULL)
296		return 0xfe;
297	sym = (CK_C_FindObjectsFinal)dlsym(hPK11, "C_FindObjectsFinal");
298	if (sym == NULL)
299		return 0xff;
300	return (*sym)(hSession);
301}
302
303#define C_GenerateKeyPair isc_C_GenerateKeyPair
304
305CK_RV
306C_GenerateKeyPair(CK_SESSION_HANDLE hSession,
307		  CK_MECHANISM_PTR pMechanism,
308		  CK_ATTRIBUTE_PTR pPublicKeyTemplate,
309		  CK_ULONG usPublicKeyAttributeCount,
310		  CK_ATTRIBUTE_PTR pPrivateKeyTemplate,
311		  CK_ULONG usPrivateKeyAttributeCount,
312		  CK_OBJECT_HANDLE_PTR phPrivateKey,
313		  CK_OBJECT_HANDLE_PTR phPublicKey);
314
315CK_RV
316C_GenerateKeyPair(CK_SESSION_HANDLE hSession,
317		  CK_MECHANISM_PTR pMechanism,
318		  CK_ATTRIBUTE_PTR pPublicKeyTemplate,
319		  CK_ULONG usPublicKeyAttributeCount,
320		  CK_ATTRIBUTE_PTR pPrivateKeyTemplate,
321		  CK_ULONG usPrivateKeyAttributeCount,
322		  CK_OBJECT_HANDLE_PTR phPrivateKey,
323		  CK_OBJECT_HANDLE_PTR phPublicKey)
324{
325	CK_C_GenerateKeyPair sym;
326
327	if (hPK11 == NULL)
328		return 0xfe;
329	sym = (CK_C_GenerateKeyPair)dlsym(hPK11, "C_GenerateKeyPair");
330	if (sym == NULL)
331		return 0xff;
332	return (*sym)(hSession,
333		      pMechanism,
334		      pPublicKeyTemplate,
335		      usPublicKeyAttributeCount,
336		      pPrivateKeyTemplate,
337		      usPrivateKeyAttributeCount,
338		      phPrivateKey,
339		      phPublicKey);
340}
341