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 *
getpassphrase(const char * prompt)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
pkcs_C_Initialize(CK_VOID_PTR pReserved)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
pkcs_C_Finalize(CK_VOID_PTR pReserved)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
pkcs_C_GetSlotList(CK_BBOOL tokenPresent,CK_SLOT_ID_PTR pSlotList,CK_ULONG_PTR pulCount)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
pkcs_C_GetTokenInfo(CK_SLOT_ID slotID,CK_TOKEN_INFO_PTR pInfo)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
pkcs_C_GetMechanismInfo(CK_SLOT_ID slotID,CK_MECHANISM_TYPE type,CK_MECHANISM_INFO_PTR pInfo)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
pkcs_C_OpenSession(CK_SLOT_ID slotID,CK_FLAGS flags,CK_VOID_PTR pApplication,CK_RV (* Notify)(CK_SESSION_HANDLE hSession,CK_NOTIFICATION event,CK_VOID_PTR pApplication),CK_SESSION_HANDLE_PTR phSession)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
pkcs_C_CloseSession(CK_SESSION_HANDLE hSession)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
pkcs_C_Login(CK_SESSION_HANDLE hSession,CK_USER_TYPE userType,CK_CHAR_PTR pPin,CK_ULONG usPinLen)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
pkcs_C_Logout(CK_SESSION_HANDLE hSession)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
pkcs_C_CreateObject(CK_SESSION_HANDLE hSession,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG usCount,CK_OBJECT_HANDLE_PTR phObject)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
pkcs_C_DestroyObject(CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE hObject)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
pkcs_C_GetAttributeValue(CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE hObject,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG usCount)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
pkcs_C_SetAttributeValue(CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE hObject,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG usCount)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
pkcs_C_FindObjectsInit(CK_SESSION_HANDLE hSession,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG usCount)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
pkcs_C_FindObjects(CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE_PTR phObject,CK_ULONG usMaxObjectCount,CK_ULONG_PTR pusObjectCount)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
pkcs_C_FindObjectsFinal(CK_SESSION_HANDLE hSession)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
pkcs_C_EncryptInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey)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
pkcs_C_Encrypt(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pData,CK_ULONG ulDataLen,CK_BYTE_PTR pEncryptedData,CK_ULONG_PTR pulEncryptedDataLen)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
pkcs_C_DigestInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism)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
pkcs_C_DigestUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pPart,CK_ULONG ulPartLen)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
pkcs_C_DigestFinal(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pDigest,CK_ULONG_PTR pulDigestLen)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
pkcs_C_SignInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey)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
pkcs_C_Sign(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pData,CK_ULONG ulDataLen,CK_BYTE_PTR pSignature,CK_ULONG_PTR pulSignatureLen)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
pkcs_C_SignUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pPart,CK_ULONG ulPartLen)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
pkcs_C_SignFinal(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pSignature,CK_ULONG_PTR pulSignatureLen)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
pkcs_C_VerifyInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey)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
pkcs_C_Verify(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pData,CK_ULONG ulDataLen,CK_BYTE_PTR pSignature,CK_ULONG ulSignatureLen)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
pkcs_C_VerifyUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pPart,CK_ULONG ulPartLen)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
pkcs_C_VerifyFinal(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pSignature,CK_ULONG ulSignatureLen)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
pkcs_C_GenerateKey(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulCount,CK_OBJECT_HANDLE_PTR phKey)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
pkcs_C_GenerateKeyPair(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_ATTRIBUTE_PTR pPublicKeyTemplate,CK_ULONG usPublicKeyAttributeCount,CK_ATTRIBUTE_PTR pPrivateKeyTemplate,CK_ULONG usPrivateKeyAttributeCount,CK_OBJECT_HANDLE_PTR phPrivateKey,CK_OBJECT_HANDLE_PTR phPublicKey)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
pkcs_C_DeriveKey(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hBaseKey,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulAttributeCount,CK_OBJECT_HANDLE_PTR phKey)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
pkcs_C_SeedRandom(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pSeed,CK_ULONG ulSeedLen)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
pkcs_C_GenerateRandom(CK_SESSION_HANDLE hSession,CK_BYTE_PTR RandomData,CK_ULONG ulRandomLen)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