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