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