wrap.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:69k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /* 
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. #ifdef DEBUG
  34. static const char CVS_ID[] = "@(#) $RCSfile: wrap.c,v $ $Revision: 1.3 $ $Date: 2000/09/06 22:23:57 $ $Name: NSS_3_1_1_RTM $";
  35. #endif /* DEBUG */
  36. /*
  37.  * wrap.c
  38.  *
  39.  * This file contains the routines that actually implement the cryptoki
  40.  * API, using the internal APIs of the NSS Cryptoki Framework.  There is
  41.  * one routine here for every cryptoki routine.  For linking reasons
  42.  * the actual entry points passed back with C_GetFunctionList have to
  43.  * exist in one of the Module's source files; however, those are merely
  44.  * simple wrappers that call these routines.  The intelligence of the
  45.  * implementations is here.
  46.  */
  47. #ifndef CK_T
  48. #include "ck.h"
  49. #endif /* CK_T */
  50. /*
  51.  * NSSCKFWC_Initialize
  52.  * NSSCKFWC_Finalize
  53.  * NSSCKFWC_GetInfo
  54.  * -- NSSCKFWC_GetFunctionList -- see the API insert file
  55.  * NSSCKFWC_GetSlotList
  56.  * NSSCKFWC_GetSlotInfo
  57.  * NSSCKFWC_GetTokenInfo
  58.  * NSSCKFWC_WaitForSlotEvent
  59.  * NSSCKFWC_GetMechanismList
  60.  * NSSCKFWC_GetMechanismInfo
  61.  * NSSCKFWC_InitToken
  62.  * NSSCKFWC_InitPIN
  63.  * NSSCKFWC_SetPIN
  64.  * NSSCKFWC_OpenSession
  65.  * NSSCKFWC_CloseSession
  66.  * NSSCKFWC_CloseAllSessions
  67.  * NSSCKFWC_GetSessionInfo
  68.  * NSSCKFWC_GetOperationState
  69.  * NSSCKFWC_SetOperationState
  70.  * NSSCKFWC_Login
  71.  * NSSCKFWC_Logout
  72.  * NSSCKFWC_CreateObject
  73.  * NSSCKFWC_CopyObject
  74.  * NSSCKFWC_DestroyObject
  75.  * NSSCKFWC_GetObjectSize
  76.  * NSSCKFWC_GetAttributeValue
  77.  * NSSCKFWC_SetAttributeValue
  78.  * NSSCKFWC_FindObjectsInit
  79.  * NSSCKFWC_FindObjects
  80.  * NSSCKFWC_FindObjectsFinal
  81.  * NSSCKFWC_EncryptInit
  82.  * NSSCKFWC_Encrypt
  83.  * NSSCKFWC_EncryptUpdate
  84.  * NSSCKFWC_EncryptFinal
  85.  * NSSCKFWC_DecryptInit
  86.  * NSSCKFWC_Decrypt
  87.  * NSSCKFWC_DecryptUpdate
  88.  * NSSCKFWC_DecryptFinal
  89.  * NSSCKFWC_DigestInit
  90.  * NSSCKFWC_Digest
  91.  * NSSCKFWC_DigestUpdate
  92.  * NSSCKFWC_DigestKey
  93.  * NSSCKFWC_DigestFinal
  94.  * NSSCKFWC_SignInit
  95.  * NSSCKFWC_Sign
  96.  * NSSCKFWC_SignUpdate
  97.  * NSSCKFWC_SignFinal
  98.  * NSSCKFWC_SignRecoverInit
  99.  * NSSCKFWC_SignRecover
  100.  * NSSCKFWC_VerifyInit
  101.  * NSSCKFWC_Verify
  102.  * NSSCKFWC_VerifyUpdate
  103.  * NSSCKFWC_VerifyFinal
  104.  * NSSCKFWC_VerifyRecoverInit
  105.  * NSSCKFWC_VerifyRecover
  106.  * NSSCKFWC_DigestEncryptUpdate
  107.  * NSSCKFWC_DecryptDigestUpdate
  108.  * NSSCKFWC_SignEncryptUpdate
  109.  * NSSCKFWC_DecryptVerifyUpdate
  110.  * NSSCKFWC_GenerateKey
  111.  * NSSCKFWC_GenerateKeyPair
  112.  * NSSCKFWC_WrapKey
  113.  * NSSCKFWC_UnwrapKey
  114.  * NSSCKFWC_DeriveKey
  115.  * NSSCKFWC_SeedRandom
  116.  * NSSCKFWC_GenerateRandom
  117.  * NSSCKFWC_GetFunctionStatus
  118.  * NSSCKFWC_CancelFunction
  119.  */
  120. /*
  121.  * NSSCKFWC_Initialize
  122.  *
  123.  */
  124. NSS_IMPLEMENT CK_RV
  125. NSSCKFWC_Initialize
  126. (
  127.   NSSCKFWInstance **pFwInstance,
  128.   NSSCKMDInstance *mdInstance,
  129.   CK_VOID_PTR pInitArgs
  130. )
  131. {
  132.   CK_RV error = CKR_OK;
  133.   if( (NSSCKFWInstance **)NULL == pFwInstance ) {
  134.     error = CKR_GENERAL_ERROR;
  135.     goto loser;
  136.   }
  137.   if( (NSSCKFWInstance *)NULL != *pFwInstance ) {
  138.     error = CKR_CRYPTOKI_ALREADY_INITIALIZED;
  139.     goto loser;
  140.   }
  141.   if( (NSSCKMDInstance *)NULL == mdInstance ) {
  142.     error = CKR_GENERAL_ERROR;
  143.     goto loser;
  144.   }
  145.   /* remember the locking args for those times we need to get a lock in code
  146.    * outside the framework.
  147.    */
  148.   nssSetLockArgs(pInitArgs);
  149.   *pFwInstance = nssCKFWInstance_Create(pInitArgs, mdInstance, &error);
  150.   if( (NSSCKFWInstance *)NULL == *pFwInstance ) {
  151.     goto loser;
  152.   }
  153.   return CKR_OK;
  154.  loser:
  155.   switch( error ) {
  156.   case CKR_ARGUMENTS_BAD:
  157.   case CKR_CANT_LOCK:
  158.   case CKR_CRYPTOKI_ALREADY_INITIALIZED:
  159.   case CKR_FUNCTION_FAILED:
  160.   case CKR_GENERAL_ERROR:
  161.   case CKR_HOST_MEMORY:
  162.   case CKR_NEED_TO_CREATE_THREADS:
  163.     break;
  164.   default:
  165.   case CKR_OK:
  166.     error = CKR_GENERAL_ERROR;
  167.     break;
  168.   }
  169.   return error;
  170. }
  171. /*
  172.  * NSSCKFWC_Finalize
  173.  *
  174.  */
  175. NSS_IMPLEMENT CK_RV
  176. NSSCKFWC_Finalize
  177. (
  178.   NSSCKFWInstance **pFwInstance
  179. )
  180. {
  181.   CK_RV error = CKR_OK;
  182.   if( (NSSCKFWInstance **)NULL == pFwInstance ) {
  183.     error = CKR_GENERAL_ERROR;
  184.     goto loser;
  185.   }
  186.   if( (NSSCKFWInstance *)NULL == *pFwInstance ) {
  187.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  188.     goto loser;
  189.   }
  190.   error = nssCKFWInstance_Destroy(*pFwInstance);
  191.   /* In any case */
  192.   *pFwInstance = (NSSCKFWInstance *)NULL;
  193.  loser:
  194.   switch( error ) {
  195.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  196.   case CKR_FUNCTION_FAILED:
  197.   case CKR_GENERAL_ERROR:
  198.   case CKR_HOST_MEMORY:
  199.   case CKR_OK:
  200.     break;
  201.   default:
  202.     error = CKR_GENERAL_ERROR;
  203.     break;
  204.   }
  205.   return error;
  206. }
  207. /*
  208.  * NSSCKFWC_GetInfo
  209.  *
  210.  */
  211. NSS_IMPLEMENT CK_RV
  212. NSSCKFWC_GetInfo
  213. (
  214.   NSSCKFWInstance *fwInstance,
  215.   CK_INFO_PTR pInfo
  216. )
  217. {
  218.   CK_RV error = CKR_OK;
  219.   if( (CK_INFO_PTR)CK_NULL_PTR == pInfo ) {
  220.     error = CKR_ARGUMENTS_BAD;
  221.     goto loser;
  222.   }
  223.   /*
  224.    * A purify error here means a caller error
  225.    */
  226.   (void)nsslibc_memset(pInfo, 0, sizeof(CK_INFO));
  227.   pInfo->cryptokiVersion = nssCKFWInstance_GetCryptokiVersion(fwInstance);
  228.   error = nssCKFWInstance_GetManufacturerID(fwInstance, pInfo->manufacturerID);
  229.   if( CKR_OK != error ) {
  230.     goto loser;
  231.   }
  232.   pInfo->flags = nssCKFWInstance_GetFlags(fwInstance);
  233.   error = nssCKFWInstance_GetLibraryDescription(fwInstance, pInfo->libraryDescription);
  234.   if( CKR_OK != error ) {
  235.     goto loser;
  236.   }
  237.   pInfo->libraryVersion = nssCKFWInstance_GetLibraryVersion(fwInstance);
  238.   return CKR_OK;
  239.  loser:
  240.   switch( error ) {
  241.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  242.   case CKR_FUNCTION_FAILED:
  243.   case CKR_GENERAL_ERROR:
  244.   case CKR_HOST_MEMORY:
  245.     break;
  246.   default:
  247.     error = CKR_GENERAL_ERROR;
  248.     break;
  249.   }
  250.   return error;
  251. }
  252.   
  253. /*
  254.  * C_GetFunctionList is implemented entirely in the Module's file which
  255.  * includes the Framework API insert file.  It requires no "actual"
  256.  * NSSCKFW routine.
  257.  */
  258. /*
  259.  * NSSCKFWC_GetSlotList
  260.  *
  261.  */
  262. NSS_IMPLEMENT CK_RV
  263. NSSCKFWC_GetSlotList
  264. (
  265.   NSSCKFWInstance *fwInstance,
  266.   CK_BBOOL tokenPresent,
  267.   CK_SLOT_ID_PTR pSlotList,
  268.   CK_ULONG_PTR pulCount
  269. )
  270. {
  271.   CK_RV error = CKR_OK;
  272.   CK_ULONG nSlots;
  273.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  274.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  275.     goto loser;
  276.   }
  277.   switch( tokenPresent ) {
  278.   case CK_TRUE:
  279.   case CK_FALSE:
  280.     break;
  281.   default:
  282.     error = CKR_ARGUMENTS_BAD;
  283.     goto loser;
  284.   }
  285.   if( (CK_ULONG_PTR)CK_NULL_PTR == pulCount ) {
  286.     error = CKR_ARGUMENTS_BAD;
  287.     goto loser;
  288.   }
  289.   nSlots = nssCKFWInstance_GetNSlots(fwInstance, &error);
  290.   if( (CK_ULONG)0 == nSlots ) {
  291.     goto loser;
  292.   }
  293.   if( (CK_SLOT_ID_PTR)CK_NULL_PTR == pSlotList ) {
  294.     *pulCount = nSlots;
  295.     return CKR_OK;
  296.   } 
  297.     
  298.   /*
  299.    * A purify error here indicates caller error.
  300.    */
  301.   (void)nsslibc_memset(pSlotList, 0, *pulCount * sizeof(CK_SLOT_ID));
  302.   if( *pulCount < nSlots ) {
  303.     *pulCount = nSlots;
  304.     error = CKR_BUFFER_TOO_SMALL;
  305.     goto loser;
  306.   } else {
  307.     CK_ULONG i;
  308.     *pulCount = nSlots;
  309.     
  310.     /* 
  311.      * Our secret "mapping": CK_SLOT_IDs are integers [1,N], and we
  312.      * just index one when we need it.
  313.      */
  314.     for( i = 0; i < nSlots; i++ ) {
  315.       pSlotList[i] = i+1;
  316.     }
  317.     return CKR_OK;
  318.   }
  319.  loser:
  320.   switch( error ) {
  321.   case CKR_BUFFER_TOO_SMALL:
  322.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  323.   case CKR_FUNCTION_FAILED:
  324.   case CKR_GENERAL_ERROR:
  325.   case CKR_HOST_MEMORY:
  326.     break;
  327.   default:
  328.   case CKR_OK:
  329.     error = CKR_GENERAL_ERROR;
  330.     break;
  331.   }
  332.   return error;
  333. }
  334.  
  335. /*
  336.  * NSSCKFWC_GetSlotInfo
  337.  *
  338.  */
  339. NSS_IMPLEMENT CK_RV
  340. NSSCKFWC_GetSlotInfo
  341. (
  342.   NSSCKFWInstance *fwInstance,
  343.   CK_SLOT_ID slotID,
  344.   CK_SLOT_INFO_PTR pInfo
  345. )
  346. {
  347.   CK_RV error = CKR_OK;
  348.   CK_ULONG nSlots;
  349.   NSSCKFWSlot **slots;
  350.   NSSCKFWSlot *fwSlot;
  351.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  352.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  353.     goto loser;
  354.   }
  355.   nSlots = nssCKFWInstance_GetNSlots(fwInstance, &error);
  356.   if( (CK_ULONG)0 == nSlots ) {
  357.     goto loser;
  358.   }
  359.   if( (slotID < 1) || (slotID > nSlots) ) {
  360.     error = CKR_SLOT_ID_INVALID;
  361.     goto loser;
  362.   }
  363.   if( (CK_SLOT_INFO_PTR)CK_NULL_PTR == pInfo ) {
  364.     error = CKR_ARGUMENTS_BAD;
  365.     goto loser;
  366.   }
  367.   /*
  368.    * A purify error here indicates caller error.
  369.    */
  370.   (void)nsslibc_memset(pInfo, 0, sizeof(CK_SLOT_INFO));
  371.   slots = nssCKFWInstance_GetSlots(fwInstance, &error);
  372.   if( (NSSCKFWSlot **)NULL == slots ) {
  373.     goto loser;
  374.   }
  375.   fwSlot = slots[ slotID-1 ];
  376.   error = nssCKFWSlot_GetSlotDescription(fwSlot, pInfo->slotDescription);
  377.   if( CKR_OK != error ) {
  378.     goto loser;
  379.   }
  380.   error = nssCKFWSlot_GetManufacturerID(fwSlot, pInfo->manufacturerID);
  381.   if( CKR_OK != error ) {
  382.     goto loser;
  383.   }
  384.   if( nssCKFWSlot_GetTokenPresent(fwSlot) ) {
  385.     pInfo->flags |= CKF_TOKEN_PRESENT;
  386.   }
  387.   if( nssCKFWSlot_GetRemovableDevice(fwSlot) ) {
  388.     pInfo->flags |= CKF_REMOVABLE_DEVICE;
  389.   }
  390.   if( nssCKFWSlot_GetHardwareSlot(fwSlot) ) {
  391.     pInfo->flags |= CKF_HW_SLOT;
  392.   }
  393.   pInfo->hardwareVersion = nssCKFWSlot_GetHardwareVersion(fwSlot);
  394.   pInfo->firmwareVersion = nssCKFWSlot_GetFirmwareVersion(fwSlot);
  395.   return CKR_OK;
  396.  loser:
  397.   switch( error ) {
  398.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  399.   case CKR_DEVICE_ERROR:
  400.   case CKR_FUNCTION_FAILED:
  401.   case CKR_GENERAL_ERROR:
  402.   case CKR_HOST_MEMORY:
  403.   case CKR_SLOT_ID_INVALID:
  404.     break;
  405.   default:
  406.   case CKR_OK:
  407.     error = CKR_GENERAL_ERROR;
  408.   }
  409.   return error;
  410. }
  411. /*
  412.  * NSSCKFWC_GetTokenInfo
  413.  *
  414.  */
  415. NSS_IMPLEMENT CK_RV
  416. NSSCKFWC_GetTokenInfo
  417. (
  418.   NSSCKFWInstance *fwInstance,
  419.   CK_SLOT_ID slotID,
  420.   CK_TOKEN_INFO_PTR pInfo
  421. )
  422. {
  423.   CK_RV error = CKR_OK;
  424.   CK_ULONG nSlots;
  425.   NSSCKFWSlot **slots;
  426.   NSSCKFWSlot *fwSlot;
  427.   NSSCKFWToken *fwToken = (NSSCKFWToken *)NULL;
  428.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  429.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  430.     goto loser;
  431.   }
  432.   nSlots = nssCKFWInstance_GetNSlots(fwInstance, &error);
  433.   if( (CK_ULONG)0 == nSlots ) {
  434.     goto loser;
  435.   }
  436.   if( (slotID < 1) || (slotID > nSlots) ) {
  437.     error = CKR_SLOT_ID_INVALID;
  438.     goto loser;
  439.   }
  440.   if( (CK_TOKEN_INFO_PTR)CK_NULL_PTR == pInfo ) {
  441.     error = CKR_ARGUMENTS_BAD;
  442.     goto loser;
  443.   }
  444.   /*
  445.    * A purify error here indicates caller error.
  446.    */
  447.   (void)nsslibc_memset(pInfo, 0, sizeof(CK_TOKEN_INFO));
  448.   slots = nssCKFWInstance_GetSlots(fwInstance, &error);
  449.   if( (NSSCKFWSlot **)NULL == slots ) {
  450.     goto loser;
  451.   }
  452.   fwSlot = slots[ slotID-1 ];
  453.   if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) {
  454.     error = CKR_TOKEN_NOT_PRESENT;
  455.     goto loser;
  456.   }
  457.   fwToken = nssCKFWSlot_GetToken(fwSlot, &error);
  458.   if( (NSSCKFWToken *)NULL == fwToken ) {
  459.     goto loser;
  460.   }
  461.   error = nssCKFWToken_GetLabel(fwToken, pInfo->label);
  462.   if( CKR_OK != error ) {
  463.     goto loser;
  464.   }
  465.   error = nssCKFWToken_GetManufacturerID(fwToken, pInfo->manufacturerID);
  466.   if( CKR_OK != error ) {
  467.     goto loser;
  468.   }
  469.   error = nssCKFWToken_GetModel(fwToken, pInfo->model);
  470.   if( CKR_OK != error ) {
  471.     goto loser;
  472.   }
  473.   error = nssCKFWToken_GetSerialNumber(fwToken, pInfo->serialNumber);
  474.   if( CKR_OK != error ) {
  475.     goto loser;
  476.   }
  477.   if( nssCKFWToken_GetHasRNG(fwToken) ) {
  478.     pInfo->flags |= CKF_RNG;
  479.   }
  480.   if( nssCKFWToken_GetIsWriteProtected(fwToken) ) {
  481.     pInfo->flags |= CKF_WRITE_PROTECTED;
  482.   }
  483.   if( nssCKFWToken_GetLoginRequired(fwToken) ) {
  484.     pInfo->flags |= CKF_LOGIN_REQUIRED;
  485.   }
  486.   if( nssCKFWToken_GetUserPinInitialized(fwToken) ) {
  487.     pInfo->flags |= CKF_USER_PIN_INITIALIZED;
  488.   }
  489.   if( nssCKFWToken_GetRestoreKeyNotNeeded(fwToken) ) {
  490.     pInfo->flags |= CKF_RESTORE_KEY_NOT_NEEDED;
  491.   }
  492.   if( nssCKFWToken_GetHasClockOnToken(fwToken) ) {
  493.     pInfo->flags |= CKF_CLOCK_ON_TOKEN;
  494.   }
  495.   if( nssCKFWToken_GetHasProtectedAuthenticationPath(fwToken) ) {
  496.     pInfo->flags |= CKF_PROTECTED_AUTHENTICATION_PATH;
  497.   }
  498.   if( nssCKFWToken_GetSupportsDualCryptoOperations(fwToken) ) {
  499.     pInfo->flags |= CKF_DUAL_CRYPTO_OPERATIONS;
  500.   }
  501.   pInfo->ulMaxSessionCount = nssCKFWToken_GetMaxSessionCount(fwToken);
  502.   pInfo->ulSessionCount = nssCKFWToken_GetSessionCount(fwToken);
  503.   pInfo->ulMaxRwSessionCount = nssCKFWToken_GetMaxRwSessionCount(fwToken);
  504.   pInfo->ulRwSessionCount= nssCKFWToken_GetRwSessionCount(fwToken);
  505.   pInfo->ulMaxPinLen = nssCKFWToken_GetMaxPinLen(fwToken);
  506.   pInfo->ulMinPinLen = nssCKFWToken_GetMinPinLen(fwToken);
  507.   pInfo->ulTotalPublicMemory = nssCKFWToken_GetTotalPublicMemory(fwToken);
  508.   pInfo->ulFreePublicMemory = nssCKFWToken_GetFreePublicMemory(fwToken);
  509.   pInfo->ulTotalPrivateMemory = nssCKFWToken_GetTotalPrivateMemory(fwToken);
  510.   pInfo->ulFreePrivateMemory = nssCKFWToken_GetFreePrivateMemory(fwToken);
  511.   pInfo->hardwareVersion = nssCKFWToken_GetHardwareVersion(fwToken);
  512.   pInfo->firmwareVersion = nssCKFWToken_GetFirmwareVersion(fwToken);
  513.   
  514.   error = nssCKFWToken_GetUTCTime(fwToken, pInfo->utcTime);
  515.   if( CKR_OK != error ) {
  516.     goto loser;
  517.   }
  518.   return CKR_OK;
  519.  loser:
  520.   switch( error ) {
  521.   case CKR_DEVICE_REMOVED:
  522.   case CKR_TOKEN_NOT_PRESENT:
  523.     (void)nssCKFWToken_Destroy(fwToken);
  524.     break;
  525.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  526.   case CKR_DEVICE_ERROR:
  527.   case CKR_DEVICE_MEMORY:
  528.   case CKR_FUNCTION_FAILED:
  529.   case CKR_GENERAL_ERROR:
  530.   case CKR_HOST_MEMORY:
  531.   case CKR_SLOT_ID_INVALID:
  532.   case CKR_TOKEN_NOT_RECOGNIZED:
  533.     break;
  534.   default:
  535.   case CKR_OK:
  536.     error = CKR_GENERAL_ERROR;
  537.     break;
  538.   }
  539.   return error;
  540. }
  541. /*
  542.  * NSSCKFWC_WaitForSlotEvent
  543.  *
  544.  */
  545. NSS_IMPLEMENT CK_RV
  546. NSSCKFWC_WaitForSlotEvent
  547. (
  548.   NSSCKFWInstance *fwInstance,
  549.   CK_FLAGS flags,
  550.   CK_SLOT_ID_PTR pSlot,
  551.   CK_VOID_PTR pReserved
  552. )
  553. {
  554.   CK_RV error = CKR_OK;
  555.   CK_ULONG nSlots;
  556.   CK_BBOOL block;
  557.   NSSCKFWSlot **slots;
  558.   NSSCKFWSlot *fwSlot;
  559.   CK_ULONG i;
  560.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  561.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  562.     goto loser;
  563.   }
  564.   if( flags & ~CKF_DONT_BLOCK ) {
  565.     error = CKR_ARGUMENTS_BAD;
  566.     goto loser;
  567.   }
  568.   block = (flags & CKF_DONT_BLOCK) ? CK_TRUE : CK_FALSE;
  569.   nSlots = nssCKFWInstance_GetNSlots(fwInstance, &error);
  570.   if( (CK_ULONG)0 == nSlots ) {
  571.     goto loser;
  572.   }
  573.   if( (CK_SLOT_ID_PTR)CK_NULL_PTR == pSlot ) {
  574.     error = CKR_ARGUMENTS_BAD;
  575.     goto loser;
  576.   }
  577.   if( (CK_VOID_PTR)CK_NULL_PTR != pReserved ) {
  578.     error = CKR_ARGUMENTS_BAD;
  579.     goto loser;
  580.   }
  581.   slots = nssCKFWInstance_GetSlots(fwInstance, &error);
  582.   if( (NSSCKFWSlot **)NULL == slots ) {
  583.     goto loser;
  584.   }
  585.   fwSlot = nssCKFWInstance_WaitForSlotEvent(fwInstance, block, &error);
  586.   if( (NSSCKFWSlot *)NULL == fwSlot ) {
  587.     goto loser;
  588.   }
  589.   for( i = 0; i < nSlots; i++ ) {
  590.     if( fwSlot == slots[i] ) {
  591.       *pSlot = (CK_SLOT_ID)(CK_ULONG)(i+1);
  592.     }
  593.     return CKR_OK;
  594.   }
  595.   error = CKR_GENERAL_ERROR; /* returned something not in the slot list */
  596.  loser:
  597.   switch( error ) {
  598.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  599.   case CKR_FUNCTION_FAILED:
  600.   case CKR_GENERAL_ERROR:
  601.   case CKR_HOST_MEMORY:
  602.   case CKR_NO_EVENT:
  603.     break;
  604.   default:
  605.   case CKR_OK:
  606.     error = CKR_GENERAL_ERROR;
  607.     break;
  608.   }
  609.   return error;
  610. }
  611. /*
  612.  * NSSCKFWC_GetMechanismList
  613.  *
  614.  */
  615. NSS_IMPLEMENT CK_RV
  616. NSSCKFWC_GetMechanismList
  617. (
  618.   NSSCKFWInstance *fwInstance,
  619.   CK_SLOT_ID slotID,
  620.   CK_MECHANISM_TYPE_PTR pMechanismList,
  621.   CK_ULONG_PTR pulCount
  622. )
  623. {
  624.   CK_RV error = CKR_OK;
  625.   CK_ULONG nSlots;
  626.   NSSCKFWSlot **slots;
  627.   NSSCKFWSlot *fwSlot;
  628.   NSSCKFWToken *fwToken = (NSSCKFWToken *)NULL;
  629.   CK_ULONG count;
  630.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  631.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  632.     goto loser;
  633.   }
  634.   nSlots = nssCKFWInstance_GetNSlots(fwInstance, &error);
  635.   if( (CK_ULONG)0 == nSlots ) {
  636.     goto loser;
  637.   }
  638.   if( (slotID < 1) || (slotID > nSlots) ) {
  639.     error = CKR_SLOT_ID_INVALID;
  640.     goto loser;
  641.   }
  642.   if( (CK_ULONG_PTR)CK_NULL_PTR == pulCount ) {
  643.     error = CKR_ARGUMENTS_BAD;
  644.     goto loser;
  645.   }
  646.   slots = nssCKFWInstance_GetSlots(fwInstance, &error);
  647.   if( (NSSCKFWSlot **)NULL == slots ) {
  648.     goto loser;
  649.   }
  650.   fwSlot = slots[ slotID-1 ];
  651.   if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) {
  652.     error = CKR_TOKEN_NOT_PRESENT;
  653.     goto loser;
  654.   }
  655.   fwToken = nssCKFWSlot_GetToken(fwSlot, &error);
  656.   if( (NSSCKFWToken *)NULL == fwToken ) {
  657.     goto loser;
  658.   }
  659.   count = nssCKFWToken_GetMechanismCount(fwToken);
  660.   if( (CK_MECHANISM_TYPE_PTR)CK_NULL_PTR == pMechanismList ) {
  661.     *pulCount = count;
  662.     return CKR_OK;
  663.   }
  664.   if( *pulCount < count ) {
  665.     *pulCount = count;
  666.     error = CKR_BUFFER_TOO_SMALL;
  667.     goto loser;
  668.   }
  669.   /*
  670.    * A purify error here indicates caller error.
  671.    */
  672.   (void)nsslibc_memset(pMechanismList, 0, *pulCount * sizeof(CK_MECHANISM_TYPE));
  673.   *pulCount = count;
  674.   if( 0 != count ) {
  675.     error = nssCKFWToken_GetMechanismTypes(fwToken, pMechanismList);
  676.   } else {
  677.     error = CKR_OK;
  678.   }
  679.   if( CKR_OK == error ) {
  680.     return CKR_OK;
  681.   }
  682.  loser:
  683.   switch( error ) {
  684.   case CKR_DEVICE_REMOVED:
  685.   case CKR_TOKEN_NOT_PRESENT:
  686.     (void)nssCKFWToken_Destroy(fwToken);
  687.     break;
  688.   case CKR_BUFFER_TOO_SMALL:
  689.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  690.   case CKR_DEVICE_ERROR:
  691.   case CKR_DEVICE_MEMORY:
  692.   case CKR_FUNCTION_FAILED:
  693.   case CKR_GENERAL_ERROR:
  694.   case CKR_HOST_MEMORY:
  695.   case CKR_SLOT_ID_INVALID:
  696.   case CKR_TOKEN_NOT_RECOGNIZED:
  697.     break;
  698.   default:
  699.   case CKR_OK:
  700.     error = CKR_GENERAL_ERROR;
  701.     break;
  702.   }
  703.   return error;
  704. }
  705. /*
  706.  * NSSCKFWC_GetMechanismInfo
  707.  *
  708.  */
  709. NSS_IMPLEMENT CK_RV
  710. NSSCKFWC_GetMechanismInfo
  711. (
  712.   NSSCKFWInstance *fwInstance,
  713.   CK_SLOT_ID slotID,
  714.   CK_MECHANISM_TYPE type,
  715.   CK_MECHANISM_INFO_PTR pInfo
  716. )
  717. {
  718.   CK_RV error = CKR_OK;
  719.   CK_ULONG nSlots;
  720.   NSSCKFWSlot **slots;
  721.   NSSCKFWSlot *fwSlot;
  722.   NSSCKFWToken *fwToken = (NSSCKFWToken *)NULL;
  723.   NSSCKFWMechanism *fwMechanism;
  724.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  725.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  726.     goto loser;
  727.   }
  728.   nSlots = nssCKFWInstance_GetNSlots(fwInstance, &error);
  729.   if( (CK_ULONG)0 == nSlots ) {
  730.     goto loser;
  731.   }
  732.   if( (slotID < 1) || (slotID > nSlots) ) {
  733.     error = CKR_SLOT_ID_INVALID;
  734.     goto loser;
  735.   }
  736.   slots = nssCKFWInstance_GetSlots(fwInstance, &error);
  737.   if( (NSSCKFWSlot **)NULL == slots ) {
  738.     goto loser;
  739.   }
  740.   fwSlot = slots[ slotID-1 ];
  741.   if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) {
  742.     error = CKR_TOKEN_NOT_PRESENT;
  743.     goto loser;
  744.   }
  745.   if( (CK_MECHANISM_INFO_PTR)CK_NULL_PTR == pInfo ) {
  746.     error = CKR_ARGUMENTS_BAD;
  747.     goto loser;
  748.   }
  749.   /*
  750.    * A purify error here indicates caller error.
  751.    */
  752.   (void)nsslibc_memset(pInfo, 0, sizeof(CK_MECHANISM_INFO));
  753.   fwToken = nssCKFWSlot_GetToken(fwSlot, &error);
  754.   if( (NSSCKFWToken *)NULL == fwToken ) {
  755.     goto loser;
  756.   }
  757.   fwMechanism = nssCKFWToken_GetMechanism(fwToken, type, &error);
  758.   if( (NSSCKFWMechanism *)NULL == fwMechanism ) {
  759.     goto loser;
  760.   }
  761.   pInfo->ulMinKeySize = nssCKFWMechanism_GetMinKeySize(fwMechanism);
  762.   pInfo->ulMaxKeySize = nssCKFWMechanism_GetMaxKeySize(fwMechanism);
  763.   if( nssCKFWMechanism_GetInHardware(fwMechanism) ) {
  764.     pInfo->flags |= CKF_HW;
  765.   }
  766.   /* More here... */
  767.   return CKR_OK;
  768.  loser:
  769.   switch( error ) {
  770.   case CKR_DEVICE_REMOVED:
  771.   case CKR_TOKEN_NOT_PRESENT:
  772.     (void)nssCKFWToken_Destroy(fwToken);
  773.     break;
  774.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  775.   case CKR_DEVICE_ERROR:
  776.   case CKR_DEVICE_MEMORY:
  777.   case CKR_FUNCTION_FAILED:
  778.   case CKR_GENERAL_ERROR:
  779.   case CKR_HOST_MEMORY:
  780.   case CKR_MECHANISM_INVALID:
  781.   case CKR_SLOT_ID_INVALID:
  782.   case CKR_TOKEN_NOT_RECOGNIZED:
  783.     break;
  784.   default:
  785.   case CKR_OK:
  786.     error = CKR_GENERAL_ERROR;
  787.     break;
  788.   }
  789.   return error;
  790. }
  791. /*
  792.  * NSSCKFWC_InitToken
  793.  *
  794.  */
  795. NSS_IMPLEMENT CK_RV
  796. NSSCKFWC_InitToken
  797. (
  798.   NSSCKFWInstance *fwInstance,
  799.   CK_SLOT_ID slotID,
  800.   CK_CHAR_PTR pPin,
  801.   CK_ULONG ulPinLen,
  802.   CK_CHAR_PTR pLabel
  803. )
  804. {
  805.   CK_RV error = CKR_OK;
  806.   CK_ULONG nSlots;
  807.   NSSCKFWSlot **slots;
  808.   NSSCKFWSlot *fwSlot;
  809.   NSSCKFWToken *fwToken = (NSSCKFWToken *)NULL;
  810.   NSSItem pin;
  811.   NSSUTF8 *label;
  812.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  813.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  814.     goto loser;
  815.   }
  816.   nSlots = nssCKFWInstance_GetNSlots(fwInstance, &error);
  817.   if( (CK_ULONG)0 == nSlots ) {
  818.     goto loser;
  819.   }
  820.   if( (slotID < 1) || (slotID > nSlots) ) {
  821.     error = CKR_SLOT_ID_INVALID;
  822.     goto loser;
  823.   }
  824.   slots = nssCKFWInstance_GetSlots(fwInstance, &error);
  825.   if( (NSSCKFWSlot **)NULL == slots ) {
  826.     goto loser;
  827.   }
  828.   fwSlot = slots[ slotID-1 ];
  829.   if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) {
  830.     error = CKR_TOKEN_NOT_PRESENT;
  831.     goto loser;
  832.   }
  833.   fwToken = nssCKFWSlot_GetToken(fwSlot, &error);
  834.   if( (NSSCKFWToken *)NULL == fwToken ) {
  835.     goto loser;
  836.   }
  837.   pin.size = (PRUint32)ulPinLen;
  838.   pin.data = (void *)pPin;
  839.   label = (NSSUTF8 *)pLabel; /* identity conversion */
  840.   error = nssCKFWToken_InitToken(fwToken, &pin, label);
  841.   if( CKR_OK != error ) {
  842.     goto loser;
  843.   }
  844.   return CKR_OK;
  845.  loser:
  846.   switch( error ) {
  847.   case CKR_DEVICE_REMOVED:
  848.   case CKR_TOKEN_NOT_PRESENT:
  849.     (void)nssCKFWToken_Destroy(fwToken);
  850.     break;
  851.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  852.   case CKR_DEVICE_ERROR:
  853.   case CKR_DEVICE_MEMORY:
  854.   case CKR_FUNCTION_FAILED:
  855.   case CKR_GENERAL_ERROR:
  856.   case CKR_HOST_MEMORY:
  857.   case CKR_PIN_INCORRECT:
  858.   case CKR_PIN_LOCKED:
  859.   case CKR_SESSION_EXISTS:
  860.   case CKR_SLOT_ID_INVALID:
  861.   case CKR_TOKEN_NOT_RECOGNIZED:
  862.   case CKR_TOKEN_WRITE_PROTECTED:
  863.     break;
  864.   default:
  865.   case CKR_OK:
  866.     error = CKR_GENERAL_ERROR;
  867.     break;
  868.   }
  869.   return error;
  870. }
  871. /*
  872.  * NSSCKFWC_InitPIN
  873.  *
  874.  */
  875. NSS_IMPLEMENT CK_RV
  876. NSSCKFWC_InitPIN
  877. (
  878.   NSSCKFWInstance *fwInstance,
  879.   CK_SESSION_HANDLE hSession,
  880.   CK_CHAR_PTR pPin,
  881.   CK_ULONG ulPinLen
  882. )
  883. {
  884.   CK_RV error = CKR_OK;
  885.   NSSCKFWSession *fwSession;
  886.   NSSItem pin, *arg;
  887.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  888.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  889.     goto loser;
  890.   }
  891.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  892.   if( (NSSCKFWSession *)NULL == fwSession ) {
  893.     error = CKR_SESSION_HANDLE_INVALID;
  894.     goto loser;
  895.   }
  896.   if( (CK_CHAR_PTR)CK_NULL_PTR == pPin ) {
  897.     arg = (NSSItem *)NULL;
  898.   } else {
  899.     arg = &pin;
  900.     pin.size = (PRUint32)ulPinLen;
  901.     pin.data = (void *)pPin;
  902.   }
  903.   error = nssCKFWSession_InitPIN(fwSession, arg);
  904.   if( CKR_OK != error ) {
  905.     goto loser;
  906.   }
  907.   return CKR_OK;
  908.  loser:
  909.   switch( error ) {
  910.   case CKR_SESSION_CLOSED:
  911.     /* destroy session? */
  912.     break;
  913.   case CKR_DEVICE_REMOVED:
  914.     /* (void)nssCKFWToken_Destroy(fwToken); */
  915.     break;
  916.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  917.   case CKR_DEVICE_ERROR:
  918.   case CKR_DEVICE_MEMORY:
  919.   case CKR_FUNCTION_FAILED:
  920.   case CKR_GENERAL_ERROR:
  921.   case CKR_HOST_MEMORY:
  922.   case CKR_PIN_INVALID:
  923.   case CKR_PIN_LEN_RANGE:
  924.   case CKR_SESSION_READ_ONLY:
  925.   case CKR_SESSION_HANDLE_INVALID:
  926.   case CKR_TOKEN_WRITE_PROTECTED:
  927.   case CKR_USER_NOT_LOGGED_IN:
  928.     break;
  929.   default:
  930.   case CKR_OK:
  931.     error = CKR_GENERAL_ERROR;
  932.     break;
  933.   }
  934.   return error;
  935. }
  936. /*
  937.  * NSSCKFWC_SetPIN
  938.  *
  939.  */
  940. NSS_IMPLEMENT CK_RV
  941. NSSCKFWC_SetPIN
  942. (
  943.   NSSCKFWInstance *fwInstance,
  944.   CK_SESSION_HANDLE hSession,
  945.   CK_CHAR_PTR pOldPin,
  946.   CK_ULONG ulOldLen,
  947.   CK_CHAR_PTR pNewPin,
  948.   CK_ULONG ulNewLen
  949. )
  950. {
  951.   CK_RV error = CKR_OK;
  952.   NSSCKFWSession *fwSession;
  953.   NSSItem oldPin, newPin, *oldArg, *newArg;
  954.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  955.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  956.     goto loser;
  957.   }
  958.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  959.   if( (NSSCKFWSession *)NULL == fwSession ) {
  960.     error = CKR_SESSION_HANDLE_INVALID;
  961.     goto loser;
  962.   }
  963.   if( (CK_CHAR_PTR)CK_NULL_PTR == pOldPin ) {
  964.     oldArg = (NSSItem *)NULL;
  965.   } else {
  966.     oldArg = &oldPin;
  967.     oldPin.size = (PRUint32)ulOldLen;
  968.     oldPin.data = (void *)pOldPin;
  969.   }
  970.   if( (CK_CHAR_PTR)CK_NULL_PTR == pNewPin ) {
  971.     newArg = (NSSItem *)NULL;
  972.   } else {
  973.     newArg = &newPin;
  974.     newPin.size = (PRUint32)ulNewLen;
  975.     newPin.data = (void *)pNewPin;
  976.   }
  977.   error = nssCKFWSession_SetPIN(fwSession, oldArg, newArg);
  978.   if( CKR_OK != error ) {
  979.     goto loser;
  980.   }
  981.   return CKR_OK;
  982.  loser:
  983.   switch( error ) {
  984.   case CKR_SESSION_CLOSED:
  985.     /* destroy session? */
  986.     break;
  987.   case CKR_DEVICE_REMOVED:
  988.     /* (void)nssCKFWToken_Destroy(fwToken); */
  989.     break;
  990.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  991.   case CKR_DEVICE_ERROR:
  992.   case CKR_DEVICE_MEMORY:
  993.   case CKR_FUNCTION_FAILED:
  994.   case CKR_GENERAL_ERROR:
  995.   case CKR_HOST_MEMORY:
  996.   case CKR_PIN_INCORRECT:
  997.   case CKR_PIN_INVALID:
  998.   case CKR_PIN_LEN_RANGE:
  999.   case CKR_PIN_LOCKED:
  1000.   case CKR_SESSION_HANDLE_INVALID:
  1001.   case CKR_SESSION_READ_ONLY:
  1002.   case CKR_TOKEN_WRITE_PROTECTED:
  1003.     break;
  1004.   default:
  1005.   case CKR_OK:
  1006.     error = CKR_GENERAL_ERROR;
  1007.     break;
  1008.   }
  1009.   return error;
  1010. }
  1011. /*
  1012.  * NSSCKFWC_OpenSession
  1013.  *
  1014.  */
  1015. NSS_IMPLEMENT CK_RV
  1016. NSSCKFWC_OpenSession
  1017. (
  1018.   NSSCKFWInstance *fwInstance,
  1019.   CK_SLOT_ID slotID,
  1020.   CK_FLAGS flags,
  1021.   CK_VOID_PTR pApplication,
  1022.   CK_NOTIFY Notify,
  1023.   CK_SESSION_HANDLE_PTR phSession
  1024. )
  1025. {
  1026.   CK_RV error = CKR_OK;
  1027.   CK_ULONG nSlots;
  1028.   NSSCKFWSlot **slots;
  1029.   NSSCKFWSlot *fwSlot;
  1030.   NSSCKFWToken *fwToken = (NSSCKFWToken *)NULL;
  1031.   NSSCKFWSession *fwSession;
  1032.   CK_BBOOL rw;
  1033.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  1034.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  1035.     goto loser;
  1036.   }
  1037.   nSlots = nssCKFWInstance_GetNSlots(fwInstance, &error);
  1038.   if( (CK_ULONG)0 == nSlots ) {
  1039.     goto loser;
  1040.   }
  1041.   if( (slotID < 1) || (slotID > nSlots) ) {
  1042.     error = CKR_SLOT_ID_INVALID;
  1043.     goto loser;
  1044.   }
  1045.   if( flags & CKF_RW_SESSION ) {
  1046.     rw = CK_TRUE;
  1047.   } else {
  1048.     rw = CK_FALSE;
  1049.   }
  1050.   if( flags & CKF_SERIAL_SESSION ) {
  1051.     ;
  1052.   } else {
  1053.     error = CKR_SESSION_PARALLEL_NOT_SUPPORTED;
  1054.     goto loser;
  1055.   }
  1056.   if( flags & ~(CKF_RW_SESSION|CKF_SERIAL_SESSION) ) {
  1057.     error = CKR_ARGUMENTS_BAD;
  1058.     goto loser;
  1059.   }
  1060.   if( (CK_SESSION_HANDLE_PTR)CK_NULL_PTR == phSession ) {
  1061.     error = CKR_ARGUMENTS_BAD;
  1062.     goto loser;
  1063.   }
  1064.   /*
  1065.    * A purify error here indicates caller error.
  1066.    */
  1067.   *phSession = (CK_SESSION_HANDLE)0;
  1068.   slots = nssCKFWInstance_GetSlots(fwInstance, &error);
  1069.   if( (NSSCKFWSlot **)NULL == slots ) {
  1070.     goto loser;
  1071.   }
  1072.   fwSlot = slots[ slotID-1 ];
  1073.   if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) {
  1074.     error = CKR_TOKEN_NOT_PRESENT;
  1075.     goto loser;
  1076.   }
  1077.   fwToken = nssCKFWSlot_GetToken(fwSlot, &error);
  1078.   if( (NSSCKFWToken *)NULL == fwToken ) {
  1079.     goto loser;
  1080.   }
  1081.   fwSession = nssCKFWToken_OpenSession(fwToken, rw, pApplication,
  1082.                Notify, &error);
  1083.   if( (NSSCKFWSession *)NULL == fwSession ) {
  1084.     goto loser;
  1085.   }
  1086.   *phSession = nssCKFWInstance_CreateSessionHandle(fwInstance,
  1087.                  fwSession, &error);
  1088.   if( (CK_SESSION_HANDLE)0 == *phSession ) {
  1089.     goto loser;
  1090.   }
  1091.   return CKR_OK;
  1092.  loser:
  1093.   switch( error ) {
  1094.   case CKR_SESSION_CLOSED:
  1095.     /* destroy session? */
  1096.     break;
  1097.   case CKR_DEVICE_REMOVED:
  1098.     /* (void)nssCKFWToken_Destroy(fwToken); */
  1099.     break;
  1100.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  1101.   case CKR_DEVICE_ERROR:
  1102.   case CKR_DEVICE_MEMORY:
  1103.   case CKR_FUNCTION_FAILED:
  1104.   case CKR_GENERAL_ERROR:
  1105.   case CKR_HOST_MEMORY:
  1106.   case CKR_SESSION_COUNT:
  1107.   case CKR_SESSION_EXISTS:
  1108.   case CKR_SESSION_PARALLEL_NOT_SUPPORTED:
  1109.   case CKR_SESSION_READ_WRITE_SO_EXISTS:
  1110.   case CKR_SLOT_ID_INVALID:
  1111.   case CKR_TOKEN_NOT_PRESENT:
  1112.   case CKR_TOKEN_NOT_RECOGNIZED:
  1113.   case CKR_TOKEN_WRITE_PROTECTED:
  1114.     break;
  1115.   default:
  1116.   case CKR_OK:
  1117.     error = CKR_GENERAL_ERROR;
  1118.     break;
  1119.   }
  1120.   return error;
  1121. }
  1122. /*
  1123.  * NSSCKFWC_CloseSession
  1124.  *
  1125.  */
  1126. NSS_IMPLEMENT CK_RV
  1127. NSSCKFWC_CloseSession
  1128. (
  1129.   NSSCKFWInstance *fwInstance,
  1130.   CK_SESSION_HANDLE hSession
  1131. )
  1132. {
  1133.   CK_RV error = CKR_OK;
  1134.   NSSCKFWSession *fwSession;
  1135.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  1136.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  1137.     goto loser;
  1138.   }
  1139.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  1140.   if( (NSSCKFWSession *)NULL == fwSession ) {
  1141.     error = CKR_SESSION_HANDLE_INVALID;
  1142.     goto loser;
  1143.   }
  1144.   nssCKFWInstance_DestroySessionHandle(fwInstance, hSession);
  1145.   error = nssCKFWSession_Destroy(fwSession, CK_TRUE);
  1146.   if( CKR_OK != error ) {
  1147.     goto loser;
  1148.   }
  1149.   return CKR_OK;
  1150.  loser:
  1151.   switch( error ) {
  1152.   case CKR_SESSION_CLOSED:
  1153.     /* destroy session? */
  1154.     break;
  1155.   case CKR_DEVICE_REMOVED:
  1156.     /* (void)nssCKFWToken_Destroy(fwToken); */
  1157.     break;
  1158.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  1159.   case CKR_DEVICE_ERROR:
  1160.   case CKR_DEVICE_MEMORY:
  1161.   case CKR_FUNCTION_FAILED:
  1162.   case CKR_GENERAL_ERROR:
  1163.   case CKR_HOST_MEMORY:
  1164.   case CKR_SESSION_HANDLE_INVALID:
  1165.     break;
  1166.   default:
  1167.   case CKR_OK:
  1168.     error = CKR_GENERAL_ERROR;
  1169.     break;
  1170.   }
  1171.   return error;
  1172. }
  1173. /*
  1174.  * NSSCKFWC_CloseAllSessions
  1175.  *
  1176.  */
  1177. NSS_IMPLEMENT CK_RV
  1178. NSSCKFWC_CloseAllSessions
  1179. (
  1180.   NSSCKFWInstance *fwInstance,
  1181.   CK_SLOT_ID slotID
  1182. )
  1183. {
  1184.   CK_RV error = CKR_OK;
  1185.   CK_ULONG nSlots;
  1186.   NSSCKFWSlot **slots;
  1187.   NSSCKFWSlot *fwSlot;
  1188.   NSSCKFWToken *fwToken = (NSSCKFWToken *)NULL;
  1189.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  1190.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  1191.     goto loser;
  1192.   }
  1193.   nSlots = nssCKFWInstance_GetNSlots(fwInstance, &error);
  1194.   if( (CK_ULONG)0 == nSlots ) {
  1195.     goto loser;
  1196.   }
  1197.   if( (slotID < 1) || (slotID > nSlots) ) {
  1198.     error = CKR_SLOT_ID_INVALID;
  1199.     goto loser;
  1200.   }
  1201.   slots = nssCKFWInstance_GetSlots(fwInstance, &error);
  1202.   if( (NSSCKFWSlot **)NULL == slots ) {
  1203.     goto loser;
  1204.   }
  1205.   fwSlot = slots[ slotID-1 ];
  1206.   if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) {
  1207.     error = CKR_TOKEN_NOT_PRESENT;
  1208.     goto loser;
  1209.   }
  1210.   fwToken = nssCKFWSlot_GetToken(fwSlot, &error);
  1211.   if( (NSSCKFWToken *)NULL == fwToken ) {
  1212.     goto loser;
  1213.   }
  1214.   error = nssCKFWToken_CloseAllSessions(fwToken);
  1215.   if( CKR_OK != error ) {
  1216.     goto loser;
  1217.   }
  1218.   return CKR_OK;
  1219.  loser:
  1220.   switch( error ) {
  1221.   case CKR_DEVICE_REMOVED:
  1222.     /* (void)nssCKFWToken_Destroy(fwToken); */
  1223.     break;
  1224.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  1225.   case CKR_DEVICE_ERROR:
  1226.   case CKR_DEVICE_MEMORY:
  1227.   case CKR_FUNCTION_FAILED:
  1228.   case CKR_GENERAL_ERROR:
  1229.   case CKR_HOST_MEMORY:
  1230.   case CKR_SLOT_ID_INVALID:
  1231.   case CKR_TOKEN_NOT_PRESENT:
  1232.     break;
  1233.   default:
  1234.   case CKR_OK:
  1235.     error = CKR_GENERAL_ERROR;
  1236.     break;
  1237.   }
  1238.   return error;
  1239. }
  1240. /*
  1241.  * NSSCKFWC_GetSessionInfo
  1242.  *
  1243.  */
  1244. NSS_IMPLEMENT CK_RV
  1245. NSSCKFWC_GetSessionInfo
  1246. (
  1247.   NSSCKFWInstance *fwInstance,
  1248.   CK_SESSION_HANDLE hSession,
  1249.   CK_SESSION_INFO_PTR pInfo
  1250. )
  1251. {
  1252.   CK_RV error = CKR_OK;
  1253.   NSSCKFWSession *fwSession;
  1254.   NSSCKFWSlot *fwSlot;
  1255.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  1256.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  1257.     goto loser;
  1258.   }
  1259.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  1260.   if( (NSSCKFWSession *)NULL == fwSession ) {
  1261.     error = CKR_SESSION_HANDLE_INVALID;
  1262.     goto loser;
  1263.   }
  1264.   if( (CK_SESSION_INFO_PTR)CK_NULL_PTR == pInfo ) {
  1265.     error = CKR_ARGUMENTS_BAD;
  1266.     goto loser;
  1267.   }
  1268.   /*
  1269.    * A purify error here indicates caller error.
  1270.    */
  1271.   (void)nsslibc_memset(pInfo, 0, sizeof(CK_SESSION_INFO));
  1272.   fwSlot = nssCKFWSession_GetFWSlot(fwSession);
  1273.   if( (NSSCKFWSlot *)NULL == fwSlot ) {
  1274.     error = CKR_GENERAL_ERROR;
  1275.     goto loser;
  1276.   }
  1277.   pInfo->slotID = nssCKFWSlot_GetSlotID(fwSlot);
  1278.   pInfo->state = nssCKFWSession_GetSessionState(fwSession);
  1279.   if( CK_TRUE == nssCKFWSession_IsRWSession(fwSession) ) {
  1280.     pInfo->flags |= CKF_RW_SESSION;
  1281.   }
  1282.   pInfo->flags |= CKF_SERIAL_SESSION; /* Always true */
  1283.   pInfo->ulDeviceError = nssCKFWSession_GetDeviceError(fwSession);
  1284.   return CKR_OK;
  1285.  loser:
  1286.   switch( error ) {
  1287.   case CKR_SESSION_CLOSED:
  1288.     /* destroy session? */
  1289.     break;
  1290.   case CKR_DEVICE_REMOVED:
  1291.     /* (void)nssCKFWToken_Destroy(fwToken); */
  1292.     break;
  1293.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  1294.   case CKR_DEVICE_ERROR:
  1295.   case CKR_DEVICE_MEMORY:
  1296.   case CKR_FUNCTION_FAILED:
  1297.   case CKR_GENERAL_ERROR:
  1298.   case CKR_HOST_MEMORY:
  1299.   case CKR_SESSION_HANDLE_INVALID:
  1300.     break;
  1301.   default:
  1302.   case CKR_OK:
  1303.     error = CKR_GENERAL_ERROR;
  1304.     break;
  1305.   }
  1306.   return error;
  1307. }
  1308. /*
  1309.  * NSSCKFWC_GetOperationState
  1310.  *
  1311.  */
  1312. NSS_IMPLEMENT CK_RV
  1313. NSSCKFWC_GetOperationState
  1314. (
  1315.   NSSCKFWInstance *fwInstance,
  1316.   CK_SESSION_HANDLE hSession,
  1317.   CK_BYTE_PTR pOperationState,
  1318.   CK_ULONG_PTR pulOperationStateLen
  1319. )
  1320. {
  1321.   CK_RV error = CKR_OK;
  1322.   NSSCKFWSession *fwSession;
  1323.   CK_ULONG len;
  1324.   NSSItem buf;
  1325.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  1326.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  1327.     goto loser;
  1328.   }
  1329.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  1330.   if( (NSSCKFWSession *)NULL == fwSession ) {
  1331.     error = CKR_SESSION_HANDLE_INVALID;
  1332.     goto loser;
  1333.   }
  1334.   if( (CK_ULONG_PTR)CK_NULL_PTR == pulOperationStateLen ) {
  1335.     error = CKR_ARGUMENTS_BAD;
  1336.     goto loser;
  1337.   }
  1338.   len = nssCKFWSession_GetOperationStateLen(fwSession, &error);
  1339.   if( ((CK_ULONG)0 == len) && (CKR_OK != error) ) {
  1340.     goto loser;
  1341.   }
  1342.   if( (CK_BYTE_PTR)CK_NULL_PTR == pOperationState ) {
  1343.     *pulOperationStateLen = len;
  1344.     return CKR_OK;
  1345.   }
  1346.   if( *pulOperationStateLen < len ) {
  1347.     *pulOperationStateLen = len;
  1348.     error = CKR_BUFFER_TOO_SMALL;
  1349.     goto loser;
  1350.   }
  1351.   buf.size = (PRUint32)*pulOperationStateLen;
  1352.   buf.data = (void *)pOperationState;
  1353.   *pulOperationStateLen = len;
  1354.   error = nssCKFWSession_GetOperationState(fwSession, &buf);
  1355.   if( CKR_OK != error ) {
  1356.     goto loser;
  1357.   }
  1358.   return CKR_OK;
  1359.  loser:
  1360.   switch( error ) {
  1361.   case CKR_SESSION_CLOSED:
  1362.     /* destroy session? */
  1363.     break;
  1364.   case CKR_DEVICE_REMOVED:
  1365.     /* (void)nssCKFWToken_Destroy(fwToken); */
  1366.     break;
  1367.   case CKR_BUFFER_TOO_SMALL:
  1368.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  1369.   case CKR_DEVICE_ERROR:
  1370.   case CKR_DEVICE_MEMORY:
  1371.   case CKR_FUNCTION_FAILED:
  1372.   case CKR_GENERAL_ERROR:
  1373.   case CKR_HOST_MEMORY:
  1374.   case CKR_OPERATION_NOT_INITIALIZED:
  1375.   case CKR_SESSION_HANDLE_INVALID:
  1376.   case CKR_STATE_UNSAVEABLE:
  1377.     break;
  1378.   default:
  1379.   case CKR_OK:
  1380.     error = CKR_GENERAL_ERROR;
  1381.     break;
  1382.   }
  1383.   return error;
  1384. }
  1385. /*
  1386.  * NSSCKFWC_SetOperationState
  1387.  *
  1388.  */
  1389. NSS_IMPLEMENT CK_RV
  1390. NSSCKFWC_SetOperationState
  1391. (
  1392.   NSSCKFWInstance *fwInstance,
  1393.   CK_SESSION_HANDLE hSession,
  1394.   CK_BYTE_PTR pOperationState,
  1395.   CK_ULONG ulOperationStateLen,
  1396.   CK_OBJECT_HANDLE hEncryptionKey,
  1397.   CK_OBJECT_HANDLE hAuthenticationKey
  1398. )
  1399. {
  1400.   CK_RV error = CKR_OK;
  1401.   NSSCKFWSession *fwSession;
  1402.   NSSCKFWObject *eKey;
  1403.   NSSCKFWObject *aKey;
  1404.   NSSItem state;
  1405.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  1406.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  1407.     goto loser;
  1408.   }
  1409.   
  1410.   if( (CK_BYTE_PTR)CK_NULL_PTR == pOperationState ) {
  1411.     error = CKR_ARGUMENTS_BAD;
  1412.     goto loser;
  1413.   }
  1414.   /* 
  1415.    * We could loop through the buffer, to catch any purify errors
  1416.    * in a place with a "user error" note.
  1417.    */
  1418.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  1419.   if( (NSSCKFWSession *)NULL == fwSession ) {
  1420.     error = CKR_SESSION_HANDLE_INVALID;
  1421.     goto loser;
  1422.   }
  1423.   if( (CK_OBJECT_HANDLE)0 == hEncryptionKey ) {
  1424.     eKey = (NSSCKFWObject *)NULL;
  1425.   } else {
  1426.     eKey = nssCKFWInstance_ResolveObjectHandle(fwInstance, hEncryptionKey);
  1427.     if( (NSSCKFWObject *)NULL == eKey ) {
  1428.       error = CKR_KEY_HANDLE_INVALID;
  1429.       goto loser;
  1430.     }
  1431.   }
  1432.   if( (CK_OBJECT_HANDLE)0 == hAuthenticationKey ) {
  1433.     aKey = (NSSCKFWObject *)NULL;
  1434.   } else {
  1435.     aKey = nssCKFWInstance_ResolveObjectHandle(fwInstance, hAuthenticationKey);
  1436.     if( (NSSCKFWObject *)NULL == aKey ) {
  1437.       error = CKR_KEY_HANDLE_INVALID;
  1438.       goto loser;
  1439.     }
  1440.   }
  1441.   error = nssCKFWSession_SetOperationState(fwSession, &state, eKey, aKey);
  1442.   if( CKR_OK != error ) {
  1443.     goto loser;
  1444.   }
  1445.   return CKR_OK;
  1446.  loser:
  1447.   switch( error ) {
  1448.   case CKR_SESSION_CLOSED:
  1449.     /* destroy session? */
  1450.     break;
  1451.   case CKR_DEVICE_REMOVED:
  1452.     /* (void)nssCKFWToken_Destroy(fwToken); */
  1453.     break;
  1454.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  1455.   case CKR_DEVICE_ERROR:
  1456.   case CKR_DEVICE_MEMORY:
  1457.   case CKR_FUNCTION_FAILED:
  1458.   case CKR_GENERAL_ERROR:
  1459.   case CKR_HOST_MEMORY:
  1460.   case CKR_KEY_CHANGED:
  1461.   case CKR_KEY_NEEDED:
  1462.   case CKR_KEY_NOT_NEEDED:
  1463.   case CKR_SAVED_STATE_INVALID:
  1464.   case CKR_SESSION_HANDLE_INVALID:
  1465.     break;
  1466.   default:
  1467.   case CKR_OK:
  1468.     error = CKR_GENERAL_ERROR;
  1469.     break;
  1470.   }
  1471.   return error;
  1472. }
  1473. /*
  1474.  * NSSCKFWC_Login
  1475.  *
  1476.  */
  1477. NSS_IMPLEMENT CK_RV
  1478. NSSCKFWC_Login
  1479. (
  1480.   NSSCKFWInstance *fwInstance,
  1481.   CK_SESSION_HANDLE hSession,
  1482.   CK_USER_TYPE userType,
  1483.   CK_CHAR_PTR pPin,
  1484.   CK_ULONG ulPinLen
  1485. )
  1486. {
  1487.   CK_RV error = CKR_OK;
  1488.   NSSCKFWSession *fwSession;
  1489.   NSSItem pin, *arg;
  1490.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  1491.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  1492.     goto loser;
  1493.   }
  1494.   
  1495.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  1496.   if( (NSSCKFWSession *)NULL == fwSession ) {
  1497.     error = CKR_SESSION_HANDLE_INVALID;
  1498.     goto loser;
  1499.   }
  1500.   if( (CK_CHAR_PTR)CK_NULL_PTR == pPin ) {
  1501.     arg = (NSSItem *)NULL;
  1502.   } else {
  1503.     arg = &pin;
  1504.     pin.size = (PRUint32)ulPinLen;
  1505.     pin.data = (void *)pPin;
  1506.   }
  1507.   error = nssCKFWSession_Login(fwSession, userType, arg);
  1508.   if( CKR_OK != error ) {
  1509.     goto loser;
  1510.   }
  1511.   return CKR_OK;
  1512.  loser:
  1513.   switch( error ) {
  1514.   case CKR_SESSION_CLOSED:
  1515.     /* destroy session? */
  1516.     break;
  1517.   case CKR_DEVICE_REMOVED:
  1518.     /* (void)nssCKFWToken_Destroy(fwToken); */
  1519.     break;
  1520.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  1521.   case CKR_DEVICE_ERROR:
  1522.   case CKR_DEVICE_MEMORY:
  1523.   case CKR_FUNCTION_FAILED:
  1524.   case CKR_GENERAL_ERROR:
  1525.   case CKR_HOST_MEMORY:
  1526.   case CKR_PIN_EXPIRED:
  1527.   case CKR_PIN_INCORRECT:
  1528.   case CKR_PIN_LOCKED:
  1529.   case CKR_SESSION_HANDLE_INVALID:
  1530.   case CKR_SESSION_READ_ONLY_EXISTS:
  1531.   case CKR_USER_ALREADY_LOGGED_IN:
  1532.   case CKR_USER_ANOTHER_ALREADY_LOGGED_IN:
  1533.   case CKR_USER_PIN_NOT_INITIALIZED:
  1534.   case CKR_USER_TOO_MANY_TYPES:
  1535.   case CKR_USER_TYPE_INVALID:
  1536.     break;
  1537.   default:
  1538.   case CKR_OK:
  1539.     error = CKR_GENERAL_ERROR;
  1540.     break;
  1541.   }
  1542.   return error;
  1543. }
  1544. /*
  1545.  * NSSCKFWC_Logout
  1546.  *
  1547.  */
  1548. NSS_IMPLEMENT CK_RV
  1549. NSSCKFWC_Logout
  1550. (
  1551.   NSSCKFWInstance *fwInstance,
  1552.   CK_SESSION_HANDLE hSession
  1553. )
  1554. {
  1555.   CK_RV error = CKR_OK;
  1556.   NSSCKFWSession *fwSession;
  1557.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  1558.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  1559.     goto loser;
  1560.   }
  1561.   
  1562.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  1563.   if( (NSSCKFWSession *)NULL == fwSession ) {
  1564.     error = CKR_SESSION_HANDLE_INVALID;
  1565.     goto loser;
  1566.   }
  1567.   error = nssCKFWSession_Logout(fwSession);
  1568.   if( CKR_OK != error ) {
  1569.     goto loser;
  1570.   }
  1571.   return CKR_OK;
  1572.  loser:
  1573.   switch( error ) {
  1574.   case CKR_SESSION_CLOSED:
  1575.     /* destroy session? */
  1576.     break;
  1577.   case CKR_DEVICE_REMOVED:
  1578.     /* (void)nssCKFWToken_Destroy(fwToken); */
  1579.     break;
  1580.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  1581.   case CKR_DEVICE_ERROR:
  1582.   case CKR_DEVICE_MEMORY:
  1583.   case CKR_FUNCTION_FAILED:
  1584.   case CKR_GENERAL_ERROR:
  1585.   case CKR_HOST_MEMORY:
  1586.   case CKR_SESSION_HANDLE_INVALID:
  1587.   case CKR_USER_NOT_LOGGED_IN:
  1588.     break;
  1589.   default:
  1590.   case CKR_OK:
  1591.     error = CKR_GENERAL_ERROR;
  1592.     break;
  1593.   }
  1594.   return error;
  1595. }
  1596. /*
  1597.  * NSSCKFWC_CreateObject
  1598.  *
  1599.  */
  1600. NSS_IMPLEMENT CK_RV
  1601. NSSCKFWC_CreateObject
  1602. (
  1603.   NSSCKFWInstance *fwInstance,
  1604.   CK_SESSION_HANDLE hSession,
  1605.   CK_ATTRIBUTE_PTR pTemplate,
  1606.   CK_ULONG ulCount,
  1607.   CK_OBJECT_HANDLE_PTR phObject
  1608. )
  1609. {
  1610.   CK_RV error = CKR_OK;
  1611.   NSSCKFWSession *fwSession;
  1612.   NSSCKFWObject *fwObject;
  1613.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  1614.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  1615.     goto loser;
  1616.   }
  1617.   
  1618.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  1619.   if( (NSSCKFWSession *)NULL == fwSession ) {
  1620.     error = CKR_SESSION_HANDLE_INVALID;
  1621.     goto loser;
  1622.   }
  1623.   if( (CK_OBJECT_HANDLE_PTR)CK_NULL_PTR == phObject ) {
  1624.     error = CKR_ARGUMENTS_BAD;
  1625.     goto loser;
  1626.   }
  1627.   /*
  1628.    * A purify error here indicates caller error.
  1629.    */
  1630.   *phObject = (CK_OBJECT_HANDLE)0;
  1631.   fwObject = nssCKFWSession_CreateObject(fwSession, pTemplate,
  1632.                ulCount, &error);
  1633.   if( (NSSCKFWObject *)NULL == fwObject ) {
  1634.     goto loser;
  1635.   }
  1636.   *phObject = nssCKFWInstance_CreateObjectHandle(fwInstance, fwObject, &error);
  1637.   if( (CK_OBJECT_HANDLE)0 == *phObject ) {
  1638.     nssCKFWObject_Destroy(fwObject);
  1639.     goto loser;
  1640.   }
  1641.   return CKR_OK;
  1642.  loser:
  1643.   switch( error ) {
  1644.   case CKR_SESSION_CLOSED:
  1645.     /* destroy session? */
  1646.     break;
  1647.   case CKR_DEVICE_REMOVED:
  1648.     /* (void)nssCKFWToken_Destroy(fwToken); */
  1649.     break;
  1650.   case CKR_ATTRIBUTE_READ_ONLY:
  1651.   case CKR_ATTRIBUTE_TYPE_INVALID:
  1652.   case CKR_ATTRIBUTE_VALUE_INVALID:
  1653.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  1654.   case CKR_DEVICE_ERROR:
  1655.   case CKR_DEVICE_MEMORY:
  1656.   case CKR_FUNCTION_FAILED:
  1657.   case CKR_GENERAL_ERROR:
  1658.   case CKR_HOST_MEMORY:
  1659.   case CKR_SESSION_HANDLE_INVALID:
  1660.   case CKR_SESSION_READ_ONLY:
  1661.   case CKR_TEMPLATE_INCOMPLETE:
  1662.   case CKR_TEMPLATE_INCONSISTENT:
  1663.   case CKR_TOKEN_WRITE_PROTECTED:
  1664.   case CKR_USER_NOT_LOGGED_IN:
  1665.     break;
  1666.   default:
  1667.   case CKR_OK:
  1668.     error = CKR_GENERAL_ERROR;
  1669.     break;
  1670.   }
  1671.   return error;
  1672. }
  1673. /*
  1674.  * NSSCKFWC_CopyObject
  1675.  *
  1676.  */
  1677. NSS_IMPLEMENT CK_RV
  1678. NSSCKFWC_CopyObject
  1679. (
  1680.   NSSCKFWInstance *fwInstance,
  1681.   CK_SESSION_HANDLE hSession,
  1682.   CK_OBJECT_HANDLE hObject,
  1683.   CK_ATTRIBUTE_PTR pTemplate,
  1684.   CK_ULONG ulCount,
  1685.   CK_OBJECT_HANDLE_PTR phNewObject
  1686. )
  1687. {
  1688.   CK_RV error = CKR_OK;
  1689.   NSSCKFWSession *fwSession;
  1690.   NSSCKFWObject *fwObject;
  1691.   NSSCKFWObject *fwNewObject;
  1692.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  1693.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  1694.     goto loser;
  1695.   }
  1696.   
  1697.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  1698.   if( (NSSCKFWSession *)NULL == fwSession ) {
  1699.     error = CKR_SESSION_HANDLE_INVALID;
  1700.     goto loser;
  1701.   }
  1702.   if( (CK_OBJECT_HANDLE_PTR)CK_NULL_PTR == phNewObject ) {
  1703.     error = CKR_ARGUMENTS_BAD;
  1704.     goto loser;
  1705.   }
  1706.   /*
  1707.    * A purify error here indicates caller error.
  1708.    */
  1709.   *phNewObject = (CK_OBJECT_HANDLE)0;
  1710.   fwObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hObject);
  1711.   if( (NSSCKFWObject *)NULL == fwObject ) {
  1712.     error = CKR_OBJECT_HANDLE_INVALID;
  1713.     goto loser;
  1714.   }
  1715.   fwNewObject = nssCKFWSession_CopyObject(fwSession, fwObject,
  1716.                   pTemplate, ulCount, &error);
  1717.   if( (NSSCKFWObject *)NULL == fwNewObject ) {
  1718.     goto loser;
  1719.   }
  1720.   *phNewObject = nssCKFWInstance_CreateObjectHandle(fwInstance, 
  1721.                    fwNewObject, &error);
  1722.   if( (CK_OBJECT_HANDLE)0 == *phNewObject ) {
  1723.     nssCKFWObject_Destroy(fwNewObject);
  1724.     goto loser;
  1725.   }
  1726.   return CKR_OK;
  1727.  loser:
  1728.   switch( error ) {
  1729.   case CKR_SESSION_CLOSED:
  1730.     /* destroy session? */
  1731.     break;
  1732.   case CKR_DEVICE_REMOVED:
  1733.     /* (void)nssCKFWToken_Destroy(fwToken); */
  1734.     break;
  1735.   case CKR_ATTRIBUTE_READ_ONLY:
  1736.   case CKR_ATTRIBUTE_TYPE_INVALID:
  1737.   case CKR_ATTRIBUTE_VALUE_INVALID:
  1738.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  1739.   case CKR_DEVICE_ERROR:
  1740.   case CKR_DEVICE_MEMORY:
  1741.   case CKR_FUNCTION_FAILED:
  1742.   case CKR_GENERAL_ERROR:
  1743.   case CKR_HOST_MEMORY:
  1744.   case CKR_OBJECT_HANDLE_INVALID:
  1745.   case CKR_SESSION_HANDLE_INVALID:
  1746.   case CKR_SESSION_READ_ONLY:
  1747.   case CKR_TEMPLATE_INCONSISTENT:
  1748.   case CKR_TOKEN_WRITE_PROTECTED:
  1749.   case CKR_USER_NOT_LOGGED_IN:
  1750.     break;
  1751.   default:
  1752.   case CKR_OK:
  1753.     error = CKR_GENERAL_ERROR;
  1754.     break;
  1755.   }
  1756.   return error;
  1757. }
  1758. /*
  1759.  * NSSCKFWC_DestroyObject
  1760.  *
  1761.  */
  1762. NSS_IMPLEMENT CK_RV
  1763. NSSCKFWC_DestroyObject
  1764. (
  1765.   NSSCKFWInstance *fwInstance,
  1766.   CK_SESSION_HANDLE hSession,
  1767.   CK_OBJECT_HANDLE hObject
  1768. )
  1769. {
  1770.   CK_RV error = CKR_OK;
  1771.   NSSCKFWSession *fwSession;
  1772.   NSSCKFWObject *fwObject;
  1773.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  1774.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  1775.     goto loser;
  1776.   }
  1777.   
  1778.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  1779.   if( (NSSCKFWSession *)NULL == fwSession ) {
  1780.     error = CKR_SESSION_HANDLE_INVALID;
  1781.     goto loser;
  1782.   }
  1783.   fwObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hObject);
  1784.   if( (NSSCKFWObject *)NULL == fwObject ) {
  1785.     error = CKR_OBJECT_HANDLE_INVALID;
  1786.     goto loser;
  1787.   }
  1788.   nssCKFWObject_Destroy(fwObject);
  1789.   nssCKFWInstance_DestroyObjectHandle(fwInstance, hObject);
  1790.   return CKR_OK;
  1791.  loser:
  1792.   switch( error ) {
  1793.   case CKR_SESSION_CLOSED:
  1794.     /* destroy session? */
  1795.     break;
  1796.   case CKR_DEVICE_REMOVED:
  1797.     /* (void)nssCKFWToken_Destroy(fwToken); */
  1798.     break;
  1799.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  1800.   case CKR_DEVICE_ERROR:
  1801.   case CKR_DEVICE_MEMORY:
  1802.   case CKR_FUNCTION_FAILED:
  1803.   case CKR_GENERAL_ERROR:
  1804.   case CKR_HOST_MEMORY:
  1805.   case CKR_OBJECT_HANDLE_INVALID:
  1806.   case CKR_SESSION_HANDLE_INVALID:
  1807.   case CKR_SESSION_READ_ONLY:
  1808.   case CKR_TOKEN_WRITE_PROTECTED:
  1809.     break;
  1810.   default:
  1811.   case CKR_OK:
  1812.     error = CKR_GENERAL_ERROR;
  1813.     break;
  1814.   }
  1815.   return error;
  1816. }
  1817. /*
  1818.  * NSSCKFWC_GetObjectSize
  1819.  *
  1820.  */
  1821. NSS_IMPLEMENT CK_RV
  1822. NSSCKFWC_GetObjectSize
  1823. (
  1824.   NSSCKFWInstance *fwInstance,
  1825.   CK_SESSION_HANDLE hSession,
  1826.   CK_OBJECT_HANDLE hObject,
  1827.   CK_ULONG_PTR pulSize
  1828. )
  1829. {
  1830.   CK_RV error = CKR_OK;
  1831.   NSSCKFWSession *fwSession;
  1832.   NSSCKFWObject *fwObject;
  1833.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  1834.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  1835.     goto loser;
  1836.   }
  1837.   
  1838.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  1839.   if( (NSSCKFWSession *)NULL == fwSession ) {
  1840.     error = CKR_SESSION_HANDLE_INVALID;
  1841.     goto loser;
  1842.   }
  1843.   fwObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hObject);
  1844.   if( (NSSCKFWObject *)NULL == fwObject ) {
  1845.     error = CKR_OBJECT_HANDLE_INVALID;
  1846.     goto loser;
  1847.   }
  1848.   if( (CK_ULONG_PTR)CK_NULL_PTR == pulSize ) {
  1849.     error = CKR_ARGUMENTS_BAD;
  1850.     goto loser;
  1851.   }
  1852.   /*
  1853.    * A purify error here indicates caller error.
  1854.    */
  1855.   *pulSize = (CK_ULONG)0;
  1856.   *pulSize = nssCKFWObject_GetObjectSize(fwObject, &error);
  1857.   if( ((CK_ULONG)0 == *pulSize) && (CKR_OK != error) ) {
  1858.     goto loser;
  1859.   }
  1860.   return CKR_OK;
  1861.  loser:
  1862.   switch( error ) {
  1863.   case CKR_SESSION_CLOSED:
  1864.     /* destroy session? */
  1865.     break;
  1866.   case CKR_DEVICE_REMOVED:
  1867.     /* (void)nssCKFWToken_Destroy(fwToken); */
  1868.     break;
  1869.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  1870.   case CKR_DEVICE_ERROR:
  1871.   case CKR_DEVICE_MEMORY:
  1872.   case CKR_FUNCTION_FAILED:
  1873.   case CKR_GENERAL_ERROR:
  1874.   case CKR_HOST_MEMORY:
  1875.   case CKR_INFORMATION_SENSITIVE:
  1876.   case CKR_OBJECT_HANDLE_INVALID:
  1877.   case CKR_SESSION_HANDLE_INVALID:
  1878.     break;
  1879.   default:
  1880.   case CKR_OK:
  1881.     error = CKR_GENERAL_ERROR;
  1882.     break;
  1883.   }
  1884.   return error;
  1885. }
  1886. /*
  1887.  * NSSCKFWC_GetAttributeValue
  1888.  *
  1889.  */
  1890. NSS_IMPLEMENT CK_RV
  1891. NSSCKFWC_GetAttributeValue
  1892. (
  1893.   NSSCKFWInstance *fwInstance,
  1894.   CK_SESSION_HANDLE hSession,
  1895.   CK_OBJECT_HANDLE hObject,
  1896.   CK_ATTRIBUTE_PTR pTemplate,
  1897.   CK_ULONG ulCount
  1898. )
  1899. {
  1900.   CK_RV error = CKR_OK;
  1901.   NSSCKFWSession *fwSession;
  1902.   NSSCKFWObject *fwObject;
  1903.   CK_BBOOL sensitive = CK_FALSE;
  1904.   CK_BBOOL invalid = CK_FALSE;
  1905.   CK_BBOOL tooSmall = CK_FALSE;
  1906.   CK_ULONG i;
  1907.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  1908.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  1909.     goto loser;
  1910.   }
  1911.   
  1912.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  1913.   if( (NSSCKFWSession *)NULL == fwSession ) {
  1914.     error = CKR_SESSION_HANDLE_INVALID;
  1915.     goto loser;
  1916.   }
  1917.   fwObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hObject);
  1918.   if( (NSSCKFWObject *)NULL == fwObject ) {
  1919.     error = CKR_OBJECT_HANDLE_INVALID;
  1920.     goto loser;
  1921.   }
  1922.   if( (CK_ATTRIBUTE_PTR)CK_NULL_PTR == pTemplate ) {
  1923.     error = CKR_ARGUMENTS_BAD;
  1924.     goto loser;
  1925.   }
  1926.   for( i = 0; i < ulCount; i++ ) {
  1927.     CK_ULONG size = nssCKFWObject_GetAttributeSize(fwObject, 
  1928.                       pTemplate[i].type, &error);
  1929.     if( (CK_ULONG)0 == size ) {
  1930.       switch( error ) {
  1931.       case CKR_ATTRIBUTE_SENSITIVE:
  1932.       case CKR_INFORMATION_SENSITIVE:
  1933.         sensitive = CK_TRUE;
  1934.         pTemplate[i].ulValueLen = (CK_ULONG)(-1);
  1935.         continue;
  1936.       case CKR_ATTRIBUTE_TYPE_INVALID:
  1937.         invalid = CK_TRUE;
  1938.         pTemplate[i].ulValueLen = (CK_ULONG)(-1);
  1939.         continue;
  1940.       case CKR_OK:
  1941.         break;
  1942.       default:
  1943.         goto loser;
  1944.       }
  1945.     }
  1946.     if( (CK_VOID_PTR)CK_NULL_PTR == pTemplate[i].pValue ) {
  1947.       pTemplate[i].ulValueLen = size;
  1948.     } else {
  1949.       NSSItem it, *p;
  1950.       if( pTemplate[i].ulValueLen < size ) {
  1951.         tooSmall = CK_TRUE;
  1952.         continue;
  1953.       }
  1954.       it.size = (PRUint32)pTemplate[i].ulValueLen;
  1955.       it.data = (void *)pTemplate[i].pValue;
  1956.       p = nssCKFWObject_GetAttribute(fwObject, pTemplate[i].type, &it, 
  1957.             (NSSArena *)NULL, &error);
  1958.       if( (NSSItem *)NULL == p ) {
  1959.         switch( error ) {
  1960.         case CKR_ATTRIBUTE_SENSITIVE:
  1961.         case CKR_INFORMATION_SENSITIVE:
  1962.           sensitive = CK_TRUE;
  1963.           pTemplate[i].ulValueLen = (CK_ULONG)(-1);
  1964.           continue;
  1965.         case CKR_ATTRIBUTE_TYPE_INVALID:
  1966.           invalid = CK_TRUE;
  1967.           pTemplate[i].ulValueLen = (CK_ULONG)(-1);
  1968.           continue;
  1969.         default:
  1970.           goto loser;
  1971.         }
  1972.       }
  1973.       pTemplate[i].ulValueLen = size;
  1974.     }
  1975.   }
  1976.   if( sensitive ) {
  1977.     error = CKR_ATTRIBUTE_SENSITIVE;
  1978.     goto loser;
  1979.   } else if( invalid ) {
  1980.     error = CKR_ATTRIBUTE_TYPE_INVALID;
  1981.     goto loser;
  1982.   } else if( tooSmall ) {
  1983.     error = CKR_BUFFER_TOO_SMALL;
  1984.     goto loser;
  1985.   }
  1986.   return CKR_OK;
  1987.  loser:
  1988.   switch( error ) {
  1989.   case CKR_SESSION_CLOSED:
  1990.     /* destroy session? */
  1991.     break;
  1992.   case CKR_DEVICE_REMOVED:
  1993.     /* (void)nssCKFWToken_Destroy(fwToken); */
  1994.     break;
  1995.   case CKR_ATTRIBUTE_SENSITIVE:
  1996.   case CKR_ATTRIBUTE_TYPE_INVALID:
  1997.   case CKR_BUFFER_TOO_SMALL:
  1998.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  1999.   case CKR_DEVICE_ERROR:
  2000.   case CKR_DEVICE_MEMORY:
  2001.   case CKR_FUNCTION_FAILED:
  2002.   case CKR_GENERAL_ERROR:
  2003.   case CKR_HOST_MEMORY:
  2004.   case CKR_OBJECT_HANDLE_INVALID:
  2005.   case CKR_SESSION_HANDLE_INVALID:
  2006.     break;
  2007.   default:
  2008.   case CKR_OK:
  2009.     error = CKR_GENERAL_ERROR;
  2010.     break;
  2011.   }
  2012.   return error;
  2013. }
  2014.   
  2015. /*
  2016.  * NSSCKFWC_SetAttributeValue
  2017.  *
  2018.  */
  2019. NSS_IMPLEMENT CK_RV
  2020. NSSCKFWC_SetAttributeValue
  2021. (
  2022.   NSSCKFWInstance *fwInstance,
  2023.   CK_SESSION_HANDLE hSession,
  2024.   CK_OBJECT_HANDLE hObject,
  2025.   CK_ATTRIBUTE_PTR pTemplate,
  2026.   CK_ULONG ulCount
  2027. )
  2028. {
  2029.   CK_RV error = CKR_OK;
  2030.   NSSCKFWSession *fwSession;
  2031.   NSSCKFWObject *fwObject;
  2032.   NSSCKFWObject *newFwObject;
  2033.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  2034.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  2035.     goto loser;
  2036.   }
  2037.   
  2038.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  2039.   if( (NSSCKFWSession *)NULL == fwSession ) {
  2040.     error = CKR_SESSION_HANDLE_INVALID;
  2041.     goto loser;
  2042.   }
  2043.   fwObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hObject);
  2044.   if( (NSSCKFWObject *)NULL == fwObject ) {
  2045.     error = CKR_OBJECT_HANDLE_INVALID;
  2046.     goto loser;
  2047.   }
  2048.   if( (CK_ATTRIBUTE_PTR)CK_NULL_PTR == pTemplate ) {
  2049.     error = CKR_ARGUMENTS_BAD;
  2050.     goto loser;
  2051.   }
  2052.   newFwObject = nssCKFWSession_CopyObject(fwSession, fwObject, pTemplate, 
  2053.                   ulCount, &error);
  2054.   if( (NSSCKFWObject *)NULL == newFwObject ) {
  2055.     goto loser;
  2056.   }
  2057.   error = nssCKFWInstance_ReassignObjectHandle(fwInstance, hObject, newFwObject);
  2058.   nssCKFWObject_Destroy(fwObject);
  2059.   if( CKR_OK != error ) {
  2060.     goto loser;
  2061.   }
  2062.   return CKR_OK;
  2063.  loser:
  2064.   switch( error ) {
  2065.   case CKR_SESSION_CLOSED:
  2066.     /* destroy session? */
  2067.     break;
  2068.   case CKR_DEVICE_REMOVED:
  2069.     /* (void)nssCKFWToken_Destroy(fwToken); */
  2070.     break;
  2071.   case CKR_ATTRIBUTE_READ_ONLY:
  2072.   case CKR_ATTRIBUTE_TYPE_INVALID:
  2073.   case CKR_ATTRIBUTE_VALUE_INVALID:
  2074.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  2075.   case CKR_DEVICE_ERROR:
  2076.   case CKR_DEVICE_MEMORY:
  2077.   case CKR_FUNCTION_FAILED:
  2078.   case CKR_GENERAL_ERROR:
  2079.   case CKR_HOST_MEMORY:
  2080.   case CKR_OBJECT_HANDLE_INVALID:
  2081.   case CKR_SESSION_HANDLE_INVALID:
  2082.   case CKR_SESSION_READ_ONLY:
  2083.   case CKR_TEMPLATE_INCONSISTENT:
  2084.   case CKR_TOKEN_WRITE_PROTECTED:
  2085.     break;
  2086.   default:
  2087.   case CKR_OK:
  2088.     error = CKR_GENERAL_ERROR;
  2089.     break;
  2090.   }
  2091.   return error;
  2092. }
  2093. /*
  2094.  * NSSCKFWC_FindObjectsInit
  2095.  *
  2096.  */
  2097. NSS_IMPLEMENT CK_RV
  2098. NSSCKFWC_FindObjectsInit
  2099. (
  2100.   NSSCKFWInstance *fwInstance,
  2101.   CK_SESSION_HANDLE hSession,
  2102.   CK_ATTRIBUTE_PTR pTemplate,
  2103.   CK_ULONG ulCount
  2104. )
  2105. {
  2106.   CK_RV error = CKR_OK;
  2107.   NSSCKFWSession *fwSession;
  2108.   NSSCKFWFindObjects *fwFindObjects;
  2109.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  2110.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  2111.     goto loser;
  2112.   }
  2113.   
  2114.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  2115.   if( (NSSCKFWSession *)NULL == fwSession ) {
  2116.     error = CKR_SESSION_HANDLE_INVALID;
  2117.     goto loser;
  2118.   }
  2119.   if( ((CK_ATTRIBUTE_PTR)CK_NULL_PTR == pTemplate) && (ulCount != 0) ) {
  2120.     error = CKR_ARGUMENTS_BAD;
  2121.     goto loser;
  2122.   }
  2123.   fwFindObjects = nssCKFWSession_GetFWFindObjects(fwSession, &error);
  2124.   if( (NSSCKFWFindObjects *)NULL != fwFindObjects ) {
  2125.     error = CKR_OPERATION_ACTIVE;
  2126.     goto loser;
  2127.   }
  2128.   if( CKR_OPERATION_NOT_INITIALIZED != error ) {
  2129.     goto loser;
  2130.   }
  2131.   fwFindObjects = nssCKFWSession_FindObjectsInit(fwSession,
  2132.                     pTemplate, ulCount, &error);
  2133.   if( (NSSCKFWFindObjects *)NULL == fwFindObjects ) {
  2134.     goto loser;
  2135.   }
  2136.   error = nssCKFWSession_SetFWFindObjects(fwSession, fwFindObjects);
  2137.   if( CKR_OK != error ) {
  2138.     nssCKFWFindObjects_Destroy(fwFindObjects);
  2139.     goto loser;
  2140.   }
  2141.   return CKR_OK;
  2142.  loser:
  2143.   switch( error ) {
  2144.   case CKR_SESSION_CLOSED:
  2145.     /* destroy session? */
  2146.     break;
  2147.   case CKR_DEVICE_REMOVED:
  2148.     /* (void)nssCKFWToken_Destroy(fwToken); */
  2149.     break;
  2150.   case CKR_ATTRIBUTE_TYPE_INVALID:
  2151.   case CKR_ATTRIBUTE_VALUE_INVALID:
  2152.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  2153.   case CKR_DEVICE_ERROR:
  2154.   case CKR_DEVICE_MEMORY:
  2155.   case CKR_FUNCTION_FAILED:
  2156.   case CKR_GENERAL_ERROR:
  2157.   case CKR_HOST_MEMORY:
  2158.   case CKR_OPERATION_ACTIVE:
  2159.   case CKR_SESSION_HANDLE_INVALID:
  2160.     break;
  2161.   default:
  2162.   case CKR_OK:
  2163.     error = CKR_GENERAL_ERROR;
  2164.     break;
  2165.   }
  2166.   return error;
  2167. }
  2168. /*
  2169.  * NSSCKFWC_FindObjects
  2170.  *
  2171.  */
  2172. NSS_IMPLEMENT CK_RV
  2173. NSSCKFWC_FindObjects
  2174. (
  2175.   NSSCKFWInstance *fwInstance,
  2176.   CK_SESSION_HANDLE hSession,
  2177.   CK_OBJECT_HANDLE_PTR phObject,
  2178.   CK_ULONG ulMaxObjectCount,
  2179.   CK_ULONG_PTR pulObjectCount
  2180. )
  2181. {
  2182.   CK_RV error = CKR_OK;
  2183.   NSSCKFWSession *fwSession;
  2184.   NSSCKFWFindObjects *fwFindObjects;
  2185.   CK_ULONG i;
  2186.   NSSArena *arena;
  2187.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  2188.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  2189.     goto loser;
  2190.   }
  2191.   
  2192.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  2193.   if( (NSSCKFWSession *)NULL == fwSession ) {
  2194.     error = CKR_SESSION_HANDLE_INVALID;
  2195.     goto loser;
  2196.   }
  2197.   arena = nssCKFWSession_GetArena(fwSession, &error);
  2198.   if( (NSSArena *)NULL == arena ) {
  2199.     goto loser;
  2200.   }
  2201.   if( (CK_OBJECT_HANDLE_PTR)CK_NULL_PTR == phObject ) {
  2202.     error = CKR_ARGUMENTS_BAD;
  2203.     goto loser;
  2204.   }
  2205.   /*
  2206.    * A purify error here indicates caller error.
  2207.    */
  2208.   (void)nsslibc_memset(phObject, 0, sizeof(CK_OBJECT_HANDLE) * ulMaxObjectCount);
  2209.   *pulObjectCount = (CK_ULONG)0;
  2210.   fwFindObjects = nssCKFWSession_GetFWFindObjects(fwSession, &error);
  2211.   if( (NSSCKFWFindObjects *)NULL == fwFindObjects ) {
  2212.     goto loser;
  2213.   }
  2214.   for( i = 0; i < ulMaxObjectCount; i++ ) {
  2215.     NSSCKFWObject *fwObject = nssCKFWFindObjects_Next(fwFindObjects,
  2216.                                 arena, &error);
  2217.     if( (NSSCKFWObject *)NULL == fwObject ) {
  2218.       break;
  2219.     }
  2220.     phObject[i] = nssCKFWInstance_FindObjectHandle(fwInstance, fwObject);
  2221.     if( (CK_OBJECT_HANDLE)0 == phObject[i] ) {
  2222.       phObject[i] = nssCKFWInstance_CreateObjectHandle(fwInstance, fwObject, &error);
  2223.     }
  2224.     if( (CK_OBJECT_HANDLE)0 == phObject[i] ) {
  2225.       /* This isn't right either, is it? */
  2226.       nssCKFWObject_Destroy(fwObject);
  2227.       goto loser;
  2228.     }
  2229.   }
  2230.   *pulObjectCount = i;
  2231.   return CKR_OK;
  2232.  loser:
  2233.   switch( error ) {
  2234.   case CKR_SESSION_CLOSED:
  2235.     /* destroy session? */
  2236.     break;
  2237.   case CKR_DEVICE_REMOVED:
  2238.     /* (void)nssCKFWToken_Destroy(fwToken); */
  2239.     break;
  2240.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  2241.   case CKR_DEVICE_ERROR:
  2242.   case CKR_DEVICE_MEMORY:
  2243.   case CKR_FUNCTION_FAILED:
  2244.   case CKR_GENERAL_ERROR:
  2245.   case CKR_HOST_MEMORY:
  2246.   case CKR_OPERATION_NOT_INITIALIZED:
  2247.   case CKR_SESSION_HANDLE_INVALID:
  2248.     break;
  2249.   default:
  2250.   case CKR_OK:
  2251.     error = CKR_GENERAL_ERROR;
  2252.     break;
  2253.   }
  2254.   return error;
  2255. }
  2256. /*
  2257.  * NSSCKFWC_FindObjectsFinal
  2258.  *
  2259.  */
  2260. NSS_IMPLEMENT CK_RV
  2261. NSSCKFWC_FindObjectsFinal
  2262. (
  2263.   NSSCKFWInstance *fwInstance,
  2264.   CK_SESSION_HANDLE hSession
  2265. )
  2266. {
  2267.   CK_RV error = CKR_OK;
  2268.   NSSCKFWSession *fwSession;
  2269.   NSSCKFWFindObjects *fwFindObjects;
  2270.   
  2271.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  2272.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  2273.     goto loser;
  2274.   }
  2275.   
  2276.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  2277.   if( (NSSCKFWSession *)NULL == fwSession ) {
  2278.     error = CKR_SESSION_HANDLE_INVALID;
  2279.     goto loser;
  2280.   }
  2281.   fwFindObjects = nssCKFWSession_GetFWFindObjects(fwSession, &error);
  2282.   if( (NSSCKFWFindObjects *)NULL == fwFindObjects ) {
  2283.     error = CKR_OPERATION_NOT_INITIALIZED;
  2284.     goto loser;
  2285.   }
  2286.   nssCKFWFindObjects_Destroy(fwFindObjects);
  2287.   error = nssCKFWSession_SetFWFindObjects(fwSession, (NSSCKFWFindObjects *)NULL);
  2288.   if( CKR_OK != error ) {
  2289.     goto loser;
  2290.   }
  2291.   return CKR_OK;
  2292.  loser:
  2293.   switch( error ) {
  2294.   case CKR_SESSION_CLOSED:
  2295.     /* destroy session? */
  2296.     break;
  2297.   case CKR_DEVICE_REMOVED:
  2298.     /* (void)nssCKFWToken_Destroy(fwToken); */
  2299.     break;
  2300.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  2301.   case CKR_DEVICE_ERROR:
  2302.   case CKR_DEVICE_MEMORY:
  2303.   case CKR_FUNCTION_FAILED:
  2304.   case CKR_GENERAL_ERROR:
  2305.   case CKR_HOST_MEMORY:
  2306.   case CKR_OPERATION_NOT_INITIALIZED:
  2307.   case CKR_SESSION_HANDLE_INVALID:
  2308.     break;
  2309.   default:
  2310.   case CKR_OK:
  2311.     error = CKR_GENERAL_ERROR;
  2312.     break;
  2313.   }
  2314.   return error;
  2315. }
  2316. /*
  2317.  * NSSCKFWC_EncryptInit
  2318.  *
  2319.  */
  2320. NSS_IMPLEMENT CK_RV
  2321. NSSCKFWC_EncryptInit
  2322. (
  2323.   NSSCKFWInstance *fwInstance,
  2324.   CK_SESSION_HANDLE hSession,
  2325.   CK_MECHANISM_PTR pMechanism,
  2326.   CK_OBJECT_HANDLE hKey
  2327. )
  2328. {
  2329.   return CKR_FUNCTION_FAILED;
  2330. }
  2331. /*
  2332.  * NSSCKFWC_Encrypt
  2333.  *
  2334.  */
  2335. NSS_IMPLEMENT CK_RV
  2336. NSSCKFWC_Encrypt
  2337. (
  2338.   NSSCKFWInstance *fwInstance,
  2339.   CK_SESSION_HANDLE hSession,
  2340.   CK_BYTE_PTR pData,
  2341.   CK_ULONG ulDataLen,
  2342.   CK_BYTE_PTR pEncryptedData,
  2343.   CK_ULONG_PTR pulEncryptedDataLen
  2344. )
  2345. {
  2346.   return CKR_FUNCTION_FAILED;
  2347. }
  2348. /*
  2349.  * NSSCKFWC_EncryptUpdate
  2350.  *
  2351.  */
  2352. NSS_IMPLEMENT CK_RV
  2353. NSSCKFWC_EncryptUpdate
  2354. (
  2355.   NSSCKFWInstance *fwInstance,
  2356.   CK_SESSION_HANDLE hSession,
  2357.   CK_BYTE_PTR pPart,
  2358.   CK_ULONG ulPartLen,
  2359.   CK_BYTE_PTR pEncryptedPart,
  2360.   CK_ULONG_PTR pulEncryptedPartLen
  2361. )
  2362. {
  2363.   return CKR_FUNCTION_FAILED;
  2364. }
  2365. /*
  2366.  * NSSCKFWC_EncryptFinal
  2367.  *
  2368.  */
  2369. NSS_IMPLEMENT CK_RV
  2370. NSSCKFWC_EncryptFinal
  2371. (
  2372.   NSSCKFWInstance *fwInstance,
  2373.   CK_SESSION_HANDLE hSession,
  2374.   CK_BYTE_PTR pLastEncryptedPart,
  2375.   CK_ULONG_PTR pulLastEncryptedPartLen
  2376. )
  2377. {
  2378.   return CKR_FUNCTION_FAILED;
  2379. }
  2380. /*
  2381.  * NSSCKFWC_DecryptInit
  2382.  *
  2383.  */
  2384. NSS_IMPLEMENT CK_RV
  2385. NSSCKFWC_DecryptInit
  2386. (
  2387.   NSSCKFWInstance *fwInstance,
  2388.   CK_SESSION_HANDLE hSession,
  2389.   CK_MECHANISM_PTR pMechanism,
  2390.   CK_OBJECT_HANDLE hKey
  2391. )
  2392. {
  2393.   return CKR_FUNCTION_FAILED;
  2394. }
  2395. /*
  2396.  * NSSCKFWC_Decrypt
  2397.  *
  2398.  */
  2399. NSS_IMPLEMENT CK_RV
  2400. NSSCKFWC_Decrypt
  2401. (
  2402.   NSSCKFWInstance *fwInstance,
  2403.   CK_SESSION_HANDLE hSession,
  2404.   CK_BYTE_PTR pEncryptedData,
  2405.   CK_ULONG ulEncryptedDataLen,
  2406.   CK_BYTE_PTR pData,
  2407.   CK_ULONG_PTR pulDataLen
  2408. )
  2409. {
  2410.   return CKR_FUNCTION_FAILED;
  2411. }
  2412. /*
  2413.  * NSSCKFWC_DecryptUpdate
  2414.  *
  2415.  */
  2416. NSS_IMPLEMENT CK_RV
  2417. NSSCKFWC_DecryptUpdate
  2418. (
  2419.   NSSCKFWInstance *fwInstance,
  2420.   CK_SESSION_HANDLE hSession,
  2421.   CK_BYTE_PTR pEncryptedPart,
  2422.   CK_ULONG ulEncryptedPartLen,
  2423.   CK_BYTE_PTR pPart,
  2424.   CK_ULONG_PTR pulPartLen
  2425. )
  2426. {
  2427.   return CKR_FUNCTION_FAILED;
  2428. }
  2429. /*
  2430.  * NSSCKFWC_DecryptFinal
  2431.  *
  2432.  */
  2433. NSS_IMPLEMENT CK_RV
  2434. NSSCKFWC_DecryptFinal
  2435. (
  2436.   NSSCKFWInstance *fwInstance,
  2437.   CK_SESSION_HANDLE hSession,
  2438.   CK_BYTE_PTR pLastPart,
  2439.   CK_ULONG_PTR pulLastPartLen
  2440. )
  2441. {
  2442.   return CKR_FUNCTION_FAILED;
  2443. }
  2444. /*
  2445.  * NSSCKFWC_DigestInit
  2446.  *
  2447.  */
  2448. NSS_IMPLEMENT CK_RV
  2449. NSSCKFWC_DigestInit
  2450. (
  2451.   NSSCKFWInstance *fwInstance,
  2452.   CK_SESSION_HANDLE hSession,
  2453.   CK_MECHANISM_PTR pMechanism
  2454. )
  2455. {
  2456.   return CKR_FUNCTION_FAILED;
  2457. }
  2458. /*
  2459.  * NSSCKFWC_Digest
  2460.  *
  2461.  */
  2462. NSS_IMPLEMENT CK_RV
  2463. NSSCKFWC_Digest
  2464. (
  2465.   NSSCKFWInstance *fwInstance,
  2466.   CK_SESSION_HANDLE hSession,
  2467.   CK_BYTE_PTR pData,
  2468.   CK_ULONG ulDataLen,
  2469.   CK_BYTE_PTR pDigest,
  2470.   CK_ULONG_PTR pulDigestLen
  2471. )
  2472. {
  2473.   return CKR_FUNCTION_FAILED;
  2474. }
  2475. /*
  2476.  * NSSCKFWC_DigestUpdate
  2477.  *
  2478.  */
  2479. NSS_IMPLEMENT CK_RV
  2480. NSSCKFWC_DigestUpdate
  2481. (
  2482.   NSSCKFWInstance *fwInstance,
  2483.   CK_SESSION_HANDLE hSession,
  2484.   CK_BYTE_PTR pData,
  2485.   CK_ULONG ulDataLen
  2486. )
  2487. {
  2488.   return CKR_FUNCTION_FAILED;
  2489. }
  2490. /*
  2491.  * NSSCKFWC_DigestKey
  2492.  *
  2493.  */
  2494. NSS_IMPLEMENT CK_RV
  2495. NSSCKFWC_DigestKey
  2496. (
  2497.   NSSCKFWInstance *fwInstance,
  2498.   CK_SESSION_HANDLE hSession,
  2499.   CK_OBJECT_HANDLE hKey
  2500. )
  2501. {
  2502.   return CKR_FUNCTION_FAILED;
  2503. }
  2504. /*
  2505.  * NSSCKFWC_DigestFinal
  2506.  *
  2507.  */
  2508. NSS_IMPLEMENT CK_RV
  2509. NSSCKFWC_DigestFinal
  2510. (
  2511.   NSSCKFWInstance *fwInstance,
  2512.   CK_SESSION_HANDLE hSession,
  2513.   CK_BYTE_PTR pDigest,
  2514.   CK_ULONG_PTR pulDigestLen
  2515. )
  2516. {
  2517.   return CKR_FUNCTION_FAILED;
  2518. }
  2519. /*
  2520.  * NSSCKFWC_SignInit
  2521.  *
  2522.  */
  2523. NSS_IMPLEMENT CK_RV
  2524. NSSCKFWC_SignInit
  2525. (
  2526.   NSSCKFWInstance *fwInstance,
  2527.   CK_SESSION_HANDLE hSession,
  2528.   CK_MECHANISM_PTR pMechanism,
  2529.   CK_OBJECT_HANDLE hKey
  2530. )
  2531. {
  2532.   return CKR_FUNCTION_FAILED;
  2533. }
  2534. /*
  2535.  * NSSCKFWC_Sign
  2536.  *
  2537.  */
  2538. NSS_IMPLEMENT CK_RV
  2539. NSSCKFWC_Sign
  2540. (
  2541.   NSSCKFWInstance *fwInstance,
  2542.   CK_SESSION_HANDLE hSession,
  2543.   CK_BYTE_PTR pData,
  2544.   CK_ULONG ulDataLen,
  2545.   CK_BYTE_PTR pSignature,
  2546.   CK_ULONG_PTR pulSignatureLen
  2547. )
  2548. {
  2549.   return CKR_FUNCTION_FAILED;
  2550. }
  2551. /*
  2552.  * NSSCKFWC_SignUpdate
  2553.  *
  2554.  */
  2555. NSS_IMPLEMENT CK_RV
  2556. NSSCKFWC_SignUpdate
  2557. (
  2558.   NSSCKFWInstance *fwInstance,
  2559.   CK_SESSION_HANDLE hSession,
  2560.   CK_BYTE_PTR pPart,
  2561.   CK_ULONG ulPartLen
  2562. )
  2563. {
  2564.   return CKR_FUNCTION_FAILED;
  2565. }
  2566. /*
  2567.  * NSSCKFWC_SignFinal
  2568.  *
  2569.  */
  2570. NSS_IMPLEMENT CK_RV
  2571. NSSCKFWC_SignFinal
  2572. (
  2573.   NSSCKFWInstance *fwInstance,
  2574.   CK_SESSION_HANDLE hSession,
  2575.   CK_BYTE_PTR pSignature,
  2576.   CK_ULONG_PTR pulSignatureLen
  2577. )
  2578. {
  2579.   return CKR_FUNCTION_FAILED;
  2580. }
  2581. /*
  2582.  * NSSCKFWC_SignRecoverInit
  2583.  *
  2584.  */
  2585. NSS_IMPLEMENT CK_RV
  2586. NSSCKFWC_SignRecoverInit
  2587. (
  2588.   NSSCKFWInstance *fwInstance,
  2589.   CK_SESSION_HANDLE hSession,
  2590.   CK_MECHANISM_PTR pMechanism,
  2591.   CK_OBJECT_HANDLE hKey
  2592. )
  2593. {
  2594.   return CKR_FUNCTION_FAILED;
  2595. }
  2596. /*
  2597.  * NSSCKFWC_SignRecover
  2598.  *
  2599.  */
  2600. NSS_IMPLEMENT CK_RV
  2601. NSSCKFWC_SignRecover
  2602. (
  2603.   NSSCKFWInstance *fwInstance,
  2604.   CK_SESSION_HANDLE hSession,
  2605.   CK_BYTE_PTR pData,
  2606.   CK_ULONG ulDataLen,
  2607.   CK_BYTE_PTR pSignature,
  2608.   CK_ULONG_PTR pulSignatureLen
  2609. )
  2610. {
  2611.   return CKR_FUNCTION_FAILED;
  2612. }
  2613. /*
  2614.  * NSSCKFWC_VerifyInit
  2615.  *
  2616.  */
  2617. NSS_IMPLEMENT CK_RV
  2618. NSSCKFWC_VerifyInit
  2619. (
  2620.   NSSCKFWInstance *fwInstance,
  2621.   CK_SESSION_HANDLE hSession,
  2622.   CK_MECHANISM_PTR pMechanism,
  2623.   CK_OBJECT_HANDLE hKey
  2624. )
  2625. {
  2626.   return CKR_FUNCTION_FAILED;
  2627. }
  2628. /*
  2629.  * NSSCKFWC_Verify
  2630.  *
  2631.  */
  2632. NSS_IMPLEMENT CK_RV
  2633. NSSCKFWC_Verify
  2634. (
  2635.   NSSCKFWInstance *fwInstance,
  2636.   CK_SESSION_HANDLE hSession,
  2637.   CK_BYTE_PTR pData,
  2638.   CK_ULONG ulDataLen,
  2639.   CK_BYTE_PTR pSignature,
  2640.   CK_ULONG ulSignatureLen
  2641. )
  2642. {
  2643.   return CKR_FUNCTION_FAILED;
  2644. }
  2645. /*
  2646.  * NSSCKFWC_VerifyUpdate
  2647.  *
  2648.  */
  2649. NSS_IMPLEMENT CK_RV
  2650. NSSCKFWC_VerifyUpdate
  2651. (
  2652.   NSSCKFWInstance *fwInstance,
  2653.   CK_SESSION_HANDLE hSession,
  2654.   CK_BYTE_PTR pPart,
  2655.   CK_ULONG ulPartLen
  2656. )
  2657. {
  2658.   return CKR_FUNCTION_FAILED;
  2659. }
  2660. /*
  2661.  * NSSCKFWC_VerifyFinal
  2662.  *
  2663.  */
  2664. NSS_IMPLEMENT CK_RV
  2665. NSSCKFWC_VerifyFinal
  2666. (
  2667.   NSSCKFWInstance *fwInstance,
  2668.   CK_SESSION_HANDLE hSession,
  2669.   CK_BYTE_PTR pSignature,
  2670.   CK_ULONG ulSignatureLen
  2671. )
  2672. {
  2673.   return CKR_FUNCTION_FAILED;
  2674. }
  2675. /*
  2676.  * NSSCKFWC_VerifyRecoverInit
  2677.  *
  2678.  */
  2679. NSS_IMPLEMENT CK_RV
  2680. NSSCKFWC_VerifyRecoverInit
  2681. (
  2682.   NSSCKFWInstance *fwInstance,
  2683.   CK_SESSION_HANDLE hSession,
  2684.   CK_MECHANISM_PTR pMechanism,
  2685.   CK_OBJECT_HANDLE hKey
  2686. )
  2687. {
  2688.   return CKR_FUNCTION_FAILED;
  2689. }
  2690. /*
  2691.  * NSSCKFWC_VerifyRecover
  2692.  *
  2693.  */
  2694. NSS_IMPLEMENT CK_RV
  2695. NSSCKFWC_VerifyRecover
  2696. (
  2697.   NSSCKFWInstance *fwInstance,
  2698.   CK_SESSION_HANDLE hSession,
  2699.   CK_BYTE_PTR pSignature,
  2700.   CK_ULONG ulSignatureLen,
  2701.   CK_BYTE_PTR pData,
  2702.   CK_ULONG_PTR pulDataLen
  2703. )
  2704. {
  2705.   return CKR_FUNCTION_FAILED;
  2706. }
  2707. /*
  2708.  * NSSCKFWC_DigestEncryptUpdate
  2709.  *
  2710.  */
  2711. NSS_IMPLEMENT CK_RV
  2712. NSSCKFWC_DigestEncryptUpdate
  2713. (
  2714.   NSSCKFWInstance *fwInstance,
  2715.   CK_SESSION_HANDLE hSession,
  2716.   CK_BYTE_PTR pPart,
  2717.   CK_ULONG ulPartLen,
  2718.   CK_BYTE_PTR pEncryptedPart,
  2719.   CK_ULONG_PTR pulEncryptedPartLen
  2720. )
  2721. {
  2722.   return CKR_FUNCTION_FAILED;
  2723. }
  2724. /*
  2725.  * NSSCKFWC_DecryptDigestUpdate
  2726.  *
  2727.  */
  2728. NSS_IMPLEMENT CK_RV
  2729. NSSCKFWC_DecryptDigestUpdate
  2730. (
  2731.   NSSCKFWInstance *fwInstance,
  2732.   CK_SESSION_HANDLE hSession,
  2733.   CK_BYTE_PTR pEncryptedPart,
  2734.   CK_ULONG ulEncryptedPartLen,
  2735.   CK_BYTE_PTR pPart,
  2736.   CK_ULONG_PTR pulPartLen
  2737. )
  2738. {
  2739.   return CKR_FUNCTION_FAILED;
  2740. }
  2741. /*
  2742.  * NSSCKFWC_SignEncryptUpdate
  2743.  *
  2744.  */
  2745. NSS_IMPLEMENT CK_RV
  2746. NSSCKFWC_SignEncryptUpdate
  2747. (
  2748.   NSSCKFWInstance *fwInstance,
  2749.   CK_SESSION_HANDLE hSession,
  2750.   CK_BYTE_PTR pPart,
  2751.   CK_ULONG ulPartLen,
  2752.   CK_BYTE_PTR pEncryptedPart,
  2753.   CK_ULONG_PTR pulEncryptedPartLen
  2754. )
  2755. {
  2756.   return CKR_FUNCTION_FAILED;
  2757. }
  2758. /*
  2759.  * NSSCKFWC_DecryptVerifyUpdate
  2760.  *
  2761.  */
  2762. NSS_IMPLEMENT CK_RV
  2763. NSSCKFWC_DecryptVerifyUpdate
  2764. (
  2765.   NSSCKFWInstance *fwInstance,
  2766.   CK_SESSION_HANDLE hSession,
  2767.   CK_BYTE_PTR pEncryptedPart,
  2768.   CK_ULONG ulEncryptedPartLen,
  2769.   CK_BYTE_PTR pPart,
  2770.   CK_ULONG_PTR pulPartLen
  2771. )
  2772. {
  2773.   return CKR_FUNCTION_FAILED;
  2774. }
  2775. /*
  2776.  * NSSCKFWC_GenerateKey
  2777.  *
  2778.  */
  2779. NSS_IMPLEMENT CK_RV
  2780. NSSCKFWC_GenerateKey
  2781. (
  2782.   NSSCKFWInstance *fwInstance,
  2783.   CK_SESSION_HANDLE hSession,
  2784.   CK_MECHANISM_PTR pMechanism,
  2785.   CK_ATTRIBUTE_PTR pTemplate,
  2786.   CK_ULONG ulCount,
  2787.   CK_OBJECT_HANDLE_PTR phKey
  2788. )
  2789. {
  2790.   return CKR_FUNCTION_FAILED;
  2791. }
  2792. /*
  2793.  * NSSCKFWC_GenerateKeyPair
  2794.  *
  2795.  */
  2796. NSS_IMPLEMENT CK_RV
  2797. NSSCKFWC_GenerateKeyPair
  2798. (
  2799.   NSSCKFWInstance *fwInstance,
  2800.   CK_SESSION_HANDLE hSession,
  2801.   CK_MECHANISM_PTR pMechanism,
  2802.   CK_ATTRIBUTE_PTR pPublicKeyTemplate,
  2803.   CK_ULONG ulPublicKeyAttributeCount,
  2804.   CK_ATTRIBUTE_PTR pPrivateKeyTemplate,
  2805.   CK_ULONG ulPrivateKeyAttributeCount,
  2806.   CK_OBJECT_HANDLE_PTR phPublicKey,
  2807.   CK_OBJECT_HANDLE_PTR phPrivateKey
  2808. )
  2809. {
  2810.   return CKR_FUNCTION_FAILED;
  2811. }
  2812. /*
  2813.  * NSSCKFWC_WrapKey
  2814.  *
  2815.  */
  2816. NSS_IMPLEMENT CK_RV
  2817. NSSCKFWC_WrapKey
  2818. (
  2819.   NSSCKFWInstance *fwInstance,
  2820.   CK_SESSION_HANDLE hSession,
  2821.   CK_MECHANISM_PTR pMechanism,
  2822.   CK_OBJECT_HANDLE hWrappingKey,
  2823.   CK_OBJECT_HANDLE hKey,
  2824.   CK_BYTE_PTR pWrappedKey,
  2825.   CK_ULONG_PTR pulWrappedKeyLen
  2826. )
  2827. {
  2828.   return CKR_FUNCTION_FAILED;
  2829. }
  2830. /*
  2831.  * NSSCKFWC_UnwrapKey
  2832.  *
  2833.  */
  2834. NSS_IMPLEMENT CK_RV
  2835. NSSCKFWC_UnwrapKey
  2836. (
  2837.   NSSCKFWInstance *fwInstance,
  2838.   CK_SESSION_HANDLE hSession,
  2839.   CK_MECHANISM_PTR pMechanism,
  2840.   CK_OBJECT_HANDLE hUnwrappingKey,
  2841.   CK_BYTE_PTR pWrappedKey,
  2842.   CK_ULONG ulWrappedKeyLen,
  2843.   CK_ATTRIBUTE_PTR pTemplate,
  2844.   CK_ULONG ulAttributeCount,
  2845.   CK_OBJECT_HANDLE_PTR phKey
  2846. )
  2847. {
  2848.   return CKR_FUNCTION_FAILED;
  2849. }
  2850. /*
  2851.  * NSSCKFWC_DeriveKey
  2852.  *
  2853.  */
  2854. NSS_IMPLEMENT CK_RV
  2855. NSSCKFWC_DeriveKey
  2856. (
  2857.   NSSCKFWInstance *fwInstance,
  2858.   CK_SESSION_HANDLE hSession,
  2859.   CK_MECHANISM_PTR pMechanism,
  2860.   CK_OBJECT_HANDLE hBaseKey,
  2861.   CK_ATTRIBUTE_PTR pTemplate,
  2862.   CK_ULONG ulAttributeCount,
  2863.   CK_OBJECT_HANDLE_PTR phKey
  2864. )
  2865. {
  2866.   return CKR_FUNCTION_FAILED;
  2867. }
  2868. /*
  2869.  * NSSCKFWC_SeedRandom
  2870.  *
  2871.  */
  2872. NSS_IMPLEMENT CK_RV
  2873. NSSCKFWC_SeedRandom
  2874. (
  2875.   NSSCKFWInstance *fwInstance,
  2876.   CK_SESSION_HANDLE hSession,
  2877.   CK_BYTE_PTR pSeed,
  2878.   CK_ULONG ulSeedLen
  2879. )
  2880. {
  2881.   CK_RV error = CKR_OK;
  2882.   NSSCKFWSession *fwSession;
  2883.   NSSItem seed;
  2884.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  2885.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  2886.     goto loser;
  2887.   }
  2888.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  2889.   if( (NSSCKFWSession *)NULL == fwSession ) {
  2890.     error = CKR_SESSION_HANDLE_INVALID;
  2891.     goto loser;
  2892.   }
  2893.   if( (CK_BYTE_PTR)CK_NULL_PTR == pSeed ) {
  2894.     error = CKR_ARGUMENTS_BAD;
  2895.     goto loser;
  2896.   }
  2897.   /* We could read through the buffer in a Purify trap */
  2898.   seed.size = (PRUint32)ulSeedLen;
  2899.   seed.data = (void *)pSeed;
  2900.   error = nssCKFWSession_SeedRandom(fwSession, &seed);
  2901.   if( CKR_OK != error ) {
  2902.     goto loser;
  2903.   }
  2904.   return CKR_OK;
  2905.  loser:
  2906.   switch( error ) {
  2907.   case CKR_SESSION_CLOSED:
  2908.     /* destroy session? */
  2909.     break;
  2910.   case CKR_DEVICE_REMOVED:
  2911.     /* (void)nssCKFWToken_Destroy(fwToken); */
  2912.     break;
  2913.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  2914.   case CKR_DEVICE_ERROR:
  2915.   case CKR_DEVICE_MEMORY:
  2916.   case CKR_FUNCTION_CANCELED:
  2917.   case CKR_FUNCTION_FAILED:
  2918.   case CKR_GENERAL_ERROR:
  2919.   case CKR_HOST_MEMORY:
  2920.   case CKR_OPERATION_ACTIVE:
  2921.   case CKR_RANDOM_SEED_NOT_SUPPORTED:
  2922.   case CKR_RANDOM_NO_RNG:
  2923.   case CKR_SESSION_HANDLE_INVALID:
  2924.   case CKR_USER_NOT_LOGGED_IN:
  2925.     break;
  2926.   default:
  2927.   case CKR_OK:
  2928.     error = CKR_GENERAL_ERROR;
  2929.     break;
  2930.   }
  2931.   return error;
  2932. }
  2933. /*
  2934.  * NSSCKFWC_GenerateRandom
  2935.  *
  2936.  */
  2937. NSS_IMPLEMENT CK_RV
  2938. NSSCKFWC_GenerateRandom
  2939. (
  2940.   NSSCKFWInstance *fwInstance,
  2941.   CK_SESSION_HANDLE hSession,
  2942.   CK_BYTE_PTR pRandomData,
  2943.   CK_ULONG ulRandomLen
  2944. )
  2945. {
  2946.   CK_RV error = CKR_OK;
  2947.   NSSCKFWSession *fwSession;
  2948.   NSSItem buffer;
  2949.   if( (NSSCKFWInstance *)NULL == fwInstance ) {
  2950.     error = CKR_CRYPTOKI_NOT_INITIALIZED;
  2951.     goto loser;
  2952.   }
  2953.   fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession);
  2954.   if( (NSSCKFWSession *)NULL == fwSession ) {
  2955.     error = CKR_SESSION_HANDLE_INVALID;
  2956.     goto loser;
  2957.   }
  2958.   if( (CK_BYTE_PTR)CK_NULL_PTR == pRandomData ) {
  2959.     error = CKR_ARGUMENTS_BAD;
  2960.     goto loser;
  2961.   }
  2962.   /*
  2963.    * A purify error here indicates caller error.
  2964.    */
  2965.   (void)nsslibc_memset(pRandomData, 0, ulRandomLen);
  2966.   buffer.size = (PRUint32)ulRandomLen;
  2967.   buffer.data = (void *)pRandomData;
  2968.   error = nssCKFWSession_GetRandom(fwSession, &buffer);
  2969.   if( CKR_OK != error ) {
  2970.     goto loser;
  2971.   }
  2972.   return CKR_OK;
  2973.  loser:
  2974.   switch( error ) {
  2975.   case CKR_SESSION_CLOSED:
  2976.     /* destroy session? */
  2977.     break;
  2978.   case CKR_DEVICE_REMOVED:
  2979.     /* (void)nssCKFWToken_Destroy(fwToken); */
  2980.     break;
  2981.   case CKR_CRYPTOKI_NOT_INITIALIZED:
  2982.   case CKR_DEVICE_ERROR:
  2983.   case CKR_DEVICE_MEMORY:
  2984.   case CKR_FUNCTION_CANCELED:
  2985.   case CKR_FUNCTION_FAILED:
  2986.   case CKR_GENERAL_ERROR:
  2987.   case CKR_HOST_MEMORY:
  2988.   case CKR_OPERATION_ACTIVE:
  2989.   case CKR_RANDOM_NO_RNG:
  2990.   case CKR_SESSION_HANDLE_INVALID:
  2991.   case CKR_USER_NOT_LOGGED_IN:
  2992.     break;
  2993.   default:
  2994.   case CKR_OK:
  2995.     error = CKR_GENERAL_ERROR;
  2996.     break;
  2997.   }
  2998.   return error;
  2999. }
  3000. /*
  3001.  * NSSCKFWC_GetFunctionStatus
  3002.  *
  3003.  */
  3004. NSS_IMPLEMENT CK_RV
  3005. NSSCKFWC_GetFunctionStatus
  3006. (
  3007.   NSSCKFWInstance *fwInstance,
  3008.   CK_SESSION_HANDLE hSession
  3009. )
  3010. {
  3011.   return CKR_FUNCTION_NOT_PARALLEL;
  3012. }
  3013. /*
  3014.  * NSSCKFWC_CancelFunction
  3015.  *
  3016.  */
  3017. NSS_IMPLEMENT CK_RV
  3018. NSSCKFWC_CancelFunction
  3019. (
  3020.   NSSCKFWInstance *fwInstance,
  3021.   CK_SESSION_HANDLE hSession
  3022. )
  3023. {
  3024.   return CKR_FUNCTION_NOT_PARALLEL;
  3025. }