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