2 * Copyright (c) 2002-2007,2011-2014 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 // Certificate.h - Certificate objects
27 #ifndef _SECURITY_CERTIFICATE_H_
28 #define _SECURITY_CERTIFICATE_H_
30 #include <security_keychain/Item.h>
32 #include <security_keychain/StorageManager.h>
33 // @@@ This should not be here.
34 #include <Security/SecBase.h>
35 #include <security_cdsa_client/clclient.h>
40 namespace KeychainCore
45 class Certificate
: public ItemImpl
49 SECCFFUNCTIONS(Certificate
, SecCertificateRef
, errSecInvalidItemRef
, gTypes().Certificate
)
51 static CL
clForType(CSSM_CERT_TYPE type
);
53 // new item constructor
54 Certificate(const CSSM_DATA
&data
, CSSM_CERT_TYPE type
, CSSM_CERT_ENCODING encoding
);
57 // db item constructor
58 Certificate(const Keychain
&keychain
, const PrimaryKey
&primaryKey
, const CssmClient::DbUniqueRecord
&uniqueId
);
60 // PrimaryKey item constructor
61 Certificate(const Keychain
&keychain
, const PrimaryKey
&primaryKey
);
64 static Certificate
* make(const Keychain
&keychain
, const PrimaryKey
&primaryKey
, const CssmClient::DbUniqueRecord
&uniqueId
);
65 static Certificate
* make(const Keychain
&keychain
, const PrimaryKey
&primaryKey
);
67 Certificate(Certificate
&certificate
);
68 virtual ~Certificate();
70 virtual void update();
71 virtual Item
copyTo(const Keychain
&keychain
, Access
*newAccess
= NULL
);
72 virtual void didModify(); // Forget any attributes and data we just wrote to the db
74 const CssmData
&data();
75 CSSM_CERT_TYPE
type();
76 CSSM_CERT_ENCODING
encoding();
78 CFDataRef
sha256Hash();
79 CFStringRef
commonName();
80 CFStringRef
distinguishedName(const CSSM_OID
*sourceOid
, const CSSM_OID
*componentOid
);
81 CFStringRef
copyFirstEmailAddress();
82 CFArrayRef
copyEmailAddresses();
83 CFArrayRef
copyDNSNames();
84 CSSM_X509_NAME_PTR
subjectName();
85 CSSM_X509_NAME_PTR
issuerName();
86 CSSM_X509_ALGORITHM_IDENTIFIER_PTR
algorithmID();
87 CSSM_CL_HANDLE
clHandle();
88 void inferLabel(bool addLabel
, CFStringRef
*rtnString
= NULL
);
89 SecPointer
<KeyItem
> publicKey();
90 const CssmData
&publicKeyHash();
91 const CssmData
&subjectKeyIdentifier();
93 static KCCursor
cursorForIssuerAndSN(const StorageManager::KeychainList
&keychains
, const CssmData
&issuer
, const CssmData
&serialNumber
);
94 static KCCursor
cursorForSubjectKeyID(const StorageManager::KeychainList
&keychains
, const CssmData
&subjectKeyID
);
95 static KCCursor
cursorForEmail(const StorageManager::KeychainList
&keychains
, const char *emailAddress
);
96 static KCCursor
cursorForIssuerAndSN_CF(const StorageManager::KeychainList
&keychains
, CFDataRef issuer
, CFDataRef serialNumber
);
98 SecPointer
<Certificate
> findInKeychain(const StorageManager::KeychainList
&keychains
);
99 static SecPointer
<Certificate
> findByIssuerAndSN(const StorageManager::KeychainList
&keychains
, const CssmData
&issuer
, const CssmData
&serialNumber
);
100 static SecPointer
<Certificate
> findBySubjectKeyID(const StorageManager::KeychainList
&keychains
, const CssmData
&subjectKeyID
);
101 static SecPointer
<Certificate
> findByEmail(const StorageManager::KeychainList
&keychains
, const char *emailAddress
);
103 static void normalizeEmailAddress(CSSM_DATA
&emailAddress
);
104 static void getNames(CSSM_DATA_PTR
*sanValues
, CSSM_DATA_PTR snValue
, CE_GeneralNameType generalNameType
, std::vector
<CssmData
> &names
);
106 bool operator < (Certificate
&other
);
107 bool operator == (Certificate
&other
);
109 virtual CFHashCode
hash();
112 CSSM_DATA_PTR
copyFirstFieldValue(const CSSM_OID
&field
);
113 void releaseFieldValue(const CSSM_OID
&field
, CSSM_DATA_PTR fieldValue
);
115 CSSM_DATA_PTR
*copyFieldValues(const CSSM_OID
&field
);
116 void releaseFieldValues(const CSSM_OID
&field
, CSSM_DATA_PTR
*fieldValues
);
117 Boolean
isSelfSigned();
120 virtual void willRead();
121 virtual PrimaryKey
add(Keychain
&keychain
);
122 CSSM_HANDLE
certHandle();
124 void addParsedAttribute(const CSSM_DB_ATTRIBUTE_INFO
&info
, const CSSM_OID
&field
);
126 void addSubjectKeyIdentifier();
127 void populateAttributes();
128 bool verifyEncoding(CSSM_DATA_PTR data
);
131 bool mHaveTypeAndEncoding
;
133 CSSM_CERT_TYPE mType
;
134 CSSM_CERT_ENCODING mEncoding
;
136 CSSM_HANDLE mCertHandle
;
137 CssmData mPublicKeyHash
;
138 uint8 mPublicKeyHashBytes
[20];
139 CssmData mSubjectKeyID
;
140 uint8 mSubjectKeyIDBytes
[20];
141 CSSM_DATA_PTR mV1SubjectPublicKeyCStructValue
; // Hack to prevent algorithmID() from leaking.
142 CSSM_DATA_PTR mV1SubjectNameCStructValue
;
143 CSSM_DATA_PTR mV1IssuerNameCStructValue
;
145 CFDataRef mSha256Hash
;
146 bool mEncodingVerified
;
149 } // end namespace KeychainCore
151 } // end namespace Security
153 #endif // !_SECURITY_CERTIFICATE_H_