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

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: find.c,v $ $Revision: 1.1 $ $Date: 2000/03/31 19:43:14 $ $Name: NSS_3_1_1_RTM $";
  35. #endif /* DEBUG */
  36. /*
  37.  * find.c
  38.  *
  39.  * This file implements the nssCKFWFindObjects type and methods.
  40.  */
  41. #ifndef CK_H
  42. #include "ck.h"
  43. #endif /* CK_H */
  44. /*
  45.  * NSSCKFWFindObjects
  46.  *
  47.  *  -- create/destroy --
  48.  *  nssCKFWFindObjects_Create
  49.  *  nssCKFWFindObjects_Destroy
  50.  *
  51.  *  -- public accessors --
  52.  *  NSSCKFWFindObjects_GetMDFindObjects
  53.  * 
  54.  *  -- implement public accessors --
  55.  *  nssCKFWFindObjects_GetMDFindObjects
  56.  *
  57.  *  -- private accessors --
  58.  *
  59.  *  -- module fronts --
  60.  *  nssCKFWFindObjects_Next
  61.  */
  62. struct NSSCKFWFindObjectsStr {
  63.   NSSCKFWMutex *mutex; /* merely to serialise the MDObject calls */
  64.   NSSCKMDFindObjects *mdfo1;
  65.   NSSCKMDFindObjects *mdfo2;
  66.   NSSCKFWSession *fwSession;
  67.   NSSCKMDSession *mdSession;
  68.   NSSCKFWToken *fwToken;
  69.   NSSCKMDToken *mdToken;
  70.   NSSCKFWInstance *fwInstance;
  71.   NSSCKMDInstance *mdInstance;
  72.   NSSCKMDFindObjects *mdFindObjects; /* varies */
  73. };
  74. #ifdef DEBUG
  75. /*
  76.  * But first, the pointer-tracking stuff.
  77.  *
  78.  * NOTE: the pointer-tracking support in NSS/base currently relies
  79.  * upon NSPR's CallOnce support.  That, however, relies upon NSPR's
  80.  * locking, which is tied into the runtime.  We need a pointer-tracker
  81.  * implementation that uses the locks supplied through C_Initialize.
  82.  * That support, however, can be filled in later.  So for now, I'll
  83.  * just do these routines as no-ops.
  84.  */
  85. static CK_RV
  86. findObjects_add_pointer
  87. (
  88.   const NSSCKFWFindObjects *fwFindObjects
  89. )
  90. {
  91.   return CKR_OK;
  92. }
  93. static CK_RV
  94. findObjects_remove_pointer
  95. (
  96.   const NSSCKFWFindObjects *fwFindObjects
  97. )
  98. {
  99.   return CKR_OK;
  100. }
  101. NSS_IMPLEMENT CK_RV
  102. nssCKFWFindObjects_verifyPointer
  103. (
  104.   const NSSCKFWFindObjects *fwFindObjects
  105. )
  106. {
  107.   return CKR_OK;
  108. }
  109. #endif /* DEBUG */
  110. /*
  111.  * nssCKFWFindObjects_Create
  112.  *
  113.  */
  114. NSS_EXTERN NSSCKFWFindObjects *
  115. nssCKFWFindObjects_Create
  116. (
  117.   NSSCKFWSession *fwSession,
  118.   NSSCKFWToken *fwToken,
  119.   NSSCKFWInstance *fwInstance,
  120.   NSSCKMDFindObjects *mdFindObjects1,
  121.   NSSCKMDFindObjects *mdFindObjects2,
  122.   CK_RV *pError
  123. )
  124. {
  125.   NSSCKFWFindObjects *fwFindObjects;
  126.   NSSArena *arena;
  127.   NSSCKMDSession *mdSession;
  128.   NSSCKMDToken *mdToken;
  129.   NSSCKMDInstance *mdInstance;
  130.   mdSession = nssCKFWSession_GetMDSession(fwSession);
  131.   mdToken = nssCKFWToken_GetMDToken(fwToken);
  132.   mdInstance = nssCKFWInstance_GetMDInstance(fwInstance);
  133.   arena = nssCKFWSession_GetArena(fwSession, pError);
  134.   if( (NSSArena *)NULL == arena ) {
  135.     goto loser;
  136.   }
  137.   fwFindObjects = nss_ZNEW(arena, NSSCKFWFindObjects);
  138.   if( (NSSCKFWFindObjects *)NULL == fwFindObjects ) {
  139.     *pError = CKR_HOST_MEMORY;
  140.     goto loser;
  141.   }
  142.   fwFindObjects->mdfo1 = mdFindObjects1;
  143.   fwFindObjects->mdfo2 = mdFindObjects2;
  144.   fwFindObjects->fwSession = fwSession;
  145.   fwFindObjects->mdSession = mdSession;
  146.   fwFindObjects->fwToken = fwToken;
  147.   fwFindObjects->mdToken = mdToken;
  148.   fwFindObjects->fwInstance = fwInstance;
  149.   fwFindObjects->mdInstance = mdInstance;
  150.   fwFindObjects->mutex = nssCKFWInstance_CreateMutex(fwInstance, arena, pError);
  151.   if( (NSSCKFWMutex *)NULL == fwFindObjects->mutex ) {
  152.     goto loser;
  153.   }
  154. #ifdef DEBUG
  155.   *pError = findObjects_add_pointer(fwFindObjects);
  156.   if( CKR_OK != *pError ) {
  157.     goto loser;
  158.   }
  159. #endif /* DEBUG */
  160.   return fwFindObjects;
  161.  loser:
  162.   nss_ZFreeIf(fwFindObjects);
  163.   if( (NSSCKMDFindObjects *)NULL != mdFindObjects1 ) {
  164.     if( (void *)NULL != (void *)mdFindObjects1->Final ) {
  165.       fwFindObjects->mdFindObjects = mdFindObjects1;
  166.       mdFindObjects1->Final(mdFindObjects1, fwFindObjects, mdSession, 
  167.         fwSession, mdToken, fwToken, mdInstance, fwInstance);
  168.     }
  169.   }
  170.   if( (NSSCKMDFindObjects *)NULL != mdFindObjects2 ) {
  171.     if( (void *)NULL != (void *)mdFindObjects2->Final ) {
  172.       fwFindObjects->mdFindObjects = mdFindObjects2;
  173.       mdFindObjects2->Final(mdFindObjects2, fwFindObjects, mdSession, 
  174.         fwSession, mdToken, fwToken, mdInstance, fwInstance);
  175.     }
  176.   }
  177.   if( CKR_OK == *pError ) {
  178.     *pError = CKR_GENERAL_ERROR;
  179.   }
  180.   return (NSSCKFWFindObjects *)NULL;
  181. }
  182. /*
  183.  * nssCKFWFindObjects_Destroy
  184.  *
  185.  */
  186. NSS_EXTERN void
  187. nssCKFWFindObjects_Destroy
  188. (
  189.   NSSCKFWFindObjects *fwFindObjects
  190. )
  191. {
  192. #ifdef NSSDEBUG
  193.   if( CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects) ) {
  194.     return;
  195.   }
  196. #endif /* NSSDEBUG */
  197.   (void)nssCKFWMutex_Destroy(fwFindObjects->mutex);
  198.   if( (NSSCKMDFindObjects *)NULL != fwFindObjects->mdfo1 ) {
  199.     if( (void *)NULL != (void *)fwFindObjects->mdfo1->Final ) {
  200.       fwFindObjects->mdFindObjects = fwFindObjects->mdfo1;
  201.       fwFindObjects->mdfo1->Final(fwFindObjects->mdfo1, fwFindObjects,
  202.         fwFindObjects->mdSession, fwFindObjects->fwSession, 
  203.         fwFindObjects->mdToken, fwFindObjects->fwToken,
  204.         fwFindObjects->mdInstance, fwFindObjects->fwInstance);
  205.     }
  206.   }
  207.   if( (NSSCKMDFindObjects *)NULL != fwFindObjects->mdfo2 ) {
  208.     if( (void *)NULL != (void *)fwFindObjects->mdfo2->Final ) {
  209.       fwFindObjects->mdFindObjects = fwFindObjects->mdfo2;
  210.       fwFindObjects->mdfo2->Final(fwFindObjects->mdfo2, fwFindObjects,
  211.         fwFindObjects->mdSession, fwFindObjects->fwSession, 
  212.         fwFindObjects->mdToken, fwFindObjects->fwToken,
  213.         fwFindObjects->mdInstance, fwFindObjects->fwInstance);
  214.     }
  215.   }
  216.   nss_ZFreeIf(fwFindObjects);
  217. #ifdef DEBUG
  218.   (void)findObjects_remove_pointer(fwFindObjects);
  219. #endif /* DEBUG */
  220.   return;
  221. }
  222. /*
  223.  * nssCKFWFindObjects_GetMDFindObjects
  224.  *
  225.  */
  226. NSS_EXTERN NSSCKMDFindObjects *
  227. nssCKFWFindObjects_GetMDFindObjects
  228. (
  229.   NSSCKFWFindObjects *fwFindObjects
  230. )
  231. {
  232. #ifdef NSSDEBUG
  233.   if( CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects) ) {
  234.     return (NSSCKMDFindObjects *)NULL;
  235.   }
  236. #endif /* NSSDEBUG */
  237.   return fwFindObjects->mdFindObjects;
  238. }
  239. /*
  240.  * nssCKFWFindObjects_Next
  241.  *
  242.  */
  243. NSS_EXTERN NSSCKFWObject *
  244. nssCKFWFindObjects_Next
  245. (
  246.   NSSCKFWFindObjects *fwFindObjects,
  247.   NSSArena *arenaOpt,
  248.   CK_RV *pError
  249. )
  250. {
  251.   NSSCKMDObject *mdObject;
  252.   NSSCKFWObject *fwObject = (NSSCKFWObject *)NULL;
  253.   NSSArena *objArena;
  254. #ifdef NSSDEBUG
  255.   if( (CK_RV *)NULL == pError ) {
  256.     return (NSSCKFWObject *)NULL;
  257.   }
  258.   *pError = nssCKFWFindObjects_verifyPointer(fwFindObjects);
  259.   if( CKR_OK != *pError ) {
  260.     return (NSSCKFWObject *)NULL;
  261.   }
  262. #endif /* NSSDEBUG */
  263.   *pError = nssCKFWMutex_Lock(fwFindObjects->mutex);
  264.   if( CKR_OK != *pError ) {
  265.     return (NSSCKFWObject *)NULL;
  266.   }
  267.   if( (NSSCKMDFindObjects *)NULL != fwFindObjects->mdfo1 ) {
  268.     if( (void *)NULL != (void *)fwFindObjects->mdfo1->Next ) {
  269.       fwFindObjects->mdFindObjects = fwFindObjects->mdfo1;
  270.       mdObject = fwFindObjects->mdfo1->Next(fwFindObjects->mdfo1,
  271.         fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession,
  272.         fwFindObjects->mdToken, fwFindObjects->fwToken, 
  273.         fwFindObjects->mdInstance, fwFindObjects->fwInstance,
  274.         arenaOpt, pError);
  275.       if( (NSSCKMDObject *)NULL == mdObject ) {
  276.         if( CKR_OK != *pError ) {
  277.           goto done;
  278.         }
  279.         /* All done. */
  280.         fwFindObjects->mdfo1->Final(fwFindObjects->mdfo1, fwFindObjects,
  281.           fwFindObjects->mdSession, fwFindObjects->fwSession,
  282.           fwFindObjects->mdToken, fwFindObjects->fwToken, 
  283.           fwFindObjects->mdInstance, fwFindObjects->fwInstance);
  284.         fwFindObjects->mdfo1 = (NSSCKMDFindObjects *)NULL;
  285.       } else {
  286.         goto wrap;
  287.       }
  288.     }
  289.   }
  290.   if( (NSSCKMDFindObjects *)NULL != fwFindObjects->mdfo2 ) {
  291.     if( (void *)NULL != (void *)fwFindObjects->mdfo2->Next ) {
  292.       fwFindObjects->mdFindObjects = fwFindObjects->mdfo2;
  293.       mdObject = fwFindObjects->mdfo2->Next(fwFindObjects->mdfo2,
  294.         fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession,
  295.         fwFindObjects->mdToken, fwFindObjects->fwToken, 
  296.         fwFindObjects->mdInstance, fwFindObjects->fwInstance,
  297.         arenaOpt, pError);
  298.       if( (NSSCKMDObject *)NULL == mdObject ) {
  299.         if( CKR_OK != *pError ) {
  300.           goto done;
  301.         }
  302.         /* All done. */
  303.         fwFindObjects->mdfo2->Final(fwFindObjects->mdfo2, fwFindObjects,
  304.           fwFindObjects->mdSession, fwFindObjects->fwSession,
  305.           fwFindObjects->mdToken, fwFindObjects->fwToken, 
  306.           fwFindObjects->mdInstance, fwFindObjects->fwInstance);
  307.         fwFindObjects->mdfo2 = (NSSCKMDFindObjects *)NULL;
  308.       } else {
  309.         goto wrap;
  310.       }
  311.     }
  312.   }
  313.   
  314.   /* No more objects */
  315.   *pError = CKR_OK;
  316.   goto done;
  317.  wrap:
  318.   /*
  319.    * This is less than ideal-- we should determine if it's a token
  320.    * object or a session object, and use the appropriate arena.
  321.    * But that duplicates logic in nssCKFWObject_IsTokenObject.
  322.    * Worry about that later.  For now, be conservative, and use
  323.    * the token arena.
  324.    */
  325.   objArena = nssCKFWToken_GetArena(fwFindObjects->fwToken, pError);
  326.   if( (NSSArena *)NULL == objArena ) {
  327.     if( CKR_OK == *pError ) {
  328.       *pError = CKR_HOST_MEMORY;
  329.     }
  330.     goto done;
  331.   }
  332.   fwObject = nssCKFWObject_Create(objArena, mdObject,
  333.                fwFindObjects->fwSession, fwFindObjects->fwToken, 
  334.                fwFindObjects->fwInstance, pError);
  335.   if( (NSSCKFWObject *)NULL == fwObject ) {
  336.     if( CKR_OK == *pError ) {
  337.       *pError = CKR_GENERAL_ERROR;
  338.     }
  339.   }
  340.  done:
  341.   (void)nssCKFWMutex_Unlock(fwFindObjects->mutex);
  342.   return fwObject;
  343. }
  344. /*
  345.  * NSSCKFWFindObjects_GetMDFindObjects
  346.  *
  347.  */
  348. NSS_EXTERN NSSCKMDFindObjects *
  349. NSSCKFWFindObjects_GetMDFindObjects
  350. (
  351.   NSSCKFWFindObjects *fwFindObjects
  352. )
  353. {
  354. #ifdef DEBUG
  355.   if( CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects) ) {
  356.     return (NSSCKMDFindObjects *)NULL;
  357.   }
  358. #endif /* DEBUG */
  359.   return nssCKFWFindObjects_GetMDFindObjects(fwFindObjects);
  360. }