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