1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
14 * The Original Code is the Netscape security libraries.
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1994-2000
19 * the Initial Developer. All Rights Reserved.
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
35 * ***** END LICENSE BLOCK ***** */
38 static const char CVS_ID
[] = "@(#) $RCSfile: wrap.c,v $ $Revision: 1.16 $ $Date: 2008/02/25 20:35:23 $";
44 * This file contains the routines that actually implement the cryptoki
45 * API, using the internal APIs of the NSS Cryptoki Framework. There is
46 * one routine here for every cryptoki routine. For linking reasons
47 * the actual entry points passed back with C_GetFunctionList have to
48 * exist in one of the Module's source files; however, those are merely
49 * simple wrappers that call these routines. The intelligence of the
50 * implementations is here.
61 * -- NSSCKFWC_GetFunctionList -- see the API insert file
62 * NSSCKFWC_GetSlotList
63 * NSSCKFWC_GetSlotInfo
64 * NSSCKFWC_GetTokenInfo
65 * NSSCKFWC_WaitForSlotEvent
66 * NSSCKFWC_GetMechanismList
67 * NSSCKFWC_GetMechanismInfo
71 * NSSCKFWC_OpenSession
72 * NSSCKFWC_CloseSession
73 * NSSCKFWC_CloseAllSessions
74 * NSSCKFWC_GetSessionInfo
75 * NSSCKFWC_GetOperationState
76 * NSSCKFWC_SetOperationState
79 * NSSCKFWC_CreateObject
81 * NSSCKFWC_DestroyObject
82 * NSSCKFWC_GetObjectSize
83 * NSSCKFWC_GetAttributeValue
84 * NSSCKFWC_SetAttributeValue
85 * NSSCKFWC_FindObjectsInit
86 * NSSCKFWC_FindObjects
87 * NSSCKFWC_FindObjectsFinal
88 * NSSCKFWC_EncryptInit
90 * NSSCKFWC_EncryptUpdate
91 * NSSCKFWC_EncryptFinal
92 * NSSCKFWC_DecryptInit
94 * NSSCKFWC_DecryptUpdate
95 * NSSCKFWC_DecryptFinal
98 * NSSCKFWC_DigestUpdate
100 * NSSCKFWC_DigestFinal
103 * NSSCKFWC_SignUpdate
105 * NSSCKFWC_SignRecoverInit
106 * NSSCKFWC_SignRecover
107 * NSSCKFWC_VerifyInit
109 * NSSCKFWC_VerifyUpdate
110 * NSSCKFWC_VerifyFinal
111 * NSSCKFWC_VerifyRecoverInit
112 * NSSCKFWC_VerifyRecover
113 * NSSCKFWC_DigestEncryptUpdate
114 * NSSCKFWC_DecryptDigestUpdate
115 * NSSCKFWC_SignEncryptUpdate
116 * NSSCKFWC_DecryptVerifyUpdate
117 * NSSCKFWC_GenerateKey
118 * NSSCKFWC_GenerateKeyPair
122 * NSSCKFWC_SeedRandom
123 * NSSCKFWC_GenerateRandom
124 * NSSCKFWC_GetFunctionStatus
125 * NSSCKFWC_CancelFunction
128 /* figure out out locking semantics */
130 nssCKFW_GetThreadSafeState(CK_C_INITIALIZE_ARGS_PTR pInitArgs
,
131 CryptokiLockingState
*pLocking_state
) {
132 int functionCount
= 0;
134 /* parsed according to (PKCS #11 Section 11.4) */
135 /* no args, the degenerate version of case 1 */
137 *pLocking_state
= SingleThreaded
;
141 /* CKF_OS_LOCKING_OK set, Cases 2 and 4 */
142 if (pInitArgs
->flags
& CKF_OS_LOCKING_OK
) {
143 *pLocking_state
= MultiThreaded
;
146 if ((CK_CREATEMUTEX
) NULL
!= pInitArgs
->CreateMutex
) functionCount
++;
147 if ((CK_DESTROYMUTEX
) NULL
!= pInitArgs
->DestroyMutex
) functionCount
++;
148 if ((CK_LOCKMUTEX
) NULL
!= pInitArgs
->LockMutex
) functionCount
++;
149 if ((CK_UNLOCKMUTEX
) NULL
!= pInitArgs
->UnlockMutex
) functionCount
++;
151 /* CKF_OS_LOCKING_OK is not set, and not functions supplied,
153 if (0 == functionCount
) {
154 *pLocking_state
= SingleThreaded
;
158 /* OS_LOCKING_OK is not set and functions have been supplied. Since
159 * ckfw uses nssbase library which explicitly calls NSPR, and since
160 * there is no way to reliably override these explicit calls to NSPR,
161 * therefore we can't support applications which have their own threading
162 * module. Return CKR_CANT_LOCK if they supplied the correct number of
163 * arguments, or CKR_ARGUMENTS_BAD if they did not in either case we will
164 * fail the initialize */
165 return (4 == functionCount
) ? CKR_CANT_LOCK
: CKR_ARGUMENTS_BAD
;
168 static PRInt32 liveInstances
;
171 * NSSCKFWC_Initialize
177 NSSCKFWInstance
**pFwInstance
,
178 NSSCKMDInstance
*mdInstance
,
179 CK_VOID_PTR pInitArgs
182 CK_RV error
= CKR_OK
;
183 CryptokiLockingState locking_state
;
185 if( (NSSCKFWInstance
**)NULL
== pFwInstance
) {
186 error
= CKR_GENERAL_ERROR
;
190 if( (NSSCKFWInstance
*)NULL
!= *pFwInstance
) {
191 error
= CKR_CRYPTOKI_ALREADY_INITIALIZED
;
195 if( (NSSCKMDInstance
*)NULL
== mdInstance
) {
196 error
= CKR_GENERAL_ERROR
;
200 error
= nssCKFW_GetThreadSafeState(pInitArgs
,&locking_state
);
201 if( CKR_OK
!= error
) {
205 *pFwInstance
= nssCKFWInstance_Create(pInitArgs
, locking_state
, mdInstance
, &error
);
206 if( (NSSCKFWInstance
*)NULL
== *pFwInstance
) {
209 PR_AtomicIncrement(&liveInstances
);
214 case CKR_ARGUMENTS_BAD
:
216 case CKR_CRYPTOKI_ALREADY_INITIALIZED
:
217 case CKR_FUNCTION_FAILED
:
218 case CKR_GENERAL_ERROR
:
219 case CKR_HOST_MEMORY
:
220 case CKR_NEED_TO_CREATE_THREADS
:
224 error
= CKR_GENERAL_ERROR
;
238 NSSCKFWInstance
**pFwInstance
241 CK_RV error
= CKR_OK
;
243 if( (NSSCKFWInstance
**)NULL
== pFwInstance
) {
244 error
= CKR_GENERAL_ERROR
;
248 if( (NSSCKFWInstance
*)NULL
== *pFwInstance
) {
249 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
253 error
= nssCKFWInstance_Destroy(*pFwInstance
);
256 *pFwInstance
= (NSSCKFWInstance
*)NULL
;
260 PRInt32 remainingInstances
;
262 remainingInstances
= PR_AtomicDecrement(&liveInstances
);
263 if (!remainingInstances
) {
267 case CKR_CRYPTOKI_NOT_INITIALIZED
:
268 case CKR_FUNCTION_FAILED
:
269 case CKR_GENERAL_ERROR
:
270 case CKR_HOST_MEMORY
:
273 error
= CKR_GENERAL_ERROR
;
287 NSSCKFWInstance
*fwInstance
,
291 CK_RV error
= CKR_OK
;
293 if( (CK_INFO_PTR
)CK_NULL_PTR
== pInfo
) {
294 error
= CKR_ARGUMENTS_BAD
;
299 * A purify error here means a caller error
301 (void)nsslibc_memset(pInfo
, 0, sizeof(CK_INFO
));
303 pInfo
->cryptokiVersion
= nssCKFWInstance_GetCryptokiVersion(fwInstance
);
305 error
= nssCKFWInstance_GetManufacturerID(fwInstance
, pInfo
->manufacturerID
);
306 if( CKR_OK
!= error
) {
310 pInfo
->flags
= nssCKFWInstance_GetFlags(fwInstance
);
312 error
= nssCKFWInstance_GetLibraryDescription(fwInstance
, pInfo
->libraryDescription
);
313 if( CKR_OK
!= error
) {
317 pInfo
->libraryVersion
= nssCKFWInstance_GetLibraryVersion(fwInstance
);
323 case CKR_CRYPTOKI_NOT_INITIALIZED
:
324 case CKR_FUNCTION_FAILED
:
325 case CKR_GENERAL_ERROR
:
326 case CKR_HOST_MEMORY
:
329 error
= CKR_GENERAL_ERROR
;
337 * C_GetFunctionList is implemented entirely in the Module's file which
338 * includes the Framework API insert file. It requires no "actual"
343 * NSSCKFWC_GetSlotList
349 NSSCKFWInstance
*fwInstance
,
350 CK_BBOOL tokenPresent
,
351 CK_SLOT_ID_PTR pSlotList
,
352 CK_ULONG_PTR pulCount
355 CK_RV error
= CKR_OK
;
358 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
359 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
363 switch( tokenPresent
) {
368 error
= CKR_ARGUMENTS_BAD
;
372 if( (CK_ULONG_PTR
)CK_NULL_PTR
== pulCount
) {
373 error
= CKR_ARGUMENTS_BAD
;
377 nSlots
= nssCKFWInstance_GetNSlots(fwInstance
, &error
);
378 if( (CK_ULONG
)0 == nSlots
) {
382 if( (CK_SLOT_ID_PTR
)CK_NULL_PTR
== pSlotList
) {
388 * A purify error here indicates caller error.
390 (void)nsslibc_memset(pSlotList
, 0, *pulCount
* sizeof(CK_SLOT_ID
));
392 if( *pulCount
< nSlots
) {
394 error
= CKR_BUFFER_TOO_SMALL
;
401 * Our secret "mapping": CK_SLOT_IDs are integers [1,N], and we
402 * just index one when we need it.
405 for( i
= 0; i
< nSlots
; i
++ ) {
414 case CKR_BUFFER_TOO_SMALL
:
415 case CKR_CRYPTOKI_NOT_INITIALIZED
:
416 case CKR_FUNCTION_FAILED
:
417 case CKR_GENERAL_ERROR
:
418 case CKR_HOST_MEMORY
:
422 error
= CKR_GENERAL_ERROR
;
430 * NSSCKFWC_GetSlotInfo
436 NSSCKFWInstance
*fwInstance
,
438 CK_SLOT_INFO_PTR pInfo
441 CK_RV error
= CKR_OK
;
446 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
447 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
451 nSlots
= nssCKFWInstance_GetNSlots(fwInstance
, &error
);
452 if( (CK_ULONG
)0 == nSlots
) {
456 if( (slotID
< 1) || (slotID
> nSlots
) ) {
457 error
= CKR_SLOT_ID_INVALID
;
461 if( (CK_SLOT_INFO_PTR
)CK_NULL_PTR
== pInfo
) {
462 error
= CKR_ARGUMENTS_BAD
;
467 * A purify error here indicates caller error.
469 (void)nsslibc_memset(pInfo
, 0, sizeof(CK_SLOT_INFO
));
471 slots
= nssCKFWInstance_GetSlots(fwInstance
, &error
);
472 if( (NSSCKFWSlot
**)NULL
== slots
) {
476 fwSlot
= slots
[ slotID
-1 ];
478 error
= nssCKFWSlot_GetSlotDescription(fwSlot
, pInfo
->slotDescription
);
479 if( CKR_OK
!= error
) {
483 error
= nssCKFWSlot_GetManufacturerID(fwSlot
, pInfo
->manufacturerID
);
484 if( CKR_OK
!= error
) {
488 if( nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
489 pInfo
->flags
|= CKF_TOKEN_PRESENT
;
492 if( nssCKFWSlot_GetRemovableDevice(fwSlot
) ) {
493 pInfo
->flags
|= CKF_REMOVABLE_DEVICE
;
496 if( nssCKFWSlot_GetHardwareSlot(fwSlot
) ) {
497 pInfo
->flags
|= CKF_HW_SLOT
;
500 pInfo
->hardwareVersion
= nssCKFWSlot_GetHardwareVersion(fwSlot
);
501 pInfo
->firmwareVersion
= nssCKFWSlot_GetFirmwareVersion(fwSlot
);
507 case CKR_CRYPTOKI_NOT_INITIALIZED
:
508 case CKR_DEVICE_ERROR
:
509 case CKR_FUNCTION_FAILED
:
510 case CKR_GENERAL_ERROR
:
511 case CKR_HOST_MEMORY
:
512 case CKR_SLOT_ID_INVALID
:
516 error
= CKR_GENERAL_ERROR
;
523 * NSSCKFWC_GetTokenInfo
527 NSSCKFWC_GetTokenInfo
529 NSSCKFWInstance
*fwInstance
,
531 CK_TOKEN_INFO_PTR pInfo
534 CK_RV error
= CKR_OK
;
538 NSSCKFWToken
*fwToken
= (NSSCKFWToken
*)NULL
;
540 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
541 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
545 nSlots
= nssCKFWInstance_GetNSlots(fwInstance
, &error
);
546 if( (CK_ULONG
)0 == nSlots
) {
550 if( (slotID
< 1) || (slotID
> nSlots
) ) {
551 error
= CKR_SLOT_ID_INVALID
;
555 if( (CK_TOKEN_INFO_PTR
)CK_NULL_PTR
== pInfo
) {
556 error
= CKR_ARGUMENTS_BAD
;
561 * A purify error here indicates caller error.
563 (void)nsslibc_memset(pInfo
, 0, sizeof(CK_TOKEN_INFO
));
565 slots
= nssCKFWInstance_GetSlots(fwInstance
, &error
);
566 if( (NSSCKFWSlot
**)NULL
== slots
) {
570 fwSlot
= slots
[ slotID
-1 ];
572 if( CK_TRUE
!= nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
573 error
= CKR_TOKEN_NOT_PRESENT
;
577 fwToken
= nssCKFWSlot_GetToken(fwSlot
, &error
);
578 if( (NSSCKFWToken
*)NULL
== fwToken
) {
582 error
= nssCKFWToken_GetLabel(fwToken
, pInfo
->label
);
583 if( CKR_OK
!= error
) {
587 error
= nssCKFWToken_GetManufacturerID(fwToken
, pInfo
->manufacturerID
);
588 if( CKR_OK
!= error
) {
592 error
= nssCKFWToken_GetModel(fwToken
, pInfo
->model
);
593 if( CKR_OK
!= error
) {
597 error
= nssCKFWToken_GetSerialNumber(fwToken
, pInfo
->serialNumber
);
598 if( CKR_OK
!= error
) {
602 if( nssCKFWToken_GetHasRNG(fwToken
) ) {
603 pInfo
->flags
|= CKF_RNG
;
606 if( nssCKFWToken_GetIsWriteProtected(fwToken
) ) {
607 pInfo
->flags
|= CKF_WRITE_PROTECTED
;
610 if( nssCKFWToken_GetLoginRequired(fwToken
) ) {
611 pInfo
->flags
|= CKF_LOGIN_REQUIRED
;
614 if( nssCKFWToken_GetUserPinInitialized(fwToken
) ) {
615 pInfo
->flags
|= CKF_USER_PIN_INITIALIZED
;
618 if( nssCKFWToken_GetRestoreKeyNotNeeded(fwToken
) ) {
619 pInfo
->flags
|= CKF_RESTORE_KEY_NOT_NEEDED
;
622 if( nssCKFWToken_GetHasClockOnToken(fwToken
) ) {
623 pInfo
->flags
|= CKF_CLOCK_ON_TOKEN
;
626 if( nssCKFWToken_GetHasProtectedAuthenticationPath(fwToken
) ) {
627 pInfo
->flags
|= CKF_PROTECTED_AUTHENTICATION_PATH
;
630 if( nssCKFWToken_GetSupportsDualCryptoOperations(fwToken
) ) {
631 pInfo
->flags
|= CKF_DUAL_CRYPTO_OPERATIONS
;
634 pInfo
->ulMaxSessionCount
= nssCKFWToken_GetMaxSessionCount(fwToken
);
635 pInfo
->ulSessionCount
= nssCKFWToken_GetSessionCount(fwToken
);
636 pInfo
->ulMaxRwSessionCount
= nssCKFWToken_GetMaxRwSessionCount(fwToken
);
637 pInfo
->ulRwSessionCount
= nssCKFWToken_GetRwSessionCount(fwToken
);
638 pInfo
->ulMaxPinLen
= nssCKFWToken_GetMaxPinLen(fwToken
);
639 pInfo
->ulMinPinLen
= nssCKFWToken_GetMinPinLen(fwToken
);
640 pInfo
->ulTotalPublicMemory
= nssCKFWToken_GetTotalPublicMemory(fwToken
);
641 pInfo
->ulFreePublicMemory
= nssCKFWToken_GetFreePublicMemory(fwToken
);
642 pInfo
->ulTotalPrivateMemory
= nssCKFWToken_GetTotalPrivateMemory(fwToken
);
643 pInfo
->ulFreePrivateMemory
= nssCKFWToken_GetFreePrivateMemory(fwToken
);
644 pInfo
->hardwareVersion
= nssCKFWToken_GetHardwareVersion(fwToken
);
645 pInfo
->firmwareVersion
= nssCKFWToken_GetFirmwareVersion(fwToken
);
647 error
= nssCKFWToken_GetUTCTime(fwToken
, pInfo
->utcTime
);
648 if( CKR_OK
!= error
) {
656 case CKR_DEVICE_REMOVED
:
657 case CKR_TOKEN_NOT_PRESENT
:
659 nssCKFWToken_Destroy(fwToken
);
661 case CKR_CRYPTOKI_NOT_INITIALIZED
:
662 case CKR_DEVICE_ERROR
:
663 case CKR_DEVICE_MEMORY
:
664 case CKR_FUNCTION_FAILED
:
665 case CKR_GENERAL_ERROR
:
666 case CKR_HOST_MEMORY
:
667 case CKR_SLOT_ID_INVALID
:
668 case CKR_TOKEN_NOT_RECOGNIZED
:
672 error
= CKR_GENERAL_ERROR
;
680 * NSSCKFWC_WaitForSlotEvent
684 NSSCKFWC_WaitForSlotEvent
686 NSSCKFWInstance
*fwInstance
,
688 CK_SLOT_ID_PTR pSlot
,
689 CK_VOID_PTR pReserved
692 CK_RV error
= CKR_OK
;
699 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
700 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
704 if( flags
& ~CKF_DONT_BLOCK
) {
705 error
= CKR_ARGUMENTS_BAD
;
709 block
= (flags
& CKF_DONT_BLOCK
) ? CK_TRUE
: CK_FALSE
;
711 nSlots
= nssCKFWInstance_GetNSlots(fwInstance
, &error
);
712 if( (CK_ULONG
)0 == nSlots
) {
716 if( (CK_SLOT_ID_PTR
)CK_NULL_PTR
== pSlot
) {
717 error
= CKR_ARGUMENTS_BAD
;
721 if( (CK_VOID_PTR
)CK_NULL_PTR
!= pReserved
) {
722 error
= CKR_ARGUMENTS_BAD
;
726 slots
= nssCKFWInstance_GetSlots(fwInstance
, &error
);
727 if( (NSSCKFWSlot
**)NULL
== slots
) {
731 fwSlot
= nssCKFWInstance_WaitForSlotEvent(fwInstance
, block
, &error
);
732 if( (NSSCKFWSlot
*)NULL
== fwSlot
) {
736 for( i
= 0; i
< nSlots
; i
++ ) {
737 if( fwSlot
== slots
[i
] ) {
738 *pSlot
= (CK_SLOT_ID
)(CK_ULONG
)(i
+1);
743 error
= CKR_GENERAL_ERROR
; /* returned something not in the slot list */
747 case CKR_CRYPTOKI_NOT_INITIALIZED
:
748 case CKR_FUNCTION_FAILED
:
749 case CKR_GENERAL_ERROR
:
750 case CKR_HOST_MEMORY
:
755 error
= CKR_GENERAL_ERROR
;
763 * NSSCKFWC_GetMechanismList
767 NSSCKFWC_GetMechanismList
769 NSSCKFWInstance
*fwInstance
,
771 CK_MECHANISM_TYPE_PTR pMechanismList
,
772 CK_ULONG_PTR pulCount
775 CK_RV error
= CKR_OK
;
779 NSSCKFWToken
*fwToken
= (NSSCKFWToken
*)NULL
;
782 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
783 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
787 nSlots
= nssCKFWInstance_GetNSlots(fwInstance
, &error
);
788 if( (CK_ULONG
)0 == nSlots
) {
792 if( (slotID
< 1) || (slotID
> nSlots
) ) {
793 error
= CKR_SLOT_ID_INVALID
;
797 if( (CK_ULONG_PTR
)CK_NULL_PTR
== pulCount
) {
798 error
= CKR_ARGUMENTS_BAD
;
802 slots
= nssCKFWInstance_GetSlots(fwInstance
, &error
);
803 if( (NSSCKFWSlot
**)NULL
== slots
) {
807 fwSlot
= slots
[ slotID
-1 ];
809 if( CK_TRUE
!= nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
810 error
= CKR_TOKEN_NOT_PRESENT
;
814 fwToken
= nssCKFWSlot_GetToken(fwSlot
, &error
);
815 if( (NSSCKFWToken
*)NULL
== fwToken
) {
819 count
= nssCKFWToken_GetMechanismCount(fwToken
);
821 if( (CK_MECHANISM_TYPE_PTR
)CK_NULL_PTR
== pMechanismList
) {
826 if( *pulCount
< count
) {
828 error
= CKR_BUFFER_TOO_SMALL
;
833 * A purify error here indicates caller error.
835 (void)nsslibc_memset(pMechanismList
, 0, *pulCount
* sizeof(CK_MECHANISM_TYPE
));
840 error
= nssCKFWToken_GetMechanismTypes(fwToken
, pMechanismList
);
845 if( CKR_OK
== error
) {
851 case CKR_DEVICE_REMOVED
:
852 case CKR_TOKEN_NOT_PRESENT
:
854 nssCKFWToken_Destroy(fwToken
);
856 case CKR_ARGUMENTS_BAD
:
857 case CKR_BUFFER_TOO_SMALL
:
858 case CKR_CRYPTOKI_NOT_INITIALIZED
:
859 case CKR_DEVICE_ERROR
:
860 case CKR_DEVICE_MEMORY
:
861 case CKR_FUNCTION_FAILED
:
862 case CKR_GENERAL_ERROR
:
863 case CKR_HOST_MEMORY
:
864 case CKR_SLOT_ID_INVALID
:
865 case CKR_TOKEN_NOT_RECOGNIZED
:
869 error
= CKR_GENERAL_ERROR
;
877 * NSSCKFWC_GetMechanismInfo
881 NSSCKFWC_GetMechanismInfo
883 NSSCKFWInstance
*fwInstance
,
885 CK_MECHANISM_TYPE type
,
886 CK_MECHANISM_INFO_PTR pInfo
889 CK_RV error
= CKR_OK
;
893 NSSCKFWToken
*fwToken
= (NSSCKFWToken
*)NULL
;
894 NSSCKFWMechanism
*fwMechanism
;
896 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
897 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
901 nSlots
= nssCKFWInstance_GetNSlots(fwInstance
, &error
);
902 if( (CK_ULONG
)0 == nSlots
) {
906 if( (slotID
< 1) || (slotID
> nSlots
) ) {
907 error
= CKR_SLOT_ID_INVALID
;
911 slots
= nssCKFWInstance_GetSlots(fwInstance
, &error
);
912 if( (NSSCKFWSlot
**)NULL
== slots
) {
916 fwSlot
= slots
[ slotID
-1 ];
918 if( CK_TRUE
!= nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
919 error
= CKR_TOKEN_NOT_PRESENT
;
923 if( (CK_MECHANISM_INFO_PTR
)CK_NULL_PTR
== pInfo
) {
924 error
= CKR_ARGUMENTS_BAD
;
929 * A purify error here indicates caller error.
931 (void)nsslibc_memset(pInfo
, 0, sizeof(CK_MECHANISM_INFO
));
933 fwToken
= nssCKFWSlot_GetToken(fwSlot
, &error
);
934 if( (NSSCKFWToken
*)NULL
== fwToken
) {
938 fwMechanism
= nssCKFWToken_GetMechanism(fwToken
, type
, &error
);
939 if( (NSSCKFWMechanism
*)NULL
== fwMechanism
) {
943 pInfo
->ulMinKeySize
= nssCKFWMechanism_GetMinKeySize(fwMechanism
, &error
);
944 pInfo
->ulMaxKeySize
= nssCKFWMechanism_GetMaxKeySize(fwMechanism
, &error
);
946 if( nssCKFWMechanism_GetInHardware(fwMechanism
, &error
) ) {
947 pInfo
->flags
|= CKF_HW
;
949 if( nssCKFWMechanism_GetCanEncrypt(fwMechanism
, &error
) ) {
950 pInfo
->flags
|= CKF_ENCRYPT
;
952 if( nssCKFWMechanism_GetCanDecrypt(fwMechanism
, &error
) ) {
953 pInfo
->flags
|= CKF_DECRYPT
;
955 if( nssCKFWMechanism_GetCanDigest(fwMechanism
, &error
) ) {
956 pInfo
->flags
|= CKF_DIGEST
;
958 if( nssCKFWMechanism_GetCanSign(fwMechanism
, &error
) ) {
959 pInfo
->flags
|= CKF_SIGN
;
961 if( nssCKFWMechanism_GetCanSignRecover(fwMechanism
, &error
) ) {
962 pInfo
->flags
|= CKF_SIGN_RECOVER
;
964 if( nssCKFWMechanism_GetCanVerify(fwMechanism
, &error
) ) {
965 pInfo
->flags
|= CKF_VERIFY
;
967 if( nssCKFWMechanism_GetCanVerifyRecover(fwMechanism
, &error
) ) {
968 pInfo
->flags
|= CKF_VERIFY_RECOVER
;
970 if( nssCKFWMechanism_GetCanGenerate(fwMechanism
, &error
) ) {
971 pInfo
->flags
|= CKF_GENERATE
;
973 if( nssCKFWMechanism_GetCanGenerateKeyPair(fwMechanism
, &error
) ) {
974 pInfo
->flags
|= CKF_GENERATE_KEY_PAIR
;
976 if( nssCKFWMechanism_GetCanWrap(fwMechanism
, &error
) ) {
977 pInfo
->flags
|= CKF_WRAP
;
979 if( nssCKFWMechanism_GetCanUnwrap(fwMechanism
, &error
) ) {
980 pInfo
->flags
|= CKF_UNWRAP
;
982 if( nssCKFWMechanism_GetCanDerive(fwMechanism
, &error
) ) {
983 pInfo
->flags
|= CKF_DERIVE
;
985 nssCKFWMechanism_Destroy(fwMechanism
);
991 case CKR_DEVICE_REMOVED
:
992 case CKR_TOKEN_NOT_PRESENT
:
994 nssCKFWToken_Destroy(fwToken
);
996 case CKR_ARGUMENTS_BAD
:
997 case CKR_CRYPTOKI_NOT_INITIALIZED
:
998 case CKR_DEVICE_ERROR
:
999 case CKR_DEVICE_MEMORY
:
1000 case CKR_FUNCTION_FAILED
:
1001 case CKR_GENERAL_ERROR
:
1002 case CKR_HOST_MEMORY
:
1003 case CKR_MECHANISM_INVALID
:
1004 case CKR_SLOT_ID_INVALID
:
1005 case CKR_TOKEN_NOT_RECOGNIZED
:
1009 error
= CKR_GENERAL_ERROR
;
1017 * NSSCKFWC_InitToken
1023 NSSCKFWInstance
*fwInstance
,
1030 CK_RV error
= CKR_OK
;
1032 NSSCKFWSlot
**slots
;
1033 NSSCKFWSlot
*fwSlot
;
1034 NSSCKFWToken
*fwToken
= (NSSCKFWToken
*)NULL
;
1038 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
1039 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
1043 nSlots
= nssCKFWInstance_GetNSlots(fwInstance
, &error
);
1044 if( (CK_ULONG
)0 == nSlots
) {
1048 if( (slotID
< 1) || (slotID
> nSlots
) ) {
1049 error
= CKR_SLOT_ID_INVALID
;
1053 slots
= nssCKFWInstance_GetSlots(fwInstance
, &error
);
1054 if( (NSSCKFWSlot
**)NULL
== slots
) {
1058 fwSlot
= slots
[ slotID
-1 ];
1060 if( CK_TRUE
!= nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
1061 error
= CKR_TOKEN_NOT_PRESENT
;
1065 fwToken
= nssCKFWSlot_GetToken(fwSlot
, &error
);
1066 if( (NSSCKFWToken
*)NULL
== fwToken
) {
1070 pin
.size
= (PRUint32
)ulPinLen
;
1071 pin
.data
= (void *)pPin
;
1072 label
= (NSSUTF8
*)pLabel
; /* identity conversion */
1074 error
= nssCKFWToken_InitToken(fwToken
, &pin
, label
);
1075 if( CKR_OK
!= error
) {
1083 case CKR_DEVICE_REMOVED
:
1084 case CKR_TOKEN_NOT_PRESENT
:
1086 nssCKFWToken_Destroy(fwToken
);
1088 case CKR_ARGUMENTS_BAD
:
1089 case CKR_CRYPTOKI_NOT_INITIALIZED
:
1090 case CKR_DEVICE_ERROR
:
1091 case CKR_DEVICE_MEMORY
:
1092 case CKR_FUNCTION_FAILED
:
1093 case CKR_GENERAL_ERROR
:
1094 case CKR_HOST_MEMORY
:
1095 case CKR_PIN_INCORRECT
:
1096 case CKR_PIN_LOCKED
:
1097 case CKR_SESSION_EXISTS
:
1098 case CKR_SLOT_ID_INVALID
:
1099 case CKR_TOKEN_NOT_RECOGNIZED
:
1100 case CKR_TOKEN_WRITE_PROTECTED
:
1104 error
= CKR_GENERAL_ERROR
;
1118 NSSCKFWInstance
*fwInstance
,
1119 CK_SESSION_HANDLE hSession
,
1124 CK_RV error
= CKR_OK
;
1125 NSSCKFWSession
*fwSession
;
1128 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
1129 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
1133 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
1134 if( (NSSCKFWSession
*)NULL
== fwSession
) {
1135 error
= CKR_SESSION_HANDLE_INVALID
;
1139 if( (CK_CHAR_PTR
)CK_NULL_PTR
== pPin
) {
1140 arg
= (NSSItem
*)NULL
;
1143 pin
.size
= (PRUint32
)ulPinLen
;
1144 pin
.data
= (void *)pPin
;
1147 error
= nssCKFWSession_InitPIN(fwSession
, arg
);
1148 if( CKR_OK
!= error
) {
1156 case CKR_SESSION_CLOSED
:
1157 /* destroy session? */
1159 case CKR_DEVICE_REMOVED
:
1160 /* (void)nssCKFWToken_Destroy(fwToken); */
1162 case CKR_ARGUMENTS_BAD
:
1163 case CKR_CRYPTOKI_NOT_INITIALIZED
:
1164 case CKR_DEVICE_ERROR
:
1165 case CKR_DEVICE_MEMORY
:
1166 case CKR_FUNCTION_FAILED
:
1167 case CKR_GENERAL_ERROR
:
1168 case CKR_HOST_MEMORY
:
1169 case CKR_PIN_INVALID
:
1170 case CKR_PIN_LEN_RANGE
:
1171 case CKR_SESSION_READ_ONLY
:
1172 case CKR_SESSION_HANDLE_INVALID
:
1173 case CKR_TOKEN_WRITE_PROTECTED
:
1174 case CKR_USER_NOT_LOGGED_IN
:
1178 error
= CKR_GENERAL_ERROR
;
1192 NSSCKFWInstance
*fwInstance
,
1193 CK_SESSION_HANDLE hSession
,
1194 CK_CHAR_PTR pOldPin
,
1196 CK_CHAR_PTR pNewPin
,
1200 CK_RV error
= CKR_OK
;
1201 NSSCKFWSession
*fwSession
;
1202 NSSItem oldPin
, newPin
, *oldArg
, *newArg
;
1204 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
1205 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
1209 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
1210 if( (NSSCKFWSession
*)NULL
== fwSession
) {
1211 error
= CKR_SESSION_HANDLE_INVALID
;
1215 if( (CK_CHAR_PTR
)CK_NULL_PTR
== pOldPin
) {
1216 oldArg
= (NSSItem
*)NULL
;
1219 oldPin
.size
= (PRUint32
)ulOldLen
;
1220 oldPin
.data
= (void *)pOldPin
;
1223 if( (CK_CHAR_PTR
)CK_NULL_PTR
== pNewPin
) {
1224 newArg
= (NSSItem
*)NULL
;
1227 newPin
.size
= (PRUint32
)ulNewLen
;
1228 newPin
.data
= (void *)pNewPin
;
1231 error
= nssCKFWSession_SetPIN(fwSession
, oldArg
, newArg
);
1232 if( CKR_OK
!= error
) {
1240 case CKR_SESSION_CLOSED
:
1241 /* destroy session? */
1243 case CKR_DEVICE_REMOVED
:
1244 /* (void)nssCKFWToken_Destroy(fwToken); */
1246 case CKR_ARGUMENTS_BAD
:
1247 case CKR_CRYPTOKI_NOT_INITIALIZED
:
1248 case CKR_DEVICE_ERROR
:
1249 case CKR_DEVICE_MEMORY
:
1250 case CKR_FUNCTION_FAILED
:
1251 case CKR_GENERAL_ERROR
:
1252 case CKR_HOST_MEMORY
:
1253 case CKR_PIN_INCORRECT
:
1254 case CKR_PIN_INVALID
:
1255 case CKR_PIN_LEN_RANGE
:
1256 case CKR_PIN_LOCKED
:
1257 case CKR_SESSION_HANDLE_INVALID
:
1258 case CKR_SESSION_READ_ONLY
:
1259 case CKR_TOKEN_WRITE_PROTECTED
:
1263 error
= CKR_GENERAL_ERROR
;
1271 * NSSCKFWC_OpenSession
1275 NSSCKFWC_OpenSession
1277 NSSCKFWInstance
*fwInstance
,
1280 CK_VOID_PTR pApplication
,
1282 CK_SESSION_HANDLE_PTR phSession
1285 CK_RV error
= CKR_OK
;
1287 NSSCKFWSlot
**slots
;
1288 NSSCKFWSlot
*fwSlot
;
1289 NSSCKFWToken
*fwToken
= (NSSCKFWToken
*)NULL
;
1290 NSSCKFWSession
*fwSession
;
1293 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
1294 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
1298 nSlots
= nssCKFWInstance_GetNSlots(fwInstance
, &error
);
1299 if( (CK_ULONG
)0 == nSlots
) {
1303 if( (slotID
< 1) || (slotID
> nSlots
) ) {
1304 error
= CKR_SLOT_ID_INVALID
;
1308 if( flags
& CKF_RW_SESSION
) {
1314 if( flags
& CKF_SERIAL_SESSION
) {
1317 error
= CKR_SESSION_PARALLEL_NOT_SUPPORTED
;
1321 if( flags
& ~(CKF_RW_SESSION
|CKF_SERIAL_SESSION
) ) {
1322 error
= CKR_ARGUMENTS_BAD
;
1326 if( (CK_SESSION_HANDLE_PTR
)CK_NULL_PTR
== phSession
) {
1327 error
= CKR_ARGUMENTS_BAD
;
1332 * A purify error here indicates caller error.
1334 *phSession
= (CK_SESSION_HANDLE
)0;
1336 slots
= nssCKFWInstance_GetSlots(fwInstance
, &error
);
1337 if( (NSSCKFWSlot
**)NULL
== slots
) {
1341 fwSlot
= slots
[ slotID
-1 ];
1343 if( CK_TRUE
!= nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
1344 error
= CKR_TOKEN_NOT_PRESENT
;
1348 fwToken
= nssCKFWSlot_GetToken(fwSlot
, &error
);
1349 if( (NSSCKFWToken
*)NULL
== fwToken
) {
1353 fwSession
= nssCKFWToken_OpenSession(fwToken
, rw
, pApplication
,
1355 if( (NSSCKFWSession
*)NULL
== fwSession
) {
1359 *phSession
= nssCKFWInstance_CreateSessionHandle(fwInstance
,
1361 if( (CK_SESSION_HANDLE
)0 == *phSession
) {
1369 case CKR_SESSION_CLOSED
:
1370 /* destroy session? */
1372 case CKR_DEVICE_REMOVED
:
1373 /* (void)nssCKFWToken_Destroy(fwToken); */
1375 case CKR_CRYPTOKI_NOT_INITIALIZED
:
1376 case CKR_DEVICE_ERROR
:
1377 case CKR_DEVICE_MEMORY
:
1378 case CKR_FUNCTION_FAILED
:
1379 case CKR_GENERAL_ERROR
:
1380 case CKR_HOST_MEMORY
:
1381 case CKR_SESSION_COUNT
:
1382 case CKR_SESSION_EXISTS
:
1383 case CKR_SESSION_PARALLEL_NOT_SUPPORTED
:
1384 case CKR_SESSION_READ_WRITE_SO_EXISTS
:
1385 case CKR_SLOT_ID_INVALID
:
1386 case CKR_TOKEN_NOT_PRESENT
:
1387 case CKR_TOKEN_NOT_RECOGNIZED
:
1388 case CKR_TOKEN_WRITE_PROTECTED
:
1392 error
= CKR_GENERAL_ERROR
;
1400 * NSSCKFWC_CloseSession
1404 NSSCKFWC_CloseSession
1406 NSSCKFWInstance
*fwInstance
,
1407 CK_SESSION_HANDLE hSession
1410 CK_RV error
= CKR_OK
;
1411 NSSCKFWSession
*fwSession
;
1413 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
1414 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
1418 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
1419 if( (NSSCKFWSession
*)NULL
== fwSession
) {
1420 error
= CKR_SESSION_HANDLE_INVALID
;
1424 nssCKFWInstance_DestroySessionHandle(fwInstance
, hSession
);
1425 error
= nssCKFWSession_Destroy(fwSession
, CK_TRUE
);
1427 if( CKR_OK
!= error
) {
1435 case CKR_SESSION_CLOSED
:
1436 /* destroy session? */
1438 case CKR_DEVICE_REMOVED
:
1439 /* (void)nssCKFWToken_Destroy(fwToken); */
1441 case CKR_CRYPTOKI_NOT_INITIALIZED
:
1442 case CKR_DEVICE_ERROR
:
1443 case CKR_DEVICE_MEMORY
:
1444 case CKR_FUNCTION_FAILED
:
1445 case CKR_GENERAL_ERROR
:
1446 case CKR_HOST_MEMORY
:
1447 case CKR_SESSION_HANDLE_INVALID
:
1451 error
= CKR_GENERAL_ERROR
;
1459 * NSSCKFWC_CloseAllSessions
1463 NSSCKFWC_CloseAllSessions
1465 NSSCKFWInstance
*fwInstance
,
1469 CK_RV error
= CKR_OK
;
1471 NSSCKFWSlot
**slots
;
1472 NSSCKFWSlot
*fwSlot
;
1473 NSSCKFWToken
*fwToken
= (NSSCKFWToken
*)NULL
;
1475 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
1476 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
1480 nSlots
= nssCKFWInstance_GetNSlots(fwInstance
, &error
);
1481 if( (CK_ULONG
)0 == nSlots
) {
1485 if( (slotID
< 1) || (slotID
> nSlots
) ) {
1486 error
= CKR_SLOT_ID_INVALID
;
1490 slots
= nssCKFWInstance_GetSlots(fwInstance
, &error
);
1491 if( (NSSCKFWSlot
**)NULL
== slots
) {
1495 fwSlot
= slots
[ slotID
-1 ];
1497 if( CK_TRUE
!= nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
1498 error
= CKR_TOKEN_NOT_PRESENT
;
1502 fwToken
= nssCKFWSlot_GetToken(fwSlot
, &error
);
1503 if( (NSSCKFWToken
*)NULL
== fwToken
) {
1507 error
= nssCKFWToken_CloseAllSessions(fwToken
);
1508 if( CKR_OK
!= error
) {
1516 case CKR_DEVICE_REMOVED
:
1517 /* (void)nssCKFWToken_Destroy(fwToken); */
1519 case CKR_CRYPTOKI_NOT_INITIALIZED
:
1520 case CKR_DEVICE_ERROR
:
1521 case CKR_DEVICE_MEMORY
:
1522 case CKR_FUNCTION_FAILED
:
1523 case CKR_GENERAL_ERROR
:
1524 case CKR_HOST_MEMORY
:
1525 case CKR_SLOT_ID_INVALID
:
1526 case CKR_TOKEN_NOT_PRESENT
:
1530 error
= CKR_GENERAL_ERROR
;
1538 * NSSCKFWC_GetSessionInfo
1542 NSSCKFWC_GetSessionInfo
1544 NSSCKFWInstance
*fwInstance
,
1545 CK_SESSION_HANDLE hSession
,
1546 CK_SESSION_INFO_PTR pInfo
1549 CK_RV error
= CKR_OK
;
1550 NSSCKFWSession
*fwSession
;
1551 NSSCKFWSlot
*fwSlot
;
1553 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
1554 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
1558 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
1559 if( (NSSCKFWSession
*)NULL
== fwSession
) {
1560 error
= CKR_SESSION_HANDLE_INVALID
;
1564 if( (CK_SESSION_INFO_PTR
)CK_NULL_PTR
== pInfo
) {
1565 error
= CKR_ARGUMENTS_BAD
;
1570 * A purify error here indicates caller error.
1572 (void)nsslibc_memset(pInfo
, 0, sizeof(CK_SESSION_INFO
));
1574 fwSlot
= nssCKFWSession_GetFWSlot(fwSession
);
1575 if( (NSSCKFWSlot
*)NULL
== fwSlot
) {
1576 error
= CKR_GENERAL_ERROR
;
1580 pInfo
->slotID
= nssCKFWSlot_GetSlotID(fwSlot
);
1581 pInfo
->state
= nssCKFWSession_GetSessionState(fwSession
);
1583 if( CK_TRUE
== nssCKFWSession_IsRWSession(fwSession
) ) {
1584 pInfo
->flags
|= CKF_RW_SESSION
;
1587 pInfo
->flags
|= CKF_SERIAL_SESSION
; /* Always true */
1589 pInfo
->ulDeviceError
= nssCKFWSession_GetDeviceError(fwSession
);
1595 case CKR_SESSION_CLOSED
:
1596 /* destroy session? */
1598 case CKR_DEVICE_REMOVED
:
1599 /* (void)nssCKFWToken_Destroy(fwToken); */
1601 case CKR_CRYPTOKI_NOT_INITIALIZED
:
1602 case CKR_DEVICE_ERROR
:
1603 case CKR_DEVICE_MEMORY
:
1604 case CKR_FUNCTION_FAILED
:
1605 case CKR_GENERAL_ERROR
:
1606 case CKR_HOST_MEMORY
:
1607 case CKR_SESSION_HANDLE_INVALID
:
1611 error
= CKR_GENERAL_ERROR
;
1619 * NSSCKFWC_GetOperationState
1623 NSSCKFWC_GetOperationState
1625 NSSCKFWInstance
*fwInstance
,
1626 CK_SESSION_HANDLE hSession
,
1627 CK_BYTE_PTR pOperationState
,
1628 CK_ULONG_PTR pulOperationStateLen
1631 CK_RV error
= CKR_OK
;
1632 NSSCKFWSession
*fwSession
;
1636 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
1637 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
1641 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
1642 if( (NSSCKFWSession
*)NULL
== fwSession
) {
1643 error
= CKR_SESSION_HANDLE_INVALID
;
1647 if( (CK_ULONG_PTR
)CK_NULL_PTR
== pulOperationStateLen
) {
1648 error
= CKR_ARGUMENTS_BAD
;
1652 len
= nssCKFWSession_GetOperationStateLen(fwSession
, &error
);
1653 if( ((CK_ULONG
)0 == len
) && (CKR_OK
!= error
) ) {
1657 if( (CK_BYTE_PTR
)CK_NULL_PTR
== pOperationState
) {
1658 *pulOperationStateLen
= len
;
1662 if( *pulOperationStateLen
< len
) {
1663 *pulOperationStateLen
= len
;
1664 error
= CKR_BUFFER_TOO_SMALL
;
1668 buf
.size
= (PRUint32
)*pulOperationStateLen
;
1669 buf
.data
= (void *)pOperationState
;
1670 *pulOperationStateLen
= len
;
1671 error
= nssCKFWSession_GetOperationState(fwSession
, &buf
);
1673 if( CKR_OK
!= error
) {
1681 case CKR_SESSION_CLOSED
:
1682 /* destroy session? */
1684 case CKR_DEVICE_REMOVED
:
1685 /* (void)nssCKFWToken_Destroy(fwToken); */
1687 case CKR_BUFFER_TOO_SMALL
:
1688 case CKR_CRYPTOKI_NOT_INITIALIZED
:
1689 case CKR_DEVICE_ERROR
:
1690 case CKR_DEVICE_MEMORY
:
1691 case CKR_FUNCTION_FAILED
:
1692 case CKR_GENERAL_ERROR
:
1693 case CKR_HOST_MEMORY
:
1694 case CKR_OPERATION_NOT_INITIALIZED
:
1695 case CKR_SESSION_HANDLE_INVALID
:
1696 case CKR_STATE_UNSAVEABLE
:
1700 error
= CKR_GENERAL_ERROR
;
1708 * NSSCKFWC_SetOperationState
1712 NSSCKFWC_SetOperationState
1714 NSSCKFWInstance
*fwInstance
,
1715 CK_SESSION_HANDLE hSession
,
1716 CK_BYTE_PTR pOperationState
,
1717 CK_ULONG ulOperationStateLen
,
1718 CK_OBJECT_HANDLE hEncryptionKey
,
1719 CK_OBJECT_HANDLE hAuthenticationKey
1722 CK_RV error
= CKR_OK
;
1723 NSSCKFWSession
*fwSession
;
1724 NSSCKFWObject
*eKey
;
1725 NSSCKFWObject
*aKey
;
1728 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
1729 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
1733 if( (CK_BYTE_PTR
)CK_NULL_PTR
== pOperationState
) {
1734 error
= CKR_ARGUMENTS_BAD
;
1739 * We could loop through the buffer, to catch any purify errors
1740 * in a place with a "user error" note.
1743 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
1744 if( (NSSCKFWSession
*)NULL
== fwSession
) {
1745 error
= CKR_SESSION_HANDLE_INVALID
;
1749 if( (CK_OBJECT_HANDLE
)0 == hEncryptionKey
) {
1750 eKey
= (NSSCKFWObject
*)NULL
;
1752 eKey
= nssCKFWInstance_ResolveObjectHandle(fwInstance
, hEncryptionKey
);
1753 if( (NSSCKFWObject
*)NULL
== eKey
) {
1754 error
= CKR_KEY_HANDLE_INVALID
;
1759 if( (CK_OBJECT_HANDLE
)0 == hAuthenticationKey
) {
1760 aKey
= (NSSCKFWObject
*)NULL
;
1762 aKey
= nssCKFWInstance_ResolveObjectHandle(fwInstance
, hAuthenticationKey
);
1763 if( (NSSCKFWObject
*)NULL
== aKey
) {
1764 error
= CKR_KEY_HANDLE_INVALID
;
1769 error
= nssCKFWSession_SetOperationState(fwSession
, &state
, eKey
, aKey
);
1770 if( CKR_OK
!= error
) {
1778 case CKR_SESSION_CLOSED
:
1779 /* destroy session? */
1781 case CKR_DEVICE_REMOVED
:
1782 /* (void)nssCKFWToken_Destroy(fwToken); */
1784 case CKR_CRYPTOKI_NOT_INITIALIZED
:
1785 case CKR_DEVICE_ERROR
:
1786 case CKR_DEVICE_MEMORY
:
1787 case CKR_FUNCTION_FAILED
:
1788 case CKR_GENERAL_ERROR
:
1789 case CKR_HOST_MEMORY
:
1790 case CKR_KEY_CHANGED
:
1791 case CKR_KEY_NEEDED
:
1792 case CKR_KEY_NOT_NEEDED
:
1793 case CKR_SAVED_STATE_INVALID
:
1794 case CKR_SESSION_HANDLE_INVALID
:
1798 error
= CKR_GENERAL_ERROR
;
1812 NSSCKFWInstance
*fwInstance
,
1813 CK_SESSION_HANDLE hSession
,
1814 CK_USER_TYPE userType
,
1819 CK_RV error
= CKR_OK
;
1820 NSSCKFWSession
*fwSession
;
1823 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
1824 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
1828 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
1829 if( (NSSCKFWSession
*)NULL
== fwSession
) {
1830 error
= CKR_SESSION_HANDLE_INVALID
;
1834 if( (CK_CHAR_PTR
)CK_NULL_PTR
== pPin
) {
1835 arg
= (NSSItem
*)NULL
;
1838 pin
.size
= (PRUint32
)ulPinLen
;
1839 pin
.data
= (void *)pPin
;
1842 error
= nssCKFWSession_Login(fwSession
, userType
, arg
);
1843 if( CKR_OK
!= error
) {
1851 case CKR_SESSION_CLOSED
:
1852 /* destroy session? */
1854 case CKR_DEVICE_REMOVED
:
1855 /* (void)nssCKFWToken_Destroy(fwToken); */
1857 case CKR_CRYPTOKI_NOT_INITIALIZED
:
1858 case CKR_DEVICE_ERROR
:
1859 case CKR_DEVICE_MEMORY
:
1860 case CKR_FUNCTION_FAILED
:
1861 case CKR_GENERAL_ERROR
:
1862 case CKR_HOST_MEMORY
:
1863 case CKR_PIN_EXPIRED
:
1864 case CKR_PIN_INCORRECT
:
1865 case CKR_PIN_LOCKED
:
1866 case CKR_SESSION_HANDLE_INVALID
:
1867 case CKR_SESSION_READ_ONLY_EXISTS
:
1868 case CKR_USER_ALREADY_LOGGED_IN
:
1869 case CKR_USER_ANOTHER_ALREADY_LOGGED_IN
:
1870 case CKR_USER_PIN_NOT_INITIALIZED
:
1871 case CKR_USER_TOO_MANY_TYPES
:
1872 case CKR_USER_TYPE_INVALID
:
1876 error
= CKR_GENERAL_ERROR
;
1890 NSSCKFWInstance
*fwInstance
,
1891 CK_SESSION_HANDLE hSession
1894 CK_RV error
= CKR_OK
;
1895 NSSCKFWSession
*fwSession
;
1897 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
1898 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
1902 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
1903 if( (NSSCKFWSession
*)NULL
== fwSession
) {
1904 error
= CKR_SESSION_HANDLE_INVALID
;
1908 error
= nssCKFWSession_Logout(fwSession
);
1909 if( CKR_OK
!= error
) {
1917 case CKR_SESSION_CLOSED
:
1918 /* destroy session? */
1920 case CKR_DEVICE_REMOVED
:
1921 /* (void)nssCKFWToken_Destroy(fwToken); */
1923 case CKR_CRYPTOKI_NOT_INITIALIZED
:
1924 case CKR_DEVICE_ERROR
:
1925 case CKR_DEVICE_MEMORY
:
1926 case CKR_FUNCTION_FAILED
:
1927 case CKR_GENERAL_ERROR
:
1928 case CKR_HOST_MEMORY
:
1929 case CKR_SESSION_HANDLE_INVALID
:
1930 case CKR_USER_NOT_LOGGED_IN
:
1934 error
= CKR_GENERAL_ERROR
;
1942 * NSSCKFWC_CreateObject
1946 NSSCKFWC_CreateObject
1948 NSSCKFWInstance
*fwInstance
,
1949 CK_SESSION_HANDLE hSession
,
1950 CK_ATTRIBUTE_PTR pTemplate
,
1952 CK_OBJECT_HANDLE_PTR phObject
1955 CK_RV error
= CKR_OK
;
1956 NSSCKFWSession
*fwSession
;
1957 NSSCKFWObject
*fwObject
;
1959 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
1960 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
1964 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
1965 if( (NSSCKFWSession
*)NULL
== fwSession
) {
1966 error
= CKR_SESSION_HANDLE_INVALID
;
1970 if( (CK_OBJECT_HANDLE_PTR
)CK_NULL_PTR
== phObject
) {
1971 error
= CKR_ARGUMENTS_BAD
;
1976 * A purify error here indicates caller error.
1978 *phObject
= (CK_OBJECT_HANDLE
)0;
1980 fwObject
= nssCKFWSession_CreateObject(fwSession
, pTemplate
,
1982 if( (NSSCKFWObject
*)NULL
== fwObject
) {
1986 *phObject
= nssCKFWInstance_CreateObjectHandle(fwInstance
, fwObject
, &error
);
1987 if( (CK_OBJECT_HANDLE
)0 == *phObject
) {
1988 nssCKFWObject_Destroy(fwObject
);
1996 case CKR_SESSION_CLOSED
:
1997 /* destroy session? */
1999 case CKR_DEVICE_REMOVED
:
2000 /* (void)nssCKFWToken_Destroy(fwToken); */
2002 case CKR_ATTRIBUTE_READ_ONLY
:
2003 case CKR_ATTRIBUTE_TYPE_INVALID
:
2004 case CKR_ATTRIBUTE_VALUE_INVALID
:
2005 case CKR_CRYPTOKI_NOT_INITIALIZED
:
2006 case CKR_DEVICE_ERROR
:
2007 case CKR_DEVICE_MEMORY
:
2008 case CKR_FUNCTION_FAILED
:
2009 case CKR_GENERAL_ERROR
:
2010 case CKR_HOST_MEMORY
:
2011 case CKR_SESSION_HANDLE_INVALID
:
2012 case CKR_SESSION_READ_ONLY
:
2013 case CKR_TEMPLATE_INCOMPLETE
:
2014 case CKR_TEMPLATE_INCONSISTENT
:
2015 case CKR_TOKEN_WRITE_PROTECTED
:
2016 case CKR_USER_NOT_LOGGED_IN
:
2020 error
= CKR_GENERAL_ERROR
;
2028 * NSSCKFWC_CopyObject
2034 NSSCKFWInstance
*fwInstance
,
2035 CK_SESSION_HANDLE hSession
,
2036 CK_OBJECT_HANDLE hObject
,
2037 CK_ATTRIBUTE_PTR pTemplate
,
2039 CK_OBJECT_HANDLE_PTR phNewObject
2042 CK_RV error
= CKR_OK
;
2043 NSSCKFWSession
*fwSession
;
2044 NSSCKFWObject
*fwObject
;
2045 NSSCKFWObject
*fwNewObject
;
2047 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
2048 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
2052 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
2053 if( (NSSCKFWSession
*)NULL
== fwSession
) {
2054 error
= CKR_SESSION_HANDLE_INVALID
;
2058 if( (CK_OBJECT_HANDLE_PTR
)CK_NULL_PTR
== phNewObject
) {
2059 error
= CKR_ARGUMENTS_BAD
;
2064 * A purify error here indicates caller error.
2066 *phNewObject
= (CK_OBJECT_HANDLE
)0;
2068 fwObject
= nssCKFWInstance_ResolveObjectHandle(fwInstance
, hObject
);
2069 if( (NSSCKFWObject
*)NULL
== fwObject
) {
2070 error
= CKR_OBJECT_HANDLE_INVALID
;
2074 fwNewObject
= nssCKFWSession_CopyObject(fwSession
, fwObject
,
2075 pTemplate
, ulCount
, &error
);
2076 if( (NSSCKFWObject
*)NULL
== fwNewObject
) {
2080 *phNewObject
= nssCKFWInstance_CreateObjectHandle(fwInstance
,
2081 fwNewObject
, &error
);
2082 if( (CK_OBJECT_HANDLE
)0 == *phNewObject
) {
2083 nssCKFWObject_Destroy(fwNewObject
);
2091 case CKR_SESSION_CLOSED
:
2092 /* destroy session? */
2094 case CKR_DEVICE_REMOVED
:
2095 /* (void)nssCKFWToken_Destroy(fwToken); */
2097 case CKR_ATTRIBUTE_READ_ONLY
:
2098 case CKR_ATTRIBUTE_TYPE_INVALID
:
2099 case CKR_ATTRIBUTE_VALUE_INVALID
:
2100 case CKR_CRYPTOKI_NOT_INITIALIZED
:
2101 case CKR_DEVICE_ERROR
:
2102 case CKR_DEVICE_MEMORY
:
2103 case CKR_FUNCTION_FAILED
:
2104 case CKR_GENERAL_ERROR
:
2105 case CKR_HOST_MEMORY
:
2106 case CKR_OBJECT_HANDLE_INVALID
:
2107 case CKR_SESSION_HANDLE_INVALID
:
2108 case CKR_SESSION_READ_ONLY
:
2109 case CKR_TEMPLATE_INCONSISTENT
:
2110 case CKR_TOKEN_WRITE_PROTECTED
:
2111 case CKR_USER_NOT_LOGGED_IN
:
2115 error
= CKR_GENERAL_ERROR
;
2123 * NSSCKFWC_DestroyObject
2127 NSSCKFWC_DestroyObject
2129 NSSCKFWInstance
*fwInstance
,
2130 CK_SESSION_HANDLE hSession
,
2131 CK_OBJECT_HANDLE hObject
2134 CK_RV error
= CKR_OK
;
2135 NSSCKFWSession
*fwSession
;
2136 NSSCKFWObject
*fwObject
;
2138 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
2139 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
2143 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
2144 if( (NSSCKFWSession
*)NULL
== fwSession
) {
2145 error
= CKR_SESSION_HANDLE_INVALID
;
2149 fwObject
= nssCKFWInstance_ResolveObjectHandle(fwInstance
, hObject
);
2150 if( (NSSCKFWObject
*)NULL
== fwObject
) {
2151 error
= CKR_OBJECT_HANDLE_INVALID
;
2155 nssCKFWInstance_DestroyObjectHandle(fwInstance
, hObject
);
2156 nssCKFWObject_Destroy(fwObject
);
2162 case CKR_SESSION_CLOSED
:
2163 /* destroy session? */
2165 case CKR_DEVICE_REMOVED
:
2166 /* (void)nssCKFWToken_Destroy(fwToken); */
2168 case CKR_CRYPTOKI_NOT_INITIALIZED
:
2169 case CKR_DEVICE_ERROR
:
2170 case CKR_DEVICE_MEMORY
:
2171 case CKR_FUNCTION_FAILED
:
2172 case CKR_GENERAL_ERROR
:
2173 case CKR_HOST_MEMORY
:
2174 case CKR_OBJECT_HANDLE_INVALID
:
2175 case CKR_SESSION_HANDLE_INVALID
:
2176 case CKR_SESSION_READ_ONLY
:
2177 case CKR_TOKEN_WRITE_PROTECTED
:
2181 error
= CKR_GENERAL_ERROR
;
2189 * NSSCKFWC_GetObjectSize
2193 NSSCKFWC_GetObjectSize
2195 NSSCKFWInstance
*fwInstance
,
2196 CK_SESSION_HANDLE hSession
,
2197 CK_OBJECT_HANDLE hObject
,
2198 CK_ULONG_PTR pulSize
2201 CK_RV error
= CKR_OK
;
2202 NSSCKFWSession
*fwSession
;
2203 NSSCKFWObject
*fwObject
;
2205 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
2206 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
2210 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
2211 if( (NSSCKFWSession
*)NULL
== fwSession
) {
2212 error
= CKR_SESSION_HANDLE_INVALID
;
2216 fwObject
= nssCKFWInstance_ResolveObjectHandle(fwInstance
, hObject
);
2217 if( (NSSCKFWObject
*)NULL
== fwObject
) {
2218 error
= CKR_OBJECT_HANDLE_INVALID
;
2222 if( (CK_ULONG_PTR
)CK_NULL_PTR
== pulSize
) {
2223 error
= CKR_ARGUMENTS_BAD
;
2228 * A purify error here indicates caller error.
2230 *pulSize
= (CK_ULONG
)0;
2232 *pulSize
= nssCKFWObject_GetObjectSize(fwObject
, &error
);
2233 if( ((CK_ULONG
)0 == *pulSize
) && (CKR_OK
!= error
) ) {
2241 case CKR_SESSION_CLOSED
:
2242 /* destroy session? */
2244 case CKR_DEVICE_REMOVED
:
2245 /* (void)nssCKFWToken_Destroy(fwToken); */
2247 case CKR_CRYPTOKI_NOT_INITIALIZED
:
2248 case CKR_DEVICE_ERROR
:
2249 case CKR_DEVICE_MEMORY
:
2250 case CKR_FUNCTION_FAILED
:
2251 case CKR_GENERAL_ERROR
:
2252 case CKR_HOST_MEMORY
:
2253 case CKR_INFORMATION_SENSITIVE
:
2254 case CKR_OBJECT_HANDLE_INVALID
:
2255 case CKR_SESSION_HANDLE_INVALID
:
2259 error
= CKR_GENERAL_ERROR
;
2267 * NSSCKFWC_GetAttributeValue
2271 NSSCKFWC_GetAttributeValue
2273 NSSCKFWInstance
*fwInstance
,
2274 CK_SESSION_HANDLE hSession
,
2275 CK_OBJECT_HANDLE hObject
,
2276 CK_ATTRIBUTE_PTR pTemplate
,
2280 CK_RV error
= CKR_OK
;
2281 NSSCKFWSession
*fwSession
;
2282 NSSCKFWObject
*fwObject
;
2283 CK_BBOOL sensitive
= CK_FALSE
;
2284 CK_BBOOL invalid
= CK_FALSE
;
2285 CK_BBOOL tooSmall
= CK_FALSE
;
2288 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
2289 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
2293 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
2294 if( (NSSCKFWSession
*)NULL
== fwSession
) {
2295 error
= CKR_SESSION_HANDLE_INVALID
;
2299 fwObject
= nssCKFWInstance_ResolveObjectHandle(fwInstance
, hObject
);
2300 if( (NSSCKFWObject
*)NULL
== fwObject
) {
2301 error
= CKR_OBJECT_HANDLE_INVALID
;
2305 if( (CK_ATTRIBUTE_PTR
)CK_NULL_PTR
== pTemplate
) {
2306 error
= CKR_ARGUMENTS_BAD
;
2310 for( i
= 0; i
< ulCount
; i
++ ) {
2311 CK_ULONG size
= nssCKFWObject_GetAttributeSize(fwObject
,
2312 pTemplate
[i
].type
, &error
);
2313 if( (CK_ULONG
)0 == size
) {
2315 case CKR_ATTRIBUTE_SENSITIVE
:
2316 case CKR_INFORMATION_SENSITIVE
:
2317 sensitive
= CK_TRUE
;
2318 pTemplate
[i
].ulValueLen
= (CK_ULONG
)(-1);
2320 case CKR_ATTRIBUTE_TYPE_INVALID
:
2322 pTemplate
[i
].ulValueLen
= (CK_ULONG
)(-1);
2331 if( (CK_VOID_PTR
)CK_NULL_PTR
== pTemplate
[i
].pValue
) {
2332 pTemplate
[i
].ulValueLen
= size
;
2336 if( pTemplate
[i
].ulValueLen
< size
) {
2341 it
.size
= (PRUint32
)pTemplate
[i
].ulValueLen
;
2342 it
.data
= (void *)pTemplate
[i
].pValue
;
2343 p
= nssCKFWObject_GetAttribute(fwObject
, pTemplate
[i
].type
, &it
,
2344 (NSSArena
*)NULL
, &error
);
2345 if( (NSSItem
*)NULL
== p
) {
2347 case CKR_ATTRIBUTE_SENSITIVE
:
2348 case CKR_INFORMATION_SENSITIVE
:
2349 sensitive
= CK_TRUE
;
2350 pTemplate
[i
].ulValueLen
= (CK_ULONG
)(-1);
2352 case CKR_ATTRIBUTE_TYPE_INVALID
:
2354 pTemplate
[i
].ulValueLen
= (CK_ULONG
)(-1);
2361 pTemplate
[i
].ulValueLen
= size
;
2366 error
= CKR_ATTRIBUTE_SENSITIVE
;
2368 } else if( invalid
) {
2369 error
= CKR_ATTRIBUTE_TYPE_INVALID
;
2371 } else if( tooSmall
) {
2372 error
= CKR_BUFFER_TOO_SMALL
;
2380 case CKR_SESSION_CLOSED
:
2381 /* destroy session? */
2383 case CKR_DEVICE_REMOVED
:
2384 /* (void)nssCKFWToken_Destroy(fwToken); */
2386 case CKR_ATTRIBUTE_SENSITIVE
:
2387 case CKR_ATTRIBUTE_TYPE_INVALID
:
2388 case CKR_BUFFER_TOO_SMALL
:
2389 case CKR_CRYPTOKI_NOT_INITIALIZED
:
2390 case CKR_DEVICE_ERROR
:
2391 case CKR_DEVICE_MEMORY
:
2392 case CKR_FUNCTION_FAILED
:
2393 case CKR_GENERAL_ERROR
:
2394 case CKR_HOST_MEMORY
:
2395 case CKR_OBJECT_HANDLE_INVALID
:
2396 case CKR_SESSION_HANDLE_INVALID
:
2400 error
= CKR_GENERAL_ERROR
;
2408 * NSSCKFWC_SetAttributeValue
2412 NSSCKFWC_SetAttributeValue
2414 NSSCKFWInstance
*fwInstance
,
2415 CK_SESSION_HANDLE hSession
,
2416 CK_OBJECT_HANDLE hObject
,
2417 CK_ATTRIBUTE_PTR pTemplate
,
2421 CK_RV error
= CKR_OK
;
2422 NSSCKFWSession
*fwSession
;
2423 NSSCKFWObject
*fwObject
;
2426 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
2427 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
2431 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
2432 if( (NSSCKFWSession
*)NULL
== fwSession
) {
2433 error
= CKR_SESSION_HANDLE_INVALID
;
2437 fwObject
= nssCKFWInstance_ResolveObjectHandle(fwInstance
, hObject
);
2438 if( (NSSCKFWObject
*)NULL
== fwObject
) {
2439 error
= CKR_OBJECT_HANDLE_INVALID
;
2443 if( (CK_ATTRIBUTE_PTR
)CK_NULL_PTR
== pTemplate
) {
2444 error
= CKR_ARGUMENTS_BAD
;
2448 for (i
=0; i
< ulCount
; i
++) {
2451 value
.data
= pTemplate
[i
].pValue
;
2452 value
.size
= pTemplate
[i
].ulValueLen
;
2454 error
= nssCKFWObject_SetAttribute(fwObject
, fwSession
,
2455 pTemplate
[i
].type
, &value
);
2457 if( CKR_OK
!= error
) {
2466 case CKR_SESSION_CLOSED
:
2467 /* destroy session? */
2469 case CKR_DEVICE_REMOVED
:
2470 /* (void)nssCKFWToken_Destroy(fwToken); */
2472 case CKR_ATTRIBUTE_READ_ONLY
:
2473 case CKR_ATTRIBUTE_TYPE_INVALID
:
2474 case CKR_ATTRIBUTE_VALUE_INVALID
:
2475 case CKR_CRYPTOKI_NOT_INITIALIZED
:
2476 case CKR_DEVICE_ERROR
:
2477 case CKR_DEVICE_MEMORY
:
2478 case CKR_FUNCTION_FAILED
:
2479 case CKR_GENERAL_ERROR
:
2480 case CKR_HOST_MEMORY
:
2481 case CKR_OBJECT_HANDLE_INVALID
:
2482 case CKR_SESSION_HANDLE_INVALID
:
2483 case CKR_SESSION_READ_ONLY
:
2484 case CKR_TEMPLATE_INCONSISTENT
:
2485 case CKR_TOKEN_WRITE_PROTECTED
:
2489 error
= CKR_GENERAL_ERROR
;
2497 * NSSCKFWC_FindObjectsInit
2501 NSSCKFWC_FindObjectsInit
2503 NSSCKFWInstance
*fwInstance
,
2504 CK_SESSION_HANDLE hSession
,
2505 CK_ATTRIBUTE_PTR pTemplate
,
2509 CK_RV error
= CKR_OK
;
2510 NSSCKFWSession
*fwSession
;
2511 NSSCKFWFindObjects
*fwFindObjects
;
2513 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
2514 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
2518 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
2519 if( (NSSCKFWSession
*)NULL
== fwSession
) {
2520 error
= CKR_SESSION_HANDLE_INVALID
;
2524 if( ((CK_ATTRIBUTE_PTR
)CK_NULL_PTR
== pTemplate
) && (ulCount
!= 0) ) {
2525 error
= CKR_ARGUMENTS_BAD
;
2529 fwFindObjects
= nssCKFWSession_GetFWFindObjects(fwSession
, &error
);
2530 if( (NSSCKFWFindObjects
*)NULL
!= fwFindObjects
) {
2531 error
= CKR_OPERATION_ACTIVE
;
2535 if( CKR_OPERATION_NOT_INITIALIZED
!= error
) {
2539 fwFindObjects
= nssCKFWSession_FindObjectsInit(fwSession
,
2540 pTemplate
, ulCount
, &error
);
2541 if( (NSSCKFWFindObjects
*)NULL
== fwFindObjects
) {
2545 error
= nssCKFWSession_SetFWFindObjects(fwSession
, fwFindObjects
);
2547 if( CKR_OK
!= error
) {
2548 nssCKFWFindObjects_Destroy(fwFindObjects
);
2556 case CKR_SESSION_CLOSED
:
2557 /* destroy session? */
2559 case CKR_DEVICE_REMOVED
:
2560 /* (void)nssCKFWToken_Destroy(fwToken); */
2562 case CKR_ATTRIBUTE_TYPE_INVALID
:
2563 case CKR_ATTRIBUTE_VALUE_INVALID
:
2564 case CKR_CRYPTOKI_NOT_INITIALIZED
:
2565 case CKR_DEVICE_ERROR
:
2566 case CKR_DEVICE_MEMORY
:
2567 case CKR_FUNCTION_FAILED
:
2568 case CKR_GENERAL_ERROR
:
2569 case CKR_HOST_MEMORY
:
2570 case CKR_OPERATION_ACTIVE
:
2571 case CKR_SESSION_HANDLE_INVALID
:
2575 error
= CKR_GENERAL_ERROR
;
2583 * NSSCKFWC_FindObjects
2587 NSSCKFWC_FindObjects
2589 NSSCKFWInstance
*fwInstance
,
2590 CK_SESSION_HANDLE hSession
,
2591 CK_OBJECT_HANDLE_PTR phObject
,
2592 CK_ULONG ulMaxObjectCount
,
2593 CK_ULONG_PTR pulObjectCount
2596 CK_RV error
= CKR_OK
;
2597 NSSCKFWSession
*fwSession
;
2598 NSSCKFWFindObjects
*fwFindObjects
;
2601 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
2602 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
2606 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
2607 if( (NSSCKFWSession
*)NULL
== fwSession
) {
2608 error
= CKR_SESSION_HANDLE_INVALID
;
2612 if( (CK_OBJECT_HANDLE_PTR
)CK_NULL_PTR
== phObject
) {
2613 error
= CKR_ARGUMENTS_BAD
;
2618 * A purify error here indicates caller error.
2620 (void)nsslibc_memset(phObject
, 0, sizeof(CK_OBJECT_HANDLE
) * ulMaxObjectCount
);
2621 *pulObjectCount
= (CK_ULONG
)0;
2623 fwFindObjects
= nssCKFWSession_GetFWFindObjects(fwSession
, &error
);
2624 if( (NSSCKFWFindObjects
*)NULL
== fwFindObjects
) {
2628 for( i
= 0; i
< ulMaxObjectCount
; i
++ ) {
2629 NSSCKFWObject
*fwObject
= nssCKFWFindObjects_Next(fwFindObjects
,
2631 if( (NSSCKFWObject
*)NULL
== fwObject
) {
2635 phObject
[i
] = nssCKFWInstance_FindObjectHandle(fwInstance
, fwObject
);
2636 if( (CK_OBJECT_HANDLE
)0 == phObject
[i
] ) {
2637 phObject
[i
] = nssCKFWInstance_CreateObjectHandle(fwInstance
, fwObject
, &error
);
2639 if( (CK_OBJECT_HANDLE
)0 == phObject
[i
] ) {
2640 /* This isn't right either, is it? */
2641 nssCKFWObject_Destroy(fwObject
);
2646 *pulObjectCount
= i
;
2652 case CKR_SESSION_CLOSED
:
2653 /* destroy session? */
2655 case CKR_DEVICE_REMOVED
:
2656 /* (void)nssCKFWToken_Destroy(fwToken); */
2658 case CKR_CRYPTOKI_NOT_INITIALIZED
:
2659 case CKR_DEVICE_ERROR
:
2660 case CKR_DEVICE_MEMORY
:
2661 case CKR_FUNCTION_FAILED
:
2662 case CKR_GENERAL_ERROR
:
2663 case CKR_HOST_MEMORY
:
2664 case CKR_OPERATION_NOT_INITIALIZED
:
2665 case CKR_SESSION_HANDLE_INVALID
:
2669 error
= CKR_GENERAL_ERROR
;
2677 * NSSCKFWC_FindObjectsFinal
2681 NSSCKFWC_FindObjectsFinal
2683 NSSCKFWInstance
*fwInstance
,
2684 CK_SESSION_HANDLE hSession
2687 CK_RV error
= CKR_OK
;
2688 NSSCKFWSession
*fwSession
;
2689 NSSCKFWFindObjects
*fwFindObjects
;
2691 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
2692 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
2696 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
2697 if( (NSSCKFWSession
*)NULL
== fwSession
) {
2698 error
= CKR_SESSION_HANDLE_INVALID
;
2702 fwFindObjects
= nssCKFWSession_GetFWFindObjects(fwSession
, &error
);
2703 if( (NSSCKFWFindObjects
*)NULL
== fwFindObjects
) {
2704 error
= CKR_OPERATION_NOT_INITIALIZED
;
2708 nssCKFWFindObjects_Destroy(fwFindObjects
);
2709 error
= nssCKFWSession_SetFWFindObjects(fwSession
,
2710 (NSSCKFWFindObjects
*)NULL
);
2712 if( CKR_OK
!= error
) {
2720 case CKR_SESSION_CLOSED
:
2721 /* destroy session? */
2723 case CKR_DEVICE_REMOVED
:
2724 /* (void)nssCKFWToken_Destroy(fwToken); */
2726 case CKR_CRYPTOKI_NOT_INITIALIZED
:
2727 case CKR_DEVICE_ERROR
:
2728 case CKR_DEVICE_MEMORY
:
2729 case CKR_FUNCTION_FAILED
:
2730 case CKR_GENERAL_ERROR
:
2731 case CKR_HOST_MEMORY
:
2732 case CKR_OPERATION_NOT_INITIALIZED
:
2733 case CKR_SESSION_HANDLE_INVALID
:
2737 error
= CKR_GENERAL_ERROR
;
2745 * NSSCKFWC_EncryptInit
2749 NSSCKFWC_EncryptInit
2751 NSSCKFWInstance
*fwInstance
,
2752 CK_SESSION_HANDLE hSession
,
2753 CK_MECHANISM_PTR pMechanism
,
2754 CK_OBJECT_HANDLE hKey
2757 CK_RV error
= CKR_OK
;
2758 NSSCKFWSession
*fwSession
;
2759 NSSCKFWObject
*fwObject
;
2760 NSSCKFWSlot
*fwSlot
;
2761 NSSCKFWToken
*fwToken
;
2762 NSSCKFWMechanism
*fwMechanism
;
2764 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
2765 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
2769 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
2770 if( (NSSCKFWSession
*)NULL
== fwSession
) {
2771 error
= CKR_SESSION_HANDLE_INVALID
;
2775 fwObject
= nssCKFWInstance_ResolveObjectHandle(fwInstance
, hKey
);
2776 if( (NSSCKFWObject
*)NULL
== fwObject
) {
2777 error
= CKR_KEY_HANDLE_INVALID
;
2781 fwSlot
= nssCKFWSession_GetFWSlot(fwSession
);
2782 if( (NSSCKFWSlot
*)NULL
== fwSlot
) {
2783 error
= CKR_GENERAL_ERROR
; /* should never happen! */
2787 if( CK_TRUE
!= nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
2788 error
= CKR_TOKEN_NOT_PRESENT
;
2792 fwToken
= nssCKFWSlot_GetToken(fwSlot
, &error
);
2793 if( (NSSCKFWToken
*)NULL
== fwToken
) {
2797 fwMechanism
= nssCKFWToken_GetMechanism(fwToken
, pMechanism
->mechanism
, &error
);
2798 if( (NSSCKFWMechanism
*)NULL
== fwMechanism
) {
2802 error
= nssCKFWMechanism_EncryptInit(fwMechanism
, pMechanism
,
2803 fwSession
, fwObject
);
2805 nssCKFWMechanism_Destroy(fwMechanism
);
2807 if (CKR_OK
== error
) {
2814 case CKR_CRYPTOKI_NOT_INITIALIZED
:
2815 case CKR_DEVICE_ERROR
:
2816 case CKR_DEVICE_MEMORY
:
2817 case CKR_DEVICE_REMOVED
:
2818 case CKR_FUNCTION_CANCELED
:
2819 case CKR_FUNCTION_FAILED
:
2820 case CKR_GENERAL_ERROR
:
2821 case CKR_HOST_MEMORY
:
2822 case CKR_KEY_FUNCTION_NOT_PERMITTED
:
2823 case CKR_KEY_HANDLE_INVALID
:
2824 case CKR_KEY_SIZE_RANGE
:
2825 case CKR_KEY_TYPE_INCONSISTENT
:
2826 case CKR_MECHANISM_INVALID
:
2827 case CKR_MECHANISM_PARAM_INVALID
:
2828 case CKR_OPERATION_ACTIVE
:
2829 case CKR_PIN_EXPIRED
:
2830 case CKR_SESSION_CLOSED
:
2831 case CKR_SESSION_HANDLE_INVALID
:
2832 case CKR_USER_NOT_LOGGED_IN
:
2836 error
= CKR_GENERAL_ERROR
;
2849 NSSCKFWInstance
*fwInstance
,
2850 CK_SESSION_HANDLE hSession
,
2853 CK_BYTE_PTR pEncryptedData
,
2854 CK_ULONG_PTR pulEncryptedDataLen
2857 CK_RV error
= CKR_OK
;
2858 NSSCKFWSession
*fwSession
;
2860 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
2861 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
2865 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
2866 if( (NSSCKFWSession
*)NULL
== fwSession
) {
2867 error
= CKR_SESSION_HANDLE_INVALID
;
2871 error
= nssCKFWSession_UpdateFinal(fwSession
,
2872 NSSCKFWCryptoOperationType_Encrypt
,
2873 NSSCKFWCryptoOperationState_EncryptDecrypt
,
2874 pData
, ulDataLen
, pEncryptedData
, pulEncryptedDataLen
);
2876 if (CKR_OK
== error
) {
2883 case CKR_ARGUMENTS_BAD
:
2884 case CKR_BUFFER_TOO_SMALL
:
2885 case CKR_CRYPTOKI_NOT_INITIALIZED
:
2886 case CKR_DATA_INVALID
:
2887 case CKR_DATA_LEN_RANGE
:
2888 case CKR_DEVICE_ERROR
:
2889 case CKR_DEVICE_MEMORY
:
2890 case CKR_DEVICE_REMOVED
:
2891 case CKR_FUNCTION_CANCELED
:
2892 case CKR_FUNCTION_FAILED
:
2893 case CKR_GENERAL_ERROR
:
2894 case CKR_HOST_MEMORY
:
2895 case CKR_OPERATION_NOT_INITIALIZED
:
2896 case CKR_SESSION_HANDLE_INVALID
:
2897 case CKR_SESSION_CLOSED
:
2901 error
= CKR_GENERAL_ERROR
;
2908 * NSSCKFWC_EncryptUpdate
2912 NSSCKFWC_EncryptUpdate
2914 NSSCKFWInstance
*fwInstance
,
2915 CK_SESSION_HANDLE hSession
,
2918 CK_BYTE_PTR pEncryptedPart
,
2919 CK_ULONG_PTR pulEncryptedPartLen
2922 CK_RV error
= CKR_OK
;
2923 NSSCKFWSession
*fwSession
;
2925 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
2926 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
2930 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
2931 if( (NSSCKFWSession
*)NULL
== fwSession
) {
2932 error
= CKR_SESSION_HANDLE_INVALID
;
2936 error
= nssCKFWSession_Update(fwSession
,
2937 NSSCKFWCryptoOperationType_Encrypt
,
2938 NSSCKFWCryptoOperationState_EncryptDecrypt
,
2939 pPart
, ulPartLen
, pEncryptedPart
, pulEncryptedPartLen
);
2941 if (CKR_OK
== error
) {
2948 case CKR_ARGUMENTS_BAD
:
2949 case CKR_BUFFER_TOO_SMALL
:
2950 case CKR_CRYPTOKI_NOT_INITIALIZED
:
2951 case CKR_DATA_LEN_RANGE
:
2952 case CKR_DEVICE_ERROR
:
2953 case CKR_DEVICE_MEMORY
:
2954 case CKR_DEVICE_REMOVED
:
2955 case CKR_FUNCTION_CANCELED
:
2956 case CKR_FUNCTION_FAILED
:
2957 case CKR_GENERAL_ERROR
:
2958 case CKR_HOST_MEMORY
:
2959 case CKR_OPERATION_NOT_INITIALIZED
:
2960 case CKR_SESSION_CLOSED
:
2961 case CKR_SESSION_HANDLE_INVALID
:
2965 error
= CKR_GENERAL_ERROR
;
2972 * NSSCKFWC_EncryptFinal
2976 NSSCKFWC_EncryptFinal
2978 NSSCKFWInstance
*fwInstance
,
2979 CK_SESSION_HANDLE hSession
,
2980 CK_BYTE_PTR pLastEncryptedPart
,
2981 CK_ULONG_PTR pulLastEncryptedPartLen
2984 CK_RV error
= CKR_OK
;
2985 NSSCKFWSession
*fwSession
;
2987 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
2988 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
2992 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
2993 if( (NSSCKFWSession
*)NULL
== fwSession
) {
2994 error
= CKR_SESSION_HANDLE_INVALID
;
2998 error
= nssCKFWSession_Final(fwSession
,
2999 NSSCKFWCryptoOperationType_Encrypt
,
3000 NSSCKFWCryptoOperationState_EncryptDecrypt
,
3001 pLastEncryptedPart
, pulLastEncryptedPartLen
);
3003 if (CKR_OK
== error
) {
3010 case CKR_ARGUMENTS_BAD
:
3011 case CKR_BUFFER_TOO_SMALL
:
3012 case CKR_CRYPTOKI_NOT_INITIALIZED
:
3013 case CKR_DATA_LEN_RANGE
:
3014 case CKR_DEVICE_ERROR
:
3015 case CKR_DEVICE_MEMORY
:
3016 case CKR_DEVICE_REMOVED
:
3017 case CKR_FUNCTION_CANCELED
:
3018 case CKR_FUNCTION_FAILED
:
3019 case CKR_GENERAL_ERROR
:
3020 case CKR_HOST_MEMORY
:
3021 case CKR_OPERATION_NOT_INITIALIZED
:
3022 case CKR_SESSION_CLOSED
:
3023 case CKR_SESSION_HANDLE_INVALID
:
3027 error
= CKR_GENERAL_ERROR
;
3034 * NSSCKFWC_DecryptInit
3038 NSSCKFWC_DecryptInit
3040 NSSCKFWInstance
*fwInstance
,
3041 CK_SESSION_HANDLE hSession
,
3042 CK_MECHANISM_PTR pMechanism
,
3043 CK_OBJECT_HANDLE hKey
3046 CK_RV error
= CKR_OK
;
3047 NSSCKFWSession
*fwSession
;
3048 NSSCKFWObject
*fwObject
;
3049 NSSCKFWSlot
*fwSlot
;
3050 NSSCKFWToken
*fwToken
;
3051 NSSCKFWMechanism
*fwMechanism
;
3053 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
3054 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
3058 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
3059 if( (NSSCKFWSession
*)NULL
== fwSession
) {
3060 error
= CKR_SESSION_HANDLE_INVALID
;
3064 fwObject
= nssCKFWInstance_ResolveObjectHandle(fwInstance
, hKey
);
3065 if( (NSSCKFWObject
*)NULL
== fwObject
) {
3066 error
= CKR_KEY_HANDLE_INVALID
;
3070 fwSlot
= nssCKFWSession_GetFWSlot(fwSession
);
3071 if( (NSSCKFWSlot
*)NULL
== fwSlot
) {
3072 error
= CKR_GENERAL_ERROR
; /* should never happen! */
3076 if( CK_TRUE
!= nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
3077 error
= CKR_TOKEN_NOT_PRESENT
;
3081 fwToken
= nssCKFWSlot_GetToken(fwSlot
, &error
);
3082 if( (NSSCKFWToken
*)NULL
== fwToken
) {
3086 fwMechanism
= nssCKFWToken_GetMechanism(fwToken
, pMechanism
->mechanism
, &error
);
3087 if( (NSSCKFWMechanism
*)NULL
== fwMechanism
) {
3091 error
= nssCKFWMechanism_DecryptInit(fwMechanism
, pMechanism
,
3092 fwSession
, fwObject
);
3093 nssCKFWMechanism_Destroy(fwMechanism
);
3095 if (CKR_OK
== error
) {
3102 case CKR_ARGUMENTS_BAD
:
3103 case CKR_CRYPTOKI_NOT_INITIALIZED
:
3104 case CKR_DEVICE_ERROR
:
3105 case CKR_DEVICE_MEMORY
:
3106 case CKR_DEVICE_REMOVED
:
3107 case CKR_FUNCTION_CANCELED
:
3108 case CKR_FUNCTION_FAILED
:
3109 case CKR_GENERAL_ERROR
:
3110 case CKR_HOST_MEMORY
:
3111 case CKR_KEY_FUNCTION_NOT_PERMITTED
:
3112 case CKR_KEY_HANDLE_INVALID
:
3113 case CKR_KEY_SIZE_RANGE
:
3114 case CKR_KEY_TYPE_INCONSISTENT
:
3115 case CKR_MECHANISM_INVALID
:
3116 case CKR_MECHANISM_PARAM_INVALID
:
3117 case CKR_OPERATION_ACTIVE
:
3118 case CKR_PIN_EXPIRED
:
3119 case CKR_SESSION_CLOSED
:
3120 case CKR_SESSION_HANDLE_INVALID
:
3121 case CKR_USER_NOT_LOGGED_IN
:
3125 error
= CKR_GENERAL_ERROR
;
3138 NSSCKFWInstance
*fwInstance
,
3139 CK_SESSION_HANDLE hSession
,
3140 CK_BYTE_PTR pEncryptedData
,
3141 CK_ULONG ulEncryptedDataLen
,
3143 CK_ULONG_PTR pulDataLen
3146 CK_RV error
= CKR_OK
;
3147 NSSCKFWSession
*fwSession
;
3149 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
3150 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
3154 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
3155 if( (NSSCKFWSession
*)NULL
== fwSession
) {
3156 error
= CKR_SESSION_HANDLE_INVALID
;
3160 error
= nssCKFWSession_UpdateFinal(fwSession
,
3161 NSSCKFWCryptoOperationType_Decrypt
,
3162 NSSCKFWCryptoOperationState_EncryptDecrypt
,
3163 pEncryptedData
, ulEncryptedDataLen
, pData
, pulDataLen
);
3165 if (CKR_OK
== error
) {
3172 case CKR_ARGUMENTS_BAD
:
3173 case CKR_BUFFER_TOO_SMALL
:
3174 case CKR_CRYPTOKI_NOT_INITIALIZED
:
3175 case CKR_DEVICE_ERROR
:
3176 case CKR_DEVICE_MEMORY
:
3177 case CKR_DEVICE_REMOVED
:
3178 case CKR_ENCRYPTED_DATA_INVALID
:
3179 case CKR_ENCRYPTED_DATA_LEN_RANGE
:
3180 case CKR_FUNCTION_CANCELED
:
3181 case CKR_FUNCTION_FAILED
:
3182 case CKR_GENERAL_ERROR
:
3183 case CKR_HOST_MEMORY
:
3184 case CKR_OPERATION_NOT_INITIALIZED
:
3185 case CKR_SESSION_CLOSED
:
3186 case CKR_SESSION_HANDLE_INVALID
:
3187 case CKR_USER_NOT_LOGGED_IN
:
3189 case CKR_DATA_LEN_RANGE
:
3190 error
= CKR_ENCRYPTED_DATA_LEN_RANGE
;
3192 case CKR_DATA_INVALID
:
3193 error
= CKR_ENCRYPTED_DATA_INVALID
;
3197 error
= CKR_GENERAL_ERROR
;
3204 * NSSCKFWC_DecryptUpdate
3208 NSSCKFWC_DecryptUpdate
3210 NSSCKFWInstance
*fwInstance
,
3211 CK_SESSION_HANDLE hSession
,
3212 CK_BYTE_PTR pEncryptedPart
,
3213 CK_ULONG ulEncryptedPartLen
,
3215 CK_ULONG_PTR pulPartLen
3218 CK_RV error
= CKR_OK
;
3219 NSSCKFWSession
*fwSession
;
3221 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
3222 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
3226 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
3227 if( (NSSCKFWSession
*)NULL
== fwSession
) {
3228 error
= CKR_SESSION_HANDLE_INVALID
;
3232 error
= nssCKFWSession_Update(fwSession
,
3233 NSSCKFWCryptoOperationType_Decrypt
,
3234 NSSCKFWCryptoOperationState_EncryptDecrypt
,
3235 pEncryptedPart
, ulEncryptedPartLen
, pPart
, pulPartLen
);
3237 if (CKR_OK
== error
) {
3244 case CKR_ARGUMENTS_BAD
:
3245 case CKR_BUFFER_TOO_SMALL
:
3246 case CKR_CRYPTOKI_NOT_INITIALIZED
:
3247 case CKR_DEVICE_ERROR
:
3248 case CKR_DEVICE_MEMORY
:
3249 case CKR_DEVICE_REMOVED
:
3250 case CKR_ENCRYPTED_DATA_INVALID
:
3251 case CKR_ENCRYPTED_DATA_LEN_RANGE
:
3252 case CKR_FUNCTION_CANCELED
:
3253 case CKR_FUNCTION_FAILED
:
3254 case CKR_GENERAL_ERROR
:
3255 case CKR_HOST_MEMORY
:
3256 case CKR_OPERATION_NOT_INITIALIZED
:
3257 case CKR_SESSION_CLOSED
:
3258 case CKR_SESSION_HANDLE_INVALID
:
3259 case CKR_USER_NOT_LOGGED_IN
:
3261 case CKR_DATA_LEN_RANGE
:
3262 error
= CKR_ENCRYPTED_DATA_LEN_RANGE
;
3264 case CKR_DATA_INVALID
:
3265 error
= CKR_ENCRYPTED_DATA_INVALID
;
3269 error
= CKR_GENERAL_ERROR
;
3276 * NSSCKFWC_DecryptFinal
3280 NSSCKFWC_DecryptFinal
3282 NSSCKFWInstance
*fwInstance
,
3283 CK_SESSION_HANDLE hSession
,
3284 CK_BYTE_PTR pLastPart
,
3285 CK_ULONG_PTR pulLastPartLen
3288 CK_RV error
= CKR_OK
;
3289 NSSCKFWSession
*fwSession
;
3291 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
3292 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
3296 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
3297 if( (NSSCKFWSession
*)NULL
== fwSession
) {
3298 error
= CKR_SESSION_HANDLE_INVALID
;
3302 error
= nssCKFWSession_Final(fwSession
,
3303 NSSCKFWCryptoOperationType_Decrypt
,
3304 NSSCKFWCryptoOperationState_EncryptDecrypt
,
3305 pLastPart
, pulLastPartLen
);
3307 if (CKR_OK
== error
) {
3314 case CKR_ARGUMENTS_BAD
:
3315 case CKR_BUFFER_TOO_SMALL
:
3316 case CKR_CRYPTOKI_NOT_INITIALIZED
:
3317 case CKR_DEVICE_ERROR
:
3318 case CKR_DEVICE_MEMORY
:
3319 case CKR_DEVICE_REMOVED
:
3320 case CKR_FUNCTION_FAILED
:
3321 case CKR_FUNCTION_CANCELED
:
3322 case CKR_ENCRYPTED_DATA_INVALID
:
3323 case CKR_ENCRYPTED_DATA_LEN_RANGE
:
3324 case CKR_GENERAL_ERROR
:
3325 case CKR_HOST_MEMORY
:
3326 case CKR_OPERATION_NOT_INITIALIZED
:
3327 case CKR_SESSION_CLOSED
:
3328 case CKR_SESSION_HANDLE_INVALID
:
3329 case CKR_USER_NOT_LOGGED_IN
:
3331 case CKR_DATA_LEN_RANGE
:
3332 error
= CKR_ENCRYPTED_DATA_LEN_RANGE
;
3334 case CKR_DATA_INVALID
:
3335 error
= CKR_ENCRYPTED_DATA_INVALID
;
3339 error
= CKR_GENERAL_ERROR
;
3346 * NSSCKFWC_DigestInit
3352 NSSCKFWInstance
*fwInstance
,
3353 CK_SESSION_HANDLE hSession
,
3354 CK_MECHANISM_PTR pMechanism
3357 CK_RV error
= CKR_OK
;
3358 NSSCKFWSession
*fwSession
;
3359 NSSCKFWSlot
*fwSlot
;
3360 NSSCKFWToken
*fwToken
;
3361 NSSCKFWMechanism
*fwMechanism
;
3363 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
3364 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
3368 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
3369 if( (NSSCKFWSession
*)NULL
== fwSession
) {
3370 error
= CKR_SESSION_HANDLE_INVALID
;
3374 fwSlot
= nssCKFWSession_GetFWSlot(fwSession
);
3375 if( (NSSCKFWSlot
*)NULL
== fwSlot
) {
3376 error
= CKR_GENERAL_ERROR
; /* should never happen! */
3380 if( CK_TRUE
!= nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
3381 error
= CKR_TOKEN_NOT_PRESENT
;
3385 fwToken
= nssCKFWSlot_GetToken(fwSlot
, &error
);
3386 if( (NSSCKFWToken
*)NULL
== fwToken
) {
3390 fwMechanism
= nssCKFWToken_GetMechanism(fwToken
, pMechanism
->mechanism
, &error
);
3391 if( (NSSCKFWMechanism
*)NULL
== fwMechanism
) {
3395 error
= nssCKFWMechanism_DigestInit(fwMechanism
, pMechanism
, fwSession
);
3397 nssCKFWMechanism_Destroy(fwMechanism
);
3399 if (CKR_OK
== error
) {
3406 case CKR_ARGUMENTS_BAD
:
3407 case CKR_CRYPTOKI_NOT_INITIALIZED
:
3408 case CKR_DEVICE_ERROR
:
3409 case CKR_DEVICE_MEMORY
:
3410 case CKR_DEVICE_REMOVED
:
3411 case CKR_FUNCTION_CANCELED
:
3412 case CKR_FUNCTION_FAILED
:
3413 case CKR_GENERAL_ERROR
:
3414 case CKR_HOST_MEMORY
:
3415 case CKR_MECHANISM_INVALID
:
3416 case CKR_MECHANISM_PARAM_INVALID
:
3417 case CKR_OPERATION_ACTIVE
:
3418 case CKR_PIN_EXPIRED
:
3419 case CKR_SESSION_CLOSED
:
3420 case CKR_SESSION_HANDLE_INVALID
:
3421 case CKR_USER_NOT_LOGGED_IN
:
3425 error
= CKR_GENERAL_ERROR
;
3438 NSSCKFWInstance
*fwInstance
,
3439 CK_SESSION_HANDLE hSession
,
3442 CK_BYTE_PTR pDigest
,
3443 CK_ULONG_PTR pulDigestLen
3446 CK_RV error
= CKR_OK
;
3447 NSSCKFWSession
*fwSession
;
3449 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
3450 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
3454 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
3455 if( (NSSCKFWSession
*)NULL
== fwSession
) {
3456 error
= CKR_SESSION_HANDLE_INVALID
;
3460 error
= nssCKFWSession_UpdateFinal(fwSession
,
3461 NSSCKFWCryptoOperationType_Digest
,
3462 NSSCKFWCryptoOperationState_Digest
,
3463 pData
, ulDataLen
, pDigest
, pulDigestLen
);
3465 if (CKR_OK
== error
) {
3472 case CKR_ARGUMENTS_BAD
:
3473 case CKR_BUFFER_TOO_SMALL
:
3474 case CKR_CRYPTOKI_NOT_INITIALIZED
:
3475 case CKR_DEVICE_ERROR
:
3476 case CKR_DEVICE_MEMORY
:
3477 case CKR_DEVICE_REMOVED
:
3478 case CKR_FUNCTION_CANCELED
:
3479 case CKR_FUNCTION_FAILED
:
3480 case CKR_GENERAL_ERROR
:
3481 case CKR_HOST_MEMORY
:
3482 case CKR_OPERATION_NOT_INITIALIZED
:
3483 case CKR_SESSION_CLOSED
:
3484 case CKR_SESSION_HANDLE_INVALID
:
3488 error
= CKR_GENERAL_ERROR
;
3495 * NSSCKFWC_DigestUpdate
3499 NSSCKFWC_DigestUpdate
3501 NSSCKFWInstance
*fwInstance
,
3502 CK_SESSION_HANDLE hSession
,
3507 CK_RV error
= CKR_OK
;
3508 NSSCKFWSession
*fwSession
;
3510 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
3511 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
3515 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
3516 if( (NSSCKFWSession
*)NULL
== fwSession
) {
3517 error
= CKR_SESSION_HANDLE_INVALID
;
3521 error
= nssCKFWSession_DigestUpdate(fwSession
,
3522 NSSCKFWCryptoOperationType_Digest
,
3523 NSSCKFWCryptoOperationState_Digest
,
3526 if (CKR_OK
== error
) {
3533 case CKR_ARGUMENTS_BAD
:
3534 case CKR_CRYPTOKI_NOT_INITIALIZED
:
3535 case CKR_DEVICE_ERROR
:
3536 case CKR_DEVICE_MEMORY
:
3537 case CKR_DEVICE_REMOVED
:
3538 case CKR_FUNCTION_CANCELED
:
3539 case CKR_FUNCTION_FAILED
:
3540 case CKR_GENERAL_ERROR
:
3541 case CKR_HOST_MEMORY
:
3542 case CKR_OPERATION_NOT_INITIALIZED
:
3543 case CKR_SESSION_CLOSED
:
3544 case CKR_SESSION_HANDLE_INVALID
:
3548 error
= CKR_GENERAL_ERROR
;
3555 * NSSCKFWC_DigestKey
3561 NSSCKFWInstance
*fwInstance
,
3562 CK_SESSION_HANDLE hSession
,
3563 CK_OBJECT_HANDLE hKey
3566 CK_RV error
= CKR_OK
;
3567 NSSCKFWSession
*fwSession
;
3568 NSSCKFWObject
*fwObject
;
3570 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
3571 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
3575 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
3576 if( (NSSCKFWSession
*)NULL
== fwSession
) {
3577 error
= CKR_SESSION_HANDLE_INVALID
;
3581 fwObject
= nssCKFWInstance_ResolveObjectHandle(fwInstance
, hKey
);
3582 if( (NSSCKFWObject
*)NULL
== fwObject
) {
3583 error
= CKR_KEY_HANDLE_INVALID
;
3587 error
= nssCKFWSession_DigestKey(fwSession
, fwObject
);
3589 if (CKR_OK
== error
) {
3596 case CKR_CRYPTOKI_NOT_INITIALIZED
:
3597 case CKR_DEVICE_ERROR
:
3598 case CKR_DEVICE_MEMORY
:
3599 case CKR_DEVICE_REMOVED
:
3600 case CKR_FUNCTION_CANCELED
:
3601 case CKR_FUNCTION_FAILED
:
3602 case CKR_GENERAL_ERROR
:
3603 case CKR_HOST_MEMORY
:
3604 case CKR_KEY_HANDLE_INVALID
:
3605 case CKR_KEY_INDIGESTIBLE
:
3606 case CKR_KEY_SIZE_RANGE
:
3607 case CKR_OPERATION_NOT_INITIALIZED
:
3608 case CKR_SESSION_CLOSED
:
3609 case CKR_SESSION_HANDLE_INVALID
:
3613 error
= CKR_GENERAL_ERROR
;
3620 * NSSCKFWC_DigestFinal
3624 NSSCKFWC_DigestFinal
3626 NSSCKFWInstance
*fwInstance
,
3627 CK_SESSION_HANDLE hSession
,
3628 CK_BYTE_PTR pDigest
,
3629 CK_ULONG_PTR pulDigestLen
3632 CK_RV error
= CKR_OK
;
3633 NSSCKFWSession
*fwSession
;
3635 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
3636 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
3640 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
3641 if( (NSSCKFWSession
*)NULL
== fwSession
) {
3642 error
= CKR_SESSION_HANDLE_INVALID
;
3646 error
= nssCKFWSession_Final(fwSession
,
3647 NSSCKFWCryptoOperationType_Digest
,
3648 NSSCKFWCryptoOperationState_Digest
,
3649 pDigest
, pulDigestLen
);
3651 if (CKR_OK
== error
) {
3658 case CKR_ARGUMENTS_BAD
:
3659 case CKR_BUFFER_TOO_SMALL
:
3660 case CKR_CRYPTOKI_NOT_INITIALIZED
:
3661 case CKR_DEVICE_ERROR
:
3662 case CKR_DEVICE_MEMORY
:
3663 case CKR_DEVICE_REMOVED
:
3664 case CKR_FUNCTION_CANCELED
:
3665 case CKR_FUNCTION_FAILED
:
3666 case CKR_GENERAL_ERROR
:
3667 case CKR_HOST_MEMORY
:
3668 case CKR_OPERATION_NOT_INITIALIZED
:
3669 case CKR_SESSION_CLOSED
:
3670 case CKR_SESSION_HANDLE_INVALID
:
3674 error
= CKR_GENERAL_ERROR
;
3687 NSSCKFWInstance
*fwInstance
,
3688 CK_SESSION_HANDLE hSession
,
3689 CK_MECHANISM_PTR pMechanism
,
3690 CK_OBJECT_HANDLE hKey
3693 CK_RV error
= CKR_OK
;
3694 NSSCKFWSession
*fwSession
;
3695 NSSCKFWObject
*fwObject
;
3696 NSSCKFWSlot
*fwSlot
;
3697 NSSCKFWToken
*fwToken
;
3698 NSSCKFWMechanism
*fwMechanism
;
3700 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
3701 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
3705 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
3706 if( (NSSCKFWSession
*)NULL
== fwSession
) {
3707 error
= CKR_SESSION_HANDLE_INVALID
;
3711 fwObject
= nssCKFWInstance_ResolveObjectHandle(fwInstance
, hKey
);
3712 if( (NSSCKFWObject
*)NULL
== fwObject
) {
3713 error
= CKR_KEY_HANDLE_INVALID
;
3717 fwSlot
= nssCKFWSession_GetFWSlot(fwSession
);
3718 if( (NSSCKFWSlot
*)NULL
== fwSlot
) {
3719 error
= CKR_GENERAL_ERROR
; /* should never happen! */
3723 if( CK_TRUE
!= nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
3724 error
= CKR_TOKEN_NOT_PRESENT
;
3728 fwToken
= nssCKFWSlot_GetToken(fwSlot
, &error
);
3729 if( (NSSCKFWToken
*)NULL
== fwToken
) {
3733 fwMechanism
= nssCKFWToken_GetMechanism(fwToken
, pMechanism
->mechanism
, &error
);
3734 if( (NSSCKFWMechanism
*)NULL
== fwMechanism
) {
3738 error
= nssCKFWMechanism_SignInit(fwMechanism
, pMechanism
, fwSession
,
3741 nssCKFWMechanism_Destroy(fwMechanism
);
3743 if (CKR_OK
== error
) {
3750 case CKR_ARGUMENTS_BAD
:
3751 case CKR_CRYPTOKI_NOT_INITIALIZED
:
3752 case CKR_DEVICE_ERROR
:
3753 case CKR_DEVICE_MEMORY
:
3754 case CKR_DEVICE_REMOVED
:
3755 case CKR_FUNCTION_CANCELED
:
3756 case CKR_FUNCTION_FAILED
:
3757 case CKR_GENERAL_ERROR
:
3758 case CKR_HOST_MEMORY
:
3759 case CKR_KEY_FUNCTION_NOT_PERMITTED
:
3760 case CKR_KEY_HANDLE_INVALID
:
3761 case CKR_KEY_SIZE_RANGE
:
3762 case CKR_KEY_TYPE_INCONSISTENT
:
3763 case CKR_MECHANISM_INVALID
:
3764 case CKR_MECHANISM_PARAM_INVALID
:
3765 case CKR_OPERATION_ACTIVE
:
3766 case CKR_PIN_EXPIRED
:
3767 case CKR_SESSION_CLOSED
:
3768 case CKR_SESSION_HANDLE_INVALID
:
3769 case CKR_USER_NOT_LOGGED_IN
:
3773 error
= CKR_GENERAL_ERROR
;
3786 NSSCKFWInstance
*fwInstance
,
3787 CK_SESSION_HANDLE hSession
,
3790 CK_BYTE_PTR pSignature
,
3791 CK_ULONG_PTR pulSignatureLen
3794 CK_RV error
= CKR_OK
;
3795 NSSCKFWSession
*fwSession
;
3797 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
3798 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
3802 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
3803 if( (NSSCKFWSession
*)NULL
== fwSession
) {
3804 error
= CKR_SESSION_HANDLE_INVALID
;
3808 error
= nssCKFWSession_UpdateFinal(fwSession
,
3809 NSSCKFWCryptoOperationType_Sign
,
3810 NSSCKFWCryptoOperationState_SignVerify
,
3811 pData
, ulDataLen
, pSignature
, pulSignatureLen
);
3813 if (CKR_OK
== error
) {
3820 case CKR_ARGUMENTS_BAD
:
3821 case CKR_BUFFER_TOO_SMALL
:
3822 case CKR_CRYPTOKI_NOT_INITIALIZED
:
3823 case CKR_DATA_INVALID
:
3824 case CKR_DATA_LEN_RANGE
:
3825 case CKR_DEVICE_ERROR
:
3826 case CKR_DEVICE_MEMORY
:
3827 case CKR_DEVICE_REMOVED
:
3828 case CKR_FUNCTION_CANCELED
:
3829 case CKR_FUNCTION_FAILED
:
3830 case CKR_GENERAL_ERROR
:
3831 case CKR_HOST_MEMORY
:
3832 case CKR_OPERATION_NOT_INITIALIZED
:
3833 case CKR_SESSION_CLOSED
:
3834 case CKR_SESSION_HANDLE_INVALID
:
3835 case CKR_USER_NOT_LOGGED_IN
:
3836 case CKR_FUNCTION_REJECTED
:
3840 error
= CKR_GENERAL_ERROR
;
3847 * NSSCKFWC_SignUpdate
3853 NSSCKFWInstance
*fwInstance
,
3854 CK_SESSION_HANDLE hSession
,
3859 CK_RV error
= CKR_OK
;
3860 NSSCKFWSession
*fwSession
;
3862 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
3863 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
3867 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
3868 if( (NSSCKFWSession
*)NULL
== fwSession
) {
3869 error
= CKR_SESSION_HANDLE_INVALID
;
3873 error
= nssCKFWSession_DigestUpdate(fwSession
,
3874 NSSCKFWCryptoOperationType_Sign
,
3875 NSSCKFWCryptoOperationState_SignVerify
,
3878 if (CKR_OK
== error
) {
3885 case CKR_ARGUMENTS_BAD
:
3886 case CKR_CRYPTOKI_NOT_INITIALIZED
:
3887 case CKR_DATA_LEN_RANGE
:
3888 case CKR_DEVICE_ERROR
:
3889 case CKR_DEVICE_MEMORY
:
3890 case CKR_DEVICE_REMOVED
:
3891 case CKR_FUNCTION_CANCELED
:
3892 case CKR_FUNCTION_FAILED
:
3893 case CKR_GENERAL_ERROR
:
3894 case CKR_HOST_MEMORY
:
3895 case CKR_OPERATION_NOT_INITIALIZED
:
3896 case CKR_SESSION_CLOSED
:
3897 case CKR_SESSION_HANDLE_INVALID
:
3898 case CKR_USER_NOT_LOGGED_IN
:
3902 error
= CKR_GENERAL_ERROR
;
3909 * NSSCKFWC_SignFinal
3915 NSSCKFWInstance
*fwInstance
,
3916 CK_SESSION_HANDLE hSession
,
3917 CK_BYTE_PTR pSignature
,
3918 CK_ULONG_PTR pulSignatureLen
3921 CK_RV error
= CKR_OK
;
3922 NSSCKFWSession
*fwSession
;
3924 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
3925 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
3929 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
3930 if( (NSSCKFWSession
*)NULL
== fwSession
) {
3931 error
= CKR_SESSION_HANDLE_INVALID
;
3935 error
= nssCKFWSession_Final(fwSession
,
3936 NSSCKFWCryptoOperationType_Sign
,
3937 NSSCKFWCryptoOperationState_SignVerify
,
3938 pSignature
, pulSignatureLen
);
3940 if (CKR_OK
== error
) {
3947 case CKR_ARGUMENTS_BAD
:
3948 case CKR_BUFFER_TOO_SMALL
:
3949 case CKR_CRYPTOKI_NOT_INITIALIZED
:
3950 case CKR_DATA_LEN_RANGE
:
3951 case CKR_DEVICE_ERROR
:
3952 case CKR_DEVICE_MEMORY
:
3953 case CKR_DEVICE_REMOVED
:
3954 case CKR_FUNCTION_CANCELED
:
3955 case CKR_FUNCTION_FAILED
:
3956 case CKR_GENERAL_ERROR
:
3957 case CKR_HOST_MEMORY
:
3958 case CKR_OPERATION_NOT_INITIALIZED
:
3959 case CKR_SESSION_CLOSED
:
3960 case CKR_SESSION_HANDLE_INVALID
:
3961 case CKR_USER_NOT_LOGGED_IN
:
3962 case CKR_FUNCTION_REJECTED
:
3966 error
= CKR_GENERAL_ERROR
;
3973 * NSSCKFWC_SignRecoverInit
3977 NSSCKFWC_SignRecoverInit
3979 NSSCKFWInstance
*fwInstance
,
3980 CK_SESSION_HANDLE hSession
,
3981 CK_MECHANISM_PTR pMechanism
,
3982 CK_OBJECT_HANDLE hKey
3985 CK_RV error
= CKR_OK
;
3986 NSSCKFWSession
*fwSession
;
3987 NSSCKFWObject
*fwObject
;
3988 NSSCKFWSlot
*fwSlot
;
3989 NSSCKFWToken
*fwToken
;
3990 NSSCKFWMechanism
*fwMechanism
;
3992 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
3993 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
3997 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
3998 if( (NSSCKFWSession
*)NULL
== fwSession
) {
3999 error
= CKR_SESSION_HANDLE_INVALID
;
4003 fwObject
= nssCKFWInstance_ResolveObjectHandle(fwInstance
, hKey
);
4004 if( (NSSCKFWObject
*)NULL
== fwObject
) {
4005 error
= CKR_KEY_HANDLE_INVALID
;
4009 fwSlot
= nssCKFWSession_GetFWSlot(fwSession
);
4010 if( (NSSCKFWSlot
*)NULL
== fwSlot
) {
4011 error
= CKR_GENERAL_ERROR
; /* should never happen! */
4015 if( CK_TRUE
!= nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
4016 error
= CKR_TOKEN_NOT_PRESENT
;
4020 fwToken
= nssCKFWSlot_GetToken(fwSlot
, &error
);
4021 if( (NSSCKFWToken
*)NULL
== fwToken
) {
4025 fwMechanism
= nssCKFWToken_GetMechanism(fwToken
, pMechanism
->mechanism
, &error
);
4026 if( (NSSCKFWMechanism
*)NULL
== fwMechanism
) {
4030 error
= nssCKFWMechanism_SignRecoverInit(fwMechanism
, pMechanism
, fwSession
,
4033 nssCKFWMechanism_Destroy(fwMechanism
);
4035 if (CKR_OK
== error
) {
4042 case CKR_ARGUMENTS_BAD
:
4043 case CKR_CRYPTOKI_NOT_INITIALIZED
:
4044 case CKR_DEVICE_ERROR
:
4045 case CKR_DEVICE_MEMORY
:
4046 case CKR_DEVICE_REMOVED
:
4047 case CKR_FUNCTION_CANCELED
:
4048 case CKR_FUNCTION_FAILED
:
4049 case CKR_GENERAL_ERROR
:
4050 case CKR_HOST_MEMORY
:
4051 case CKR_KEY_FUNCTION_NOT_PERMITTED
:
4052 case CKR_KEY_HANDLE_INVALID
:
4053 case CKR_KEY_SIZE_RANGE
:
4054 case CKR_KEY_TYPE_INCONSISTENT
:
4055 case CKR_MECHANISM_INVALID
:
4056 case CKR_MECHANISM_PARAM_INVALID
:
4057 case CKR_OPERATION_ACTIVE
:
4058 case CKR_PIN_EXPIRED
:
4059 case CKR_SESSION_CLOSED
:
4060 case CKR_SESSION_HANDLE_INVALID
:
4061 case CKR_USER_NOT_LOGGED_IN
:
4065 error
= CKR_GENERAL_ERROR
;
4072 * NSSCKFWC_SignRecover
4076 NSSCKFWC_SignRecover
4078 NSSCKFWInstance
*fwInstance
,
4079 CK_SESSION_HANDLE hSession
,
4082 CK_BYTE_PTR pSignature
,
4083 CK_ULONG_PTR pulSignatureLen
4086 CK_RV error
= CKR_OK
;
4087 NSSCKFWSession
*fwSession
;
4089 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
4090 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
4094 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
4095 if( (NSSCKFWSession
*)NULL
== fwSession
) {
4096 error
= CKR_SESSION_HANDLE_INVALID
;
4100 error
= nssCKFWSession_UpdateFinal(fwSession
,
4101 NSSCKFWCryptoOperationType_SignRecover
,
4102 NSSCKFWCryptoOperationState_SignVerify
,
4103 pData
, ulDataLen
, pSignature
, pulSignatureLen
);
4105 if (CKR_OK
== error
) {
4112 case CKR_ARGUMENTS_BAD
:
4113 case CKR_BUFFER_TOO_SMALL
:
4114 case CKR_CRYPTOKI_NOT_INITIALIZED
:
4115 case CKR_DATA_INVALID
:
4116 case CKR_DATA_LEN_RANGE
:
4117 case CKR_DEVICE_ERROR
:
4118 case CKR_DEVICE_MEMORY
:
4119 case CKR_DEVICE_REMOVED
:
4120 case CKR_FUNCTION_CANCELED
:
4121 case CKR_FUNCTION_FAILED
:
4122 case CKR_GENERAL_ERROR
:
4123 case CKR_HOST_MEMORY
:
4124 case CKR_OPERATION_NOT_INITIALIZED
:
4125 case CKR_SESSION_CLOSED
:
4126 case CKR_SESSION_HANDLE_INVALID
:
4127 case CKR_USER_NOT_LOGGED_IN
:
4131 error
= CKR_GENERAL_ERROR
;
4138 * NSSCKFWC_VerifyInit
4144 NSSCKFWInstance
*fwInstance
,
4145 CK_SESSION_HANDLE hSession
,
4146 CK_MECHANISM_PTR pMechanism
,
4147 CK_OBJECT_HANDLE hKey
4150 CK_RV error
= CKR_OK
;
4151 NSSCKFWSession
*fwSession
;
4152 NSSCKFWObject
*fwObject
;
4153 NSSCKFWSlot
*fwSlot
;
4154 NSSCKFWToken
*fwToken
;
4155 NSSCKFWMechanism
*fwMechanism
;
4157 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
4158 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
4162 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
4163 if( (NSSCKFWSession
*)NULL
== fwSession
) {
4164 error
= CKR_SESSION_HANDLE_INVALID
;
4168 fwObject
= nssCKFWInstance_ResolveObjectHandle(fwInstance
, hKey
);
4169 if( (NSSCKFWObject
*)NULL
== fwObject
) {
4170 error
= CKR_KEY_HANDLE_INVALID
;
4174 fwSlot
= nssCKFWSession_GetFWSlot(fwSession
);
4175 if( (NSSCKFWSlot
*)NULL
== fwSlot
) {
4176 error
= CKR_GENERAL_ERROR
; /* should never happen! */
4180 if( CK_TRUE
!= nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
4181 error
= CKR_TOKEN_NOT_PRESENT
;
4185 fwToken
= nssCKFWSlot_GetToken(fwSlot
, &error
);
4186 if( (NSSCKFWToken
*)NULL
== fwToken
) {
4190 fwMechanism
= nssCKFWToken_GetMechanism(fwToken
, pMechanism
->mechanism
, &error
);
4191 if( (NSSCKFWMechanism
*)NULL
== fwMechanism
) {
4195 error
= nssCKFWMechanism_VerifyInit(fwMechanism
, pMechanism
, fwSession
,
4198 nssCKFWMechanism_Destroy(fwMechanism
);
4200 if (CKR_OK
== error
) {
4207 case CKR_ARGUMENTS_BAD
:
4208 case CKR_CRYPTOKI_NOT_INITIALIZED
:
4209 case CKR_DEVICE_ERROR
:
4210 case CKR_DEVICE_MEMORY
:
4211 case CKR_DEVICE_REMOVED
:
4212 case CKR_FUNCTION_CANCELED
:
4213 case CKR_FUNCTION_FAILED
:
4214 case CKR_GENERAL_ERROR
:
4215 case CKR_HOST_MEMORY
:
4216 case CKR_KEY_FUNCTION_NOT_PERMITTED
:
4217 case CKR_KEY_HANDLE_INVALID
:
4218 case CKR_KEY_SIZE_RANGE
:
4219 case CKR_KEY_TYPE_INCONSISTENT
:
4220 case CKR_MECHANISM_INVALID
:
4221 case CKR_MECHANISM_PARAM_INVALID
:
4222 case CKR_OPERATION_ACTIVE
:
4223 case CKR_PIN_EXPIRED
:
4224 case CKR_SESSION_CLOSED
:
4225 case CKR_SESSION_HANDLE_INVALID
:
4226 case CKR_USER_NOT_LOGGED_IN
:
4230 error
= CKR_GENERAL_ERROR
;
4243 NSSCKFWInstance
*fwInstance
,
4244 CK_SESSION_HANDLE hSession
,
4247 CK_BYTE_PTR pSignature
,
4248 CK_ULONG ulSignatureLen
4251 CK_RV error
= CKR_OK
;
4252 NSSCKFWSession
*fwSession
;
4254 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
4255 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
4259 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
4260 if( (NSSCKFWSession
*)NULL
== fwSession
) {
4261 error
= CKR_SESSION_HANDLE_INVALID
;
4265 error
= nssCKFWSession_UpdateFinal(fwSession
,
4266 NSSCKFWCryptoOperationType_Verify
,
4267 NSSCKFWCryptoOperationState_SignVerify
,
4268 pData
, ulDataLen
, pSignature
, &ulSignatureLen
);
4270 if (CKR_OK
== error
) {
4277 case CKR_ARGUMENTS_BAD
:
4278 case CKR_CRYPTOKI_NOT_INITIALIZED
:
4279 case CKR_DATA_INVALID
:
4280 case CKR_DATA_LEN_RANGE
:
4281 case CKR_DEVICE_ERROR
:
4282 case CKR_DEVICE_MEMORY
:
4283 case CKR_DEVICE_REMOVED
:
4284 case CKR_FUNCTION_CANCELED
:
4285 case CKR_FUNCTION_FAILED
:
4286 case CKR_GENERAL_ERROR
:
4287 case CKR_HOST_MEMORY
:
4288 case CKR_OPERATION_NOT_INITIALIZED
:
4289 case CKR_SESSION_CLOSED
:
4290 case CKR_SESSION_HANDLE_INVALID
:
4291 case CKR_SIGNATURE_INVALID
:
4292 case CKR_SIGNATURE_LEN_RANGE
:
4296 error
= CKR_GENERAL_ERROR
;
4303 * NSSCKFWC_VerifyUpdate
4307 NSSCKFWC_VerifyUpdate
4309 NSSCKFWInstance
*fwInstance
,
4310 CK_SESSION_HANDLE hSession
,
4315 CK_RV error
= CKR_OK
;
4316 NSSCKFWSession
*fwSession
;
4318 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
4319 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
4323 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
4324 if( (NSSCKFWSession
*)NULL
== fwSession
) {
4325 error
= CKR_SESSION_HANDLE_INVALID
;
4329 error
= nssCKFWSession_DigestUpdate(fwSession
,
4330 NSSCKFWCryptoOperationType_Verify
,
4331 NSSCKFWCryptoOperationState_SignVerify
,
4334 if (CKR_OK
== error
) {
4341 case CKR_ARGUMENTS_BAD
:
4342 case CKR_CRYPTOKI_NOT_INITIALIZED
:
4343 case CKR_DATA_LEN_RANGE
:
4344 case CKR_DEVICE_ERROR
:
4345 case CKR_DEVICE_MEMORY
:
4346 case CKR_DEVICE_REMOVED
:
4347 case CKR_FUNCTION_CANCELED
:
4348 case CKR_FUNCTION_FAILED
:
4349 case CKR_GENERAL_ERROR
:
4350 case CKR_HOST_MEMORY
:
4351 case CKR_OPERATION_NOT_INITIALIZED
:
4352 case CKR_SESSION_CLOSED
:
4353 case CKR_SESSION_HANDLE_INVALID
:
4357 error
= CKR_GENERAL_ERROR
;
4364 * NSSCKFWC_VerifyFinal
4368 NSSCKFWC_VerifyFinal
4370 NSSCKFWInstance
*fwInstance
,
4371 CK_SESSION_HANDLE hSession
,
4372 CK_BYTE_PTR pSignature
,
4373 CK_ULONG ulSignatureLen
4376 CK_RV error
= CKR_OK
;
4377 NSSCKFWSession
*fwSession
;
4379 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
4380 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
4384 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
4385 if( (NSSCKFWSession
*)NULL
== fwSession
) {
4386 error
= CKR_SESSION_HANDLE_INVALID
;
4390 error
= nssCKFWSession_Final(fwSession
,
4391 NSSCKFWCryptoOperationType_Verify
,
4392 NSSCKFWCryptoOperationState_SignVerify
,
4393 pSignature
, &ulSignatureLen
);
4395 if (CKR_OK
== error
) {
4402 case CKR_ARGUMENTS_BAD
:
4403 case CKR_CRYPTOKI_NOT_INITIALIZED
:
4404 case CKR_DATA_LEN_RANGE
:
4405 case CKR_DEVICE_ERROR
:
4406 case CKR_DEVICE_MEMORY
:
4407 case CKR_DEVICE_REMOVED
:
4408 case CKR_FUNCTION_CANCELED
:
4409 case CKR_FUNCTION_FAILED
:
4410 case CKR_GENERAL_ERROR
:
4411 case CKR_HOST_MEMORY
:
4412 case CKR_OPERATION_NOT_INITIALIZED
:
4413 case CKR_SESSION_CLOSED
:
4414 case CKR_SESSION_HANDLE_INVALID
:
4415 case CKR_SIGNATURE_INVALID
:
4416 case CKR_SIGNATURE_LEN_RANGE
:
4420 error
= CKR_GENERAL_ERROR
;
4427 * NSSCKFWC_VerifyRecoverInit
4431 NSSCKFWC_VerifyRecoverInit
4433 NSSCKFWInstance
*fwInstance
,
4434 CK_SESSION_HANDLE hSession
,
4435 CK_MECHANISM_PTR pMechanism
,
4436 CK_OBJECT_HANDLE hKey
4439 CK_RV error
= CKR_OK
;
4440 NSSCKFWSession
*fwSession
;
4441 NSSCKFWObject
*fwObject
;
4442 NSSCKFWSlot
*fwSlot
;
4443 NSSCKFWToken
*fwToken
;
4444 NSSCKFWMechanism
*fwMechanism
;
4446 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
4447 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
4451 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
4452 if( (NSSCKFWSession
*)NULL
== fwSession
) {
4453 error
= CKR_SESSION_HANDLE_INVALID
;
4457 fwObject
= nssCKFWInstance_ResolveObjectHandle(fwInstance
, hKey
);
4458 if( (NSSCKFWObject
*)NULL
== fwObject
) {
4459 error
= CKR_KEY_HANDLE_INVALID
;
4463 fwSlot
= nssCKFWSession_GetFWSlot(fwSession
);
4464 if( (NSSCKFWSlot
*)NULL
== fwSlot
) {
4465 error
= CKR_GENERAL_ERROR
; /* should never happen! */
4469 if( CK_TRUE
!= nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
4470 error
= CKR_TOKEN_NOT_PRESENT
;
4474 fwToken
= nssCKFWSlot_GetToken(fwSlot
, &error
);
4475 if( (NSSCKFWToken
*)NULL
== fwToken
) {
4479 fwMechanism
= nssCKFWToken_GetMechanism(fwToken
, pMechanism
->mechanism
, &error
);
4480 if( (NSSCKFWMechanism
*)NULL
== fwMechanism
) {
4484 error
= nssCKFWMechanism_VerifyRecoverInit(fwMechanism
, pMechanism
,
4485 fwSession
, fwObject
);
4487 nssCKFWMechanism_Destroy(fwMechanism
);
4489 if (CKR_OK
== error
) {
4496 case CKR_ARGUMENTS_BAD
:
4497 case CKR_CRYPTOKI_NOT_INITIALIZED
:
4498 case CKR_DEVICE_ERROR
:
4499 case CKR_DEVICE_MEMORY
:
4500 case CKR_DEVICE_REMOVED
:
4501 case CKR_FUNCTION_CANCELED
:
4502 case CKR_FUNCTION_FAILED
:
4503 case CKR_GENERAL_ERROR
:
4504 case CKR_HOST_MEMORY
:
4505 case CKR_KEY_FUNCTION_NOT_PERMITTED
:
4506 case CKR_KEY_HANDLE_INVALID
:
4507 case CKR_KEY_SIZE_RANGE
:
4508 case CKR_KEY_TYPE_INCONSISTENT
:
4509 case CKR_MECHANISM_INVALID
:
4510 case CKR_MECHANISM_PARAM_INVALID
:
4511 case CKR_OPERATION_ACTIVE
:
4512 case CKR_PIN_EXPIRED
:
4513 case CKR_SESSION_HANDLE_INVALID
:
4514 case CKR_SESSION_CLOSED
:
4515 case CKR_USER_NOT_LOGGED_IN
:
4519 error
= CKR_GENERAL_ERROR
;
4526 * NSSCKFWC_VerifyRecover
4530 NSSCKFWC_VerifyRecover
4532 NSSCKFWInstance
*fwInstance
,
4533 CK_SESSION_HANDLE hSession
,
4534 CK_BYTE_PTR pSignature
,
4535 CK_ULONG ulSignatureLen
,
4537 CK_ULONG_PTR pulDataLen
4540 CK_RV error
= CKR_OK
;
4541 NSSCKFWSession
*fwSession
;
4543 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
4544 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
4548 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
4549 if( (NSSCKFWSession
*)NULL
== fwSession
) {
4550 error
= CKR_SESSION_HANDLE_INVALID
;
4554 error
= nssCKFWSession_UpdateFinal(fwSession
,
4555 NSSCKFWCryptoOperationType_VerifyRecover
,
4556 NSSCKFWCryptoOperationState_SignVerify
,
4557 pSignature
, ulSignatureLen
, pData
, pulDataLen
);
4558 if (CKR_OK
== error
) {
4564 case CKR_ARGUMENTS_BAD
:
4565 case CKR_BUFFER_TOO_SMALL
:
4566 case CKR_CRYPTOKI_NOT_INITIALIZED
:
4567 case CKR_DATA_INVALID
:
4568 case CKR_DATA_LEN_RANGE
:
4569 case CKR_DEVICE_ERROR
:
4570 case CKR_DEVICE_MEMORY
:
4571 case CKR_DEVICE_REMOVED
:
4572 case CKR_FUNCTION_CANCELED
:
4573 case CKR_FUNCTION_FAILED
:
4574 case CKR_GENERAL_ERROR
:
4575 case CKR_HOST_MEMORY
:
4576 case CKR_OPERATION_NOT_INITIALIZED
:
4577 case CKR_SESSION_CLOSED
:
4578 case CKR_SESSION_HANDLE_INVALID
:
4579 case CKR_SIGNATURE_INVALID
:
4580 case CKR_SIGNATURE_LEN_RANGE
:
4584 error
= CKR_GENERAL_ERROR
;
4591 * NSSCKFWC_DigestEncryptUpdate
4595 NSSCKFWC_DigestEncryptUpdate
4597 NSSCKFWInstance
*fwInstance
,
4598 CK_SESSION_HANDLE hSession
,
4601 CK_BYTE_PTR pEncryptedPart
,
4602 CK_ULONG_PTR pulEncryptedPartLen
4605 CK_RV error
= CKR_OK
;
4606 NSSCKFWSession
*fwSession
;
4608 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
4609 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
4613 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
4614 if( (NSSCKFWSession
*)NULL
== fwSession
) {
4615 error
= CKR_SESSION_HANDLE_INVALID
;
4619 error
= nssCKFWSession_UpdateCombo(fwSession
,
4620 NSSCKFWCryptoOperationType_Encrypt
,
4621 NSSCKFWCryptoOperationType_Digest
,
4622 NSSCKFWCryptoOperationState_Digest
,
4623 pPart
, ulPartLen
, pEncryptedPart
, pulEncryptedPartLen
);
4625 if (CKR_OK
== error
) {
4632 case CKR_ARGUMENTS_BAD
:
4633 case CKR_BUFFER_TOO_SMALL
:
4634 case CKR_CRYPTOKI_NOT_INITIALIZED
:
4635 case CKR_DATA_LEN_RANGE
:
4636 case CKR_DEVICE_ERROR
:
4637 case CKR_DEVICE_MEMORY
:
4638 case CKR_DEVICE_REMOVED
:
4639 case CKR_FUNCTION_CANCELED
:
4640 case CKR_FUNCTION_FAILED
:
4641 case CKR_GENERAL_ERROR
:
4642 case CKR_HOST_MEMORY
:
4643 case CKR_OPERATION_NOT_INITIALIZED
:
4644 case CKR_SESSION_CLOSED
:
4645 case CKR_SESSION_HANDLE_INVALID
:
4649 error
= CKR_GENERAL_ERROR
;
4656 * NSSCKFWC_DecryptDigestUpdate
4660 NSSCKFWC_DecryptDigestUpdate
4662 NSSCKFWInstance
*fwInstance
,
4663 CK_SESSION_HANDLE hSession
,
4664 CK_BYTE_PTR pEncryptedPart
,
4665 CK_ULONG ulEncryptedPartLen
,
4667 CK_ULONG_PTR pulPartLen
4670 CK_RV error
= CKR_OK
;
4671 NSSCKFWSession
*fwSession
;
4673 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
4674 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
4678 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
4679 if( (NSSCKFWSession
*)NULL
== fwSession
) {
4680 error
= CKR_SESSION_HANDLE_INVALID
;
4684 error
= nssCKFWSession_UpdateCombo(fwSession
,
4685 NSSCKFWCryptoOperationType_Decrypt
,
4686 NSSCKFWCryptoOperationType_Digest
,
4687 NSSCKFWCryptoOperationState_Digest
,
4688 pEncryptedPart
, ulEncryptedPartLen
, pPart
, pulPartLen
);
4690 if (CKR_OK
== error
) {
4697 case CKR_ARGUMENTS_BAD
:
4698 case CKR_BUFFER_TOO_SMALL
:
4699 case CKR_CRYPTOKI_NOT_INITIALIZED
:
4700 case CKR_DEVICE_ERROR
:
4701 case CKR_DEVICE_MEMORY
:
4702 case CKR_DEVICE_REMOVED
:
4703 case CKR_ENCRYPTED_DATA_INVALID
:
4704 case CKR_ENCRYPTED_DATA_LEN_RANGE
:
4705 case CKR_FUNCTION_CANCELED
:
4706 case CKR_FUNCTION_FAILED
:
4707 case CKR_GENERAL_ERROR
:
4708 case CKR_HOST_MEMORY
:
4709 case CKR_OPERATION_NOT_INITIALIZED
:
4710 case CKR_SESSION_CLOSED
:
4711 case CKR_SESSION_HANDLE_INVALID
:
4713 case CKR_DATA_INVALID
:
4714 error
= CKR_ENCRYPTED_DATA_INVALID
;
4716 case CKR_DATA_LEN_RANGE
:
4717 error
= CKR_ENCRYPTED_DATA_LEN_RANGE
;
4721 error
= CKR_GENERAL_ERROR
;
4728 * NSSCKFWC_SignEncryptUpdate
4732 NSSCKFWC_SignEncryptUpdate
4734 NSSCKFWInstance
*fwInstance
,
4735 CK_SESSION_HANDLE hSession
,
4738 CK_BYTE_PTR pEncryptedPart
,
4739 CK_ULONG_PTR pulEncryptedPartLen
4742 CK_RV error
= CKR_OK
;
4743 NSSCKFWSession
*fwSession
;
4745 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
4746 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
4750 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
4751 if( (NSSCKFWSession
*)NULL
== fwSession
) {
4752 error
= CKR_SESSION_HANDLE_INVALID
;
4756 error
= nssCKFWSession_UpdateCombo(fwSession
,
4757 NSSCKFWCryptoOperationType_Encrypt
,
4758 NSSCKFWCryptoOperationType_Sign
,
4759 NSSCKFWCryptoOperationState_SignVerify
,
4760 pPart
, ulPartLen
, pEncryptedPart
, pulEncryptedPartLen
);
4762 if (CKR_OK
== error
) {
4769 case CKR_ARGUMENTS_BAD
:
4770 case CKR_BUFFER_TOO_SMALL
:
4771 case CKR_CRYPTOKI_NOT_INITIALIZED
:
4772 case CKR_DATA_LEN_RANGE
:
4773 case CKR_DEVICE_ERROR
:
4774 case CKR_DEVICE_MEMORY
:
4775 case CKR_DEVICE_REMOVED
:
4776 case CKR_FUNCTION_CANCELED
:
4777 case CKR_FUNCTION_FAILED
:
4778 case CKR_GENERAL_ERROR
:
4779 case CKR_HOST_MEMORY
:
4780 case CKR_OPERATION_NOT_INITIALIZED
:
4781 case CKR_SESSION_CLOSED
:
4782 case CKR_SESSION_HANDLE_INVALID
:
4783 case CKR_USER_NOT_LOGGED_IN
:
4787 error
= CKR_GENERAL_ERROR
;
4794 * NSSCKFWC_DecryptVerifyUpdate
4798 NSSCKFWC_DecryptVerifyUpdate
4800 NSSCKFWInstance
*fwInstance
,
4801 CK_SESSION_HANDLE hSession
,
4802 CK_BYTE_PTR pEncryptedPart
,
4803 CK_ULONG ulEncryptedPartLen
,
4805 CK_ULONG_PTR pulPartLen
4808 CK_RV error
= CKR_OK
;
4809 NSSCKFWSession
*fwSession
;
4811 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
4812 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
4816 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
4817 if( (NSSCKFWSession
*)NULL
== fwSession
) {
4818 error
= CKR_SESSION_HANDLE_INVALID
;
4822 error
= nssCKFWSession_UpdateCombo(fwSession
,
4823 NSSCKFWCryptoOperationType_Decrypt
,
4824 NSSCKFWCryptoOperationType_Verify
,
4825 NSSCKFWCryptoOperationState_SignVerify
,
4826 pEncryptedPart
, ulEncryptedPartLen
, pPart
, pulPartLen
);
4828 if (CKR_OK
== error
) {
4835 case CKR_ARGUMENTS_BAD
:
4836 case CKR_BUFFER_TOO_SMALL
:
4837 case CKR_CRYPTOKI_NOT_INITIALIZED
:
4838 case CKR_DATA_LEN_RANGE
:
4839 case CKR_DEVICE_ERROR
:
4840 case CKR_DEVICE_MEMORY
:
4841 case CKR_DEVICE_REMOVED
:
4842 case CKR_ENCRYPTED_DATA_INVALID
:
4843 case CKR_ENCRYPTED_DATA_LEN_RANGE
:
4844 case CKR_FUNCTION_CANCELED
:
4845 case CKR_FUNCTION_FAILED
:
4846 case CKR_GENERAL_ERROR
:
4847 case CKR_HOST_MEMORY
:
4848 case CKR_OPERATION_NOT_INITIALIZED
:
4849 case CKR_SESSION_CLOSED
:
4850 case CKR_SESSION_HANDLE_INVALID
:
4852 case CKR_DATA_INVALID
:
4853 error
= CKR_ENCRYPTED_DATA_INVALID
;
4857 error
= CKR_GENERAL_ERROR
;
4864 * NSSCKFWC_GenerateKey
4868 NSSCKFWC_GenerateKey
4870 NSSCKFWInstance
*fwInstance
,
4871 CK_SESSION_HANDLE hSession
,
4872 CK_MECHANISM_PTR pMechanism
,
4873 CK_ATTRIBUTE_PTR pTemplate
,
4875 CK_OBJECT_HANDLE_PTR phKey
4878 CK_RV error
= CKR_OK
;
4879 NSSCKFWSession
*fwSession
;
4880 NSSCKFWObject
*fwObject
;
4881 NSSCKFWSlot
*fwSlot
;
4882 NSSCKFWToken
*fwToken
;
4883 NSSCKFWMechanism
*fwMechanism
;
4885 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
4886 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
4890 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
4891 if( (NSSCKFWSession
*)NULL
== fwSession
) {
4892 error
= CKR_SESSION_HANDLE_INVALID
;
4896 fwSlot
= nssCKFWSession_GetFWSlot(fwSession
);
4897 if( (NSSCKFWSlot
*)NULL
== fwSlot
) {
4898 error
= CKR_GENERAL_ERROR
; /* should never happen! */
4902 if( CK_TRUE
!= nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
4903 error
= CKR_TOKEN_NOT_PRESENT
;
4907 fwToken
= nssCKFWSlot_GetToken(fwSlot
, &error
);
4908 if( (NSSCKFWToken
*)NULL
== fwToken
) {
4912 fwMechanism
= nssCKFWToken_GetMechanism(fwToken
, pMechanism
->mechanism
, &error
);
4913 if( (NSSCKFWMechanism
*)NULL
== fwMechanism
) {
4917 fwObject
= nssCKFWMechanism_GenerateKey(
4925 nssCKFWMechanism_Destroy(fwMechanism
);
4926 if ((NSSCKFWObject
*)NULL
== fwObject
) {
4929 *phKey
= nssCKFWInstance_CreateObjectHandle(fwInstance
, fwObject
, &error
);
4931 if (CKR_OK
== error
) {
4938 case CKR_ARGUMENTS_BAD
:
4939 case CKR_ATTRIBUTE_READ_ONLY
:
4940 case CKR_ATTRIBUTE_TYPE_INVALID
:
4941 case CKR_ATTRIBUTE_VALUE_INVALID
:
4942 case CKR_CRYPTOKI_NOT_INITIALIZED
:
4943 case CKR_DEVICE_ERROR
:
4944 case CKR_DEVICE_MEMORY
:
4945 case CKR_DEVICE_REMOVED
:
4946 case CKR_FUNCTION_CANCELED
:
4947 case CKR_FUNCTION_FAILED
:
4948 case CKR_GENERAL_ERROR
:
4949 case CKR_HOST_MEMORY
:
4950 case CKR_MECHANISM_INVALID
:
4951 case CKR_MECHANISM_PARAM_INVALID
:
4952 case CKR_OPERATION_ACTIVE
:
4953 case CKR_PIN_EXPIRED
:
4954 case CKR_SESSION_CLOSED
:
4955 case CKR_SESSION_HANDLE_INVALID
:
4956 case CKR_SESSION_READ_ONLY
:
4957 case CKR_TEMPLATE_INCOMPLETE
:
4958 case CKR_TEMPLATE_INCONSISTENT
:
4959 case CKR_TOKEN_WRITE_PROTECTED
:
4960 case CKR_USER_NOT_LOGGED_IN
:
4964 error
= CKR_GENERAL_ERROR
;
4971 * NSSCKFWC_GenerateKeyPair
4975 NSSCKFWC_GenerateKeyPair
4977 NSSCKFWInstance
*fwInstance
,
4978 CK_SESSION_HANDLE hSession
,
4979 CK_MECHANISM_PTR pMechanism
,
4980 CK_ATTRIBUTE_PTR pPublicKeyTemplate
,
4981 CK_ULONG ulPublicKeyAttributeCount
,
4982 CK_ATTRIBUTE_PTR pPrivateKeyTemplate
,
4983 CK_ULONG ulPrivateKeyAttributeCount
,
4984 CK_OBJECT_HANDLE_PTR phPublicKey
,
4985 CK_OBJECT_HANDLE_PTR phPrivateKey
4988 CK_RV error
= CKR_OK
;
4989 NSSCKFWSession
*fwSession
;
4990 NSSCKFWObject
*fwPrivateKeyObject
;
4991 NSSCKFWObject
*fwPublicKeyObject
;
4992 NSSCKFWSlot
*fwSlot
;
4993 NSSCKFWToken
*fwToken
;
4994 NSSCKFWMechanism
*fwMechanism
;
4996 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
4997 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
5001 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
5002 if( (NSSCKFWSession
*)NULL
== fwSession
) {
5003 error
= CKR_SESSION_HANDLE_INVALID
;
5007 fwSlot
= nssCKFWSession_GetFWSlot(fwSession
);
5008 if( (NSSCKFWSlot
*)NULL
== fwSlot
) {
5009 error
= CKR_GENERAL_ERROR
; /* should never happen! */
5013 if( CK_TRUE
!= nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
5014 error
= CKR_TOKEN_NOT_PRESENT
;
5018 fwToken
= nssCKFWSlot_GetToken(fwSlot
, &error
);
5019 if( (NSSCKFWToken
*)NULL
== fwToken
) {
5023 fwMechanism
= nssCKFWToken_GetMechanism(fwToken
, pMechanism
->mechanism
, &error
);
5024 if( (NSSCKFWMechanism
*)NULL
== fwMechanism
) {
5028 error
= nssCKFWMechanism_GenerateKeyPair(
5033 ulPublicKeyAttributeCount
,
5035 ulPublicKeyAttributeCount
,
5037 &fwPrivateKeyObject
);
5039 nssCKFWMechanism_Destroy(fwMechanism
);
5040 if (CKR_OK
!= error
) {
5043 *phPublicKey
= nssCKFWInstance_CreateObjectHandle(fwInstance
,
5046 if (CKR_OK
!= error
) {
5049 *phPrivateKey
= nssCKFWInstance_CreateObjectHandle(fwInstance
,
5052 if (CKR_OK
== error
) {
5059 case CKR_ARGUMENTS_BAD
:
5060 case CKR_ATTRIBUTE_READ_ONLY
:
5061 case CKR_ATTRIBUTE_TYPE_INVALID
:
5062 case CKR_ATTRIBUTE_VALUE_INVALID
:
5063 case CKR_CRYPTOKI_NOT_INITIALIZED
:
5064 case CKR_DEVICE_ERROR
:
5065 case CKR_DEVICE_MEMORY
:
5066 case CKR_DEVICE_REMOVED
:
5067 case CKR_DOMAIN_PARAMS_INVALID
:
5068 case CKR_FUNCTION_CANCELED
:
5069 case CKR_FUNCTION_FAILED
:
5070 case CKR_GENERAL_ERROR
:
5071 case CKR_HOST_MEMORY
:
5072 case CKR_MECHANISM_INVALID
:
5073 case CKR_MECHANISM_PARAM_INVALID
:
5074 case CKR_OPERATION_ACTIVE
:
5075 case CKR_PIN_EXPIRED
:
5076 case CKR_SESSION_CLOSED
:
5077 case CKR_SESSION_HANDLE_INVALID
:
5078 case CKR_SESSION_READ_ONLY
:
5079 case CKR_TEMPLATE_INCOMPLETE
:
5080 case CKR_TEMPLATE_INCONSISTENT
:
5081 case CKR_TOKEN_WRITE_PROTECTED
:
5082 case CKR_USER_NOT_LOGGED_IN
:
5086 error
= CKR_GENERAL_ERROR
;
5099 NSSCKFWInstance
*fwInstance
,
5100 CK_SESSION_HANDLE hSession
,
5101 CK_MECHANISM_PTR pMechanism
,
5102 CK_OBJECT_HANDLE hWrappingKey
,
5103 CK_OBJECT_HANDLE hKey
,
5104 CK_BYTE_PTR pWrappedKey
,
5105 CK_ULONG_PTR pulWrappedKeyLen
5108 CK_RV error
= CKR_OK
;
5109 NSSCKFWSession
*fwSession
;
5110 NSSCKFWObject
*fwKeyObject
;
5111 NSSCKFWObject
*fwWrappingKeyObject
;
5112 NSSCKFWSlot
*fwSlot
;
5113 NSSCKFWToken
*fwToken
;
5114 NSSCKFWMechanism
*fwMechanism
;
5116 CK_ULONG wrappedKeyLength
= 0;
5118 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
5119 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
5123 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
5124 if( (NSSCKFWSession
*)NULL
== fwSession
) {
5125 error
= CKR_SESSION_HANDLE_INVALID
;
5129 fwWrappingKeyObject
= nssCKFWInstance_ResolveObjectHandle(fwInstance
,
5131 if( (NSSCKFWObject
*)NULL
== fwWrappingKeyObject
) {
5132 error
= CKR_WRAPPING_KEY_HANDLE_INVALID
;
5136 fwKeyObject
= nssCKFWInstance_ResolveObjectHandle(fwInstance
, hKey
);
5137 if( (NSSCKFWObject
*)NULL
== fwKeyObject
) {
5138 error
= CKR_KEY_HANDLE_INVALID
;
5142 fwSlot
= nssCKFWSession_GetFWSlot(fwSession
);
5143 if( (NSSCKFWSlot
*)NULL
== fwSlot
) {
5144 error
= CKR_GENERAL_ERROR
; /* should never happen! */
5148 if( CK_TRUE
!= nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
5149 error
= CKR_TOKEN_NOT_PRESENT
;
5153 fwToken
= nssCKFWSlot_GetToken(fwSlot
, &error
);
5154 if( (NSSCKFWToken
*)NULL
== fwToken
) {
5158 fwMechanism
= nssCKFWToken_GetMechanism(fwToken
, pMechanism
->mechanism
, &error
);
5159 if( (NSSCKFWMechanism
*)NULL
== fwMechanism
) {
5164 * first get the length...
5166 wrappedKeyLength
= nssCKFWMechanism_GetWrapKeyLength(
5170 fwWrappingKeyObject
,
5173 if ((CK_ULONG
) 0 == wrappedKeyLength
) {
5174 nssCKFWMechanism_Destroy(fwMechanism
);
5177 if ((CK_BYTE_PTR
)NULL
== pWrappedKey
) {
5178 *pulWrappedKeyLen
= wrappedKeyLength
;
5179 nssCKFWMechanism_Destroy(fwMechanism
);
5182 if (wrappedKeyLength
> *pulWrappedKeyLen
) {
5183 *pulWrappedKeyLen
= wrappedKeyLength
;
5184 nssCKFWMechanism_Destroy(fwMechanism
);
5185 error
= CKR_BUFFER_TOO_SMALL
;
5190 wrappedKey
.data
= pWrappedKey
;
5191 wrappedKey
.size
= wrappedKeyLength
;
5193 error
= nssCKFWMechanism_WrapKey(
5197 fwWrappingKeyObject
,
5201 nssCKFWMechanism_Destroy(fwMechanism
);
5202 *pulWrappedKeyLen
= wrappedKey
.size
;
5204 if (CKR_OK
== error
) {
5211 case CKR_ARGUMENTS_BAD
:
5212 case CKR_BUFFER_TOO_SMALL
:
5213 case CKR_CRYPTOKI_NOT_INITIALIZED
:
5214 case CKR_DEVICE_ERROR
:
5215 case CKR_DEVICE_MEMORY
:
5216 case CKR_DEVICE_REMOVED
:
5217 case CKR_FUNCTION_CANCELED
:
5218 case CKR_FUNCTION_FAILED
:
5219 case CKR_GENERAL_ERROR
:
5220 case CKR_HOST_MEMORY
:
5221 case CKR_KEY_HANDLE_INVALID
:
5222 case CKR_KEY_NOT_WRAPPABLE
:
5223 case CKR_KEY_SIZE_RANGE
:
5224 case CKR_KEY_UNEXTRACTABLE
:
5225 case CKR_MECHANISM_INVALID
:
5226 case CKR_MECHANISM_PARAM_INVALID
:
5227 case CKR_OPERATION_ACTIVE
:
5228 case CKR_PIN_EXPIRED
:
5229 case CKR_SESSION_CLOSED
:
5230 case CKR_SESSION_HANDLE_INVALID
:
5231 case CKR_WRAPPING_KEY_HANDLE_INVALID
:
5232 case CKR_WRAPPING_KEY_SIZE_RANGE
:
5233 case CKR_WRAPPING_KEY_TYPE_INCONSISTENT
:
5235 case CKR_KEY_TYPE_INCONSISTENT
:
5236 error
= CKR_WRAPPING_KEY_TYPE_INCONSISTENT
;
5240 error
= CKR_GENERAL_ERROR
;
5247 * NSSCKFWC_UnwrapKey
5253 NSSCKFWInstance
*fwInstance
,
5254 CK_SESSION_HANDLE hSession
,
5255 CK_MECHANISM_PTR pMechanism
,
5256 CK_OBJECT_HANDLE hUnwrappingKey
,
5257 CK_BYTE_PTR pWrappedKey
,
5258 CK_ULONG ulWrappedKeyLen
,
5259 CK_ATTRIBUTE_PTR pTemplate
,
5260 CK_ULONG ulAttributeCount
,
5261 CK_OBJECT_HANDLE_PTR phKey
5264 CK_RV error
= CKR_OK
;
5265 NSSCKFWSession
*fwSession
;
5266 NSSCKFWObject
*fwObject
;
5267 NSSCKFWObject
*fwWrappingKeyObject
;
5268 NSSCKFWSlot
*fwSlot
;
5269 NSSCKFWToken
*fwToken
;
5270 NSSCKFWMechanism
*fwMechanism
;
5273 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
5274 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
5278 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
5279 if( (NSSCKFWSession
*)NULL
== fwSession
) {
5280 error
= CKR_SESSION_HANDLE_INVALID
;
5284 fwWrappingKeyObject
= nssCKFWInstance_ResolveObjectHandle(fwInstance
,
5286 if( (NSSCKFWObject
*)NULL
== fwWrappingKeyObject
) {
5287 error
= CKR_WRAPPING_KEY_HANDLE_INVALID
;
5291 fwSlot
= nssCKFWSession_GetFWSlot(fwSession
);
5292 if( (NSSCKFWSlot
*)NULL
== fwSlot
) {
5293 error
= CKR_GENERAL_ERROR
; /* should never happen! */
5297 if( CK_TRUE
!= nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
5298 error
= CKR_TOKEN_NOT_PRESENT
;
5302 fwToken
= nssCKFWSlot_GetToken(fwSlot
, &error
);
5303 if( (NSSCKFWToken
*)NULL
== fwToken
) {
5307 fwMechanism
= nssCKFWToken_GetMechanism(fwToken
, pMechanism
->mechanism
, &error
);
5308 if( (NSSCKFWMechanism
*)NULL
== fwMechanism
) {
5312 wrappedKey
.data
= pWrappedKey
;
5313 wrappedKey
.size
= ulWrappedKeyLen
;
5315 fwObject
= nssCKFWMechanism_UnwrapKey(
5319 fwWrappingKeyObject
,
5325 nssCKFWMechanism_Destroy(fwMechanism
);
5326 if ((NSSCKFWObject
*)NULL
== fwObject
) {
5329 *phKey
= nssCKFWInstance_CreateObjectHandle(fwInstance
, fwObject
, &error
);
5331 if (CKR_OK
== error
) {
5338 case CKR_ARGUMENTS_BAD
:
5339 case CKR_ATTRIBUTE_READ_ONLY
:
5340 case CKR_ATTRIBUTE_TYPE_INVALID
:
5341 case CKR_ATTRIBUTE_VALUE_INVALID
:
5342 case CKR_BUFFER_TOO_SMALL
:
5343 case CKR_CRYPTOKI_NOT_INITIALIZED
:
5344 case CKR_DEVICE_ERROR
:
5345 case CKR_DEVICE_MEMORY
:
5346 case CKR_DEVICE_REMOVED
:
5347 case CKR_DOMAIN_PARAMS_INVALID
:
5348 case CKR_FUNCTION_CANCELED
:
5349 case CKR_FUNCTION_FAILED
:
5350 case CKR_GENERAL_ERROR
:
5351 case CKR_HOST_MEMORY
:
5352 case CKR_MECHANISM_INVALID
:
5353 case CKR_MECHANISM_PARAM_INVALID
:
5354 case CKR_OPERATION_ACTIVE
:
5355 case CKR_PIN_EXPIRED
:
5356 case CKR_SESSION_CLOSED
:
5357 case CKR_SESSION_HANDLE_INVALID
:
5358 case CKR_SESSION_READ_ONLY
:
5359 case CKR_TEMPLATE_INCOMPLETE
:
5360 case CKR_TEMPLATE_INCONSISTENT
:
5361 case CKR_TOKEN_WRITE_PROTECTED
:
5362 case CKR_UNWRAPPING_KEY_HANDLE_INVALID
:
5363 case CKR_UNWRAPPING_KEY_SIZE_RANGE
:
5364 case CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT
:
5365 case CKR_USER_NOT_LOGGED_IN
:
5366 case CKR_WRAPPED_KEY_INVALID
:
5367 case CKR_WRAPPED_KEY_LEN_RANGE
:
5369 case CKR_KEY_HANDLE_INVALID
:
5370 error
= CKR_UNWRAPPING_KEY_HANDLE_INVALID
;
5372 case CKR_KEY_SIZE_RANGE
:
5373 error
= CKR_UNWRAPPING_KEY_SIZE_RANGE
;
5375 case CKR_KEY_TYPE_INCONSISTENT
:
5376 error
= CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT
;
5378 case CKR_ENCRYPTED_DATA_INVALID
:
5379 error
= CKR_WRAPPED_KEY_INVALID
;
5381 case CKR_ENCRYPTED_DATA_LEN_RANGE
:
5382 error
= CKR_WRAPPED_KEY_LEN_RANGE
;
5386 error
= CKR_GENERAL_ERROR
;
5393 * NSSCKFWC_DeriveKey
5399 NSSCKFWInstance
*fwInstance
,
5400 CK_SESSION_HANDLE hSession
,
5401 CK_MECHANISM_PTR pMechanism
,
5402 CK_OBJECT_HANDLE hBaseKey
,
5403 CK_ATTRIBUTE_PTR pTemplate
,
5404 CK_ULONG ulAttributeCount
,
5405 CK_OBJECT_HANDLE_PTR phKey
5408 CK_RV error
= CKR_OK
;
5409 NSSCKFWSession
*fwSession
;
5410 NSSCKFWObject
*fwObject
;
5411 NSSCKFWObject
*fwBaseKeyObject
;
5412 NSSCKFWSlot
*fwSlot
;
5413 NSSCKFWToken
*fwToken
;
5414 NSSCKFWMechanism
*fwMechanism
;
5416 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
5417 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
5421 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
5422 if( (NSSCKFWSession
*)NULL
== fwSession
) {
5423 error
= CKR_SESSION_HANDLE_INVALID
;
5427 fwBaseKeyObject
= nssCKFWInstance_ResolveObjectHandle(fwInstance
, hBaseKey
);
5428 if( (NSSCKFWObject
*)NULL
== fwBaseKeyObject
) {
5429 error
= CKR_KEY_HANDLE_INVALID
;
5433 fwSlot
= nssCKFWSession_GetFWSlot(fwSession
);
5434 if( (NSSCKFWSlot
*)NULL
== fwSlot
) {
5435 error
= CKR_GENERAL_ERROR
; /* should never happen! */
5439 if( CK_TRUE
!= nssCKFWSlot_GetTokenPresent(fwSlot
) ) {
5440 error
= CKR_TOKEN_NOT_PRESENT
;
5444 fwToken
= nssCKFWSlot_GetToken(fwSlot
, &error
);
5445 if( (NSSCKFWToken
*)NULL
== fwToken
) {
5449 fwMechanism
= nssCKFWToken_GetMechanism(fwToken
, pMechanism
->mechanism
, &error
);
5450 if( (NSSCKFWMechanism
*)NULL
== fwMechanism
) {
5454 fwObject
= nssCKFWMechanism_DeriveKey(
5463 nssCKFWMechanism_Destroy(fwMechanism
);
5464 if ((NSSCKFWObject
*)NULL
== fwObject
) {
5467 *phKey
= nssCKFWInstance_CreateObjectHandle(fwInstance
, fwObject
, &error
);
5469 if (CKR_OK
== error
) {
5476 case CKR_ARGUMENTS_BAD
:
5477 case CKR_ATTRIBUTE_READ_ONLY
:
5478 case CKR_ATTRIBUTE_TYPE_INVALID
:
5479 case CKR_ATTRIBUTE_VALUE_INVALID
:
5480 case CKR_CRYPTOKI_NOT_INITIALIZED
:
5481 case CKR_DEVICE_ERROR
:
5482 case CKR_DEVICE_MEMORY
:
5483 case CKR_DEVICE_REMOVED
:
5484 case CKR_DOMAIN_PARAMS_INVALID
:
5485 case CKR_FUNCTION_CANCELED
:
5486 case CKR_FUNCTION_FAILED
:
5487 case CKR_GENERAL_ERROR
:
5488 case CKR_HOST_MEMORY
:
5489 case CKR_KEY_HANDLE_INVALID
:
5490 case CKR_KEY_SIZE_RANGE
:
5491 case CKR_KEY_TYPE_INCONSISTENT
:
5492 case CKR_MECHANISM_INVALID
:
5493 case CKR_MECHANISM_PARAM_INVALID
:
5494 case CKR_OPERATION_ACTIVE
:
5495 case CKR_PIN_EXPIRED
:
5496 case CKR_SESSION_CLOSED
:
5497 case CKR_SESSION_HANDLE_INVALID
:
5498 case CKR_SESSION_READ_ONLY
:
5499 case CKR_TEMPLATE_INCOMPLETE
:
5500 case CKR_TEMPLATE_INCONSISTENT
:
5501 case CKR_TOKEN_WRITE_PROTECTED
:
5502 case CKR_USER_NOT_LOGGED_IN
:
5506 error
= CKR_GENERAL_ERROR
;
5513 * NSSCKFWC_SeedRandom
5519 NSSCKFWInstance
*fwInstance
,
5520 CK_SESSION_HANDLE hSession
,
5525 CK_RV error
= CKR_OK
;
5526 NSSCKFWSession
*fwSession
;
5529 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
5530 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
5534 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
5535 if( (NSSCKFWSession
*)NULL
== fwSession
) {
5536 error
= CKR_SESSION_HANDLE_INVALID
;
5540 if( (CK_BYTE_PTR
)CK_NULL_PTR
== pSeed
) {
5541 error
= CKR_ARGUMENTS_BAD
;
5545 /* We could read through the buffer in a Purify trap */
5547 seed
.size
= (PRUint32
)ulSeedLen
;
5548 seed
.data
= (void *)pSeed
;
5550 error
= nssCKFWSession_SeedRandom(fwSession
, &seed
);
5552 if( CKR_OK
!= error
) {
5560 case CKR_SESSION_CLOSED
:
5561 /* destroy session? */
5563 case CKR_DEVICE_REMOVED
:
5564 /* (void)nssCKFWToken_Destroy(fwToken); */
5566 case CKR_ARGUMENTS_BAD
:
5567 case CKR_CRYPTOKI_NOT_INITIALIZED
:
5568 case CKR_DEVICE_ERROR
:
5569 case CKR_DEVICE_MEMORY
:
5570 case CKR_FUNCTION_CANCELED
:
5571 case CKR_FUNCTION_FAILED
:
5572 case CKR_GENERAL_ERROR
:
5573 case CKR_HOST_MEMORY
:
5574 case CKR_OPERATION_ACTIVE
:
5575 case CKR_RANDOM_SEED_NOT_SUPPORTED
:
5576 case CKR_RANDOM_NO_RNG
:
5577 case CKR_SESSION_HANDLE_INVALID
:
5578 case CKR_USER_NOT_LOGGED_IN
:
5582 error
= CKR_GENERAL_ERROR
;
5590 * NSSCKFWC_GenerateRandom
5594 NSSCKFWC_GenerateRandom
5596 NSSCKFWInstance
*fwInstance
,
5597 CK_SESSION_HANDLE hSession
,
5598 CK_BYTE_PTR pRandomData
,
5599 CK_ULONG ulRandomLen
5602 CK_RV error
= CKR_OK
;
5603 NSSCKFWSession
*fwSession
;
5606 if( (NSSCKFWInstance
*)NULL
== fwInstance
) {
5607 error
= CKR_CRYPTOKI_NOT_INITIALIZED
;
5611 fwSession
= nssCKFWInstance_ResolveSessionHandle(fwInstance
, hSession
);
5612 if( (NSSCKFWSession
*)NULL
== fwSession
) {
5613 error
= CKR_SESSION_HANDLE_INVALID
;
5617 if( (CK_BYTE_PTR
)CK_NULL_PTR
== pRandomData
) {
5618 error
= CKR_ARGUMENTS_BAD
;
5623 * A purify error here indicates caller error.
5625 (void)nsslibc_memset(pRandomData
, 0, ulRandomLen
);
5627 buffer
.size
= (PRUint32
)ulRandomLen
;
5628 buffer
.data
= (void *)pRandomData
;
5630 error
= nssCKFWSession_GetRandom(fwSession
, &buffer
);
5632 if( CKR_OK
!= error
) {
5640 case CKR_SESSION_CLOSED
:
5641 /* destroy session? */
5643 case CKR_DEVICE_REMOVED
:
5644 /* (void)nssCKFWToken_Destroy(fwToken); */
5646 case CKR_ARGUMENTS_BAD
:
5647 case CKR_CRYPTOKI_NOT_INITIALIZED
:
5648 case CKR_DEVICE_ERROR
:
5649 case CKR_DEVICE_MEMORY
:
5650 case CKR_FUNCTION_CANCELED
:
5651 case CKR_FUNCTION_FAILED
:
5652 case CKR_GENERAL_ERROR
:
5653 case CKR_HOST_MEMORY
:
5654 case CKR_OPERATION_ACTIVE
:
5655 case CKR_RANDOM_NO_RNG
:
5656 case CKR_SESSION_HANDLE_INVALID
:
5657 case CKR_USER_NOT_LOGGED_IN
:
5661 error
= CKR_GENERAL_ERROR
;
5669 * NSSCKFWC_GetFunctionStatus
5673 NSSCKFWC_GetFunctionStatus
5675 NSSCKFWInstance
*fwInstance
,
5676 CK_SESSION_HANDLE hSession
5679 return CKR_FUNCTION_NOT_PARALLEL
;
5683 * NSSCKFWC_CancelFunction
5687 NSSCKFWC_CancelFunction
5689 NSSCKFWInstance
*fwInstance
,
5690 CK_SESSION_HANDLE hSession
5693 return CKR_FUNCTION_NOT_PARALLEL
;