1 /* $NetBSD: pk11_api.c,v 1.1.1.4 2014/12/10 03:34:44 christos Exp $ */ 2 3 /* 4 * Copyright (C) 2014 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 */ 20 21 /*! \file */ 22 23 #include <config.h> 24 25 #include <string.h> 26 #include <dlfcn.h> 27 28 #include <isc/log.h> 29 #include <isc/mem.h> 30 #include <isc/once.h> 31 #include <isc/stdio.h> 32 #include <isc/thread.h> 33 #include <isc/util.h> 34 35 #include <pkcs11/cryptoki.h> 36 #include <pkcs11/pkcs11.h> 37 38 #define KEEP_PKCS11_NAMES 39 #include <pk11/pk11.h> 40 #include <pk11/internal.h> 41 42 static void *hPK11 = NULL; 43 44 CK_RV 45 pkcs_C_Initialize(CK_VOID_PTR pReserved) { 46 CK_C_Initialize sym; 47 48 if (hPK11 != NULL) 49 return (CKR_LIBRARY_ALREADY_INITIALIZED); 50 51 hPK11 = dlopen(pk11_get_lib_name(), RTLD_NOW); 52 53 if (hPK11 == NULL) 54 return (CKR_LIBRARY_FAILED_TO_LOAD); 55 sym = (CK_C_Initialize)dlsym(hPK11, "C_Initialize"); 56 if (sym == NULL) 57 return (CKR_SYMBOL_RESOLUTION_FAILED); 58 return (*sym)(pReserved); 59 } 60 61 CK_RV 62 pkcs_C_Finalize(CK_VOID_PTR pReserved) { 63 CK_C_Finalize sym; 64 CK_RV rv; 65 66 if (hPK11 == NULL) 67 return (CKR_LIBRARY_FAILED_TO_LOAD); 68 sym = (CK_C_Finalize)dlsym(hPK11, "C_Finalize"); 69 if (sym == NULL) 70 return (CKR_SYMBOL_RESOLUTION_FAILED); 71 rv = (*sym)(pReserved); 72 if ((rv == CKR_OK) && (dlclose(hPK11) != 0)) 73 return (CKR_LIBRARY_FAILED_TO_LOAD); 74 hPK11 = NULL; 75 return (rv); 76 } 77 78 CK_RV 79 pkcs_C_GetSlotList(CK_BBOOL tokenPresent, CK_SLOT_ID_PTR pSlotList, 80 CK_ULONG_PTR pulCount) 81 { 82 static CK_C_GetSlotList sym = NULL; 83 static void *pPK11 = NULL; 84 85 if (hPK11 == NULL) 86 return (CKR_LIBRARY_FAILED_TO_LOAD); 87 if ((sym == NULL) || (hPK11 != pPK11)) { 88 pPK11 = hPK11; 89 sym = (CK_C_GetSlotList)dlsym(hPK11, "C_GetSlotList"); 90 } 91 if (sym == NULL) 92 return (CKR_SYMBOL_RESOLUTION_FAILED); 93 return (*sym)(tokenPresent, pSlotList, pulCount); 94 } 95 96 CK_RV 97 pkcs_C_GetTokenInfo(CK_SLOT_ID slotID, CK_TOKEN_INFO_PTR pInfo) { 98 static CK_C_GetTokenInfo sym = NULL; 99 static void *pPK11 = NULL; 100 101 if (hPK11 == NULL) 102 return (CKR_LIBRARY_FAILED_TO_LOAD); 103 if ((sym == NULL) || (hPK11 != pPK11)) { 104 pPK11 = hPK11; 105 sym = (CK_C_GetTokenInfo)dlsym(hPK11, "C_GetTokenInfo"); 106 } 107 if (sym == NULL) 108 return (CKR_SYMBOL_RESOLUTION_FAILED); 109 return (*sym)(slotID, pInfo); 110 } 111 112 CK_RV 113 pkcs_C_GetMechanismInfo(CK_SLOT_ID slotID, CK_MECHANISM_TYPE type, 114 CK_MECHANISM_INFO_PTR pInfo) 115 { 116 static CK_C_GetMechanismInfo sym = NULL; 117 static void *pPK11 = NULL; 118 119 if (hPK11 == NULL) 120 return (CKR_LIBRARY_FAILED_TO_LOAD); 121 if ((sym == NULL) || (hPK11 != pPK11)) { 122 pPK11 = hPK11; 123 sym = (CK_C_GetMechanismInfo)dlsym(hPK11, 124 "C_GetMechanismInfo"); 125 } 126 if (sym == NULL) 127 return (CKR_SYMBOL_RESOLUTION_FAILED); 128 return (*sym)(slotID, type, pInfo); 129 } 130 131 CK_RV 132 pkcs_C_OpenSession(CK_SLOT_ID slotID, CK_FLAGS flags, 133 CK_VOID_PTR pApplication, 134 CK_RV (*Notify) (CK_SESSION_HANDLE hSession, 135 CK_NOTIFICATION event, 136 CK_VOID_PTR pApplication), 137 CK_SESSION_HANDLE_PTR phSession) 138 { 139 static CK_C_OpenSession sym = NULL; 140 static void *pPK11 = NULL; 141 142 if (hPK11 == NULL) 143 hPK11 = dlopen(pk11_get_lib_name(), RTLD_NOW); 144 if (hPK11 == NULL) 145 return (CKR_LIBRARY_FAILED_TO_LOAD); 146 if ((sym == NULL) || (hPK11 != pPK11)) { 147 pPK11 = hPK11; 148 sym = (CK_C_OpenSession)dlsym(hPK11, "C_OpenSession"); 149 } 150 if (sym == NULL) 151 return (CKR_SYMBOL_RESOLUTION_FAILED); 152 return (*sym)(slotID, flags, pApplication, Notify, phSession); 153 } 154 155 CK_RV 156 pkcs_C_CloseSession(CK_SESSION_HANDLE hSession) { 157 static CK_C_CloseSession sym = NULL; 158 static void *pPK11 = NULL; 159 160 if (hPK11 == NULL) 161 return (CKR_LIBRARY_FAILED_TO_LOAD); 162 if ((sym == NULL) || (hPK11 != pPK11)) { 163 pPK11 = hPK11; 164 sym = (CK_C_CloseSession)dlsym(hPK11, "C_CloseSession"); 165 } 166 if (sym == NULL) 167 return (CKR_SYMBOL_RESOLUTION_FAILED); 168 return (*sym)(hSession); 169 } 170 171 CK_RV 172 pkcs_C_Login(CK_SESSION_HANDLE hSession, CK_USER_TYPE userType, 173 CK_CHAR_PTR pPin, CK_ULONG usPinLen) 174 { 175 static CK_C_Login sym = NULL; 176 static void *pPK11 = NULL; 177 178 if (hPK11 == NULL) 179 return (CKR_LIBRARY_FAILED_TO_LOAD); 180 if ((sym == NULL) || (hPK11 != pPK11)) { 181 pPK11 = hPK11; 182 sym = (CK_C_Login)dlsym(hPK11, "C_Login"); 183 } 184 if (sym == NULL) 185 return (CKR_SYMBOL_RESOLUTION_FAILED); 186 return (*sym)(hSession, userType, pPin, usPinLen); 187 } 188 189 CK_RV 190 pkcs_C_Logout(CK_SESSION_HANDLE hSession) { 191 static CK_C_Logout sym = NULL; 192 static void *pPK11 = NULL; 193 194 if (hPK11 == NULL) 195 return (CKR_LIBRARY_FAILED_TO_LOAD); 196 if ((sym == NULL) || (hPK11 != pPK11)) { 197 pPK11 = hPK11; 198 sym = (CK_C_Logout)dlsym(hPK11, "C_Logout"); 199 } 200 if (sym == NULL) 201 return (CKR_SYMBOL_RESOLUTION_FAILED); 202 return (*sym)(hSession); 203 } 204 205 CK_RV 206 pkcs_C_CreateObject(CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate, 207 CK_ULONG usCount, CK_OBJECT_HANDLE_PTR phObject) 208 { 209 static CK_C_CreateObject sym = NULL; 210 static void *pPK11 = NULL; 211 212 if (hPK11 == NULL) 213 return (CKR_LIBRARY_FAILED_TO_LOAD); 214 if ((sym == NULL) || (hPK11 != pPK11)) { 215 pPK11 = hPK11; 216 sym = (CK_C_CreateObject)dlsym(hPK11, "C_CreateObject"); 217 } 218 if (sym == NULL) 219 return (CKR_SYMBOL_RESOLUTION_FAILED); 220 return (*sym)(hSession, pTemplate, usCount, phObject); 221 } 222 223 CK_RV 224 pkcs_C_DestroyObject(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject) { 225 static CK_C_DestroyObject sym = NULL; 226 static void *pPK11 = NULL; 227 228 if (hPK11 == NULL) 229 return (CKR_LIBRARY_FAILED_TO_LOAD); 230 if ((sym == NULL) || (hPK11 != pPK11)) { 231 pPK11 = hPK11; 232 sym = (CK_C_DestroyObject)dlsym(hPK11, "C_DestroyObject"); 233 } 234 if (sym == NULL) 235 return (CKR_SYMBOL_RESOLUTION_FAILED); 236 return (*sym)(hSession, hObject); 237 } 238 239 CK_RV 240 pkcs_C_GetAttributeValue(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject, 241 CK_ATTRIBUTE_PTR pTemplate, CK_ULONG usCount) 242 { 243 static CK_C_GetAttributeValue sym = NULL; 244 static void *pPK11 = NULL; 245 246 if (hPK11 == NULL) 247 return (CKR_LIBRARY_FAILED_TO_LOAD); 248 if ((sym == NULL) || (hPK11 != pPK11)) { 249 pPK11 = hPK11; 250 sym = (CK_C_GetAttributeValue)dlsym(hPK11, 251 "C_GetAttributeValue"); 252 } 253 if (sym == NULL) 254 return (CKR_SYMBOL_RESOLUTION_FAILED); 255 return (*sym)(hSession, hObject, pTemplate, usCount); 256 } 257 258 CK_RV 259 pkcs_C_SetAttributeValue(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject, 260 CK_ATTRIBUTE_PTR pTemplate, CK_ULONG usCount) 261 { 262 static CK_C_SetAttributeValue sym = NULL; 263 static void *pPK11 = NULL; 264 265 if (hPK11 == NULL) 266 return (CKR_LIBRARY_FAILED_TO_LOAD); 267 if ((sym == NULL) || (hPK11 != pPK11)) { 268 pPK11 = hPK11; 269 sym = (CK_C_SetAttributeValue)dlsym(hPK11, 270 "C_SetAttributeValue"); 271 } 272 if (sym == NULL) 273 return (CKR_SYMBOL_RESOLUTION_FAILED); 274 return (*sym)(hSession, hObject, pTemplate, usCount); 275 } 276 277 CK_RV 278 pkcs_C_FindObjectsInit(CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate, 279 CK_ULONG usCount) 280 { 281 static CK_C_FindObjectsInit sym = NULL; 282 static void *pPK11 = NULL; 283 284 if (hPK11 == NULL) 285 return (CKR_LIBRARY_FAILED_TO_LOAD); 286 if ((sym == NULL) || (hPK11 != pPK11)) { 287 pPK11 = hPK11; 288 sym = (CK_C_FindObjectsInit)dlsym(hPK11, "C_FindObjectsInit"); 289 } 290 if (sym == NULL) 291 return (CKR_SYMBOL_RESOLUTION_FAILED); 292 return (*sym)(hSession, pTemplate, usCount); 293 } 294 295 CK_RV 296 pkcs_C_FindObjects(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE_PTR phObject, 297 CK_ULONG usMaxObjectCount, CK_ULONG_PTR pusObjectCount) 298 { 299 static CK_C_FindObjects sym = NULL; 300 static void *pPK11 = NULL; 301 302 if (hPK11 == NULL) 303 return (CKR_LIBRARY_FAILED_TO_LOAD); 304 if ((sym == NULL) || (hPK11 != pPK11)) { 305 pPK11 = hPK11; 306 sym = (CK_C_FindObjects)dlsym(hPK11, "C_FindObjects"); 307 } 308 if (sym == NULL) 309 return (CKR_SYMBOL_RESOLUTION_FAILED); 310 return (*sym)(hSession, phObject, usMaxObjectCount, pusObjectCount); 311 } 312 313 CK_RV 314 pkcs_C_FindObjectsFinal(CK_SESSION_HANDLE hSession) 315 { 316 static CK_C_FindObjectsFinal sym = NULL; 317 static void *pPK11 = NULL; 318 319 if (hPK11 == NULL) 320 return (CKR_LIBRARY_FAILED_TO_LOAD); 321 if ((sym == NULL) || (hPK11 != pPK11)) { 322 pPK11 = hPK11; 323 sym = (CK_C_FindObjectsFinal)dlsym(hPK11, 324 "C_FindObjectsFinal"); 325 } 326 if (sym == NULL) 327 return (CKR_SYMBOL_RESOLUTION_FAILED); 328 return (*sym)(hSession); 329 } 330 331 CK_RV 332 pkcs_C_EncryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, 333 CK_OBJECT_HANDLE hKey) 334 { 335 static CK_C_EncryptInit sym = NULL; 336 static void *pPK11 = NULL; 337 338 if (hPK11 == NULL) 339 return (CKR_LIBRARY_FAILED_TO_LOAD); 340 if ((sym == NULL) || (hPK11 != pPK11)) { 341 pPK11 = hPK11; 342 sym = (CK_C_EncryptInit)dlsym(hPK11, "C_EncryptInit"); 343 } 344 if (sym == NULL) 345 return (CKR_SYMBOL_RESOLUTION_FAILED); 346 return (*sym)(hSession, pMechanism, hKey); 347 } 348 349 CK_RV 350 pkcs_C_Encrypt(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, 351 CK_ULONG ulDataLen, CK_BYTE_PTR pEncryptedData, 352 CK_ULONG_PTR pulEncryptedDataLen) 353 { 354 static CK_C_Encrypt sym = NULL; 355 static void *pPK11 = NULL; 356 357 if (hPK11 == NULL) 358 return (CKR_LIBRARY_FAILED_TO_LOAD); 359 if ((sym == NULL) || (hPK11 != pPK11)) { 360 pPK11 = hPK11; 361 sym = (CK_C_Encrypt)dlsym(hPK11, "C_Encrypt"); 362 } 363 if (sym == NULL) 364 return (CKR_SYMBOL_RESOLUTION_FAILED); 365 return (*sym)(hSession, pData, ulDataLen, 366 pEncryptedData, pulEncryptedDataLen); 367 } 368 369 CK_RV 370 pkcs_C_DigestInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism) { 371 static CK_C_DigestInit sym = NULL; 372 static void *pPK11 = NULL; 373 374 if (hPK11 == NULL) 375 return (CKR_LIBRARY_FAILED_TO_LOAD); 376 if ((sym == NULL) || (hPK11 != pPK11)) { 377 pPK11 = hPK11; 378 sym = (CK_C_DigestInit)dlsym(hPK11, "C_DigestInit"); 379 } 380 if (sym == NULL) 381 return (CKR_SYMBOL_RESOLUTION_FAILED); 382 return (*sym)(hSession, pMechanism); 383 } 384 385 CK_RV 386 pkcs_C_DigestUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, 387 CK_ULONG ulPartLen) 388 { 389 static CK_C_DigestUpdate sym = NULL; 390 static void *pPK11 = NULL; 391 392 if (hPK11 == NULL) 393 return (CKR_LIBRARY_FAILED_TO_LOAD); 394 if ((sym == NULL) || (hPK11 != pPK11)) { 395 pPK11 = hPK11; 396 sym = (CK_C_DigestUpdate)dlsym(hPK11, "C_DigestUpdate"); 397 } 398 if (sym == NULL) 399 return (CKR_SYMBOL_RESOLUTION_FAILED); 400 return (*sym)(hSession, pPart, ulPartLen); 401 } 402 403 CK_RV 404 pkcs_C_DigestFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pDigest, 405 CK_ULONG_PTR pulDigestLen) 406 { 407 static CK_C_DigestFinal sym = NULL; 408 static void *pPK11 = NULL; 409 410 if (hPK11 == NULL) 411 return (CKR_LIBRARY_FAILED_TO_LOAD); 412 if ((sym == NULL) || (hPK11 != pPK11)) { 413 pPK11 = hPK11; 414 sym = (CK_C_DigestFinal)dlsym(hPK11, "C_DigestFinal"); 415 } 416 if (sym == NULL) 417 return (CKR_SYMBOL_RESOLUTION_FAILED); 418 return (*sym)(hSession, pDigest, pulDigestLen); 419 } 420 421 CK_RV 422 pkcs_C_SignInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, 423 CK_OBJECT_HANDLE hKey) 424 { 425 static CK_C_SignInit sym = NULL; 426 static void *pPK11 = NULL; 427 428 if (hPK11 == NULL) 429 return (CKR_LIBRARY_FAILED_TO_LOAD); 430 if ((sym == NULL) || (hPK11 != pPK11)) { 431 pPK11 = hPK11; 432 sym = (CK_C_SignInit)dlsym(hPK11, "C_SignInit"); 433 } 434 if (sym == NULL) 435 return (CKR_SYMBOL_RESOLUTION_FAILED); 436 return (*sym)(hSession, pMechanism, hKey); 437 } 438 439 CK_RV 440 pkcs_C_Sign(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, 441 CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, 442 CK_ULONG_PTR pulSignatureLen) 443 { 444 static CK_C_Sign sym = NULL; 445 static void *pPK11 = NULL; 446 447 if (hPK11 == NULL) 448 return (CKR_LIBRARY_FAILED_TO_LOAD); 449 if ((sym == NULL) || (hPK11 != pPK11)) { 450 pPK11 = hPK11; 451 sym = (CK_C_Sign)dlsym(hPK11, "C_Sign"); 452 } 453 if (sym == NULL) 454 return (CKR_SYMBOL_RESOLUTION_FAILED); 455 return (*sym)(hSession, pData, ulDataLen, pSignature, pulSignatureLen); 456 } 457 458 CK_RV 459 pkcs_C_SignUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, 460 CK_ULONG ulPartLen) 461 { 462 static CK_C_SignUpdate sym = NULL; 463 static void *pPK11 = NULL; 464 465 if (hPK11 == NULL) 466 return (CKR_LIBRARY_FAILED_TO_LOAD); 467 if ((sym == NULL) || (hPK11 != pPK11)) { 468 pPK11 = hPK11; 469 sym = (CK_C_SignUpdate)dlsym(hPK11, "C_SignUpdate"); 470 } 471 if (sym == NULL) 472 return (CKR_SYMBOL_RESOLUTION_FAILED); 473 return (*sym)(hSession, pPart, ulPartLen); 474 } 475 476 CK_RV 477 pkcs_C_SignFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature, 478 CK_ULONG_PTR pulSignatureLen) 479 { 480 static CK_C_SignFinal sym = NULL; 481 static void *pPK11 = NULL; 482 483 if (hPK11 == NULL) 484 return (CKR_LIBRARY_FAILED_TO_LOAD); 485 if ((sym == NULL) || (hPK11 != pPK11)) { 486 pPK11 = hPK11; 487 sym = (CK_C_SignFinal)dlsym(hPK11, "C_SignFinal"); 488 } 489 if (sym == NULL) 490 return (CKR_SYMBOL_RESOLUTION_FAILED); 491 return (*sym)(hSession, pSignature, pulSignatureLen); 492 } 493 494 CK_RV 495 pkcs_C_VerifyInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, 496 CK_OBJECT_HANDLE hKey) 497 { 498 static CK_C_VerifyInit sym = NULL; 499 static void *pPK11 = NULL; 500 501 if (hPK11 == NULL) 502 return (CKR_LIBRARY_FAILED_TO_LOAD); 503 if ((sym == NULL) || (hPK11 != pPK11)) { 504 pPK11 = hPK11; 505 sym = (CK_C_VerifyInit)dlsym(hPK11, "C_VerifyInit"); 506 } 507 if (sym == NULL) 508 return (CKR_SYMBOL_RESOLUTION_FAILED); 509 return (*sym)(hSession, pMechanism, hKey); 510 } 511 512 CK_RV 513 pkcs_C_Verify(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, 514 CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, 515 CK_ULONG ulSignatureLen) 516 { 517 static CK_C_Verify sym = NULL; 518 static void *pPK11 = NULL; 519 520 if (hPK11 == NULL) 521 return (CKR_LIBRARY_FAILED_TO_LOAD); 522 if ((sym == NULL) || (hPK11 != pPK11)) { 523 pPK11 = hPK11; 524 sym = (CK_C_Verify)dlsym(hPK11, "C_Verify"); 525 } 526 if (sym == NULL) 527 return (CKR_SYMBOL_RESOLUTION_FAILED); 528 return (*sym)(hSession, pData, ulDataLen, pSignature, ulSignatureLen); 529 } 530 531 CK_RV 532 pkcs_C_VerifyUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, 533 CK_ULONG ulPartLen) 534 { 535 static CK_C_VerifyUpdate sym = NULL; 536 static void *pPK11 = NULL; 537 538 if (hPK11 == NULL) 539 return (CKR_LIBRARY_FAILED_TO_LOAD); 540 if ((sym == NULL) || (hPK11 != pPK11)) { 541 pPK11 = hPK11; 542 sym = (CK_C_VerifyUpdate)dlsym(hPK11, "C_VerifyUpdate"); 543 } 544 if (sym == NULL) 545 return (CKR_SYMBOL_RESOLUTION_FAILED); 546 return (*sym)(hSession, pPart, ulPartLen); 547 } 548 549 CK_RV 550 pkcs_C_VerifyFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature, 551 CK_ULONG ulSignatureLen) 552 { 553 static CK_C_VerifyFinal sym = NULL; 554 static void *pPK11 = NULL; 555 556 if (hPK11 == NULL) 557 return (CKR_LIBRARY_FAILED_TO_LOAD); 558 if ((sym == NULL) || (hPK11 != pPK11)) { 559 pPK11 = hPK11; 560 sym = (CK_C_VerifyFinal)dlsym(hPK11, "C_VerifyFinal"); 561 } 562 if (sym == NULL) 563 return (CKR_SYMBOL_RESOLUTION_FAILED); 564 return (*sym)(hSession, pSignature, ulSignatureLen); 565 } 566 567 CK_RV 568 pkcs_C_GenerateKey(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, 569 CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, 570 CK_OBJECT_HANDLE_PTR phKey) 571 { 572 static CK_C_GenerateKey sym = NULL; 573 static void *pPK11 = NULL; 574 575 if (hPK11 == NULL) 576 return (CKR_LIBRARY_FAILED_TO_LOAD); 577 if ((sym == NULL) || (hPK11 != pPK11)) { 578 pPK11 = hPK11; 579 sym = (CK_C_GenerateKey)dlsym(hPK11, "C_GenerateKey"); 580 } 581 if (sym == NULL) 582 return (CKR_SYMBOL_RESOLUTION_FAILED); 583 return (*sym)(hSession, pMechanism, pTemplate, ulCount, phKey); 584 } 585 586 CK_RV 587 pkcs_C_GenerateKeyPair(CK_SESSION_HANDLE hSession, 588 CK_MECHANISM_PTR pMechanism, 589 CK_ATTRIBUTE_PTR pPublicKeyTemplate, 590 CK_ULONG usPublicKeyAttributeCount, 591 CK_ATTRIBUTE_PTR pPrivateKeyTemplate, 592 CK_ULONG usPrivateKeyAttributeCount, 593 CK_OBJECT_HANDLE_PTR phPrivateKey, 594 CK_OBJECT_HANDLE_PTR phPublicKey) 595 { 596 static CK_C_GenerateKeyPair sym = NULL; 597 static void *pPK11 = NULL; 598 599 if (hPK11 == NULL) 600 return (CKR_LIBRARY_FAILED_TO_LOAD); 601 if ((sym == NULL) || (hPK11 != pPK11)) { 602 pPK11 = hPK11; 603 sym = (CK_C_GenerateKeyPair)dlsym(hPK11, "C_GenerateKeyPair"); 604 } 605 if (sym == NULL) 606 return (CKR_SYMBOL_RESOLUTION_FAILED); 607 return (*sym)(hSession, 608 pMechanism, 609 pPublicKeyTemplate, 610 usPublicKeyAttributeCount, 611 pPrivateKeyTemplate, 612 usPrivateKeyAttributeCount, 613 phPrivateKey, 614 phPublicKey); 615 } 616 617 CK_RV 618 pkcs_C_DeriveKey(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, 619 CK_OBJECT_HANDLE hBaseKey, CK_ATTRIBUTE_PTR pTemplate, 620 CK_ULONG ulAttributeCount, CK_OBJECT_HANDLE_PTR phKey) 621 { 622 static CK_C_DeriveKey sym = NULL; 623 static void *pPK11 = NULL; 624 625 if (hPK11 == NULL) 626 return (CKR_LIBRARY_FAILED_TO_LOAD); 627 if ((sym == NULL) || (hPK11 != pPK11)) { 628 pPK11 = hPK11; 629 sym = (CK_C_DeriveKey)dlsym(hPK11, "C_DeriveKey"); 630 } 631 if (sym == NULL) 632 return (CKR_SYMBOL_RESOLUTION_FAILED); 633 return (*sym)(hSession, 634 pMechanism, 635 hBaseKey, 636 pTemplate, 637 ulAttributeCount, 638 phKey); 639 } 640 641 CK_RV 642 pkcs_C_SeedRandom(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSeed, 643 CK_ULONG ulSeedLen) 644 { 645 static CK_C_SeedRandom sym = NULL; 646 static void *pPK11 = NULL; 647 648 if (hPK11 == NULL) 649 return (CKR_LIBRARY_FAILED_TO_LOAD); 650 if ((sym == NULL) || (hPK11 != pPK11)) { 651 pPK11 = hPK11; 652 sym = (CK_C_SeedRandom)dlsym(hPK11, "C_SeedRandom"); 653 } 654 if (sym == NULL) 655 return (CKR_SYMBOL_RESOLUTION_FAILED); 656 return (*sym)(hSession, pSeed, ulSeedLen); 657 } 658 659 CK_RV 660 pkcs_C_GenerateRandom(CK_SESSION_HANDLE hSession, CK_BYTE_PTR RandomData, 661 CK_ULONG ulRandomLen) 662 { 663 static CK_C_GenerateRandom sym = NULL; 664 static void *pPK11 = NULL; 665 666 if (hPK11 == NULL) 667 return (CKR_LIBRARY_FAILED_TO_LOAD); 668 if ((sym == NULL) || (hPK11 != pPK11)) { 669 pPK11 = hPK11; 670 sym = (CK_C_GenerateRandom)dlsym(hPK11, "C_GenerateRandom"); 671 } 672 if (sym == NULL) 673 return (CKR_SYMBOL_RESOLUTION_FAILED); 674 return (*sym)(hSession, RandomData, ulRandomLen); 675 } 676