/ OSX / libsecurity_cdsa_client / lib / mds_standard.cpp
mds_standard.cpp
  1  /*
  2   * Copyright (c) 2000-2004,2011,2014 Apple Inc. All Rights Reserved.
  3   * 
  4   * The contents of this file constitute Original Code as defined in and are
  5   * subject to the Apple Public Source License Version 1.2 (the 'License').
  6   * You may not use this file except in compliance with the License. Please obtain
  7   * a copy of the License at http://www.apple.com/publicsource and read it before
  8   * using this file.
  9   * 
 10   * This Original Code and all software distributed under the License are
 11   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
 12   * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
 13   * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 14   * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
 15   * specific language governing rights and limitations under the License.
 16   */
 17  
 18  
 19  //
 20  // mds_standard - standard-defined MDS record types
 21  //
 22  #include <security_cdsa_client/mds_standard.h>
 23  #include <security_cdsa_client/dlquery.h>
 24  
 25  
 26  namespace Security {
 27  namespace MDSClient {
 28  
 29  
 30  //
 31  // CDSA Common relation (one record per module)
 32  //
 33  static const char * const commonAttributes[] = {
 34  	"ModuleID",
 35  	"ModuleName",
 36  	"Path",
 37  	"Desc",
 38  	"DynamicFlag",
 39  	"MultiThreadFlag",
 40  	"ServiceMask",
 41  	NULL
 42  };
 43  Common::Common() : Record(commonAttributes) { }
 44  
 45  string Common::moduleID() const					{ return mAttributes[0]; }
 46  string Common::moduleName() const				{ return mAttributes[1]; }
 47  string Common::path() const						{ return mAttributes[2]; }
 48  string Common::description() const				{ return mAttributes[3]; }
 49  bool Common::dynamic() const					{ return mAttributes[4]; }
 50  bool Common::singleThreaded() const				{ return !mAttributes[5]; }
 51  CSSM_SERVICE_MASK Common::serviceMask() const   { return mAttributes[6]; }
 52  
 53  
 54  //
 55  // Common::Carrier draws in the Common fields for anything with
 56  // a ModuleID attribute (which must be the first attribute listed)
 57  //
 58  Common::Carrier::~Carrier() { }
 59  
 60  Common &Common::Carrier::common() const
 61  {
 62  	if (!mCommon) {
 63  		const CssmDbRecordAttributeData &attrs
 64  			= dynamic_cast<const Record *>(this)->attributes();
 65  		RefPointer<Common> rpc;
 66  		rpc = Table<Common>(mds()).fetch(
 67  			Attribute("ModuleID") == string(attrs[0]),
 68  			CSSMERR_DL_ENDOFDATA);
 69  		mCommon = rpc;
 70  	}
 71  	return *mCommon;
 72  }
 73  
 74  
 75  //
 76  // Attributes that are common to all primary relations
 77  //
 78  static const char * const primaryAttributes[] = {
 79      "ModuleID",
 80  	"SSID",
 81  	"ModuleName",
 82  	"ProductVersion",
 83  	"Vendor",
 84  	NULL
 85  };
 86  PrimaryRecord::PrimaryRecord(const char * const * names)
 87  	: Record(primaryAttributes)
 88  {
 89  	addAttributes(names);
 90  }
 91  
 92  string PrimaryRecord::moduleID() const			{ return mAttributes[0]; }
 93  uint32 PrimaryRecord::subserviceID() const		{ return mAttributes[1]; }
 94  string PrimaryRecord::moduleName() const		{ return mAttributes[2]; }
 95  string PrimaryRecord::productVersion() const	{ return mAttributes[3]; }
 96  string PrimaryRecord::vendor() const			{ return mAttributes[4]; }
 97  
 98  
 99  //
100  // CSP Primary relation (one record per CSP SSID)
101  //
102  static const char * const cspAttributes[] = {
103  	// up to Vendor is handled by PrimaryRecord
104  	"CspType",
105  	"CspFlags",
106  	NULL
107  };
108  CSP::CSP() : PrimaryRecord(cspAttributes) { }
109  
110  uint32 CSP::cspType() const						{ return mAttributes[5]; }
111  CSSM_CSP_FLAGS CSP::cspFlags() const			{ return mAttributes[6]; }
112  
113  
114  //
115  // CSP capabilities relation
116  //
117  static const char * const capAttributes[] = {
118  	"ModuleID",
119  	"SSID",
120  	"ContextType",
121  	"AlgType",
122  	"GroupId",
123  	"AttributeType",
124  	"Description",
125  	NULL
126  };
127  CSPCapabilities::CSPCapabilities() : Record(capAttributes) { }
128  
129  string CSPCapabilities::moduleID() const		{ return mAttributes[0]; }
130  uint32 CSPCapabilities::subserviceID() const	{ return mAttributes[1]; }
131  uint32 CSPCapabilities::contextType() const		{ return mAttributes[2]; }
132  uint32 CSPCapabilities::algorithm() const		{ return mAttributes[3]; }
133  uint32 CSPCapabilities::group() const			{ return mAttributes[4]; }
134  uint32 CSPCapabilities::attribute() const		{ return mAttributes[5]; }
135  string CSPCapabilities::description() const		{ return mAttributes[6]; }
136  
137  
138  //
139  // CSP SmartcardInfo relation (one record per smartcard token present)
140  //
141  static const char * const scAttributes[] = {
142      "ModuleID",
143  	"SSID",
144  	"ScDesc",
145  	"ScVendor",
146  	"ScVersion",
147  	"ScFirmwareVersion",
148  	"ScFlags",
149  	"ScCustomFlags",
150  	"ScSerialNumber",
151  	NULL
152  };
153  SmartcardInfo::SmartcardInfo() : Record(scAttributes) { }
154  
155  string SmartcardInfo::moduleID() const			{ return mAttributes[0]; }
156  uint32 SmartcardInfo::subserviceID() const		{ return mAttributes[1]; }
157  string SmartcardInfo::description() const		{ return mAttributes[2]; }
158  string SmartcardInfo::vendor() const			{ return mAttributes[3]; }
159  string SmartcardInfo::version() const			{ return mAttributes[4]; }
160  string SmartcardInfo::firmware() const			{ return mAttributes[5]; }
161  CSSM_SC_FLAGS SmartcardInfo::flags() const		{ return mAttributes[6]; }
162  CSSM_SC_FLAGS SmartcardInfo::customFlags() const { return mAttributes[7]; }
163  string SmartcardInfo::serial() const			{ return mAttributes[8]; }
164  
165  
166  //
167  // DL Primary relation (one record per DL SSID)
168  //
169  static const char * const dlAttributes[] = {
170  	// up to Vendor is handled by PrimaryRecord
171  	"DLType",
172  	"QueryLimitsFlag",
173  	NULL
174  };
175  DL::DL() : PrimaryRecord(dlAttributes) { }
176  
177  uint32 DL::dlType() const						{ return mAttributes[5]; }
178  uint32 DL::queryLimits() const					{ return mAttributes[6]; }
179  
180  
181  //
182  // CL Primary relation (one record per CL SSID)
183  //
184  static const char * const clAttributes[] = {
185  	// up to Vendor is handled by PrimaryRecord
186  	"CertTypeFormat",
187  	"CrlTypeFormat",
188  	NULL
189  };
190  CL::CL() : PrimaryRecord(clAttributes) { }
191  
192  uint32 CL::certTypeFormat() const				{ return mAttributes[5]; }
193  uint32 CL::crlTypeFormat() const				{ return mAttributes[6]; }
194  
195  
196  //
197  // TP Primary relation (one record per TP SSID)
198  //
199  static const char * const tpAttributes[] = {
200  	// up to Vendor is handled by PrimaryRecord
201  	"CertTypeFormat",
202  	NULL
203  };
204  TP::TP() : PrimaryRecord(tpAttributes) { }
205  
206  uint32 TP::certTypeFormat() const				{ return mAttributes[5]; }
207  
208  
209  //
210  // TP Policy-OIDS relation (one record per supported policy and TP)
211  //
212  static const char * const policyAttributes[] = {
213      "ModuleID",
214  	"SSID",
215  	"OID",
216  	"Value",
217  	NULL
218  };
219  PolicyOids::PolicyOids() : Record(policyAttributes) { }
220  
221  string PolicyOids::moduleID() const			{ return mAttributes[0]; }
222  uint32 PolicyOids::subserviceID() const		{ return mAttributes[1]; }
223  CssmData PolicyOids::oid() const			{ return mAttributes[2]; }
224  CssmData PolicyOids::value() const			{ return mAttributes[3]; }
225  
226  
227  } // end namespace MDSClient
228  } // end namespace Security