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