1 /*
2 * Copyright (c)2010 SURFnet bv
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
20 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 * INTERRUPTION)HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23 * OTHERWISE)ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
24 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27 /*****************************************************************************
28 main.cpp
29
30 This file contains the main entry point to the PKCS #11 library. All it does
31 is dispatch calls to the actual implementation and check for fatal exceptions
32 on the boundary of the library.
33 *****************************************************************************/
34
35 // The functions are exported library/DLL entry points
36 #define CRYPTOKI_EXPORTS
37
38 #include "config.h"
39 #include "log.h"
40 #include "fatal.h"
41 #include "cryptoki.h"
42 #include "SoftHSM.h"
43
44 #if defined(__GNUC__) && \
45 (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) || \
46 defined(__SUNPRO_C) && __SUNPRO_C >= 0x590
47 #define PKCS_API __attribute__ ((visibility("default")))
48 #else
49 #define PKCS_API
50 #endif
51
52 // PKCS #11 function list
53 static CK_FUNCTION_LIST functionList =
54 {
55 // Version information
56 { CRYPTOKI_VERSION_MAJOR, CRYPTOKI_VERSION_MINOR },
57 // Function pointers
58 C_Initialize,
59 C_Finalize,
60 C_GetInfo,
61 C_GetFunctionList,
62 C_GetSlotList,
63 C_GetSlotInfo,
64 C_GetTokenInfo,
65 C_GetMechanismList,
66 C_GetMechanismInfo,
67 C_InitToken,
68 C_InitPIN,
69 C_SetPIN,
70 C_OpenSession,
71 C_CloseSession,
72 C_CloseAllSessions,
73 C_GetSessionInfo,
74 C_GetOperationState,
75 C_SetOperationState,
76 C_Login,
77 C_Logout,
78 C_CreateObject,
79 C_CopyObject,
80 C_DestroyObject,
81 C_GetObjectSize,
82 C_GetAttributeValue,
83 C_SetAttributeValue,
84 C_FindObjectsInit,
85 C_FindObjects,
86 C_FindObjectsFinal,
87 C_EncryptInit,
88 C_Encrypt,
89 C_EncryptUpdate,
90 C_EncryptFinal,
91 C_DecryptInit,
92 C_Decrypt,
93 C_DecryptUpdate,
94 C_DecryptFinal,
95 C_DigestInit,
96 C_Digest,
97 C_DigestUpdate,
98 C_DigestKey,
99 C_DigestFinal,
100 C_SignInit,
101 C_Sign,
102 C_SignUpdate,
103 C_SignFinal,
104 C_SignRecoverInit,
105 C_SignRecover,
106 C_VerifyInit,
107 C_Verify,
108 C_VerifyUpdate,
109 C_VerifyFinal,
110 C_VerifyRecoverInit,
111 C_VerifyRecover,
112 C_DigestEncryptUpdate,
113 C_DecryptDigestUpdate,
114 C_SignEncryptUpdate,
115 C_DecryptVerifyUpdate,
116 C_GenerateKey,
117 C_GenerateKeyPair,
118 C_WrapKey,
119 C_UnwrapKey,
120 C_DeriveKey,
121 C_SeedRandom,
122 C_GenerateRandom,
123 C_GetFunctionStatus,
124 C_CancelFunction,
125 C_WaitForSlotEvent
126 };
127
128 // PKCS #11 initialisation function
C_Initialize(CK_VOID_PTR pInitArgs)129 PKCS_API CK_RV C_Initialize(CK_VOID_PTR pInitArgs)
130 {
131 try
132 {
133 return SoftHSM::i()->C_Initialize(pInitArgs);
134 }
135 catch (...)
136 {
137 FatalException();
138 }
139
140 return CKR_FUNCTION_FAILED;
141 }
142
143 // PKCS #11 finalisation function
C_Finalize(CK_VOID_PTR pReserved)144 PKCS_API CK_RV C_Finalize(CK_VOID_PTR pReserved)
145 {
146 try
147 {
148 return SoftHSM::i()->C_Finalize(pReserved);
149 }
150 catch (...)
151 {
152 FatalException();
153 }
154
155 return CKR_FUNCTION_FAILED;
156 }
157
158 // Return information about the PKCS #11 module
C_GetInfo(CK_INFO_PTR pInfo)159 PKCS_API CK_RV C_GetInfo(CK_INFO_PTR pInfo)
160 {
161 try
162 {
163 return SoftHSM::i()->C_GetInfo(pInfo);
164 }
165 catch (...)
166 {
167 FatalException();
168 }
169
170 return CKR_FUNCTION_FAILED;
171 }
172
173 // Return the list of PKCS #11 functions
C_GetFunctionList(CK_FUNCTION_LIST_PTR_PTR ppFunctionList)174 PKCS_API CK_RV C_GetFunctionList(CK_FUNCTION_LIST_PTR_PTR ppFunctionList)
175 {
176 try
177 {
178 if (ppFunctionList == NULL_PTR) return CKR_ARGUMENTS_BAD;
179
180 *ppFunctionList = &functionList;
181
182 return CKR_OK;
183 }
184 catch (...)
185 {
186 FatalException();
187 }
188
189 return CKR_FUNCTION_FAILED;
190 }
191
192 // Return a list of available slots
C_GetSlotList(CK_BBOOL tokenPresent,CK_SLOT_ID_PTR pSlotList,CK_ULONG_PTR pulCount)193 PKCS_API CK_RV C_GetSlotList(CK_BBOOL tokenPresent, CK_SLOT_ID_PTR pSlotList, CK_ULONG_PTR pulCount)
194 {
195 try
196 {
197 return SoftHSM::i()->C_GetSlotList(tokenPresent, pSlotList, pulCount);
198 }
199 catch (...)
200 {
201 FatalException();
202 }
203
204 return CKR_FUNCTION_FAILED;
205 }
206
207 // Return information about a slot
C_GetSlotInfo(CK_SLOT_ID slotID,CK_SLOT_INFO_PTR pInfo)208 PKCS_API CK_RV C_GetSlotInfo(CK_SLOT_ID slotID, CK_SLOT_INFO_PTR pInfo)
209 {
210 try
211 {
212 return SoftHSM::i()->C_GetSlotInfo(slotID, pInfo);
213 }
214 catch (...)
215 {
216 FatalException();
217 }
218
219 return CKR_FUNCTION_FAILED;
220 }
221
222 // Return information about a token in a slot
C_GetTokenInfo(CK_SLOT_ID slotID,CK_TOKEN_INFO_PTR pInfo)223 PKCS_API CK_RV C_GetTokenInfo(CK_SLOT_ID slotID, CK_TOKEN_INFO_PTR pInfo)
224 {
225 try
226 {
227 return SoftHSM::i()->C_GetTokenInfo(slotID, pInfo);
228 }
229 catch (...)
230 {
231 FatalException();
232 }
233
234 return CKR_FUNCTION_FAILED;
235 }
236
237 // Return the list of supported mechanisms for a given slot
C_GetMechanismList(CK_SLOT_ID slotID,CK_MECHANISM_TYPE_PTR pMechanismList,CK_ULONG_PTR pulCount)238 PKCS_API CK_RV C_GetMechanismList(CK_SLOT_ID slotID, CK_MECHANISM_TYPE_PTR pMechanismList, CK_ULONG_PTR pulCount)
239 {
240 try
241 {
242 return SoftHSM::i()->C_GetMechanismList(slotID, pMechanismList, pulCount);
243 }
244 catch (...)
245 {
246 FatalException();
247 }
248
249 return CKR_FUNCTION_FAILED;
250 }
251
252 // Return more information about a mechanism for a given slot
C_GetMechanismInfo(CK_SLOT_ID slotID,CK_MECHANISM_TYPE type,CK_MECHANISM_INFO_PTR pInfo)253 PKCS_API CK_RV C_GetMechanismInfo(CK_SLOT_ID slotID, CK_MECHANISM_TYPE type, CK_MECHANISM_INFO_PTR pInfo)
254 {
255 try
256 {
257 return SoftHSM::i()->C_GetMechanismInfo(slotID, type, pInfo);
258 }
259 catch (...)
260 {
261 FatalException();
262 }
263
264 return CKR_FUNCTION_FAILED;
265 }
266
267 // Initialise the token in the specified slot
C_InitToken(CK_SLOT_ID slotID,CK_UTF8CHAR_PTR pPin,CK_ULONG ulPinLen,CK_UTF8CHAR_PTR pLabel)268 PKCS_API CK_RV C_InitToken(CK_SLOT_ID slotID, CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen, CK_UTF8CHAR_PTR pLabel)
269 {
270 try
271 {
272 return SoftHSM::i()->C_InitToken(slotID, pPin, ulPinLen, pLabel);
273 }
274 catch (...)
275 {
276 FatalException();
277 }
278
279 return CKR_FUNCTION_FAILED;
280 }
281
282 // Initialise the user PIN
C_InitPIN(CK_SESSION_HANDLE hSession,CK_UTF8CHAR_PTR pPin,CK_ULONG ulPinLen)283 PKCS_API CK_RV C_InitPIN(CK_SESSION_HANDLE hSession, CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen)
284 {
285 try
286 {
287 return SoftHSM::i()->C_InitPIN(hSession, pPin, ulPinLen);
288 }
289 catch (...)
290 {
291 FatalException();
292 }
293
294 return CKR_FUNCTION_FAILED;
295 }
296
297 // Change the PIN
C_SetPIN(CK_SESSION_HANDLE hSession,CK_UTF8CHAR_PTR pOldPin,CK_ULONG ulOldLen,CK_UTF8CHAR_PTR pNewPin,CK_ULONG ulNewLen)298 PKCS_API CK_RV C_SetPIN(CK_SESSION_HANDLE hSession, CK_UTF8CHAR_PTR pOldPin, CK_ULONG ulOldLen, CK_UTF8CHAR_PTR pNewPin, CK_ULONG ulNewLen)
299 {
300 try
301 {
302 return SoftHSM::i()->C_SetPIN(hSession, pOldPin, ulOldLen, pNewPin, ulNewLen);
303 }
304 catch (...)
305 {
306 FatalException();
307 }
308
309 return CKR_FUNCTION_FAILED;
310 }
311
312 // Open a new session to the specified slot
C_OpenSession(CK_SLOT_ID slotID,CK_FLAGS flags,CK_VOID_PTR pApplication,CK_NOTIFY notify,CK_SESSION_HANDLE_PTR phSession)313 PKCS_API CK_RV C_OpenSession(CK_SLOT_ID slotID, CK_FLAGS flags, CK_VOID_PTR pApplication, CK_NOTIFY notify, CK_SESSION_HANDLE_PTR phSession)
314 {
315 try
316 {
317 return SoftHSM::i()->C_OpenSession(slotID, flags, pApplication, notify, phSession);
318 }
319 catch (...)
320 {
321 FatalException();
322 }
323
324 return CKR_FUNCTION_FAILED;
325 }
326
327 // Close the given session
C_CloseSession(CK_SESSION_HANDLE hSession)328 PKCS_API CK_RV C_CloseSession(CK_SESSION_HANDLE hSession)
329 {
330 try
331 {
332 return SoftHSM::i()->C_CloseSession(hSession);
333 }
334 catch (...)
335 {
336 FatalException();
337 }
338
339 return CKR_FUNCTION_FAILED;
340 }
341
342 // Close all open sessions
C_CloseAllSessions(CK_SLOT_ID slotID)343 PKCS_API CK_RV C_CloseAllSessions(CK_SLOT_ID slotID)
344 {
345 try
346 {
347 return SoftHSM::i()->C_CloseAllSessions(slotID);
348 }
349 catch (...)
350 {
351 FatalException();
352 }
353
354 return CKR_FUNCTION_FAILED;
355 }
356
357 // Retrieve information about the specified session
C_GetSessionInfo(CK_SESSION_HANDLE hSession,CK_SESSION_INFO_PTR pInfo)358 PKCS_API CK_RV C_GetSessionInfo(CK_SESSION_HANDLE hSession, CK_SESSION_INFO_PTR pInfo)
359 {
360 try
361 {
362 return SoftHSM::i()->C_GetSessionInfo(hSession, pInfo);
363 }
364 catch (...)
365 {
366 FatalException();
367 }
368
369 return CKR_FUNCTION_FAILED;
370 }
371
372 // Determine the state of a running operation in a session
C_GetOperationState(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pOperationState,CK_ULONG_PTR pulOperationStateLen)373 PKCS_API CK_RV C_GetOperationState(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pOperationState, CK_ULONG_PTR pulOperationStateLen)
374 {
375 try
376 {
377 return SoftHSM::i()->C_GetOperationState(hSession, pOperationState, pulOperationStateLen);
378 }
379 catch (...)
380 {
381 FatalException();
382 }
383
384 return CKR_FUNCTION_FAILED;
385 }
386
387 // Set the operation sate in a session
C_SetOperationState(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pOperationState,CK_ULONG ulOperationStateLen,CK_OBJECT_HANDLE hEncryptionKey,CK_OBJECT_HANDLE hAuthenticationKey)388 PKCS_API CK_RV C_SetOperationState(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pOperationState, CK_ULONG ulOperationStateLen, CK_OBJECT_HANDLE hEncryptionKey, CK_OBJECT_HANDLE hAuthenticationKey)
389 {
390 try
391 {
392 return SoftHSM::i()->C_SetOperationState(hSession, pOperationState, ulOperationStateLen, hEncryptionKey, hAuthenticationKey);
393 }
394 catch (...)
395 {
396 FatalException();
397 }
398
399 return CKR_FUNCTION_FAILED;
400 }
401
402 // Login on the token in the specified session
C_Login(CK_SESSION_HANDLE hSession,CK_USER_TYPE userType,CK_UTF8CHAR_PTR pPin,CK_ULONG ulPinLen)403 PKCS_API CK_RV C_Login(CK_SESSION_HANDLE hSession, CK_USER_TYPE userType, CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen)
404 {
405 try
406 {
407 return SoftHSM::i()->C_Login(hSession, userType, pPin, ulPinLen);
408 }
409 catch (...)
410 {
411 FatalException();
412 }
413
414 return CKR_FUNCTION_FAILED;
415 }
416
417 // Log out of the token in the specified session
C_Logout(CK_SESSION_HANDLE hSession)418 PKCS_API CK_RV C_Logout(CK_SESSION_HANDLE hSession)
419 {
420 try
421 {
422 return SoftHSM::i()->C_Logout(hSession);
423 }
424 catch (...)
425 {
426 FatalException();
427 }
428
429 return CKR_FUNCTION_FAILED;
430 }
431
432 // Create a new object on the token in the specified session using the given attribute template
C_CreateObject(CK_SESSION_HANDLE hSession,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulCount,CK_OBJECT_HANDLE_PTR phObject)433 PKCS_API CK_RV C_CreateObject(CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phObject)
434 {
435 try
436 {
437 return SoftHSM::i()->C_CreateObject(hSession, pTemplate, ulCount, phObject);
438 }
439 catch (...)
440 {
441 FatalException();
442 }
443
444 return CKR_FUNCTION_FAILED;
445 }
446
447 // Create a copy of the object with the specified handle
C_CopyObject(CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE hObject,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulCount,CK_OBJECT_HANDLE_PTR phNewObject)448 PKCS_API CK_RV C_CopyObject(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phNewObject)
449 {
450 try
451 {
452 return SoftHSM::i()->C_CopyObject(hSession, hObject, pTemplate, ulCount, phNewObject);
453 }
454 catch (...)
455 {
456 FatalException();
457 }
458
459 return CKR_FUNCTION_FAILED;
460 }
461
462 // Destroy the specified object
C_DestroyObject(CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE hObject)463 PKCS_API CK_RV C_DestroyObject(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject)
464 {
465 try
466 {
467 return SoftHSM::i()->C_DestroyObject(hSession, hObject);
468 }
469 catch (...)
470 {
471 FatalException();
472 }
473
474 return CKR_FUNCTION_FAILED;
475 }
476
477 // Determine the size of the specified object
C_GetObjectSize(CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE hObject,CK_ULONG_PTR pulSize)478 PKCS_API CK_RV C_GetObjectSize(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject, CK_ULONG_PTR pulSize)
479 {
480 try
481 {
482 return SoftHSM::i()->C_GetObjectSize(hSession, hObject, pulSize);
483 }
484 catch (...)
485 {
486 FatalException();
487 }
488
489 return CKR_FUNCTION_FAILED;
490 }
491
492 // Retrieve the specified attributes for the given object
C_GetAttributeValue(CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE hObject,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulCount)493 PKCS_API CK_RV C_GetAttributeValue(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount)
494 {
495 try
496 {
497 return SoftHSM::i()->C_GetAttributeValue(hSession, hObject, pTemplate, ulCount);
498 }
499 catch (...)
500 {
501 FatalException();
502 }
503
504 return CKR_FUNCTION_FAILED;
505 }
506
507 // Change or set the value of the specified attributes on the specified object
C_SetAttributeValue(CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE hObject,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulCount)508 PKCS_API CK_RV C_SetAttributeValue(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount)
509 {
510 try
511 {
512 return SoftHSM::i()->C_SetAttributeValue(hSession, hObject, pTemplate, ulCount);
513 }
514 catch (...)
515 {
516 FatalException();
517 }
518
519 return CKR_FUNCTION_FAILED;
520 }
521
522 // Initialise object search in the specified session using the specified attribute template as search parameters
C_FindObjectsInit(CK_SESSION_HANDLE hSession,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulCount)523 PKCS_API CK_RV C_FindObjectsInit(CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount)
524 {
525 try
526 {
527 return SoftHSM::i()->C_FindObjectsInit(hSession, pTemplate, ulCount);
528 }
529 catch (...)
530 {
531 FatalException();
532 }
533
534 return CKR_FUNCTION_FAILED;
535 }
536
537 // Continue the search for objects in the specified session
C_FindObjects(CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE_PTR phObject,CK_ULONG ulMaxObjectCount,CK_ULONG_PTR pulObjectCount)538 PKCS_API CK_RV C_FindObjects(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE_PTR phObject, CK_ULONG ulMaxObjectCount, CK_ULONG_PTR pulObjectCount)
539 {
540 try
541 {
542 return SoftHSM::i()->C_FindObjects(hSession, phObject, ulMaxObjectCount, pulObjectCount);
543 }
544 catch (...)
545 {
546 FatalException();
547 }
548
549 return CKR_FUNCTION_FAILED;
550 }
551
552 // Finish searching for objects
C_FindObjectsFinal(CK_SESSION_HANDLE hSession)553 PKCS_API CK_RV C_FindObjectsFinal(CK_SESSION_HANDLE hSession)
554 {
555 try
556 {
557 return SoftHSM::i()->C_FindObjectsFinal(hSession);
558 }
559 catch (...)
560 {
561 FatalException();
562 }
563
564 return CKR_FUNCTION_FAILED;
565 }
566
567 // Initialise encryption using the specified object and mechanism
C_EncryptInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hObject)568 PKCS_API CK_RV C_EncryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hObject)
569 {
570 try
571 {
572 return SoftHSM::i()->C_EncryptInit(hSession, pMechanism, hObject);
573 }
574 catch (...)
575 {
576 FatalException();
577 }
578
579 return CKR_FUNCTION_FAILED;
580 }
581
582 // Perform a single operation encryption operation in the specified session
C_Encrypt(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pData,CK_ULONG ulDataLen,CK_BYTE_PTR pEncryptedData,CK_ULONG_PTR pulEncryptedDataLen)583 PKCS_API CK_RV C_Encrypt(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pEncryptedData, CK_ULONG_PTR pulEncryptedDataLen)
584 {
585 try
586 {
587 return SoftHSM::i()->C_Encrypt(hSession, pData, ulDataLen, pEncryptedData, pulEncryptedDataLen);
588 }
589 catch (...)
590 {
591 FatalException();
592 }
593
594 return CKR_FUNCTION_FAILED;
595 }
596
597 // Feed data to the running encryption operation in a session
C_EncryptUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pData,CK_ULONG ulDataLen,CK_BYTE_PTR pEncryptedData,CK_ULONG_PTR pulEncryptedDataLen)598 PKCS_API CK_RV C_EncryptUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pEncryptedData, CK_ULONG_PTR pulEncryptedDataLen)
599 {
600 try
601 {
602 return SoftHSM::i()->C_EncryptUpdate(hSession, pData, ulDataLen, pEncryptedData, pulEncryptedDataLen);
603 }
604 catch (...)
605 {
606 FatalException();
607 }
608
609 return CKR_FUNCTION_FAILED;
610 }
611
612 // Finalise the encryption operation
C_EncryptFinal(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pEncryptedData,CK_ULONG_PTR pulEncryptedDataLen)613 PKCS_API CK_RV C_EncryptFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedData, CK_ULONG_PTR pulEncryptedDataLen)
614 {
615 try
616 {
617 return SoftHSM::i()->C_EncryptFinal(hSession, pEncryptedData, pulEncryptedDataLen);
618 }
619 catch (...)
620 {
621 FatalException();
622 }
623
624 return CKR_FUNCTION_FAILED;
625 }
626
627 // Initialise decryption using the specified object
C_DecryptInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hObject)628 PKCS_API CK_RV C_DecryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hObject)
629 {
630 try
631 {
632 return SoftHSM::i()->C_DecryptInit(hSession, pMechanism, hObject);
633 }
634 catch (...)
635 {
636 FatalException();
637 }
638
639 return CKR_FUNCTION_FAILED;
640 }
641
642 // Perform a single operation decryption in the given session
C_Decrypt(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pEncryptedData,CK_ULONG ulEncryptedDataLen,CK_BYTE_PTR pData,CK_ULONG_PTR pulDataLen)643 PKCS_API CK_RV C_Decrypt(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedData, CK_ULONG ulEncryptedDataLen, CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen)
644 {
645 try
646 {
647 return SoftHSM::i()->C_Decrypt(hSession, pEncryptedData, ulEncryptedDataLen, pData, pulDataLen);
648 }
649 catch (...)
650 {
651 FatalException();
652 }
653
654 return CKR_FUNCTION_FAILED;
655 }
656
657 // Feed data to the running decryption operation in a session
C_DecryptUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pEncryptedData,CK_ULONG ulEncryptedDataLen,CK_BYTE_PTR pData,CK_ULONG_PTR pDataLen)658 PKCS_API CK_RV C_DecryptUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedData, CK_ULONG ulEncryptedDataLen, CK_BYTE_PTR pData, CK_ULONG_PTR pDataLen)
659 {
660 try
661 {
662 return SoftHSM::i()->C_DecryptUpdate(hSession, pEncryptedData, ulEncryptedDataLen, pData, pDataLen);
663 }
664 catch (...)
665 {
666 FatalException();
667 }
668
669 return CKR_FUNCTION_FAILED;
670 }
671
672 // Finalise the decryption operation
C_DecryptFinal(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pData,CK_ULONG_PTR pDataLen)673 PKCS_API CK_RV C_DecryptFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG_PTR pDataLen)
674 {
675 try
676 {
677 return SoftHSM::i()->C_DecryptFinal(hSession, pData, pDataLen);
678 }
679 catch (...)
680 {
681 FatalException();
682 }
683
684 return CKR_FUNCTION_FAILED;
685 }
686
687 // Initialise digesting using the specified mechanism in the specified session
C_DigestInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism)688 PKCS_API CK_RV C_DigestInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism)
689 {
690 try
691 {
692 return SoftHSM::i()->C_DigestInit(hSession, pMechanism);
693 }
694 catch (...)
695 {
696 FatalException();
697 }
698
699 return CKR_FUNCTION_FAILED;
700 }
701
702 // Digest the specified data in a one-pass operation and return the resulting digest
C_Digest(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pData,CK_ULONG ulDataLen,CK_BYTE_PTR pDigest,CK_ULONG_PTR pulDigestLen)703 PKCS_API CK_RV C_Digest(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pDigest, CK_ULONG_PTR pulDigestLen)
704 {
705 try
706 {
707 return SoftHSM::i()->C_Digest(hSession, pData, ulDataLen, pDigest, pulDigestLen);
708 }
709 catch (...)
710 {
711 FatalException();
712 }
713
714 return CKR_FUNCTION_FAILED;
715 }
716
717 // Update a running digest operation
C_DigestUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pPart,CK_ULONG ulPartLen)718 PKCS_API CK_RV C_DigestUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen)
719 {
720 try
721 {
722 return SoftHSM::i()->C_DigestUpdate(hSession, pPart, ulPartLen);
723 }
724 catch (...)
725 {
726 FatalException();
727 }
728
729 return CKR_FUNCTION_FAILED;
730 }
731
732 // Update a running digest operation by digesting a secret key with the specified handle
C_DigestKey(CK_SESSION_HANDLE hSession,CK_OBJECT_HANDLE hObject)733 PKCS_API CK_RV C_DigestKey(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject)
734 {
735 try
736 {
737 return SoftHSM::i()->C_DigestKey(hSession, hObject);
738 }
739 catch (...)
740 {
741 FatalException();
742 }
743
744 return CKR_FUNCTION_FAILED;
745 }
746
747 // Finalise the digest operation in the specified session and return the digest
C_DigestFinal(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pDigest,CK_ULONG_PTR pulDigestLen)748 PKCS_API CK_RV C_DigestFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pDigest, CK_ULONG_PTR pulDigestLen)
749 {
750 try
751 {
752 return SoftHSM::i()->C_DigestFinal(hSession, pDigest, pulDigestLen);
753 }
754 catch (...)
755 {
756 FatalException();
757 }
758
759 return CKR_FUNCTION_FAILED;
760 }
761
762 // Initialise a signing operation using the specified key and mechanism
C_SignInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey)763 PKCS_API CK_RV C_SignInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey)
764 {
765 try
766 {
767 return SoftHSM::i()->C_SignInit(hSession, pMechanism, hKey);
768 }
769 catch (...)
770 {
771 FatalException();
772 }
773
774 return CKR_FUNCTION_FAILED;
775 }
776
777 // Sign the data in a single pass operation
C_Sign(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pData,CK_ULONG ulDataLen,CK_BYTE_PTR pSignature,CK_ULONG_PTR pulSignatureLen)778 PKCS_API CK_RV C_Sign(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen)
779 {
780 try
781 {
782 return SoftHSM::i()->C_Sign(hSession, pData, ulDataLen, pSignature, pulSignatureLen);
783 }
784 catch (...)
785 {
786 FatalException();
787 }
788
789 return CKR_FUNCTION_FAILED;
790 }
791
792 // Update a running signing operation with additional data
C_SignUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pPart,CK_ULONG ulPartLen)793 PKCS_API CK_RV C_SignUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen)
794 {
795 try
796 {
797 return SoftHSM::i()->C_SignUpdate(hSession, pPart, ulPartLen);
798 }
799 catch (...)
800 {
801 FatalException();
802 }
803
804 return CKR_FUNCTION_FAILED;
805 }
806
807 // Finalise a running signing operation and return the signature
C_SignFinal(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pSignature,CK_ULONG_PTR pulSignatureLen)808 PKCS_API CK_RV C_SignFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen)
809 {
810 try
811 {
812 return SoftHSM::i()->C_SignFinal(hSession, pSignature, pulSignatureLen);
813 }
814 catch (...)
815 {
816 FatalException();
817 }
818
819 return CKR_FUNCTION_FAILED;
820 }
821
822 // Initialise a signing operation that allows recovery of the signed data
C_SignRecoverInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey)823 PKCS_API CK_RV C_SignRecoverInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey)
824 {
825 try
826 {
827 return SoftHSM::i()->C_SignRecoverInit(hSession, pMechanism, hKey);
828 }
829 catch (...)
830 {
831 FatalException();
832 }
833
834 return CKR_FUNCTION_FAILED;
835 }
836
837 // Perform a single part signing operation that allows recovery of the signed data
C_SignRecover(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pData,CK_ULONG ulDataLen,CK_BYTE_PTR pSignature,CK_ULONG_PTR pulSignatureLen)838 PKCS_API CK_RV C_SignRecover(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen)
839 {
840 try
841 {
842 return SoftHSM::i()->C_SignRecover(hSession, pData, ulDataLen, pSignature, pulSignatureLen);
843 }
844 catch (...)
845 {
846 FatalException();
847 }
848
849 return CKR_FUNCTION_FAILED;
850 }
851
852 // Initialise a verification operation using the specified key and mechanism
C_VerifyInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey)853 PKCS_API CK_RV C_VerifyInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey)
854 {
855 try
856 {
857 return SoftHSM::i()->C_VerifyInit(hSession, pMechanism, hKey);
858 }
859 catch (...)
860 {
861 FatalException();
862 }
863
864 return CKR_FUNCTION_FAILED;
865 }
866
867 // Perform a single pass verification operation
C_Verify(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pData,CK_ULONG ulDataLen,CK_BYTE_PTR pSignature,CK_ULONG ulSignatureLen)868 PKCS_API CK_RV C_Verify(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_ULONG ulSignatureLen)
869 {
870 try
871 {
872 return SoftHSM::i()->C_Verify(hSession, pData, ulDataLen, pSignature, ulSignatureLen);
873 }
874 catch (...)
875 {
876 FatalException();
877 }
878
879 return CKR_FUNCTION_FAILED;
880 }
881
882 // Update a running verification operation with additional data
C_VerifyUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pPart,CK_ULONG ulPartLen)883 PKCS_API CK_RV C_VerifyUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen)
884 {
885 try
886 {
887 return SoftHSM::i()->C_VerifyUpdate(hSession, pPart, ulPartLen);
888 }
889 catch (...)
890 {
891 FatalException();
892 }
893
894 return CKR_FUNCTION_FAILED;
895 }
896
897 // Finalise the verification operation and check the signature
C_VerifyFinal(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pSignature,CK_ULONG ulSignatureLen)898 PKCS_API CK_RV C_VerifyFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature, CK_ULONG ulSignatureLen)
899 {
900 try
901 {
902 return SoftHSM::i()->C_VerifyFinal(hSession, pSignature, ulSignatureLen);
903 }
904 catch (...)
905 {
906 FatalException();
907 }
908
909 return CKR_FUNCTION_FAILED;
910 }
911
912 // Initialise a verification operation the allows recovery of the signed data from the signature
C_VerifyRecoverInit(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey)913 PKCS_API CK_RV C_VerifyRecoverInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey)
914 {
915 try
916 {
917 return SoftHSM::i()->C_VerifyRecoverInit(hSession, pMechanism, hKey);
918 }
919 catch (...)
920 {
921 FatalException();
922 }
923
924 return CKR_FUNCTION_FAILED;
925 }
926
927 // Perform a single part verification operation and recover the signed data
C_VerifyRecover(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pSignature,CK_ULONG ulSignatureLen,CK_BYTE_PTR pData,CK_ULONG_PTR pulDataLen)928 PKCS_API CK_RV C_VerifyRecover(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature, CK_ULONG ulSignatureLen, CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen)
929 {
930 try
931 {
932 return SoftHSM::i()->C_VerifyRecover(hSession, pSignature, ulSignatureLen, pData, pulDataLen);
933 }
934 catch (...)
935 {
936 FatalException();
937 }
938
939 return CKR_FUNCTION_FAILED;
940 }
941
942 // Update a running multi-part encryption and digesting operation
C_DigestEncryptUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pPart,CK_ULONG ulPartLen,CK_BYTE_PTR pEncryptedPart,CK_ULONG_PTR pulEncryptedPartLen)943 PKCS_API CK_RV C_DigestEncryptUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart, CK_ULONG_PTR pulEncryptedPartLen)
944 {
945 try
946 {
947 return SoftHSM::i()->C_DigestEncryptUpdate(hSession, pPart, ulPartLen, pEncryptedPart, pulEncryptedPartLen);
948 }
949 catch (...)
950 {
951 FatalException();
952 }
953
954 return CKR_FUNCTION_FAILED;
955 }
956
957 // Update a running multi-part decryption and digesting operation
C_DecryptDigestUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pPart,CK_ULONG ulPartLen,CK_BYTE_PTR pDecryptedPart,CK_ULONG_PTR pulDecryptedPartLen)958 PKCS_API CK_RV C_DecryptDigestUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen, CK_BYTE_PTR pDecryptedPart, CK_ULONG_PTR pulDecryptedPartLen)
959 {
960 try
961 {
962 return SoftHSM::i()->C_DecryptDigestUpdate(hSession, pPart, ulPartLen, pDecryptedPart, pulDecryptedPartLen);
963 }
964 catch (...)
965 {
966 FatalException();
967 }
968
969 return CKR_FUNCTION_FAILED;
970 }
971
972 // Update a running multi-part signing and encryption operation
C_SignEncryptUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pPart,CK_ULONG ulPartLen,CK_BYTE_PTR pEncryptedPart,CK_ULONG_PTR pulEncryptedPartLen)973 PKCS_API CK_RV C_SignEncryptUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart, CK_ULONG_PTR pulEncryptedPartLen)
974 {
975 try
976 {
977 return SoftHSM::i()->C_SignEncryptUpdate(hSession, pPart, ulPartLen, pEncryptedPart, pulEncryptedPartLen);
978 }
979 catch (...)
980 {
981 FatalException();
982 }
983
984 return CKR_FUNCTION_FAILED;
985 }
986
987 // Update a running multi-part decryption and verification operation
C_DecryptVerifyUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pEncryptedPart,CK_ULONG ulEncryptedPartLen,CK_BYTE_PTR pPart,CK_ULONG_PTR pulPartLen)988 PKCS_API CK_RV C_DecryptVerifyUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedPart, CK_ULONG ulEncryptedPartLen, CK_BYTE_PTR pPart, CK_ULONG_PTR pulPartLen)
989 {
990 try
991 {
992 return SoftHSM::i()->C_DecryptVerifyUpdate(hSession, pEncryptedPart, ulEncryptedPartLen, pPart, pulPartLen);
993 }
994 catch (...)
995 {
996 FatalException();
997 }
998
999 return CKR_FUNCTION_FAILED;
1000 }
1001
1002 // Generate a secret key using the specified mechanism
C_GenerateKey(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulCount,CK_OBJECT_HANDLE_PTR phKey)1003 PKCS_API CK_RV C_GenerateKey(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phKey)
1004 {
1005 try
1006 {
1007 return SoftHSM::i()->C_GenerateKey(hSession, pMechanism, pTemplate, ulCount, phKey);
1008 }
1009 catch (...)
1010 {
1011 FatalException();
1012 }
1013
1014 return CKR_FUNCTION_FAILED;
1015 }
1016
1017 // Generate a key-pair using the specified mechanism
C_GenerateKeyPair(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_ATTRIBUTE_PTR pPublicKeyTemplate,CK_ULONG ulPublicKeyAttributeCount,CK_ATTRIBUTE_PTR pPrivateKeyTemplate,CK_ULONG ulPrivateKeyAttributeCount,CK_OBJECT_HANDLE_PTR phPublicKey,CK_OBJECT_HANDLE_PTR phPrivateKey)1018 PKCS_API CK_RV C_GenerateKeyPair
1019 (
1020 CK_SESSION_HANDLE hSession,
1021 CK_MECHANISM_PTR pMechanism,
1022 CK_ATTRIBUTE_PTR pPublicKeyTemplate,
1023 CK_ULONG ulPublicKeyAttributeCount,
1024 CK_ATTRIBUTE_PTR pPrivateKeyTemplate,
1025 CK_ULONG ulPrivateKeyAttributeCount,
1026 CK_OBJECT_HANDLE_PTR phPublicKey,
1027 CK_OBJECT_HANDLE_PTR phPrivateKey
1028 )
1029 {
1030 try
1031 {
1032 return SoftHSM::i()->C_GenerateKeyPair(hSession, pMechanism, pPublicKeyTemplate, ulPublicKeyAttributeCount, pPrivateKeyTemplate, ulPrivateKeyAttributeCount, phPublicKey, phPrivateKey);
1033 }
1034 catch (...)
1035 {
1036 FatalException();
1037 }
1038
1039 return CKR_FUNCTION_FAILED;
1040 }
1041
1042 // Wrap the specified key using the specified wrapping key and mechanism
C_WrapKey(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hWrappingKey,CK_OBJECT_HANDLE hKey,CK_BYTE_PTR pWrappedKey,CK_ULONG_PTR pulWrappedKeyLen)1043 PKCS_API CK_RV C_WrapKey
1044 (
1045 CK_SESSION_HANDLE hSession,
1046 CK_MECHANISM_PTR pMechanism,
1047 CK_OBJECT_HANDLE hWrappingKey,
1048 CK_OBJECT_HANDLE hKey,
1049 CK_BYTE_PTR pWrappedKey,
1050 CK_ULONG_PTR pulWrappedKeyLen
1051 )
1052 {
1053 try
1054 {
1055 return SoftHSM::i()->C_WrapKey(hSession, pMechanism, hWrappingKey, hKey, pWrappedKey, pulWrappedKeyLen);
1056 }
1057 catch (...)
1058 {
1059 FatalException();
1060 }
1061
1062 return CKR_FUNCTION_FAILED;
1063 }
1064
1065 // Unwrap the specified key using the specified unwrapping key
C_UnwrapKey(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hUnwrappingKey,CK_BYTE_PTR pWrappedKey,CK_ULONG ulWrappedKeyLen,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulCount,CK_OBJECT_HANDLE_PTR phKey)1066 PKCS_API CK_RV C_UnwrapKey
1067 (
1068 CK_SESSION_HANDLE hSession,
1069 CK_MECHANISM_PTR pMechanism,
1070 CK_OBJECT_HANDLE hUnwrappingKey,
1071 CK_BYTE_PTR pWrappedKey,
1072 CK_ULONG ulWrappedKeyLen,
1073 CK_ATTRIBUTE_PTR pTemplate,
1074 CK_ULONG ulCount,
1075 CK_OBJECT_HANDLE_PTR phKey
1076 )
1077 {
1078 try
1079 {
1080 return SoftHSM::i()->C_UnwrapKey(hSession, pMechanism, hUnwrappingKey, pWrappedKey, ulWrappedKeyLen, pTemplate, ulCount, phKey);
1081 }
1082 catch (...)
1083 {
1084 FatalException();
1085 }
1086
1087 return CKR_FUNCTION_FAILED;
1088 }
1089
1090 // Derive a key from the specified base key
C_DeriveKey(CK_SESSION_HANDLE hSession,CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hBaseKey,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulCount,CK_OBJECT_HANDLE_PTR phKey)1091 PKCS_API CK_RV C_DeriveKey
1092 (
1093 CK_SESSION_HANDLE hSession,
1094 CK_MECHANISM_PTR pMechanism,
1095 CK_OBJECT_HANDLE hBaseKey,
1096 CK_ATTRIBUTE_PTR pTemplate,
1097 CK_ULONG ulCount,
1098 CK_OBJECT_HANDLE_PTR phKey
1099 )
1100 {
1101 try
1102 {
1103 return SoftHSM::i()->C_DeriveKey(hSession, pMechanism, hBaseKey, pTemplate, ulCount, phKey);
1104 }
1105 catch (...)
1106 {
1107 FatalException();
1108 }
1109
1110 return CKR_FUNCTION_FAILED;
1111 }
1112
1113 // Seed the random number generator with new data
C_SeedRandom(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pSeed,CK_ULONG ulSeedLen)1114 PKCS_API CK_RV C_SeedRandom(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSeed, CK_ULONG ulSeedLen)
1115 {
1116 try
1117 {
1118 return SoftHSM::i()->C_SeedRandom(hSession, pSeed, ulSeedLen);
1119 }
1120 catch (...)
1121 {
1122 FatalException();
1123 }
1124
1125 return CKR_FUNCTION_FAILED;
1126 }
1127
1128 // Generate the specified amount of random data
C_GenerateRandom(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pRandomData,CK_ULONG ulRandomLen)1129 PKCS_API CK_RV C_GenerateRandom(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pRandomData, CK_ULONG ulRandomLen)
1130 {
1131 try
1132 {
1133 return SoftHSM::i()->C_GenerateRandom(hSession, pRandomData, ulRandomLen);
1134 }
1135 catch (...)
1136 {
1137 FatalException();
1138 }
1139
1140 return CKR_FUNCTION_FAILED;
1141 }
1142
1143 // Legacy function
C_GetFunctionStatus(CK_SESSION_HANDLE hSession)1144 PKCS_API CK_RV C_GetFunctionStatus(CK_SESSION_HANDLE hSession)
1145 {
1146 try
1147 {
1148 return SoftHSM::i()->C_GetFunctionStatus(hSession);
1149 }
1150 catch (...)
1151 {
1152 FatalException();
1153 }
1154
1155 return CKR_FUNCTION_FAILED;
1156 }
1157
1158 // Legacy function
C_CancelFunction(CK_SESSION_HANDLE hSession)1159 PKCS_API CK_RV C_CancelFunction(CK_SESSION_HANDLE hSession)
1160 {
1161 try
1162 {
1163 return SoftHSM::i()->C_CancelFunction(hSession);
1164 }
1165 catch (...)
1166 {
1167 FatalException();
1168 }
1169
1170 return CKR_FUNCTION_FAILED;
1171 }
1172
1173 // Wait or poll for a slot even on the specified slot
C_WaitForSlotEvent(CK_FLAGS flags,CK_SLOT_ID_PTR pSlot,CK_VOID_PTR pReserved)1174 PKCS_API CK_RV C_WaitForSlotEvent(CK_FLAGS flags, CK_SLOT_ID_PTR pSlot, CK_VOID_PTR pReserved)
1175 {
1176 try
1177 {
1178 return SoftHSM::i()->C_WaitForSlotEvent(flags, pSlot, pReserved);
1179 }
1180 catch (...)
1181 {
1182 FatalException();
1183 }
1184
1185 return CKR_FUNCTION_FAILED;
1186 }
1187
1188