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