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