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