1divert(-1)
2changecom(/*, */)
3/*
4 * Copyright (c) 2000-2002 Apple Inc. All Rights Reserved.
5 *
6 * The contents of this file constitute Original Code as defined in and are
7 * subject to the Apple Public Source License Version 1.2 (the 'License').
8 * You may not use this file except in compliance with the License. Please obtain
9 * a copy of the License at http://www.apple.com/publicsource and read it before
10 * using this file.
11 *
12 * This Original Code and all software distributed under the License are
13 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
14 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
15 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
16 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
17 * specific language governing rights and limitations under the License.
18 */
19
20define(`startClass',
21`define(`arrayIndex', 0)dnl
22define(`class', $1)dnl
23divert(0)dnl
24// $1 password attributes
25static const CSSM_DB_ATTRIBUTE_INFO $1Attributes[] =
26{
27divert(1)dnl
28// $1 password indices
29static const CSSM_DB_INDEX_INFO $1Indices[] =
30{')
31
32define(`endClass',
33`divert(0)dnl
34};
35
36divert(1)dnl
37`  // Unique (primary) index'
38undivert(3)
39`  // Secondary indices'
40undivert(4)dnl
41};
42
43divert(-1)')
44
45define(`attributeBody',
46`    {
47ifelse(index(`$1',`s'),-1,
48`        CSSM_DB_ATTRIBUTE_NAME_AS_INTEGER,
49        {(char *)((uint64_t)$3<<32|$3)},',
50`        CSSM_DB_ATTRIBUTE_NAME_AS_STRING,
51        {$4},')
52        CSSM_DB_ATTRIBUTE_FORMAT_$7
53    }')
54
55define(`simpleAttribute',
56`const CSSM_DB_ATTRIBUTE_INFO $2 =
57attributeBody($*);
58')
59
60define(`attribute',
61`ifelse(index(`$1',`U'),-1,`',
62`divert(3)dnl
63  {
64    CSSM_DB_INDEX_UNIQUE,
65    CSSM_DB_INDEX_ON_ATTRIBUTE,
66attributeBody($*)
67  },
68')dnl
69ifelse(index(`$1',`I'),-1,`',
70`divert(4)dnl
71  {
72    CSSM_DB_INDEX_NONUNIQUE,
73    CSSM_DB_INDEX_ON_ATTRIBUTE,
74attributeBody($*)
75  },
76')dnl
77divert(2)dnl
78dnl const CSSM_DB_ATTRIBUTE_INFO &`k'class()$2 = class()Attributes[arrayIndex()];
79`#define k'class()$2 class()Attributes[arrayIndex()];
80divert(0)dnl
81attributeBody($*),dnl
82define(`arrayIndex', incr(arrayIndex))dnl
83')
84
85define(`attrInfo',
86`{
87        $1,
88        sizeof($2Attributes) / sizeof(CSSM_DB_ATTRIBUTE_INFO),
89        const_cast<CSSM_DB_ATTRIBUTE_INFO_PTR>($2Attributes)
90    }')
91
92define(`indexInfo',
93`{
94        $1,
95        sizeof($2Indices) / sizeof(CSSM_DB_INDEX_INFO),
96        const_cast<CSSM_DB_INDEX_INFO_PTR>($2Indices)
97    }')
98
99define(`parseInfo',
100`{
101        CSSM_DB_RECORDTYPE_APP_DEFINED_START,
102        {
103            {0,0,0,{0}},
104            {0,0},
105            0,
106            0
107        }
108    }')
109
110define(`startNewClass',
111`define(`indexIndex', 0)dnl
112define(`class', $1)dnl
113divert(2)dnl
114// $1 attributes
115const CSSM_DB_SCHEMA_ATTRIBUTE_INFO $1SchemaAttributeList[] =
116{
117divert(3)dnl
118// $1 indices
119const CSSM_DB_SCHEMA_INDEX_INFO $1SchemaIndexList[] =
120{')
121
122define(`endNewClass',
123`divert(2)dnl
124};
125
126const uint32 class()SchemaAttributeCount = sizeof(class()SchemaAttributeList) / sizeof(CSSM_DB_SCHEMA_ATTRIBUTE_INFO);
127
128divert(3)dnl
129`    // Unique (primary) index'
130undivert(5)
131`    // Secondary indices'
132undivert(6)dnl
133};
134
135const uint32 class()SchemaIndexCount = sizeof(class()SchemaIndexList) / sizeof(CSSM_DB_SCHEMA_INDEX_INFO);
136
137undivert(4)dnl
138divert(0)dnl
139undivert(2)dnl
140undivert(3)dnl')
141
142define(`newAttributeBody',
143`{
144ifelse(index(`$1',`s'),-1,
145`    CSSM_DB_ATTRIBUTE_NAME_AS_INTEGER,
146     {(char *)((uint64_t)$3<<32|$3)},',
147`    CSSM_DB_ATTRIBUTE_NAME_AS_STRING,
148    {$4},')
149    CSSM_DB_ATTRIBUTE_FORMAT_$7
150}')
151
152define(`simpleNewAttribute',
153`const CSSM_DB_ATTRIBUTE_INFO `k'class()$2 =
154newAttributeBody($*);
155')
156
157define(`newAttribute',
158`divert(2)dnl
159    { $3, $4, { $5, $6 }, CSSM_DB_ATTRIBUTE_FORMAT_$7 },
160divert(-1)
161ifelse(index(`$1',`S'),-1,`',
162`divert(4)dnl
163simpleNewAttribute($*)
164divert(-1)')dnl
165
166ifelse(index(`$1',`U'),-1,`',
167`divert(5)dnl
168    { $3, 0, CSSM_DB_INDEX_UNIQUE, CSSM_DB_INDEX_ON_ATTRIBUTE },
169divert(-1)')dnl
170ifelse(index(`$1',`I'),-1,`',
171`define(`indexIndex', incr(indexIndex))dnl
172divert(6)dnl
173    { $3, indexIndex(), CSSM_DB_INDEX_NONUNIQUE, CSSM_DB_INDEX_ON_ATTRIBUTE },
174divert(-1)')')
175
176/* Start of actual output */
177divert(0)dnl
178/*
179 * Generated by m4 from Schema.m4 please do not edit this file.
180 */
181
182`#include <security_cdsa_utilities/Schema.h>'
183
184`#include <Security/SecCertificate.h>'
185`#include <Security/SecTrustPriv.h>'
186`#include <Security/SecKeychainItemPriv.h>'
187`#include <Security/cssmapple.h>'
188`#include <security_utilities/errors.h>'
189
190`#pragma clang diagnostic push'
191`#pragma clang diagnostic ignored "-Wunused-const-variable"'
192
193namespace Security {
194
195namespace KeychainCore {
196
197namespace Schema {
198
199// Meta attributes
200simpleAttribute(`  s', RelationID, 0, (char*) "RelationID", 0, NULL, UINT32)
201simpleAttribute(`  s', RelationName, 1, (char*) "RelationName", 0, NULL, STRING)
202simpleAttribute(`  s', AttributeID, 1, (char*) "AttributeID", 0, NULL, UINT32)
203simpleAttribute(`  s', AttributeNameFormat, 2, (char*) "AttributeNameFormat", 0, NULL, UINT32)
204simpleAttribute(`  s', AttributeName, 3, (char*) "AttributeName", 0, NULL, STRING)
205simpleAttribute(`  s', AttributeNameID, 4, (char*) "AttributeNameID", 0, NULL, BLOB)
206simpleAttribute(`  s', AttributeFormat, 5, (char*) "AttributeFormat", 0, NULL, UINT32)
207simpleAttribute(`  s', IndexType, 3, (char*) "IndexType", 0, NULL, UINT32)
208
209divert(-1)
210startClass(Generic)
211attribute(`  i', CreationDate, kSecCreationDateItemAttr, (char*) "CreationDate", 0, NULL, TIME_DATE)
212attribute(`  i', ModDate, kSecModDateItemAttr, (char*) "ModDate", 0, NULL, TIME_DATE)
213attribute(`  i', Description, kSecDescriptionItemAttr, (char*) "Description", 0, NULL, BLOB)
214attribute(`  i', Comment, kSecCommentItemAttr, (char*) "Comment", 0, NULL, BLOB)
215attribute(`  i', Creator, kSecCreatorItemAttr, (char*) "Creator", 0, NULL, UINT32)
216attribute(`  i', Type, kSecTypeItemAttr, (char*) "Type", 0, NULL, UINT32)
217attribute(`  i', ScriptCode, kSecScriptCodeItemAttr, (char*) "ScriptCode", 0, NULL, SINT32)
218attribute(`  s', PrintName, kSecLabelItemAttr, (char*) "PrintName", 0, NULL, BLOB)
219attribute(`  s', Alias, kSecAlias, (char*) "Alias", 0, NULL, BLOB)
220attribute(`  i', Invisible, kSecInvisibleItemAttr, (char*) "Invisible", 0, NULL, SINT32)
221attribute(`  i', Negative, kSecNegativeItemAttr, (char*) "Negative", 0, NULL, SINT32)
222attribute(`  i', CustomIcon, kSecCustomIconItemAttr, (char*) "CustomIcon", 0, NULL, SINT32)
223attribute(`  i', Protected, kSecProtectedDataItemAttr, (char*) "Protected", 0, NULL, BLOB)
224attribute(`UIi', Account, kSecAccountItemAttr, (char*) "Account", 0, NULL, BLOB)
225attribute(`UIi', Service, kSecServiceItemAttr, (char*) "Service", 0, NULL, BLOB)
226attribute(`  i', Generic, kSecGenericItemAttr, (char*) "Generic", 0, NULL, BLOB)
227endClass()
228
229startClass(Appleshare)
230attribute(`  i', CreationDate, kSecCreationDateItemAttr, (char*) "CreationDate", 0, NULL, TIME_DATE)
231attribute(`  i', ModDate, kSecModDateItemAttr, (char*) "ModDate", 0, NULL, TIME_DATE)
232attribute(`  i', Description, kSecDescriptionItemAttr, (char*) "Description", 0, NULL, BLOB)
233attribute(`  i', Comment, kSecCommentItemAttr, (char*) "Comment", 0, NULL, BLOB)
234attribute(`  i', Creator, kSecCreatorItemAttr, (char*) "Creator", 0, NULL, UINT32)
235attribute(`  i', Type, kSecTypeItemAttr, (char*) "Type", 0, NULL, UINT32)
236attribute(`  i', ScriptCode, kSecScriptCodeItemAttr, (char*) "ScriptCode", 0, NULL, SINT32)
237attribute(`  s', PrintName, kSecLabelItemAttr, (char*) "PrintName", 0, NULL, BLOB)
238attribute(`  s', Alias, kSecAlias, (char*) "Alias", 0, NULL, BLOB)
239attribute(`  i', Invisible, kSecInvisibleItemAttr, (char*) "Invisible", 0, NULL, SINT32)
240attribute(`  i', Negative, kSecNegativeItemAttr, (char*) "Negative", 0, NULL, SINT32)
241attribute(`  i', CustomIcon, kSecCustomIconItemAttr, (char*) "CustomIcon", 0, NULL, SINT32)
242attribute(`  i', Protected, kSecProtectedDataItemAttr, (char*) "Protected", 0, NULL, BLOB)
243attribute(`UIi', Account, kSecAccountItemAttr, (char*) "Account", 0, NULL, BLOB)
244attribute(`UIi', Volume, kSecVolumeItemAttr, (char*) "Volume", 0, NULL, BLOB)
245attribute(`  i', Server, kSecServerItemAttr, (char*) "Server", 0, NULL, BLOB)
246attribute(`  i', Protocol, kSecProtocolItemAttr, (char*) "Protocol", 0, NULL, UINT32)
247attribute(`UIi', Address, kSecAddressItemAttr, (char*) "Address", 0, NULL, BLOB)
248attribute(`UIi', Signature, kSecSignatureItemAttr, (char*) "Signature", 0, NULL, BLOB)
249endClass()
250
251startClass(Internet)
252attribute(`  i', CreationDate, kSecCreationDateItemAttr, (char*) "CreationDate", 0, NULL, TIME_DATE)
253attribute(`  i', ModDate, kSecModDateItemAttr, (char*) "ModDate", 0, NULL, TIME_DATE)
254attribute(`  i', Description, kSecDescriptionItemAttr, (char*) "Description", 0, NULL, BLOB)
255attribute(`  i', Comment, kSecCommentItemAttr, (char*) "Comment", 0, NULL, BLOB)
256attribute(`  i', Creator, kSecCreatorItemAttr, (char*) "Creator", 0, NULL, UINT32)
257attribute(`  i', Type, kSecTypeItemAttr, (char*) "Type", 0, NULL, UINT32)
258attribute(`  i', ScriptCode, kSecScriptCodeItemAttr, (char*) "ScriptCode", 0, NULL, SINT32)
259attribute(`  s', PrintName, kSecLabelItemAttr, (char*) "PrintName", 0, NULL, BLOB)
260attribute(`  s', Alias, kSecAlias, (char*) "Alias", 0, NULL, BLOB)
261attribute(`  i', Invisible, kSecInvisibleItemAttr, (char*) "Invisible", 0, NULL, SINT32)
262attribute(`  i', Negative, kSecNegativeItemAttr, (char*) "Negative", 0, NULL, SINT32)
263attribute(`  i', CustomIcon, kSecCustomIconItemAttr, (char*) "CustomIcon", 0, NULL, SINT32)
264attribute(`  i', Protected, kSecProtectedDataItemAttr, (char*) "Protected", 0, NULL, BLOB)
265attribute(`UIi', Account, kSecAccountItemAttr, (char*) "Account", 0, NULL, BLOB)
266attribute(`UIi', SecurityDomain, kSecSecurityDomainItemAttr, (char*) "SecurityDomain", 0, NULL, BLOB)
267attribute(`UIi', Server, kSecServerItemAttr, (char*) "Server", 0, NULL, BLOB)
268attribute(`UIi', Protocol, kSecProtocolItemAttr, (char*) "Protocol", 0, NULL, UINT32)
269attribute(`UIi', AuthType, kSecAuthenticationTypeItemAttr, (char*) "AuthType", 0, NULL, BLOB)
270attribute(`UIi', Port, kSecPortItemAttr, (char*) "Port", 0, NULL, UINT32)
271attribute(`UIi', Path, kSecPathItemAttr, (char*) "Path", 0, NULL, BLOB)
272endClass()
273
274startNewClass(X509Certificate)
275newAttribute(`UISs', CertType, kSecCertTypeItemAttr, (char*) "CertType", 0, NULL, UINT32)
276newAttribute(`  Ss', CertEncoding, kSecCertEncodingItemAttr, (char*) "CertEncoding", 0, NULL, UINT32)
277newAttribute(`  Ss', PrintName, kSecLabelItemAttr, (char*) "PrintName", 0, NULL, BLOB)
278newAttribute(` ISs', Alias, kSecAlias, (char*) "Alias", 0, NULL, BLOB)
279newAttribute(` ISs', Subject, kSecSubjectItemAttr, (char*) "Subject", 0, NULL, BLOB)
280newAttribute(`UISs', Issuer, kSecIssuerItemAttr, (char*) "Issuer", 0, NULL, BLOB)
281newAttribute(`UISs', SerialNumber, kSecSerialNumberItemAttr, (char*) "SerialNumber", 0, NULL, BLOB)
282newAttribute(` ISs', SubjectKeyIdentifier, kSecSubjectKeyIdentifierItemAttr, (char*) "SubjectKeyIdentifier", 0, NULL, BLOB)
283newAttribute(` ISs', PublicKeyHash, kSecPublicKeyHashItemAttr, (char*) "PublicKeyHash", 0, NULL, BLOB)
284endNewClass()
285
286startNewClass(X509Crl)
287newAttribute(`UISs', CrlType, kSecCrlType, (char*) "CrlType", 0, NULL, UINT32)
288newAttribute(`  Ss', CrlEncoding, kSecCrlEncodingItemAttr, (char*) "CrlEncoding", 0, NULL, UINT32)
289newAttribute(`  Ss', PrintName, kSecLabelItemAttr, (char*) "PrintName", 0, NULL, BLOB)
290newAttribute(`  Ss', Alias, kSecAlias, (char*) "Alias", 0, NULL, BLOB)
291newAttribute(`UISs', Issuer, kSecIssuerItemAttr, (char*) "Issuer", 0, NULL, BLOB)
292newAttribute(`UISs', ThisUpdate, kSecThisUpdateItemAttr, (char*) "ThisUpdate", 0, NULL, BLOB)
293newAttribute(`UISs', NextUpdate, kSecNextUpdateItemAttr, (char*) "NextUpdate", 0, NULL, BLOB)
294newAttribute(`  Ss', URI, kSecUriItemAttr, (char*) "URI", 0, NULL, BLOB)
295newAttribute(` ISs', CrlNumber, kSecCrlNumberItemAttr, (char*) "CrlNumber", 0, NULL, UINT32)
296newAttribute(` ISs', DeltaCrlNumber, kSecDeltaCrlNumberItemAttr, (char*) "DeltaCrlNumber", 0, NULL, UINT32)
297endNewClass()
298
299startNewClass(UserTrust)
300newAttribute(`UISs', TrustedCertificate, kSecTrustCertAttr, (char*) "TrustedCertificate", 0, NULL, BLOB)
301newAttribute(`UISs', TrustedPolicy, kSecTrustPolicyAttr, (char*) "TrustedPolicy", 0, NULL, BLOB)
302newAttribute(`  Ss', PrintName, kSecLabelItemAttr, (char*) "PrintName", 0, NULL, BLOB)
303endNewClass()
304
305startNewClass(UnlockReferral)
306newAttribute(`UISs', Type, kSecReferralTypeAttr, (char*) "Type", 0, NULL, UINT32)
307newAttribute(`UISs', DbName, kSecReferralDbNameAttr, (char*) "DbName", 0, NULL, STRING)
308newAttribute(`UISs', DbNetname, kSecReferralDbNetnameAttr, (char*) "DbNetname", 0, NULL, BLOB)
309newAttribute(`UISs', DbGuid, kSecReferralDbGuidAttr, (char*) "DbGuid", 0, NULL, BLOB)
310newAttribute(`UISs', DbSSID, kSecReferralDbSSIDAttr, (char*) "DbSSID", 0, NULL, UINT32)
311newAttribute(`UISs', DbSSType, kSecReferralDbSSTypeAttr, (char*) "DbSSType", 0, NULL, UINT32)
312newAttribute(` ISs', KeyLabel, kSecReferralKeyLabelAttr, (char*) "KeyLabel", 0, NULL, BLOB)
313newAttribute(` ISs', KeyAppTag, kSecReferralKeyAppTagAttr, (char*) "KeyAppTag", 0, NULL, BLOB)
314newAttribute(`  Ss', PrintName, kSecLabelItemAttr, (char*) "PrintName", 0, NULL, BLOB)
315newAttribute(`  Ss', Alias, kSecAlias, (char*) "Alias", 0, NULL, BLOB)
316endNewClass()
317
318// Extended Attribute
319startNewClass(ExtendedAttribute)
320newAttribute(`UISs', RecordType, kExtendedAttrRecordTypeAttr, (char*) "RecordType", 0, NULL, UINT32)
321newAttribute(`UISs', ItemID, kExtendedAttrItemIDAttr, (char*) "ItemID", 0, NULL, BLOB)
322newAttribute(`UISs', AttributeName, kExtendedAttrAttributeNameAttr, (char*) "AttributeName", 0, NULL, BLOB)
323newAttribute(`  Ss', ModDate, kSecModDateItemAttr, (char*) "ModDate", 0, NULL, TIME_DATE)
324newAttribute(`  Ss', AttributeValue, kExtendedAttrAttributeValueAttr, (char*) "AttributeValue", 0, NULL, BLOB)
325endNewClass()
326
327divert(3)
328static const CSSM_DB_RECORD_ATTRIBUTE_INFO Attributes[] =
329{
330    attrInfo(CSSM_DL_DB_RECORD_GENERIC_PASSWORD, Generic),
331    attrInfo(CSSM_DL_DB_RECORD_APPLESHARE_PASSWORD, Appleshare),
332    attrInfo(CSSM_DL_DB_RECORD_INTERNET_PASSWORD, Internet)
333};
334
335static const CSSM_DB_RECORD_INDEX_INFO Indices[] =
336{
337    indexInfo(CSSM_DL_DB_RECORD_GENERIC_PASSWORD, Generic),
338    indexInfo(CSSM_DL_DB_RECORD_APPLESHARE_PASSWORD, Appleshare),
339    indexInfo(CSSM_DL_DB_RECORD_INTERNET_PASSWORD, Internet)
340};
341
342static const CSSM_DB_PARSING_MODULE_INFO ParseInfos[] =
343{
344    parseInfo(),
345    parseInfo(),
346    parseInfo()
347};
348
349//
350// Public stuff
351//
352const CSSM_DBINFO DBInfo =
353{
354    sizeof(Attributes) / sizeof(CSSM_DB_RECORD_ATTRIBUTE_INFO),
355    const_cast<CSSM_DB_PARSING_MODULE_INFO_PTR>(ParseInfos),
356    const_cast<CSSM_DB_RECORD_ATTRIBUTE_INFO_PTR>(Attributes),
357    const_cast<CSSM_DB_RECORD_INDEX_INFO_PTR>(Indices),
358    CSSM_TRUE,
359    NULL,
360    NULL
361};
362
363//
364// Schema methods
365//
366CSSM_DB_RECORDTYPE
367recordTypeFor(SecItemClass itemClass)
368{
369    switch (itemClass)
370    {
371    case kSecGenericPasswordItemClass: return CSSM_DL_DB_RECORD_GENERIC_PASSWORD;
372    case kSecInternetPasswordItemClass: return CSSM_DL_DB_RECORD_INTERNET_PASSWORD;
373    case 'ashp': return CSSM_DL_DB_RECORD_APPLESHARE_PASSWORD;
374    default: return CSSM_DB_RECORDTYPE(itemClass);
375    }
376}
377
378SecItemClass
379itemClassFor(CSSM_DB_RECORDTYPE recordType)
380{
381    switch (recordType)
382    {
383    case CSSM_DL_DB_RECORD_GENERIC_PASSWORD: return kSecGenericPasswordItemClass;
384    case CSSM_DL_DB_RECORD_INTERNET_PASSWORD: return kSecInternetPasswordItemClass;
385    case CSSM_DL_DB_RECORD_APPLESHARE_PASSWORD: return 'ashp';
386    default: return SecItemClass(recordType);
387    }
388}
389
390const CSSM_DB_ATTRIBUTE_INFO &
391attributeInfo(SecKeychainAttrType attrType)
392{
393    switch (attrType)
394    {
395    case kSecCreationDateItemAttr: return kGenericCreationDate;
396    case kSecModDateItemAttr: return kGenericModDate;
397    case kSecDescriptionItemAttr: return kGenericDescription;
398    case kSecCommentItemAttr: return kGenericComment;
399    case kSecCreatorItemAttr: return kGenericCreator;
400    case kSecTypeItemAttr: return kGenericType;
401    case kSecScriptCodeItemAttr: return kGenericScriptCode;
402    case kSecLabelItemAttr: return kGenericPrintName;
403    case kSecAlias: return kGenericAlias;
404    case kSecInvisibleItemAttr: return kGenericInvisible;
405    case kSecNegativeItemAttr: return kGenericNegative;
406    case kSecCustomIconItemAttr: return kGenericCustomIcon;
407    /* Unique Generic password attributes */
408    case kSecAccountItemAttr: return kGenericAccount;
409    case kSecServiceItemAttr: return kGenericService;
410    case kSecGenericItemAttr: return kGenericGeneric;
411    /* Unique Appleshare password attributes */
412    case kSecVolumeItemAttr: return kAppleshareVolume;
413    case kSecAddressItemAttr: return kAppleshareAddress;
414    case kSecSignatureItemAttr: return kAppleshareSignature;
415    /* Unique AppleShare and Internet attributes */
416    case kSecServerItemAttr: return kAppleshareServer;
417    case kSecProtocolItemAttr: return kAppleshareProtocol;
418    /* Unique Internet password attributes */
419    case kSecSecurityDomainItemAttr: return kInternetSecurityDomain;
420    case kSecAuthenticationTypeItemAttr: return kInternetAuthType;
421    case kSecPortItemAttr: return kInternetPort;
422    case kSecPathItemAttr: return kInternetPath;
423	/* Unique Certificate attributes */
424	case kSecCertTypeItemAttr: return kX509CertificateCertType;
425	case kSecCertEncodingItemAttr: return kX509CertificateCertEncoding;
426	case kSecSubjectItemAttr: return kX509CertificateSubject;
427	case kSecIssuerItemAttr: return kX509CertificateIssuer;
428	case kSecSerialNumberItemAttr: return kX509CertificateSerialNumber;
429	case kSecSubjectKeyIdentifierItemAttr: return kX509CertificateSubjectKeyIdentifier;
430	case kSecPublicKeyHashItemAttr: return kX509CertificatePublicKeyHash;
431	/* Unique UserTrust attributes */
432	case kSecTrustCertAttr: return kUserTrustTrustedCertificate;
433	case kSecTrustPolicyAttr: return kUserTrustTrustedPolicy;
434	/* Unique UnlockReferral attributes */
435	case kSecReferralTypeAttr: return kUnlockReferralType;
436	case kSecReferralDbNameAttr: return kUnlockReferralDbName;
437	case kSecReferralDbGuidAttr: return kUnlockReferralDbGuid;
438	case kSecReferralDbSSIDAttr: return kUnlockReferralDbSSID;
439	case kSecReferralDbSSTypeAttr: return kUnlockReferralDbSSType;
440	case kSecReferralDbNetnameAttr: return kUnlockReferralDbNetname;
441	case kSecReferralKeyLabelAttr: return kUnlockReferralKeyLabel;
442	case kSecReferralKeyAppTagAttr: return kUnlockReferralKeyAppTag;
443	/* Unique ExtendedAttribute attributes */
444	case kExtendedAttrRecordTypeAttr: return kExtendedAttributeRecordType;
445	case kExtendedAttrItemIDAttr: return kExtendedAttributeItemID;
446	case kExtendedAttrAttributeNameAttr: return kExtendedAttributeAttributeName;
447	case kExtendedAttrAttributeValueAttr: return kExtendedAttributeAttributeValue;
448	/* ??? */
449	case kSecProtectedDataItemAttr:  return kGenericProtected;
450    default:
451	{
452		if (attrType == 7)
453		{
454			return kGenericPrintName;
455		}
456		else if (attrType == 8)
457		{
458			return kGenericAlias;
459		}
460		MacOSError::throwMe(errSecNoSuchAttr);
461    }
462	}
463}
464
465} // end namespace Schema
466
467} // end namespace KeychainCore
468
469} // end namespace Security
470
471`#pragma clang diagnostic pop'
472