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