/ OSX / libsecurity_cssm / lib / cssm.cpp
cssm.cpp
  1  /*
  2   * Copyright (c) 2000-2001,2003-2004,2011,2014 Apple Inc. All Rights Reserved.
  3   * 
  4   * @APPLE_LICENSE_HEADER_START@
  5   * 
  6   * This file contains Original Code and/or Modifications of Original Code
  7   * as defined in and that are subject to the Apple Public Source License
  8   * Version 2.0 (the 'License'). You may not use this file except in
  9   * compliance with the License. Please obtain a copy of the License at
 10   * http://www.opensource.apple.com/apsl/ and read it before using this
 11   * file.
 12   * 
 13   * The Original Code and all software distributed under the License are
 14   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 15   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 16   * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 17   * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 18   * Please see the License for the specific language governing rights and
 19   * limitations under the License.
 20   * 
 21   * @APPLE_LICENSE_HEADER_END@
 22   */
 23  
 24  
 25  //
 26  // This file contains the core CSSM public functions.
 27  // Note that hardly anything happens in here; we just hand off requests
 28  // to the various objects representing CSSM state.
 29  //
 30  #include "manager.h"
 31  #include "module.h"
 32  #include <security_utilities/globalizer.h>
 33  #include <security_cdsa_utilities/cssmbridge.h>
 34  #include "LegacyAPICounts.h"
 35  
 36  //
 37  // We currently use exactly one instance of CssmManager.
 38  //
 39  static ModuleNexus<CssmManager> gManager;
 40  
 41  
 42  //
 43  // Public API: (Re)Intiailize CSSM
 44  //
 45  CSSM_RETURN CSSMAPI
 46  CSSM_Init (const CSSM_VERSION *Version,
 47             CSSM_PRIVILEGE_SCOPE Scope,
 48             const CSSM_GUID *CallerGuid,
 49             CSSM_KEY_HIERARCHY KeyHierarchy,
 50             CSSM_PVC_MODE *PvcPolicy,
 51             const void *)
 52  {
 53      BEGIN_API
 54      gManager().initialize(Required(Version),
 55                          Scope,
 56                          Guid::required(CallerGuid),
 57                          KeyHierarchy,
 58                          Required(PvcPolicy));
 59      END_API(CSSM)
 60  }
 61  
 62  
 63  //
 64  // Public API: Terminate CSSM.
 65  //
 66  CSSM_RETURN CSSMAPI
 67  CSSM_Terminate (void)
 68  {
 69      BEGIN_API
 70      gManager().terminate();
 71      END_API(CSSM)
 72  }
 73  
 74  
 75  //
 76  // Public API: Load a CSSM module
 77  //
 78  CSSM_RETURN CSSMAPI
 79  CSSM_ModuleLoad (const CSSM_GUID *ModuleGuid,
 80                   CSSM_KEY_HIERARCHY KeyHierarchy,
 81                   CSSM_API_ModuleEventHandler AppNotifyCallback,
 82                   void *AppNotifyCallbackCtx)
 83  {
 84      BEGIN_API
 85      gManager().loadModule(Guid::required(ModuleGuid),
 86                              KeyHierarchy,
 87                              ModuleCallback(AppNotifyCallback, AppNotifyCallbackCtx));
 88      END_API(CSSM)
 89  }
 90  
 91  
 92  //
 93  // Public API: Unload a module
 94  //
 95  CSSM_RETURN CSSMAPI
 96  CSSM_ModuleUnload (const CSSM_GUID *ModuleGuid,
 97                     CSSM_API_ModuleEventHandler AppNotifyCallback,
 98                     void *AppNotifyCallbackCtx)
 99  {
100      BEGIN_API
101      gManager().unloadModule(Guid::required(ModuleGuid),
102                                ModuleCallback(AppNotifyCallback, AppNotifyCallbackCtx));
103      END_API(CSSM)
104  }
105  
106  
107  CSSM_RETURN CSSMAPI
108  CSSM_Introduce (const CSSM_GUID *ModuleID,
109                  CSSM_KEY_HIERARCHY KeyHierarchy)
110  {
111      BEGIN_API
112      gManager().introduce(Guid::required(ModuleID), KeyHierarchy);
113      END_API(CSSM)
114  }
115  
116  CSSM_RETURN CSSMAPI
117  CSSM_Unintroduce (const CSSM_GUID *ModuleID)
118  {
119      BEGIN_API
120      gManager().unIntroduce(Guid::required(ModuleID));
121      END_API(CSSM)
122  }
123  
124  
125  CSSM_RETURN CSSMAPI
126  CSSM_ModuleAttach (const CSSM_GUID *ModuleGuid,
127                     const CSSM_VERSION *Version,
128                     const CSSM_API_MEMORY_FUNCS *MemoryFuncs,
129                     uint32 SubserviceID,
130                     CSSM_SERVICE_TYPE SubServiceType,
131                     CSSM_ATTACH_FLAGS AttachFlags,
132                     CSSM_KEY_HIERARCHY KeyHierarchy,
133                     CSSM_FUNC_NAME_ADDR *FunctionTable,
134                     uint32 NumFunctionTable,
135                     const void *,
136                     CSSM_MODULE_HANDLE_PTR NewModuleHandle)
137  {
138      BEGIN_API
139      Required(NewModuleHandle) = gManager().getModule(Guid::required(ModuleGuid))->attach(
140                                    Required(Version),
141                                    SubserviceID, SubServiceType,
142                                    Required(MemoryFuncs),
143                                    AttachFlags,
144                                    KeyHierarchy,
145                                    FunctionTable, NumFunctionTable
146                                    );
147      END_API(CSSM)
148  }
149  
150  CSSM_RETURN CSSMAPI
151  CSSM_ModuleDetach (CSSM_MODULE_HANDLE ModuleHandle)
152  {
153      BEGIN_API
154      Attachment *attachment = &HandleObject::findAndKill<Attachment>(ModuleHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE);
155      attachment->detach(true);		// expect locked, will unlock
156      // the attachment is now off the maps, known idle, and unhooked
157      delete attachment;
158      END_API(CSSM)
159  }
160  
161  
162  CSSM_RETURN CSSMAPI
163  CSSM_SetPrivilege (CSSM_PRIVILEGE Privilege)
164  {
165      BEGIN_API
166      gManager().setPrivilege(Privilege);
167      END_API(CSSM)
168  }
169  
170  CSSM_RETURN CSSMAPI
171  CSSM_GetPrivilege (CSSM_PRIVILEGE *Privilege)
172  {
173      BEGIN_API
174      Required(Privilege) = gManager().getPrivilege();
175      END_API(CSSM)
176  }
177  
178  
179  CSSM_RETURN CSSMAPI
180  CSSM_GetModuleGUIDFromHandle (CSSM_MODULE_HANDLE ModuleHandle,
181                                CSSM_GUID_PTR ModuleGUID)
182  {
183      BEGIN_API
184      Attachment &attachment = HandleObject::findAndLock<Attachment>(ModuleHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE);
185      StLock<Mutex> _(attachment, true);
186      Required(ModuleGUID) = attachment.module.myGuid();
187      END_API(CSSM)
188  }
189  
190  CSSM_RETURN CSSMAPI
191  CSSM_GetSubserviceUIDFromHandle (CSSM_MODULE_HANDLE ModuleHandle,
192                                   CSSM_SUBSERVICE_UID_PTR SubserviceUID)
193  {
194      BEGIN_API
195      Attachment &attachment = HandleObject::findAndLock<Attachment>(ModuleHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE);
196      StLock<Mutex> _(attachment, true);
197      CSSM_SUBSERVICE_UID &result =  Required(SubserviceUID);
198      result.Guid = attachment.module.myGuid();
199      result.Version = attachment.pluginVersion();
200      result.SubserviceId = attachment.subserviceId();
201      result.SubserviceType = attachment.subserviceType();
202      END_API(CSSM)
203  }
204  
205  
206  CSSM_RETURN CSSMAPI
207  CSSM_ListAttachedModuleManagers (uint32 *NumberOfModuleManagers,
208                                   CSSM_GUID_PTR)
209  {
210      BEGIN_API
211      *NumberOfModuleManagers = 0;    // EMMs not implemented
212      END_API(CSSM)
213  }
214  
215  CSSM_RETURN CSSMAPI
216  CSSM_GetAPIMemoryFunctions (CSSM_MODULE_HANDLE AddInHandle,
217                              CSSM_API_MEMORY_FUNCS_PTR AppMemoryFuncs)
218  {
219      BEGIN_API
220      Attachment &attachment = HandleObject::findAndLock<Attachment>(AddInHandle, CSSMERR_CSSM_INVALID_ADDIN_HANDLE);
221      StLock<Mutex> _(attachment, true);
222      Required(AppMemoryFuncs) = attachment;
223      END_API(CSSM)
224  }