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