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