1/*
2 * Copyright (c) 2000-2001,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// MDSSchema.cpp
21//
22// Definitions of structures which define the schema, including attributes
23// and indexes, for the standard tables that are part of the MDS database.
24//
25
26#include "MDSSchema.h"
27#include <Security/mds_schema.h>
28#include <cstring>
29
30namespace Security
31{
32
33/*
34 * There appears to be a bug in AppleDatabase which prevents our assigning
35 * schema to the meta-tables.
36 */
37#define DEFINE_META_TABLES		0
38
39/* indicates "no MDSNameValuePair table" in a RELATION_INFO declaration. */
40#define NO_NVP	NULL
41
42//
43// Schema for the lone table in the Object Directory Database.
44//
45static const CSSM_DB_ATTRIBUTE_INFO objectAttrs[] = {
46	DB_ATTRIBUTE(ModuleID, STRING),
47	DB_ATTRIBUTE(Manifest, BLOB),
48	DB_ATTRIBUTE(ModuleName, STRING),
49	DB_ATTRIBUTE(Path, STRING),
50	DB_ATTRIBUTE(ProductVersion, STRING),
51
52	/* not in the CDSA spec; denotes a plugin which is statically linked to CSSM */
53	DB_ATTRIBUTE(BuiltIn, UINT32),
54};
55
56static const CSSM_DB_INDEX_INFO objectIndex[] = {
57	UNIQUE_INDEX_ATTRIBUTE(ModuleID, STRING)
58};
59
60const RelationInfo kObjectRelation =
61	RELATION_INFO(MDS_OBJECT_RECORDTYPE,
62		objectAttrs,
63		NO_NVP,			// no symbolic names
64		objectIndex);
65
66//
67// Schema for the various tables in the CDSA Directory Database.
68//
69
70// CSSM Relation.
71static const CSSM_DB_ATTRIBUTE_INFO cssmAttrs[] =
72{
73	DB_ATTRIBUTE(ModuleID, STRING),
74	DB_ATTRIBUTE(CDSAVersion, STRING),
75	DB_ATTRIBUTE(Vendor, STRING),
76	DB_ATTRIBUTE(Desc, STRING),
77	DB_ATTRIBUTE(NativeServices, UINT32),
78};
79
80static const MDSNameValuePair *cssmNvp[] = {
81	NULL, NULL,	NULL, NULL,
82	MDSServiceNames
83};
84
85static const CSSM_DB_INDEX_INFO cssmIndex[] =
86{
87	UNIQUE_INDEX_ATTRIBUTE(ModuleID, STRING)
88};
89
90// KRMM Relation.
91static const CSSM_DB_ATTRIBUTE_INFO krmmAttrs[] =
92{
93	DB_ATTRIBUTE(CSSMGuid, STRING),
94	DB_ATTRIBUTE(PolicyType, UINT32),
95	DB_ATTRIBUTE(PolicyName, STRING),
96	DB_ATTRIBUTE(PolicyPath, STRING),
97	DB_ATTRIBUTE(PolicyInfo, BLOB),
98	DB_ATTRIBUTE(PolicyManifest, BLOB),
99	/*
100	 * This attribute is not defined in the CDSA spec. It's only here, in the schema,
101	 * to avoid throwing exceptions when searching a DB for any records associated
102	 * with a specified GUID - in all other schemas, a guid is specified as a
103	 * ModuleID.
104	 */
105	DB_ATTRIBUTE(ModuleID, STRING),
106};
107
108static const MDSNameValuePair *krmmNvp[] = {
109	NULL, MDSKrPolicyTypeNames, NULL, NULL,
110	NULL, NULL,
111};
112
113static const CSSM_DB_INDEX_INFO krmmIndex[] =
114{
115	UNIQUE_INDEX_ATTRIBUTE(CSSMGuid, STRING),
116	UNIQUE_INDEX_ATTRIBUTE(PolicyType, UINT32)
117};
118
119// EMM Relation.
120static const CSSM_DB_ATTRIBUTE_INFO emmAttrs[] =
121{
122	DB_ATTRIBUTE(ModuleID, STRING),
123	DB_ATTRIBUTE(Manifest, BLOB),
124	DB_ATTRIBUTE(ModuleName, STRING),
125	DB_ATTRIBUTE(Path, STRING),
126	DB_ATTRIBUTE(CDSAVersion, STRING),
127	DB_ATTRIBUTE(EMMSpecVersion, STRING),
128	DB_ATTRIBUTE(Desc, STRING),
129	DB_ATTRIBUTE(PolicyStmt, BLOB),
130	DB_ATTRIBUTE(EmmVersion, STRING),
131	DB_ATTRIBUTE(EmmVendor, STRING),
132	DB_ATTRIBUTE(EmmType, UINT32),		// does this need a name/value table?
133};
134
135static const CSSM_DB_INDEX_INFO emmIndex[] =
136{
137	UNIQUE_INDEX_ATTRIBUTE(ModuleID, STRING)
138};
139
140// Primary EMM Service Provider Relation.
141static const CSSM_DB_ATTRIBUTE_INFO emmPrimaryAttrs[] =
142{
143	DB_ATTRIBUTE(ModuleID, STRING),
144	DB_ATTRIBUTE(SSID, UINT32),
145	DB_ATTRIBUTE(ServiceType, UINT32),
146	DB_ATTRIBUTE(Manifest, BLOB),
147	DB_ATTRIBUTE(ModuleName, STRING),
148	DB_ATTRIBUTE(ProductVersion, STRING),
149	DB_ATTRIBUTE(Vendor, STRING),
150	DB_ATTRIBUTE(SampleTypes, MULTI_UINT32),
151	DB_ATTRIBUTE(AclSubjectTypes, MULTI_UINT32),
152	DB_ATTRIBUTE(AuthTags, MULTI_UINT32),
153	DB_ATTRIBUTE(EmmSpecVersion, STRING),
154};
155
156static const MDSNameValuePair *emmPrimaryNvp[] = {
157	NULL, NULL,	NULL, NULL,
158	NULL, NULL,	NULL, MDSSampleTypeNames,
159	MDSAclSubjectTypeNames,
160	MDSAclAuthTagNames,
161	NULL
162};
163
164static const CSSM_DB_INDEX_INFO emmPrimaryIndex[] =
165{
166	UNIQUE_INDEX_ATTRIBUTE(ModuleID, STRING),
167	UNIQUE_INDEX_ATTRIBUTE(SSID, UINT32),
168	UNIQUE_INDEX_ATTRIBUTE(ServiceType, UINT32)
169};
170
171// Common Relation.
172static const CSSM_DB_ATTRIBUTE_INFO commonAttrs[] =
173{
174	DB_ATTRIBUTE(ModuleID, STRING),
175	DB_ATTRIBUTE(Manifest, BLOB),
176	DB_ATTRIBUTE(ModuleName, STRING),
177	DB_ATTRIBUTE(Path, STRING),
178	DB_ATTRIBUTE(CDSAVersion, STRING),
179	DB_ATTRIBUTE(Desc, STRING),
180	DB_ATTRIBUTE(DynamicFlag, UINT32),
181	DB_ATTRIBUTE(MultiThreadFlag, UINT32),
182	DB_ATTRIBUTE(ServiceMask, UINT32),
183};
184
185static const MDSNameValuePair *commonNvp[] = {
186	NULL, NULL,	NULL, NULL,
187	NULL, NULL,	NULL, NULL,
188	MDSServiceNames
189};
190
191static const CSSM_DB_INDEX_INFO commonIndex[] =
192{
193	UNIQUE_INDEX_ATTRIBUTE(ModuleID, STRING)
194};
195
196// CSP Primary Relation.
197static const CSSM_DB_ATTRIBUTE_INFO cspPrimaryAttrs[] =
198{
199	DB_ATTRIBUTE(ModuleID, STRING),
200	DB_ATTRIBUTE(SSID, UINT32),
201	DB_ATTRIBUTE(Manifest, BLOB),
202	DB_ATTRIBUTE(ModuleName, STRING),
203	DB_ATTRIBUTE(ProductVersion, STRING),
204	DB_ATTRIBUTE(Vendor, STRING),
205	DB_ATTRIBUTE(CspType, UINT32),
206	DB_ATTRIBUTE(CspFlags, UINT32),
207	DB_ATTRIBUTE(CspCustomFlags, UINT32),
208	DB_ATTRIBUTE(UseeTags, MULTI_UINT32),
209	DB_ATTRIBUTE(SampleTypes, MULTI_UINT32),
210	DB_ATTRIBUTE(AclSubjectTypes, MULTI_UINT32),
211	DB_ATTRIBUTE(AuthTags, MULTI_UINT32),
212};
213
214static const MDSNameValuePair *cspPrimaryNvp[] = {
215	NULL, NULL,	NULL, NULL,
216	NULL, NULL,
217	MDSCspTypeNames,
218	MDSCspFlagsNames,
219	NULL,
220	MDSUseeTagsNames,
221	MDSSampleTypeNames,
222	MDSAclSubjectTypeNames,
223	MDSAclAuthTagNames
224};
225
226static const CSSM_DB_INDEX_INFO cspPrimaryIndex[] =
227{
228	UNIQUE_INDEX_ATTRIBUTE(ModuleID, STRING),
229	UNIQUE_INDEX_ATTRIBUTE(SSID, UINT32)
230};
231
232// CSP Capabilities Relation.
233static const CSSM_DB_ATTRIBUTE_INFO cspCapabilitiesAttrs[] =
234{
235	DB_ATTRIBUTE(ModuleID, STRING),
236	DB_ATTRIBUTE(SSID, UINT32),
237	DB_ATTRIBUTE(UseeTag, UINT32),
238	DB_ATTRIBUTE(ContextType, UINT32),
239	DB_ATTRIBUTE(AlgType, UINT32),
240	DB_ATTRIBUTE(GroupId, UINT32),
241	DB_ATTRIBUTE(AttributeType, UINT32),
242	DB_ATTRIBUTE(AttributeValue, MULTI_UINT32),
243	DB_ATTRIBUTE(Description, STRING),
244};
245static const MDSNameValuePair *cspCapabilitiesNvp[] = {
246	NULL,
247	NULL,
248	MDSUseeTagsNames,
249	MDSContextTypeNames,
250	MDSAlgorithmNames,
251	NULL,
252	MDSAttributeTypeNames,
253	NULL,
254	NULL
255};
256
257static const CSSM_DB_INDEX_INFO cspCapabilitiesIndex[] =
258{
259	UNIQUE_INDEX_ATTRIBUTE(ModuleID, STRING),
260	UNIQUE_INDEX_ATTRIBUTE(SSID, UINT32),
261	UNIQUE_INDEX_ATTRIBUTE(UseeTag, UINT32),
262	UNIQUE_INDEX_ATTRIBUTE(ContextType, UINT32),
263	UNIQUE_INDEX_ATTRIBUTE(AlgType, UINT32),
264	UNIQUE_INDEX_ATTRIBUTE(GroupId, UINT32),
265	UNIQUE_INDEX_ATTRIBUTE(AttributeType, STRING)
266};
267
268// special case "subschema" for parsing CSPCapabilities. These arrays correspond
269// dictionaries within a CSPCapabilities info file; they are not part of
270// our DB's schema. They are declared only to streamline the
271// MDSAttrParser::parseCspCapabilitiesRecord function. No index info is needed.
272
273// top-level info, applied to the dictionary for the whole file.
274static const CSSM_DB_ATTRIBUTE_INFO kAttributesCSPCapabilitiesDict1[] =
275{
276	DB_ATTRIBUTE(ModuleID, STRING),
277	DB_ATTRIBUTE(SSID, UINT32),
278};
279const RelationInfo CSPCapabilitiesDict1RelInfo =
280	RELATION_INFO(
281		MDS_CDSADIR_CSP_CAPABILITY_RECORDTYPE,		// actually a don't care
282		kAttributesCSPCapabilitiesDict1,
283		NULL,										// no NVP needed
284		NULL);										// no index
285
286// "Capabilities" is an array of dictionaries of these
287static const CSSM_DB_ATTRIBUTE_INFO kAttributesCSPCapabilitiesDict2[] =
288{
289	DB_ATTRIBUTE(AlgType, UINT32),
290	DB_ATTRIBUTE(ContextType, UINT32),
291	DB_ATTRIBUTE(UseeTag, UINT32),
292	DB_ATTRIBUTE(Description, STRING),
293};
294static const MDSNameValuePair *CSPCapabilitiesDict2Nvp[] = {
295	MDSAlgorithmNames,
296	MDSContextTypeNames,
297	MDSUseeTagsNames,
298	NULL
299};
300const RelationInfo CSPCapabilitiesDict2RelInfo =
301	RELATION_INFO(
302		MDS_CDSADIR_CSP_CAPABILITY_RECORDTYPE,		// actually a don't care
303		kAttributesCSPCapabilitiesDict2,
304		CSPCapabilitiesDict2Nvp,
305		NULL);										// no index
306
307// Within a Capabilities array, the Attributes array is an array of
308// Dictionaries of these.
309static const CSSM_DB_ATTRIBUTE_INFO kAttributesCSPCapabilitiesDict3[] =
310{
311	DB_ATTRIBUTE(AttributeType, UINT32),
312	DB_ATTRIBUTE(AttributeValue, MULTI_UINT32),
313};
314static const MDSNameValuePair *CSPCapabilitiesDict3Nvp[] = {
315	MDSAttributeTypeNames,
316	NULL
317};
318const RelationInfo CSPCapabilitiesDict3RelInfo =
319	RELATION_INFO(
320		MDS_CDSADIR_CSP_CAPABILITY_RECORDTYPE,		// actually a don't care
321		kAttributesCSPCapabilitiesDict3,
322		CSPCapabilitiesDict3Nvp,
323		NULL);
324
325
326
327// CSP Encapsulated Products Relation.
328static const CSSM_DB_ATTRIBUTE_INFO cspEncapsulatedAttrs[] =
329{
330	DB_ATTRIBUTE(ModuleID, STRING),
331	DB_ATTRIBUTE(SSID, UINT32),
332	DB_ATTRIBUTE(ProductDesc, STRING),
333	DB_ATTRIBUTE(ProductVendor, STRING),
334	DB_ATTRIBUTE(ProductVersion, STRING),
335	DB_ATTRIBUTE(ProductFlags, UINT32),
336	DB_ATTRIBUTE(CustomFlags, UINT32),
337	DB_ATTRIBUTE(StandardDesc, STRING),
338	DB_ATTRIBUTE(StandardVersion, STRING),
339	DB_ATTRIBUTE(ReaderDesc, STRING),
340	DB_ATTRIBUTE(ReaderVendor, STRING),
341	DB_ATTRIBUTE(ReaderVersion, STRING),
342	DB_ATTRIBUTE(ReaderFirmwareVersion, STRING),
343	DB_ATTRIBUTE(ReaderFlags, UINT32),
344	DB_ATTRIBUTE(ReaderCustomFlags, UINT32),
345	DB_ATTRIBUTE(ReaderSerialNumber, STRING),
346};
347
348static const MDSNameValuePair *cspEncapsulatedNvp[] = {
349	NULL, NULL,	NULL, NULL,
350	NULL, NULL,	NULL, NULL,
351	NULL, NULL,	NULL, NULL,
352	NULL, MDSCspReaderFlagsNames, NULL, NULL
353};
354
355static const CSSM_DB_INDEX_INFO cspEncapsulatedIndex[] =
356{
357	UNIQUE_INDEX_ATTRIBUTE(ModuleID, STRING),
358	UNIQUE_INDEX_ATTRIBUTE(SSID, UINT32)
359};
360
361// CSP Smartcardinfo Relation.
362static const CSSM_DB_ATTRIBUTE_INFO cspSmartCardAttrs[] =
363{
364	DB_ATTRIBUTE(ModuleID, STRING),
365	DB_ATTRIBUTE(SSID, UINT32),
366	DB_ATTRIBUTE(ScDesc, STRING),
367	DB_ATTRIBUTE(ScVendor, STRING),
368	DB_ATTRIBUTE(ScVersion, STRING),
369	DB_ATTRIBUTE(ScFirmwareVersion, STRING),
370	DB_ATTRIBUTE(ScFlags, UINT32),
371	DB_ATTRIBUTE(ScCustomFlags, UINT32),
372	DB_ATTRIBUTE(ScSerialNumber, STRING),
373};
374static const MDSNameValuePair *cspSmartCardNvp[] = {
375	NULL, NULL,	NULL, NULL,
376	NULL, NULL,	MDSCspScFlagsNames, NULL,
377	NULL,
378};
379
380static const CSSM_DB_INDEX_INFO cspSmartCardIndex[] =
381{
382	UNIQUE_INDEX_ATTRIBUTE(ModuleID, STRING),
383	UNIQUE_INDEX_ATTRIBUTE(SSID, UINT32),
384	UNIQUE_INDEX_ATTRIBUTE(ScDesc, STRING),
385	UNIQUE_INDEX_ATTRIBUTE(ScVendor, STRING),
386	UNIQUE_INDEX_ATTRIBUTE(ScVersion, STRING),
387	UNIQUE_INDEX_ATTRIBUTE(ScFirmwareVersion, STRING),
388	UNIQUE_INDEX_ATTRIBUTE(ScFlags, UINT32)
389};
390
391// DL Primary Relation.
392static const CSSM_DB_ATTRIBUTE_INFO dlPrimaryAttrs[] =
393{
394	DB_ATTRIBUTE(ModuleID, STRING),
395	DB_ATTRIBUTE(SSID, UINT32),
396	DB_ATTRIBUTE(Manifest, BLOB),
397	DB_ATTRIBUTE(ModuleName, STRING),
398	DB_ATTRIBUTE(ProductVersion, STRING),
399	DB_ATTRIBUTE(Vendor, STRING),
400	DB_ATTRIBUTE(DLType, UINT32),
401	DB_ATTRIBUTE(QueryLimitsFlag, UINT32),			// a completely bogus attr; see spec
402	DB_ATTRIBUTE(SampleTypes, MULTI_UINT32),
403	DB_ATTRIBUTE(AclSubjectTypes, MULTI_UINT32),
404	DB_ATTRIBUTE(AuthTags, MULTI_UINT32),
405	DB_ATTRIBUTE(ConjunctiveOps, MULTI_UINT32),
406	DB_ATTRIBUTE(RelationalOps, MULTI_UINT32),
407};
408static const MDSNameValuePair *dlPrimaryNvp[] = {
409	NULL, NULL,	NULL, NULL,
410	NULL, NULL,	MDSDlTypeNames, NULL,
411	MDSSampleTypeNames,
412	MDSAclSubjectTypeNames,
413	MDSAclAuthTagNames,
414	MDSDbConjunctiveNames,
415	MDSDbOperatorNames
416};
417static const CSSM_DB_INDEX_INFO dlPrimaryIndex[] =
418{
419	UNIQUE_INDEX_ATTRIBUTE(ModuleID, STRING),
420	UNIQUE_INDEX_ATTRIBUTE(SSID, UINT32)
421};
422
423// DL Encapsulated Products Relation.
424static const CSSM_DB_ATTRIBUTE_INFO dlEncapsulatedAttrs[] =
425{
426	DB_ATTRIBUTE(ModuleID, STRING),
427	DB_ATTRIBUTE(SSID, UINT32),
428	DB_ATTRIBUTE(ProductDesc, STRING),
429	DB_ATTRIBUTE(ProductVendor, STRING),
430	DB_ATTRIBUTE(ProductVersion, STRING),
431	DB_ATTRIBUTE(ProductFlags, UINT32),
432	DB_ATTRIBUTE(StandardDesc, STRING),
433	DB_ATTRIBUTE(StandardVersion, STRING),
434	DB_ATTRIBUTE(Protocol, UINT32),
435	DB_ATTRIBUTE(RetrievalMode, UINT32),
436};
437
438static const MDSNameValuePair *dlEncapsulatedNvp[] = {
439	NULL, NULL,	NULL, NULL,
440	NULL, NULL,	NULL, NULL,
441	MDSNetProtocolNames,
442	MDSDbRetrievalModeNames
443};
444
445static const CSSM_DB_INDEX_INFO dlEncapsulatedIndex[] =
446{
447	UNIQUE_INDEX_ATTRIBUTE(ModuleID, STRING),
448	UNIQUE_INDEX_ATTRIBUTE(SSID, UINT32)
449};
450
451// CL Primary Relation.
452static const CSSM_DB_ATTRIBUTE_INFO clPrimaryAttrs[] =
453{
454	DB_ATTRIBUTE(ModuleID, STRING),
455	DB_ATTRIBUTE(SSID, UINT32),
456	DB_ATTRIBUTE(Manifest, BLOB),
457	DB_ATTRIBUTE(ModuleName, STRING),
458	DB_ATTRIBUTE(ProductVersion, STRING),
459	DB_ATTRIBUTE(Vendor, STRING),
460	DB_ATTRIBUTE(CertTypeFormat, UINT32),
461	DB_ATTRIBUTE(CrlTypeFormat, UINT32),
462	DB_ATTRIBUTE(CertFieldNames, BLOB),
463	DB_ATTRIBUTE(BundleTypeFormat, MULTI_UINT32),
464	DB_ATTRIBUTE(XlationTypeFormat, MULTI_UINT32),
465	DB_ATTRIBUTE(TemplateFieldNames, BLOB),
466};
467
468static const MDSNameValuePair *clPrimaryNvp[] = {
469	NULL, NULL,	NULL, NULL,
470	NULL, NULL,	MDSCertTypeNames, MDSCrlTypeNames,
471	NULL,
472	MDSCertBundleTypeNames,
473	MDSCertTypeNames,		// translation type - same as cert type - right?
474	NULL
475};
476
477static const CSSM_DB_INDEX_INFO clPrimaryIndex[] =
478{
479	UNIQUE_INDEX_ATTRIBUTE(ModuleID, STRING),
480	UNIQUE_INDEX_ATTRIBUTE(SSID, UINT32)
481};
482
483// CL Encapsulated Products Relation.
484static const CSSM_DB_ATTRIBUTE_INFO clEncapsulatedAttrs[] =
485{
486	DB_ATTRIBUTE(ModuleID, STRING),
487	DB_ATTRIBUTE(SSID, UINT32),
488	DB_ATTRIBUTE(ProductDesc, STRING),
489	DB_ATTRIBUTE(ProductVendor, STRING),
490	DB_ATTRIBUTE(ProductVersion, STRING),
491	DB_ATTRIBUTE(ProductFlags, UINT32),
492	DB_ATTRIBUTE(StandardDesc, STRING),
493	DB_ATTRIBUTE(StandardVersion, STRING),
494};
495
496static const CSSM_DB_INDEX_INFO clEncapsulatedIndex[] =
497{
498	UNIQUE_INDEX_ATTRIBUTE(ModuleID, STRING),
499	UNIQUE_INDEX_ATTRIBUTE(SSID, UINT32)
500};
501
502// TP Primary Relation.
503static const CSSM_DB_ATTRIBUTE_INFO tpPrimaryAttrs[] =
504{
505	DB_ATTRIBUTE(ModuleID, STRING),
506	DB_ATTRIBUTE(SSID, UINT32),
507	DB_ATTRIBUTE(Manifest, BLOB),
508	DB_ATTRIBUTE(ModuleName, STRING),
509	DB_ATTRIBUTE(ProductVersion, STRING),
510	DB_ATTRIBUTE(Vendor, STRING),
511	DB_ATTRIBUTE(CertTypeFormat, UINT32),
512	DB_ATTRIBUTE(SampleTypes, MULTI_UINT32),
513	DB_ATTRIBUTE(AclSubjectTypes, MULTI_UINT32),
514	DB_ATTRIBUTE(AuthTags, MULTI_UINT32),
515};
516
517static const MDSNameValuePair *tpPrimaryNvp[] = {
518	NULL, NULL,	NULL, NULL,
519	NULL, NULL,
520	MDSCertTypeNames,
521	MDSSampleTypeNames,
522	MDSAclSubjectTypeNames,
523	MDSAclAuthTagNames,
524};
525
526static const CSSM_DB_INDEX_INFO tpPrimaryIndex[] =
527{
528	UNIQUE_INDEX_ATTRIBUTE(ModuleID, STRING),
529	UNIQUE_INDEX_ATTRIBUTE(SSID, UINT32)
530};
531
532// TP Policy-OIDs Relation.
533static const CSSM_DB_ATTRIBUTE_INFO tpPolicyOidsAttrs[] =
534{
535	DB_ATTRIBUTE(ModuleID, STRING),
536	DB_ATTRIBUTE(SSID, UINT32),
537	DB_ATTRIBUTE(OID, BLOB),
538	DB_ATTRIBUTE(Value, BLOB),
539};
540
541static const CSSM_DB_INDEX_INFO tpPolicyOidsIndex[] =
542{
543	UNIQUE_INDEX_ATTRIBUTE(ModuleID, STRING),
544	UNIQUE_INDEX_ATTRIBUTE(SSID, UINT32),
545	UNIQUE_INDEX_ATTRIBUTE(OID, BLOB)
546};
547
548// special case "subschema" for parsing tpPolicyOidsAttrs. These arrays correspond
549// dictionaries within a tpPolicyOidsAttrs info file; they are not part of
550// our DB's schema. They are declared only to streamline the
551// MDSAttrParser::parseTpPolicyOidsRecord function. No index info is needed.
552
553// top-level info, applied to the dictionary for the whole file.
554static const CSSM_DB_ATTRIBUTE_INFO tpPolicyOidsDict1[] =
555{
556	DB_ATTRIBUTE(ModuleID, STRING),
557	DB_ATTRIBUTE(SSID, UINT32),
558};
559const RelationInfo TpPolicyOidsDict1RelInfo =
560	RELATION_INFO(
561		MDS_CDSADIR_TP_OIDS_RECORDTYPE,				// actually a don't care
562		tpPolicyOidsDict1,
563		NULL,										// no NVP needed
564		NULL);										// no index
565
566// One element of the "Policies" array maps to one of these.
567static const CSSM_DB_ATTRIBUTE_INFO tpPolicyOidsDict2[] =
568{
569	DB_ATTRIBUTE(OID, BLOB),
570	DB_ATTRIBUTE(Value, BLOB),
571};
572const RelationInfo TpPolicyOidsDict2RelInfo =
573	RELATION_INFO(
574		MDS_CDSADIR_TP_OIDS_RECORDTYPE,				// actually a don't care
575		tpPolicyOidsDict2,
576		NULL,										// no NVP needed
577		NULL);										// no index
578
579// TP Encapsulated Products Relation.
580static const CSSM_DB_ATTRIBUTE_INFO tpEncapsulatedAttrs[] =
581{
582	DB_ATTRIBUTE(ModuleID, STRING),
583	DB_ATTRIBUTE(SSID, UINT32),
584	DB_ATTRIBUTE(ProductDesc, STRING),
585	DB_ATTRIBUTE(ProductVendor, STRING),
586	DB_ATTRIBUTE(ProductVersion, STRING),
587	DB_ATTRIBUTE(ProductFlags, UINT32),				// vendor-specific, right?
588	DB_ATTRIBUTE(AuthorityRequestType, MULTI_UINT32),
589	DB_ATTRIBUTE(StandardDesc, STRING),
590	DB_ATTRIBUTE(StandardVersion, STRING),
591	DB_ATTRIBUTE(ProtocolDesc, STRING),
592	DB_ATTRIBUTE(ProtocolFlags, UINT32),
593	DB_ATTRIBUTE(CertClassName, STRING),
594	DB_ATTRIBUTE(RootCertificate, BLOB),
595	DB_ATTRIBUTE(RootCertTypeFormat, UINT32),
596};
597static const MDSNameValuePair *tpEncapsulatedNvp[] = {
598	NULL, NULL,	NULL, NULL,
599	NULL, NULL,	MDSTpAuthRequestNames,	NULL,
600	NULL, NULL,	NULL, NULL,
601	NULL, MDSCertTypeNames
602};
603
604static const CSSM_DB_INDEX_INFO tpEncapsulatedIndex[] =
605{
606	UNIQUE_INDEX_ATTRIBUTE(ModuleID, STRING),
607	UNIQUE_INDEX_ATTRIBUTE(SSID, UINT32)
608};
609
610#if 	DEFINE_META_TABLES
611// MDS Schema Relations (meta) Relation.
612static const CSSM_DB_ATTRIBUTE_INFO mdsSchemaRelationsAttrs[] =
613{
614	DB_ATTRIBUTE(RelationID, UINT32),
615	DB_ATTRIBUTE(RelationName, STRING),
616};
617
618static const CSSM_DB_INDEX_INFO mdsSchemaRelationsIndex[] =
619{
620	UNIQUE_INDEX_ATTRIBUTE(RelationID, UINT32),
621};
622
623// MDS Schema Attributes (meta) Relation.
624static const CSSM_DB_ATTRIBUTE_INFO mdsSchemaAttributesAttrs[] =
625{
626	DB_ATTRIBUTE(RelationID, UINT32),
627	DB_ATTRIBUTE(AttributeID, UINT32),
628	DB_ATTRIBUTE(AttributeNameFormat, UINT32),
629	DB_ATTRIBUTE(AttributeName, STRING),
630	DB_ATTRIBUTE(AttributeNameID, BLOB),
631	DB_ATTRIBUTE(AttributeFormat, UINT32),
632};
633
634static const CSSM_DB_INDEX_INFO mdsSchemaAttributesIndex[] =
635{
636	UNIQUE_INDEX_ATTRIBUTE(RelationID, UINT32),
637	UNIQUE_INDEX_ATTRIBUTE(AttributeID, UINT32)
638};
639
640// MDS Schema Indexes (meta) Relation.
641static const CSSM_DB_ATTRIBUTE_INFO mdsSchemaIndexesAttrs[] =
642{
643	DB_ATTRIBUTE(RelationID, UINT32),
644	DB_ATTRIBUTE(IndexID, UINT32),
645	DB_ATTRIBUTE(AttributeID, UINT32),
646	DB_ATTRIBUTE(IndexType, UINT32),
647	DB_ATTRIBUTE(IndexedDataLocation, UINT32),
648};
649
650static const CSSM_DB_INDEX_INFO mdsSchemaIndexesIndex[] =
651{
652	UNIQUE_INDEX_ATTRIBUTE(RelationID, UINT32),
653	UNIQUE_INDEX_ATTRIBUTE(IndexID, UINT32)
654};
655
656#endif	/* DEFINE_META_TABLES */
657
658// AC Primary Relation.
659static const CSSM_DB_ATTRIBUTE_INFO acPrimaryAttrs[] =
660{
661	DB_ATTRIBUTE(ModuleID, STRING),
662	DB_ATTRIBUTE(SSID, UINT32),
663	DB_ATTRIBUTE(Manifest, BLOB),
664	DB_ATTRIBUTE(ModuleName, STRING),
665	DB_ATTRIBUTE(ProductVersion, STRING),
666	DB_ATTRIBUTE(Vendor, STRING),
667};
668
669static const CSSM_DB_INDEX_INFO acPrimaryIndex[] =
670{
671	UNIQUE_INDEX_ATTRIBUTE(ModuleID, STRING),
672	UNIQUE_INDEX_ATTRIBUTE(SSID, UINT32)
673};
674
675// KR Primary Relation.
676static const CSSM_DB_ATTRIBUTE_INFO krPrimaryAttrs[] =
677{
678	DB_ATTRIBUTE(ModuleID, STRING),
679	DB_ATTRIBUTE(SSID, UINT32),
680	DB_ATTRIBUTE(Manifest, BLOB),
681	DB_ATTRIBUTE(ModuleName, STRING),
682	DB_ATTRIBUTE(CompatCSSMVersion, STRING),
683	DB_ATTRIBUTE(Version, STRING),
684	DB_ATTRIBUTE(Vendor, STRING),
685	DB_ATTRIBUTE(Description, STRING),
686	DB_ATTRIBUTE(ConfigFileLocation, STRING),
687};
688
689static const CSSM_DB_INDEX_INFO krPrimaryIndex[] =
690{
691	UNIQUE_INDEX_ATTRIBUTE(ModuleID, STRING),
692	UNIQUE_INDEX_ATTRIBUTE(SSID, UINT32)
693};
694
695// list of all built-in schema for the CDSA Directory DB.
696const RelationInfo kMDSRelationInfo[] =
697{
698	RELATION_INFO(MDS_CDSADIR_CSSM_RECORDTYPE,
699		cssmAttrs,
700		cssmNvp,
701		cssmIndex),
702	RELATION_INFO(MDS_CDSADIR_KRMM_RECORDTYPE,
703		krmmAttrs,
704		krmmNvp,
705		krmmIndex),
706	RELATION_INFO(MDS_CDSADIR_EMM_RECORDTYPE,
707		emmAttrs,
708		NO_NVP,		// FIXME - what is the uint32 EmmType here?
709		emmIndex),
710	RELATION_INFO(MDS_CDSADIR_EMM_PRIMARY_RECORDTYPE,
711		emmPrimaryAttrs,
712		emmPrimaryNvp,
713		emmPrimaryIndex),
714	RELATION_INFO(MDS_CDSADIR_COMMON_RECORDTYPE,
715		commonAttrs,
716		commonNvp,
717		commonIndex),
718	RELATION_INFO(MDS_CDSADIR_CSP_PRIMARY_RECORDTYPE,
719		cspPrimaryAttrs,
720		cspPrimaryNvp,
721		cspPrimaryIndex),
722	RELATION_INFO(MDS_CDSADIR_CSP_CAPABILITY_RECORDTYPE,
723		cspCapabilitiesAttrs,
724		cspCapabilitiesNvp,
725		cspCapabilitiesIndex),
726	RELATION_INFO(MDS_CDSADIR_CSP_ENCAPSULATED_PRODUCT_RECORDTYPE,
727		cspEncapsulatedAttrs,
728		cspEncapsulatedNvp,
729		cspEncapsulatedIndex),
730	RELATION_INFO(MDS_CDSADIR_CSP_SC_INFO_RECORDTYPE,
731		cspSmartCardAttrs,
732		cspSmartCardNvp,
733		cspSmartCardIndex),
734	RELATION_INFO(MDS_CDSADIR_DL_PRIMARY_RECORDTYPE,
735		dlPrimaryAttrs,
736		dlPrimaryNvp,
737		dlPrimaryIndex),
738	RELATION_INFO(MDS_CDSADIR_DL_ENCAPSULATED_PRODUCT_RECORDTYPE,
739		dlEncapsulatedAttrs,
740		dlEncapsulatedNvp,
741		dlEncapsulatedIndex),
742	RELATION_INFO(MDS_CDSADIR_CL_PRIMARY_RECORDTYPE,
743		clPrimaryAttrs,
744		clPrimaryNvp,
745		clPrimaryIndex),
746	RELATION_INFO(MDS_CDSADIR_CL_ENCAPSULATED_PRODUCT_RECORDTYPE,
747		clEncapsulatedAttrs,
748		NO_NVP,		// none needed
749		clEncapsulatedIndex),
750	RELATION_INFO(MDS_CDSADIR_TP_PRIMARY_RECORDTYPE,
751		tpPrimaryAttrs,
752		tpPrimaryNvp,
753		tpPrimaryIndex),
754	RELATION_INFO(MDS_CDSADIR_TP_OIDS_RECORDTYPE,
755		tpPolicyOidsAttrs,
756		NO_NVP,		// none needed
757		tpPolicyOidsIndex),
758	RELATION_INFO(MDS_CDSADIR_TP_ENCAPSULATED_PRODUCT_RECORDTYPE,
759		tpEncapsulatedAttrs,
760		tpEncapsulatedNvp,
761		tpEncapsulatedIndex),
762	#if	DEFINE_META_TABLES
763	RELATION_INFO(MDS_CDSADIR_MDS_SCHEMA_RELATIONS,
764		mdsSchemaRelationsAttrs,
765		NO_NVP,
766		mdsSchemaRelationsIndex),
767	RELATION_INFO(MDS_CDSADIR_MDS_SCHEMA_ATTRIBUTES,
768		mdsSchemaAttributesAttrs,
769		NO_NVP,
770		mdsSchemaAttributesIndex),
771	RELATION_INFO(MDS_CDSADIR_MDS_SCHEMA_INDEXES,
772		mdsSchemaIndexesAttrs,
773		NO_NVP,
774		mdsSchemaIndexesIndex),
775	#endif	/* DEFINE_META_TABLES */
776	RELATION_INFO(MDS_CDSADIR_AC_PRIMARY_RECORDTYPE,
777		acPrimaryAttrs,
778		NO_NVP,		// none needed
779		acPrimaryIndex),
780	RELATION_INFO(MDS_CDSADIR_KR_PRIMARY_RECORDTYPE,
781		krPrimaryAttrs,
782		NO_NVP,		// none needed
783		krPrimaryIndex)
784};
785
786const unsigned kNumMdsRelations = sizeof(kMDSRelationInfo) / sizeof(RelationInfo);
787
788// Map a CSSM_DB_RECORDTYPE to a RelationInfo *.
789extern const RelationInfo *MDSRecordTypeToRelation(
790	CSSM_DB_RECORDTYPE recordType)
791{
792	const RelationInfo *relInfo = kMDSRelationInfo;
793	unsigned dex;
794
795	for(dex=0; dex<kNumMdsRelations; dex++) {
796		if(relInfo->DataRecordType == recordType) {
797			return relInfo;
798		}
799		relInfo++;
800	}
801	if(recordType == MDS_OBJECT_RECORDTYPE) {
802		return &kObjectRelation;
803	}
804	return NULL;
805}
806
807// same as above, based on record type as string.
808extern const RelationInfo *MDSRecordTypeNameToRelation(
809	const char *recordTypeName)
810{
811	const RelationInfo *relInfo = kMDSRelationInfo;
812	unsigned dex;
813
814	for(dex=0; dex<kNumMdsRelations; dex++) {
815		if(!strcmp(recordTypeName, relInfo->relationName)) {
816			return relInfo;
817		}
818		relInfo++;
819	}
820	return NULL;
821}
822
823} // end namespace Security
824