2 * Copyright (c) 2000-2004,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 // Keychains.h - The Keychain class
27 #ifndef _SECURITY_KEYCHAINS_H_
28 #define _SECURITY_KEYCHAINS_H_
30 #include <security_cdsa_client/cspclient.h>
31 #include <security_cdsa_client/dlclient.h>
32 #include <security_utilities/refcount.h>
33 #include <security_utilities/seccfobject.h>
34 #include <Security/SecKeychain.h>
35 #include <Security/SecKeychainItem.h>
37 #include "SecCFTypes.h"
38 #include "defaultcreds.h"
45 namespace KeychainCore
53 class KeychainSchemaImpl
: public RefCount
55 NOCOPY(KeychainSchemaImpl
)
57 friend class KeychainSchema
;
59 KeychainSchemaImpl(const CssmClient::Db
&db
);
61 virtual ~KeychainSchemaImpl();
63 CSSM_DB_ATTRIBUTE_FORMAT
attributeFormatFor(CSSM_DB_RECORDTYPE recordType
, uint32 attributeId
) const;
64 const CssmAutoDbRecordAttributeInfo
&primaryKeyInfosFor(CSSM_DB_RECORDTYPE recordType
) const;
66 bool operator <(const KeychainSchemaImpl
&other
) const;
67 bool operator ==(const KeychainSchemaImpl
&other
) const;
69 void getAttributeInfoForRecordType(CSSM_DB_RECORDTYPE recordType
, SecKeychainAttributeInfo
**Info
) const;
70 CssmDbAttributeInfo
attributeInfoFor(CSSM_DB_RECORDTYPE recordType
, uint32 attributeId
) const;
71 bool hasAttribute(CSSM_DB_RECORDTYPE recordType
, uint32 attributeId
) const;
72 bool hasRecordType(CSSM_DB_RECORDTYPE recordType
) const;
74 void didCreateRelation(CSSM_DB_RECORDTYPE inRelationID
,
75 const char *inRelationName
,
76 uint32 inNumberOfAttributes
,
77 const CSSM_DB_SCHEMA_ATTRIBUTE_INFO
*pAttributeInfo
,
78 uint32 inNumberOfIndexes
,
79 const CSSM_DB_SCHEMA_INDEX_INFO
*pIndexInfo
);
82 typedef map
<CSSM_DB_RECORDTYPE
, CssmAutoDbRecordAttributeInfo
*> PrimaryKeyInfoMap
;
83 PrimaryKeyInfoMap mPrimaryKeyInfoMap
;
85 typedef map
<uint32
, CSSM_DB_ATTRIBUTE_FORMAT
> RelationInfoMap
;
86 typedef map
<CSSM_DB_RECORDTYPE
, RelationInfoMap
> DatabaseInfoMap
;
87 DatabaseInfoMap mDatabaseInfoMap
;
91 const RelationInfoMap
&relationInfoMapFor(CSSM_DB_RECORDTYPE recordType
) const;
95 class KeychainSchema
: public RefPointer
<KeychainSchemaImpl
>
99 KeychainSchema(KeychainSchemaImpl
*impl
) : RefPointer
<KeychainSchemaImpl
>(impl
) {}
100 KeychainSchema(const CssmClient::Db
&db
) : RefPointer
<KeychainSchemaImpl
>(new KeychainSchemaImpl(db
)) {}
103 bool operator <(const KeychainSchema
&other
) const
104 { return ptr
&& other
.ptr
? *ptr
< *other
.ptr
: ptr
< other
.ptr
; }
105 bool operator ==(const KeychainSchema
&other
) const
106 { return ptr
&& other
.ptr
? *ptr
== *other
.ptr
: ptr
== other
.ptr
; }
109 typedef KeychainSchemaImpl Impl
;
115 class KeychainImpl
: public SecCFObject
, private CssmClient::Db::DefaultCredentialsMaker
119 SECCFFUNCTIONS(KeychainImpl
, SecKeychainRef
, errSecInvalidKeychain
, gTypes().KeychainImpl
)
121 friend class Keychain
;
122 friend class ItemImpl
;
124 KeychainImpl(const CssmClient::Db
&db
);
127 // Methods called by ItemImpl;
128 void didUpdate(const Item
&inItem
, PrimaryKey
&oldPK
,
130 void completeAdd(Item
&item
, PrimaryKey
&key
);
133 virtual ~KeychainImpl();
135 Mutex
* getKeychainMutex();
136 Mutex
* getMutexForObject();
137 void aboutToDestruct();
139 bool operator ==(const KeychainImpl
&) const;
142 void add(Item
&item
);
143 void addCopy(Item
&item
);
144 void deleteItem(Item
&item
); // item must be persistent.
147 void create(UInt32 passwordLength
, const void *inPassword
);
148 void createWithBlob(CssmData
&blob
);
149 void create(ConstStringPtr inPassword
);
151 void create(const ResourceControlContext
*rcc
);
154 // Locking and unlocking a keychain.
157 void unlock(const CssmData
&password
);
158 void unlock(ConstStringPtr password
); // @@@ This has a length limit, we should remove it.
162 void getSettings(uint32
&outIdleTimeOut
, bool &outLockOnSleep
);
163 void setSettings(uint32 inIdleTimeOut
, bool inLockOnSleep
);
165 // Passing in NULL for either oldPassword or newPassword will cause them to be prompted for.
166 // To specify a zero length password in either case the oldPasswordLength or newPasswordLength
167 // value must be 0 and the oldPassword or newPassword must not be NULL.
168 void changePassphrase(UInt32 oldPasswordLength
, const void *oldPassword
,
169 UInt32 newPasswordLength
, const void *newPassword
);
170 void changePassphrase(ConstStringPtr oldPassword
, ConstStringPtr newPassword
);
172 void authenticate(const CSSM_ACCESS_CREDENTIALS
*cred
); // Does not do an unlock.
174 const char *name() const { return mDb
->name(); }
175 UInt32
status() const;
177 bool isActive() const;
179 KCCursor
createCursor(const SecKeychainAttributeList
*attrList
);
180 KCCursor
createCursor(SecItemClass itemClass
, const SecKeychainAttributeList
*attrList
);
181 CssmClient::Db
database() { return mDb
; }
182 DLDbIdentifier
dlDbIdentifier() const { return mDb
->dlDbIdentifier(); }
184 CssmClient::CSP
csp();
186 PrimaryKey
makePrimaryKey(CSSM_DB_RECORDTYPE recordType
, CssmClient::DbUniqueRecord
&uniqueId
);
187 void gatherPrimaryKeyAttributes(CssmClient::DbAttributes
& primaryKeyAttrs
);
189 const CssmAutoDbRecordAttributeInfo
&primaryKeyInfosFor(CSSM_DB_RECORDTYPE recordType
);
191 Item
item(const PrimaryKey
& primaryKey
);
192 Item
item(CSSM_DB_RECORDTYPE recordType
, CssmClient::DbUniqueRecord
&uniqueId
);
194 CssmDbAttributeInfo
attributeInfoFor(CSSM_DB_RECORDTYPE recordType
, UInt32 tag
);
195 void getAttributeInfoForItemID(CSSM_DB_RECORDTYPE itemID
, SecKeychainAttributeInfo
**Info
);
196 static void freeAttributeInfo(SecKeychainAttributeInfo
*Info
);
197 KeychainSchema
keychainSchema();
199 void didDeleteItem(ItemImpl
*inItemImpl
);
201 void recode(const CssmData
&data
, const CssmData
&extraData
);
202 void copyBlob(CssmData
&dbBlob
);
204 void setBatchMode(Boolean mode
, Boolean rollBack
);
206 // yield default open() credentials for this keychain (as of now)
207 const AccessCredentials
*defaultCredentials();
209 // Only call these functions while holding globals().apiLock.
210 bool inCache() const throw() { return mInCache
; }
211 void inCache(bool inCache
) throw() { mInCache
= inCache
; }
213 void postEvent(SecKeychainEvent kcEvent
, ItemImpl
* item
);
215 void addItem(const PrimaryKey
&primaryKey
, ItemImpl
*dbItemImpl
);
220 void removeItem(const PrimaryKey
&primaryKey
, ItemImpl
*inItemImpl
);
221 ItemImpl
*_lookupItem(const PrimaryKey
&primaryKey
);
223 const AccessCredentials
*makeCredentials();
225 typedef map
<PrimaryKey
, __weak ItemImpl
*> DbItemMap
;
226 // Weak reference map of all items we know about that have a primaryKey
227 DbItemMap mDbItemMap
;
228 // True iff we are in the cache of keychains in StorageManager
233 KeychainSchema mKeychainSchema
;
235 // Data for auto-unlock credentials
236 DefaultCredentials mCustomUnlockCreds
;
238 EventBuffer
*mEventBuffer
;
243 CFIndex
GetKeychainRetainCount(Keychain
& kc
);
245 class Keychain
: public SecPointer
<KeychainImpl
>
249 Keychain(KeychainImpl
*impl
) : SecPointer
<KeychainImpl
>(impl
) {}
252 static Keychain
optional(SecKeychainRef handle
);
255 friend class StorageManager
;
256 Keychain(const CssmClient::Db
&db
)
257 : SecPointer
<KeychainImpl
>(new KeychainImpl(db
)) {}
259 typedef KeychainImpl Impl
;
263 } // end namespace KeychainCore
265 } // end namespace Security
267 #endif // !_SECURITY_KEYCHAINS_H_