2 * Copyright (c) 2002-2017 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
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
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.
21 * @APPLE_LICENSE_HEADER_END@
25 // CertificateValues.cpp
27 #include <security_keychain/Certificate.h>
28 #include <Security/oidscert.h>
29 #include <Security/oidsattr.h>
30 #include <Security/SecCertificate.h>
31 #include <Security/SecCertificatePriv.h>
32 #include "SecCertificateOIDs.h"
33 #include "CertificateValues.h"
34 #include <CoreFoundation/CFNumber.h>
36 // SecCertificateInternal.h cannot be included in this file, due to its
37 // use of types which are not resolved in our macOS-only library.
39 extern "C" CFArrayRef
SecCertificateCopyLegacyProperties(SecCertificateRef certificate
);
40 extern "C" void appendProperty(CFMutableArrayRef properties
, CFStringRef propertyType
,
41 CFStringRef label
, CFStringRef localizedLabel
, CFTypeRef value
);
43 extern const CFStringRef __nonnull kSecPropertyKeyType
;
44 extern const CFStringRef __nonnull kSecPropertyKeyLabel
;
45 extern const CFStringRef __nonnull kSecPropertyKeyLocalizedLabel
;
46 extern const CFStringRef __nonnull kSecPropertyKeyValue
;
48 extern const CFStringRef __nonnull kSecPropertyTypeData
;
49 extern const CFStringRef __nonnull kSecPropertyTypeString
;
50 extern const CFStringRef __nonnull kSecPropertyTypeURL
;
51 extern const CFStringRef __nonnull kSecPropertyTypeDate
;
53 CFStringRef kSecPropertyTypeArray
= CFSTR("array");
54 CFStringRef kSecPropertyTypeNumber
= CFSTR("number");
57 #pragma mark ---------- CertificateValues Implementation ----------
59 using namespace KeychainCore
;
61 void addFieldValues(const void *key
, const void *value
, void *context
);
62 void addPropertyToFieldValues(const void *value
, void *context
);
63 void filterFieldValues(const void *key
, const void *value
, void *context
);
64 void validateKeys(const void *value
, void *context
);
66 CFDictionaryRef
CertificateValues::mOIDRemap
= NULL
;
68 typedef struct FieldValueFilterContext
70 CFMutableDictionaryRef filteredValues
;
71 CFArrayRef filterKeys
;
72 } FieldValueFilterContext
;
74 CertificateValues::CertificateValues(SecCertificateRef certificateRef
) : mCertificateRef(certificateRef
),
75 mCertificateData(NULL
),
76 mCertificateProperties(NULL
)
79 CFRetain(mCertificateRef
);
82 CertificateValues::~CertificateValues() throw()
84 if (mCertificateProperties
)
85 CFRelease(mCertificateProperties
);
87 CFRelease(mCertificateData
);
89 CFRelease(mCertificateRef
);
92 CFArrayRef
CertificateValues::copyPropertyValues(CFErrorRef
*error
)
94 if (!mCertificateProperties
) {
95 mCertificateProperties
= SecCertificateCopyLegacyProperties(mCertificateRef
);
97 if (mCertificateProperties
) {
98 CFRetain(mCertificateProperties
);
101 *error
= CFErrorCreate(NULL
,
102 kCFErrorDomainOSStatus
, errSecInvalidCertificateRef
, NULL
);
104 return mCertificateProperties
;
107 CFDictionaryRef
CertificateValues::copyFieldValues(CFArrayRef keys
, CFErrorRef
*error
)
111 if (CFGetTypeID(keys
)!=CFArrayGetTypeID())
113 CFRange range
= CFRangeMake(0, CFArrayGetCount((CFArrayRef
)keys
));
115 CFArrayApplyFunction(keys
, range
, validateKeys
, &failed
);
120 if (mCertificateData
)
122 CFRelease(mCertificateData
);
123 mCertificateData
= NULL
;
125 if (!mCertificateData
)
127 mCertificateData
= SecCertificateCopyData(mCertificateRef
); // OK to call, no big lock
128 if (!mCertificateData
)
131 *error
= CFErrorCreate(NULL
, kCFErrorDomainOSStatus
, errSecInvalidCertificateRef
, NULL
);
137 SecCertificateRef certificate
= SecCertificateCreateWithData(kCFAllocatorDefault
, mCertificateData
);
141 *error
= CFErrorCreate(NULL
, kCFErrorDomainOSStatus
, errSecInvalidCertificateGroup
, NULL
);
145 CFMutableDictionaryRef fieldValues
=CFDictionaryCreateMutable(kCFAllocatorDefault
, 0,
146 &kCFTypeDictionaryKeyCallBacks
, &kCFTypeDictionaryValueCallBacks
);
148 // Return an array of CFStringRefs representing the common names in the certificates subject if any
149 CFArrayRef commonNames
=SecCertificateCopyCommonNames(certificate
);
152 CFMutableArrayRef additionalValues
= CFArrayCreateMutable(kCFAllocatorDefault
, 0, &kCFTypeArrayCallBacks
);
153 appendProperty(additionalValues
, kSecPropertyTypeArray
, CFSTR("CN"), NULL
, commonNames
);
154 CFDictionaryAddValue(fieldValues
, kSecOIDCommonName
, (CFTypeRef
)CFArrayGetValueAtIndex(additionalValues
, 0));
155 CFRelease(commonNames
);
156 CFRelease(additionalValues
);
159 // These can exist in the subject alt name or in the subject
160 CFArrayRef dnsNames
=SecCertificateCopyDNSNames(certificate
);
163 CFMutableArrayRef additionalValues
= CFArrayCreateMutable(kCFAllocatorDefault
, 0, &kCFTypeArrayCallBacks
);
164 appendProperty(additionalValues
, kSecPropertyTypeArray
, CFSTR("DNS"), NULL
, dnsNames
);
165 CFDictionaryAddValue(fieldValues
, CFSTR("DNSNAMES"), (CFTypeRef
)CFArrayGetValueAtIndex(additionalValues
, 0));
167 CFRelease(additionalValues
);
170 CFArrayRef ipAddresses
=SecCertificateCopyIPAddresses(certificate
);
173 CFMutableArrayRef additionalValues
= CFArrayCreateMutable(kCFAllocatorDefault
, 0, &kCFTypeArrayCallBacks
);
174 appendProperty(additionalValues
, kSecPropertyTypeArray
, CFSTR("IP"), NULL
, dnsNames
);
175 CFDictionaryAddValue(fieldValues
, CFSTR("IPADDRESSES"), (CFTypeRef
)CFArrayGetValueAtIndex(additionalValues
, 0));
176 CFRelease(ipAddresses
);
177 CFRelease(additionalValues
);
180 // These can exist in the subject alt name or in the subject
181 CFArrayRef emailAddrs
=SecCertificateCopyRFC822Names(certificate
);
184 CFMutableArrayRef additionalValues
= CFArrayCreateMutable(kCFAllocatorDefault
, 0, &kCFTypeArrayCallBacks
);
185 appendProperty(additionalValues
, kSecPropertyTypeArray
, CFSTR("DNS"), NULL
, dnsNames
);
186 CFDictionaryAddValue(fieldValues
, kSecOIDEmailAddress
, (CFTypeRef
)CFArrayGetValueAtIndex(additionalValues
, 0));
187 CFRelease(emailAddrs
);
188 CFRelease(additionalValues
);
191 CFAbsoluteTime notBefore
= SecCertificateNotValidBefore(certificate
);
192 CFNumberRef notBeforeRef
= CFNumberCreate(kCFAllocatorDefault
, kCFNumberDoubleType
, ¬Before
);
195 CFMutableArrayRef additionalValues
= CFArrayCreateMutable(kCFAllocatorDefault
, 0, &kCFTypeArrayCallBacks
);
196 appendProperty(additionalValues
, kSecPropertyTypeNumber
, CFSTR("Not Valid Before"), NULL
, notBeforeRef
);
197 CFDictionaryAddValue(fieldValues
, kSecOIDX509V1ValidityNotBefore
, (CFTypeRef
)CFArrayGetValueAtIndex(additionalValues
, 0));
198 CFRelease(notBeforeRef
);
199 CFRelease(additionalValues
);
202 CFAbsoluteTime notAfter
= SecCertificateNotValidAfter(certificate
);
203 CFNumberRef notAfterRef
= CFNumberCreate(kCFAllocatorDefault
, kCFNumberDoubleType
, ¬After
);
206 CFMutableArrayRef additionalValues
= CFArrayCreateMutable(kCFAllocatorDefault
, 0, &kCFTypeArrayCallBacks
);
207 appendProperty(additionalValues
, kSecPropertyTypeNumber
, CFSTR("Not Valid After"), NULL
, notAfterRef
);
208 CFDictionaryAddValue(fieldValues
, kSecOIDX509V1ValidityNotAfter
, (CFTypeRef
)CFArrayGetValueAtIndex(additionalValues
, 0));
209 CFRelease(notAfterRef
);
210 CFRelease(additionalValues
);
213 SecKeyUsage keyUsage
=SecCertificateGetKeyUsage(certificate
);
214 CFNumberRef ku
= CFNumberCreate(kCFAllocatorDefault
, kCFNumberSInt32Type
, &keyUsage
);
217 CFMutableArrayRef additionalValues
= CFArrayCreateMutable(kCFAllocatorDefault
, 0, &kCFTypeArrayCallBacks
);
218 appendProperty(additionalValues
, kSecPropertyTypeNumber
, CFSTR("Key Usage"), NULL
, ku
);
219 CFDictionaryAddValue(fieldValues
, kSecOIDKeyUsage
, (CFTypeRef
)CFArrayGetValueAtIndex(additionalValues
, 0));
221 CFRelease(additionalValues
);
224 CFArrayRef ekus
= SecCertificateCopyExtendedKeyUsage(certificate
);
227 CFMutableArrayRef additionalValues
= CFArrayCreateMutable(kCFAllocatorDefault
, 0, &kCFTypeArrayCallBacks
);
228 appendProperty(additionalValues
, kSecPropertyTypeArray
, CFSTR("Extended Key Usage"), NULL
, ekus
);
229 CFDictionaryAddValue(fieldValues
, kSecOIDExtendedKeyUsage
, (CFTypeRef
)CFArrayGetValueAtIndex(additionalValues
, 0));
231 CFRelease(additionalValues
);
234 // Add all values from properties dictionary
235 CFArrayRef properties
= copyPropertyValues(NULL
);
238 CFRange range
= CFRangeMake(0, CFArrayGetCount((CFArrayRef
)properties
));
239 CFArrayApplyFunction(properties
, range
, addPropertyToFieldValues
, fieldValues
);
240 // CFDictionaryApplyFunction(properties, addFieldValues, fieldValues);
241 CFRelease(properties
);
244 CFAbsoluteTime verifyTime
= CFAbsoluteTimeGetCurrent();
245 CFMutableArrayRef summaryProperties
=
246 SecCertificateCopySummaryProperties(certificate
, verifyTime
);
247 if (summaryProperties
)
249 CFRange range
= CFRangeMake(0, CFArrayGetCount((CFArrayRef
)summaryProperties
));
250 CFArrayApplyFunction(summaryProperties
, range
, addPropertyToFieldValues
, fieldValues
);
251 // CFDictionaryApplyFunction(summaryProperties, addFieldValues, fieldValues);
252 // CFDictionaryAddValue(fieldValues, CFSTR("summaryProperties"), summaryProperties);
253 CFRelease(summaryProperties
);
257 CFRelease(certificate
);
260 return (CFDictionaryRef
)fieldValues
;
262 // Otherwise, we need to filter
263 CFMutableDictionaryRef filteredFieldValues
=CFDictionaryCreateMutable(kCFAllocatorDefault
, 0,
264 &kCFTypeDictionaryKeyCallBacks
, &kCFTypeDictionaryValueCallBacks
);
266 FieldValueFilterContext fvcontext
;
267 fvcontext
.filteredValues
= filteredFieldValues
;
268 fvcontext
.filterKeys
= keys
;
270 CFDictionaryApplyFunction(fieldValues
, filterFieldValues
, &fvcontext
);
272 CFRelease(fieldValues
);
273 return (CFDictionaryRef
)filteredFieldValues
;
276 void validateKeys(const void *value
, void *context
)
278 if (value
== NULL
|| (CFGetTypeID(value
)!=CFStringGetTypeID()))
280 *(bool *)context
= true;
283 void filterFieldValues(const void *key
, const void *value
, void *context
)
285 // each element of keys is a CFStringRef with an OID, e.g.
286 // const CFStringRef kSecOIDTitle = CFSTR("2.5.4.12");
288 CFTypeRef fieldKey
= (CFTypeRef
)key
;
289 if (fieldKey
== NULL
|| (CFGetTypeID(fieldKey
)!=CFStringGetTypeID()) || context
==NULL
)
292 FieldValueFilterContext
*fvcontext
= (FieldValueFilterContext
*)context
;
294 CFRange range
= CFRangeMake(0, CFArrayGetCount(fvcontext
->filterKeys
));
295 CFIndex idx
= CFArrayGetFirstIndexOfValue(fvcontext
->filterKeys
, range
, fieldKey
);
296 if (idx
!= kCFNotFound
)
297 CFDictionaryAddValue(fvcontext
->filteredValues
, fieldKey
, value
);
300 void addFieldValues(const void *key
, const void *value
, void *context
)
302 CFMutableDictionaryRef fieldValues
= (CFMutableDictionaryRef
)context
;
303 CFDictionaryAddValue(fieldValues
, key
, value
);
306 void addPropertyToFieldValues(const void *value
, void *context
)
308 CFMutableDictionaryRef fieldValues
= (CFMutableDictionaryRef
)context
;
309 if (CFGetTypeID(value
)==CFDictionaryGetTypeID())
311 CFStringRef label
= (CFStringRef
)CFDictionaryGetValue((CFDictionaryRef
)value
, kSecPropertyKeyLabel
);
313 CFStringRef typeD
= (CFStringRef
)CFDictionaryGetValue((CFDictionaryRef
)value
, kSecPropertyKeyType
);
314 CFTypeRef valueD
= (CFStringRef
)CFDictionaryGetValue((CFDictionaryRef
)value
, kSecPropertyKeyValue
);
316 CFStringRef key
= CertificateValues::remapLabelToKey(label
);
318 CFDictionaryAddValue(fieldValues
, key
, value
);
322 CFStringRef
CertificateValues::remapLabelToKey(CFStringRef label
)
331 CFSTR("Subject Name"),
332 CFSTR("Normalized Subject Name"),
333 CFSTR("Issuer Name"),
334 CFSTR("Normalized Subject Name"),
336 CFSTR("Serial Number"),
337 CFSTR("Signature Algorithm"),
338 CFSTR("Subject Unique ID"),
339 CFSTR("Issuer Unique ID"),
340 CFSTR("Public Key Algorithm"),
341 CFSTR("Public Key Data"),
343 CFSTR("Not Valid Before"),
344 CFSTR("Not Valid After"),
350 kSecOIDX509V1SubjectName
,
351 kSecOIDX509V1SubjectNameStd
,
352 kSecOIDX509V1IssuerName
,
353 kSecOIDX509V1IssuerNameStd
,
354 kSecOIDX509V1Version
,
355 kSecOIDX509V1SerialNumber
,
356 kSecOIDX509V1SignatureAlgorithm
, // or CSSMOID_X509V1SignatureAlgorithmTBS?
357 kSecOIDX509V1CertificateSubjectUniqueId
,
358 kSecOIDX509V1CertificateIssuerUniqueId
,
359 kSecOIDX509V1SubjectPublicKeyAlgorithm
,
360 kSecOIDX509V1SubjectPublicKey
,
361 kSecOIDX509V1Signature
,
362 kSecOIDX509V1ValidityNotBefore
,
363 kSecOIDX509V1ValidityNotAfter
,
364 kSecOIDInvalidityDate
367 mOIDRemap
= CFDictionaryCreate(NULL
, keys
, values
,
368 (sizeof(keys
) / sizeof(*keys
)), &kCFTypeDictionaryKeyCallBacks
,
369 &kCFTypeDictionaryValueCallBacks
);
372 CFTypeRef result
= (CFTypeRef
)CFDictionaryGetValue(mOIDRemap
, label
);
374 return result
?(CFStringRef
)result
:label
;
377 CFDataRef
CertificateValues::copySerialNumber(CFErrorRef
*error
)
379 CFDataRef result
= NULL
;
380 SecCertificateRef certificate
= copySecCertificateRef(error
);
384 result
= SecCertificateCopySerialNumberData(certificate
, error
);
385 CFRelease(certificate
);
390 CFDataRef
CertificateValues::copyNormalizedIssuerContent(CFErrorRef
*error
)
392 CFDataRef result
= NULL
;
393 SecCertificateRef certificate
= copySecCertificateRef(error
);
396 // this matches the behavior on OS X prior to 10.12, where
397 // normalized content was actually returned as a sequence.
399 result
= SecCertificateCopyNormalizedIssuerSequence(certificate
);
400 CFRelease(certificate
);
405 CFDataRef
CertificateValues::copyNormalizedSubjectContent(CFErrorRef
*error
)
407 CFDataRef result
= NULL
;
408 SecCertificateRef certificate
= copySecCertificateRef(error
);
411 // this matches the behavior on OS X prior to 10.12, where
412 // normalized content was actually returned as a sequence.
414 result
= SecCertificateCopyNormalizedSubjectSequence(certificate
);
415 CFRelease(certificate
);
420 CFDataRef
CertificateValues::copyIssuerSequence(CFErrorRef
*error
)
422 CFDataRef result
= NULL
;
423 SecCertificateRef certificate
= copySecCertificateRef(error
);
426 result
= SecCertificateCopyIssuerSequence(certificate
);
427 CFRelease(certificate
);
432 CFDataRef
CertificateValues::copySubjectSequence(CFErrorRef
*error
)
434 CFDataRef result
= NULL
;
435 SecCertificateRef certificate
= copySecCertificateRef(error
);
438 result
= SecCertificateCopySubjectSequence(certificate
);
439 CFRelease(certificate
);
444 CFStringRef
CertificateValues::copyIssuerSummary(CFErrorRef
*error
)
446 CFStringRef result
= NULL
;
447 SecCertificateRef certificate
= copySecCertificateRef(error
);
450 result
= SecCertificateCopyIssuerSummary(certificate
);
451 CFRelease(certificate
);
456 CFStringRef
CertificateValues::copySubjectSummary(CFErrorRef
*error
)
458 CFStringRef result
= NULL
;
459 SecCertificateRef certificate
= copySecCertificateRef(error
);
462 result
= SecCertificateCopySubjectSummary(certificate
);
463 CFRelease(certificate
);
468 CFDictionaryRef
CertificateValues::copyAttributeDictionary(CFErrorRef
*error
)
470 CFDictionaryRef result
= NULL
;
471 SecCertificateRef certificate
= copySecCertificateRef(error
);
474 result
= SecCertificateCopyAttributeDictionary(certificate
);
475 CFRelease(certificate
);
480 bool CertificateValues::isValid(CFAbsoluteTime verifyTime
, CFErrorRef
*error
)
483 SecCertificateRef certificate
= copySecCertificateRef(error
);
486 result
= SecCertificateIsValid(certificate
, verifyTime
);
487 CFRelease(certificate
);
492 CFAbsoluteTime
CertificateValues::notValidBefore(CFErrorRef
*error
)
494 CFAbsoluteTime result
= 0;
495 SecCertificateRef certificate
= copySecCertificateRef(error
);
498 result
= SecCertificateNotValidBefore(certificate
);
499 CFRelease(certificate
);
504 CFAbsoluteTime
CertificateValues::notValidAfter(CFErrorRef
*error
)
506 CFAbsoluteTime result
= 0;
507 SecCertificateRef certificate
= copySecCertificateRef(error
);
510 result
= SecCertificateNotValidAfter(certificate
);
511 CFRelease(certificate
);
516 SecCertificateRef
CertificateValues::copySecCertificateRef(CFErrorRef
*error
)
518 // SecCertificateCopyData returns an object created with CFDataCreate, so we
519 // own it and must release it
521 if (mCertificateData
)
523 CFRelease(mCertificateData
);
524 mCertificateData
= NULL
;
527 mCertificateData
= SecCertificateCopyData(mCertificateRef
); // OK to call, no big lock
528 if (!mCertificateData
)
532 *error
= CFErrorCreate(NULL
, kCFErrorDomainOSStatus
, errSecInvalidCertificateRef
, NULL
);
537 SecCertificateRef certificate
= SecCertificateCreateWithData(kCFAllocatorDefault
, mCertificateData
);
542 *error
= CFErrorCreate(NULL
, kCFErrorDomainOSStatus
, errSecInvalidCertificateGroup
, NULL
);
550 #pragma mark ---------- OID Constants ----------
552 const CFStringRef kSecOIDADC_CERT_POLICY
= CFSTR("1.2.840.113635.100.5.3");
553 const CFStringRef kSecOIDAPPLE_CERT_POLICY
= CFSTR("1.2.840.113635.100.5.1");
554 const CFStringRef kSecOIDAPPLE_EKU_CODE_SIGNING
= CFSTR("1.2.840.113635.100.4.1");
555 const CFStringRef kSecOIDAPPLE_EKU_CODE_SIGNING_DEV
= CFSTR("1.2.840.113635.100.4.1.1");
556 const CFStringRef kSecOIDAPPLE_EKU_ICHAT_ENCRYPTION
= CFSTR("1.2.840.113635.100.4.3");
557 const CFStringRef kSecOIDAPPLE_EKU_ICHAT_SIGNING
= CFSTR("1.2.840.113635.100.4.2");
558 const CFStringRef kSecOIDAPPLE_EKU_RESOURCE_SIGNING
= CFSTR("1.2.840.113635.100.4.1.4");
559 const CFStringRef kSecOIDAPPLE_EKU_SYSTEM_IDENTITY
= CFSTR("1.2.840.113635.100.4.4");
560 const CFStringRef kSecOIDAPPLE_EXTENSION
= CFSTR("1.2.840.113635.100.6");
561 const CFStringRef kSecOIDAPPLE_EXTENSION_ADC_APPLE_SIGNING
= CFSTR("1.2.840.113635.100.6.1.2.0.0");
562 const CFStringRef kSecOIDAPPLE_EXTENSION_ADC_DEV_SIGNING
= CFSTR("1.2.840.113635.100.6.1.2.0");
563 const CFStringRef kSecOIDAPPLE_EXTENSION_APPLE_SIGNING
= CFSTR("1.2.840.113635.100.6.1.1");
564 const CFStringRef kSecOIDAPPLE_EXTENSION_CODE_SIGNING
= CFSTR("1.2.840.113635.100.6.1");
565 const CFStringRef kSecOIDAPPLE_EXTENSION_INTERMEDIATE_MARKER
= CFSTR("1.2.840.113635.100.6.2");
566 const CFStringRef kSecOIDAPPLE_EXTENSION_WWDR_INTERMEDIATE
= CFSTR("1.2.840.113635.100.6.2.1");
567 const CFStringRef kSecOIDAPPLE_EXTENSION_ITMS_INTERMEDIATE
= CFSTR("1.2.840.113635.100.6.2.2");
568 const CFStringRef kSecOIDAPPLE_EXTENSION_AAI_INTERMEDIATE
= CFSTR("1.2.840.113635.100.6.2.3");
569 const CFStringRef kSecOIDAPPLE_EXTENSION_APPLEID_INTERMEDIATE
= CFSTR("1.2.840.113635.100.6.2.7");
570 const CFStringRef kSecOIDAuthorityInfoAccess
= CFSTR("1.3.6.1.5.5.7.1.1");
571 const CFStringRef kSecOIDAuthorityKeyIdentifier
= CFSTR("2.5.29.35");
572 const CFStringRef kSecOIDBasicConstraints
= CFSTR("2.5.29.19");
573 const CFStringRef kSecOIDBiometricInfo
= CFSTR("1.3.6.1.5.5.7.1.2");
574 const CFStringRef kSecOIDCSSMKeyStruct
= CFSTR("2.16.840.1.113741.2.1.1.1.20");
575 const CFStringRef kSecOIDCertIssuer
= CFSTR("2.5.29.29");
576 const CFStringRef kSecOIDCertificatePolicies
= CFSTR("2.5.29.32");
577 const CFStringRef kSecOIDClientAuth
= CFSTR("1.3.6.1.5.5.7.3.2");
578 const CFStringRef kSecOIDCollectiveStateProvinceName
= CFSTR("2.5.4.8.1");
579 const CFStringRef kSecOIDCollectiveStreetAddress
= CFSTR("2.5.4.9.1");
580 const CFStringRef kSecOIDCommonName
= CFSTR("2.5.4.3");
581 const CFStringRef kSecOIDCountryName
= CFSTR("2.5.4.6");
582 const CFStringRef kSecOIDCrlDistributionPoints
= CFSTR("2.5.29.31");
583 const CFStringRef kSecOIDCrlNumber
= CFSTR("2.5.29.20");
584 const CFStringRef kSecOIDCrlReason
= CFSTR("2.5.29.21");
585 const CFStringRef kSecOIDDOTMAC_CERT_EMAIL_ENCRYPT
= CFSTR("1.2.840.113635.100.3.2.3");
586 const CFStringRef kSecOIDDOTMAC_CERT_EMAIL_SIGN
= CFSTR("1.2.840.113635.100.3.2.2");
587 const CFStringRef kSecOIDDOTMAC_CERT_EXTENSION
= CFSTR("1.2.840.113635.100.3.2");
588 const CFStringRef kSecOIDDOTMAC_CERT_IDENTITY
= CFSTR("1.2.840.113635.100.3.2.1");
589 const CFStringRef kSecOIDDOTMAC_CERT_POLICY
= CFSTR("1.2.840.113635.100.5.2");
590 const CFStringRef kSecOIDDeltaCrlIndicator
= CFSTR("2.5.29.27");
591 const CFStringRef kSecOIDDescription
= CFSTR("2.5.4.13");
592 const CFStringRef kSecOIDEKU_IPSec
= CFSTR("1.3.6.1.5.5.8.2.2");
593 const CFStringRef kSecOIDEmailAddress
= CFSTR("1.2.840.113549.1.9.1");
594 const CFStringRef kSecOIDEmailProtection
= CFSTR("1.3.6.1.5.5.7.3.4");
595 const CFStringRef kSecOIDExtendedKeyUsage
= CFSTR("2.5.29.37");
596 const CFStringRef kSecOIDExtendedKeyUsageAny
= CFSTR("2.5.29.37.0");
597 const CFStringRef kSecOIDExtendedUseCodeSigning
= CFSTR("1.3.6.1.5.5.7.3.3");
598 const CFStringRef kSecOIDGivenName
= CFSTR("2.5.4.42");
599 const CFStringRef kSecOIDHoldInstructionCode
= CFSTR("2.5.29.23");
600 const CFStringRef kSecOIDInvalidityDate
= CFSTR("2.5.29.24");
601 const CFStringRef kSecOIDIssuerAltName
= CFSTR("2.5.29.18");
602 const CFStringRef kSecOIDIssuingDistributionPoint
= CFSTR("2.5.29.28");
603 const CFStringRef kSecOIDIssuingDistributionPoints
= CFSTR("2.5.29.28");
604 const CFStringRef kSecOIDKERBv5_PKINIT_KP_CLIENT_AUTH
= CFSTR("1.3.6.1.5.2.3.4");
605 const CFStringRef kSecOIDKERBv5_PKINIT_KP_KDC
= CFSTR("1.3.6.1.5.2.3.5");
606 const CFStringRef kSecOIDKeyUsage
= CFSTR("2.5.29.15");
607 const CFStringRef kSecOIDLocalityName
= CFSTR("2.5.4.7");
608 const CFStringRef kSecOIDMS_NTPrincipalName
= CFSTR("1.3.6.1.4.1.311.20.2.3");
609 const CFStringRef kSecOIDMicrosoftSGC
= CFSTR("1.3.6.1.4.1.311.10.3.3");
610 const CFStringRef kSecOIDNameConstraints
= CFSTR("2.5.29.30");
611 const CFStringRef kSecOIDNetscapeCertSequence
= CFSTR("2.16.840.1.113730.2.5");
612 const CFStringRef kSecOIDNetscapeCertType
= CFSTR("2.16.840.1.113730.1.1");
613 const CFStringRef kSecOIDNetscapeSGC
= CFSTR("2.16.840.1.113730.4.1");
614 const CFStringRef kSecOIDOCSPSigning
= CFSTR("1.3.6.1.5.5.7.3.9");
615 const CFStringRef kSecOIDOrganizationName
= CFSTR("2.5.4.10");
616 const CFStringRef kSecOIDOrganizationalUnitName
= CFSTR("2.5.4.11");
617 const CFStringRef kSecOIDPolicyConstraints
= CFSTR("2.5.29.36");
618 const CFStringRef kSecOIDPolicyMappings
= CFSTR("2.5.29.33");
619 const CFStringRef kSecOIDPrivateKeyUsagePeriod
= CFSTR("2.5.29.16");
620 const CFStringRef kSecOIDQC_Statements
= CFSTR("1.3.6.1.5.5.7.1.3");
621 const CFStringRef kSecOIDSerialNumber
= CFSTR("2.5.4.5");
622 const CFStringRef kSecOIDServerAuth
= CFSTR("1.3.6.1.5.5.7.3.1");
623 const CFStringRef kSecOIDStateProvinceName
= CFSTR("2.5.4.8");
624 const CFStringRef kSecOIDStreetAddress
= CFSTR("2.5.4.9");
625 const CFStringRef kSecOIDSubjectAltName
= CFSTR("2.5.29.17");
626 const CFStringRef kSecOIDSubjectDirectoryAttributes
= CFSTR("2.5.29.9");
627 const CFStringRef kSecOIDSubjectEmailAddress
= CFSTR("2.16.840.1.113741.2.1.1.1.50.3");
628 const CFStringRef kSecOIDSubjectInfoAccess
= CFSTR("1.3.6.1.5.5.7.1.11");
629 const CFStringRef kSecOIDSubjectKeyIdentifier
= CFSTR("2.5.29.14");
630 const CFStringRef kSecOIDSubjectPicture
= CFSTR("2.16.840.1.113741.2.1.1.1.50.2");
631 const CFStringRef kSecOIDSubjectSignatureBitmap
= CFSTR("2.16.840.1.113741.2.1.1.1.50.1");
632 const CFStringRef kSecOIDSurname
= CFSTR("2.5.4.4");
633 const CFStringRef kSecOIDTimeStamping
= CFSTR("1.3.6.1.5.5.7.3.8");
634 const CFStringRef kSecOIDTitle
= CFSTR("2.5.4.12");
635 const CFStringRef kSecOIDUseExemptions
= CFSTR("2.16.840.1.113741.2.1.1.1.50.4");
636 const CFStringRef kSecOIDX509V1CertificateIssuerUniqueId
= CFSTR("2.16.840.1.113741.2.1.1.1.11");
637 const CFStringRef kSecOIDX509V1CertificateSubjectUniqueId
= CFSTR("2.16.840.1.113741.2.1.1.1.12");
638 const CFStringRef kSecOIDX509V1IssuerName
= CFSTR("2.16.840.1.113741.2.1.1.1.5");
639 const CFStringRef kSecOIDX509V1IssuerNameCStruct
= CFSTR("2.16.840.1.113741.2.1.1.1.5.1");
640 const CFStringRef kSecOIDX509V1IssuerNameLDAP
= CFSTR("2.16.840.1.113741.2.1.1.1.5.2");
641 const CFStringRef kSecOIDX509V1IssuerNameStd
= CFSTR("2.16.840.1.113741.2.1.1.1.23");
642 const CFStringRef kSecOIDX509V1SerialNumber
= CFSTR("2.16.840.1.113741.2.1.1.1.3");
643 const CFStringRef kSecOIDX509V1Signature
= CFSTR("2.16.840.1.113741.2.1.3.2.2");
644 const CFStringRef kSecOIDX509V1SignatureAlgorithm
= CFSTR("2.16.840.1.113741.2.1.3.2.1");
645 const CFStringRef kSecOIDX509V1SignatureAlgorithmParameters
= CFSTR("2.16.840.1.113741.2.1.3.2.3");
646 const CFStringRef kSecOIDX509V1SignatureAlgorithmTBS
= CFSTR("2.16.840.1.113741.2.1.3.2.10");
647 const CFStringRef kSecOIDX509V1SignatureCStruct
= CFSTR("2.16.840.1.113741.2.1.3.2.0.1");
648 const CFStringRef kSecOIDX509V1SignatureStruct
= CFSTR("2.16.840.1.113741.2.1.3.2.0");
649 const CFStringRef kSecOIDX509V1SubjectName
= CFSTR("2.16.840.1.113741.2.1.1.1.8");
650 const CFStringRef kSecOIDX509V1SubjectNameCStruct
= CFSTR("2.16.840.1.113741.2.1.1.1.8.1");
651 const CFStringRef kSecOIDX509V1SubjectNameLDAP
= CFSTR("2.16.840.1.113741.2.1.1.1.8.2");
652 const CFStringRef kSecOIDX509V1SubjectNameStd
= CFSTR("2.16.840.1.113741.2.1.1.1.22");
653 const CFStringRef kSecOIDX509V1SubjectPublicKey
= CFSTR("2.16.840.1.113741.2.1.1.1.10");
654 const CFStringRef kSecOIDX509V1SubjectPublicKeyAlgorithm
= CFSTR("2.16.840.1.113741.2.1.1.1.9");
655 const CFStringRef kSecOIDX509V1SubjectPublicKeyAlgorithmParameters
= CFSTR("2.16.840.1.113741.2.1.1.1.18");
656 const CFStringRef kSecOIDX509V1SubjectPublicKeyCStruct
= CFSTR("2.16.840.1.113741.2.1.1.1.20.1");
657 const CFStringRef kSecOIDX509V1ValidityNotAfter
= CFSTR("2.16.840.1.113741.2.1.1.1.7");
658 const CFStringRef kSecOIDX509V1ValidityNotBefore
= CFSTR("2.16.840.1.113741.2.1.1.1.6");
659 const CFStringRef kSecOIDX509V1Version
= CFSTR("2.16.840.1.113741.2.1.1.1.2");
660 const CFStringRef kSecOIDX509V3Certificate
= CFSTR("2.16.840.1.113741.2.1.1.1.1");
661 const CFStringRef kSecOIDX509V3CertificateCStruct
= CFSTR("2.16.840.1.113741.2.1.1.1.1.1");
662 const CFStringRef kSecOIDX509V3CertificateExtensionCStruct
= CFSTR("2.16.840.1.113741.2.1.1.1.13.1");
663 const CFStringRef kSecOIDX509V3CertificateExtensionCritical
= CFSTR("2.16.840.1.113741.2.1.1.1.16");
664 const CFStringRef kSecOIDX509V3CertificateExtensionId
= CFSTR("2.16.840.1.113741.2.1.1.1.15");
665 const CFStringRef kSecOIDX509V3CertificateExtensionStruct
= CFSTR("2.16.840.1.113741.2.1.1.1.13");
666 const CFStringRef kSecOIDX509V3CertificateExtensionType
= CFSTR("2.16.840.1.113741.2.1.1.1.19");
667 const CFStringRef kSecOIDX509V3CertificateExtensionValue
= CFSTR("2.16.840.1.113741.2.1.1.1.17");
668 const CFStringRef kSecOIDX509V3CertificateExtensionsCStruct
= CFSTR("2.16.840.1.113741.2.1.1.1.21.1");
669 const CFStringRef kSecOIDX509V3CertificateExtensionsStruct
= CFSTR("2.16.840.1.113741.2.1.1.1.21");
670 const CFStringRef kSecOIDX509V3CertificateNumberOfExtensions
= CFSTR("2.16.840.1.113741.2.1.1.1.14");
671 const CFStringRef kSecOIDX509V3SignedCertificate
= CFSTR("2.16.840.1.113741.2.1.1.1.0");
672 const CFStringRef kSecOIDX509V3SignedCertificateCStruct
= CFSTR("2.16.840.1.113741.2.1.1.1.0.1");
673 const CFStringRef kSecOIDSRVName
= CFSTR("1.3.6.1.5.5.7.8.7");