]> git.saurik.com Git - apple/security.git/blobdiff - OSX/libsecurity_keychain/Security/Item.h
Security-57336.1.9.tar.gz
[apple/security.git] / OSX / libsecurity_keychain / Security / Item.h
diff --git a/OSX/libsecurity_keychain/Security/Item.h b/OSX/libsecurity_keychain/Security/Item.h
new file mode 100644 (file)
index 0000000..ff1e205
--- /dev/null
@@ -0,0 +1,213 @@
+/*
+ * Copyright (c) 2000-2004,2011-2014 Apple Inc. All Rights Reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+
+//
+// Item.h
+//
+#ifndef _SECURITY_ITEM_H_
+#define _SECURITY_ITEM_H_
+
+#include <security_keychain/Keychains.h>
+#include <security_keychain/PrimaryKey.h>
+#include <security_cdsa_client/securestorage.h>
+#include <security_keychain/Access.h>
+
+namespace Security
+{
+
+using namespace CssmClient;
+
+namespace KeychainCore
+{
+class Keychain;
+
+class ItemImpl : public SecCFObject
+{
+public:
+       SECCFFUNCTIONS(ItemImpl, SecKeychainItemRef, errSecInvalidItemRef, gTypes().ItemImpl)
+
+    friend class Item;
+       friend class KeychainImpl;
+protected:
+
+       // new item constructors
+    ItemImpl(SecItemClass itemClass, OSType itemCreator, UInt32 length, const void* data, bool inhibitCheck = false);
+
+       ItemImpl(SecItemClass itemClass, SecKeychainAttributeList *attrList, UInt32 length, const void* data);
+
+       // db item constructor
+    ItemImpl(const Keychain &keychain, const PrimaryKey &primaryKey, const CssmClient::DbUniqueRecord &uniqueId);
+
+       // PrimaryKey item constructor
+    ItemImpl(const Keychain &keychain, const PrimaryKey &primaryKey);
+
+public:
+
+       static ItemImpl* make(const Keychain &keychain, const PrimaryKey &primaryKey, const CssmClient::DbUniqueRecord &uniqueId);
+       static ItemImpl* make(const Keychain &keychain, const PrimaryKey &primaryKey);
+
+       ItemImpl(ItemImpl &item);
+
+       // Return true if we got the attribute, false if we only got the actualLength.
+       void getAttributeFrom(CssmDbAttributeData *data, SecKeychainAttribute &attr,  UInt32 *actualLength);
+       void getClass(SecKeychainAttribute &attr,  UInt32 *actualLength);
+
+       // For iOS keys
+       void setPersistentRef(CFDataRef ref);
+       // returns NULL for securityd keys, or the (non-NULL) persistent ref for iOS keys
+       CFDataRef getPersistentRef();
+       
+       PrimaryKey addWithCopyInfo(Keychain &keychain, bool isCopy);
+       Mutex* getMutexForObject();
+
+protected:
+       // Methods called by KeychainImpl;
+
+       // Add the receiver to keychain
+       virtual PrimaryKey add(Keychain &keychain);
+
+       // Get the default value for an attribute
+       static const CSSM_DATA &defaultAttributeValue(const CSSM_DB_ATTRIBUTE_INFO &info);
+
+public:
+    virtual ~ItemImpl();
+    bool isPersistent();
+    bool isModified();
+
+       virtual void update();
+
+       void aboutToDestruct();
+
+       // put a copy of the item into a given keychain
+       virtual Item copyTo(const Keychain &keychain, Access *newAccess = NULL);
+
+    CSSM_DB_RECORDTYPE recordType();
+
+       // Used for writing the record to the database.
+    CssmClient::DbUniqueRecord dbUniqueRecord();
+       const CssmClient::DbAttributes *modifiedAttributes();
+       const CssmData *modifiedData();
+       virtual void didModify(); // Forget any attributes and data we just wrote to the db
+
+       Keychain keychain();
+       PrimaryKey primaryKey();
+       bool operator < (const ItemImpl &other);
+
+       void getAttribute(SecKeychainAttribute& attr,  UInt32 *actualLength);
+       void getData(CssmDataContainer& outData);
+
+       void modifyContent(const SecKeychainAttributeList *attrList, UInt32 dataLength, const void *inData);
+       void getContent(SecItemClass *itemClass, SecKeychainAttributeList *attrList, UInt32 *length, void **outData);
+       static void freeContent(SecKeychainAttributeList *attrList, void *data);
+       static void freeAttributesAndData(SecKeychainAttributeList *attrList, void *data);
+
+       void getAttributesAndData(SecKeychainAttributeInfo *info, SecItemClass *itemClass,
+                                                         SecKeychainAttributeList **attrList, UInt32 *length, void **outData);
+       void modifyAttributesAndData(const SecKeychainAttributeList *attrList, UInt32 dataLength, const void *inData);
+
+       void setAttribute(SecKeychainAttribute& attr);
+       void setAttribute(const CssmDbAttributeInfo &info, const CssmPolyData &data);
+       void setData(UInt32 length,const void *data);
+       void setAccess(Access *newAccess);
+       void copyRecordIdentifier(CSSM_DATA &data);
+       SSGroup group();
+
+    void getContent(DbAttributes *dbAttributes, CssmDataContainer *itemData);
+    void getLocalContent(SecKeychainAttributeList *attributeList, UInt32 *outLength, void **outData);
+
+    bool useSecureStorage(const CssmClient::Db &db);
+       virtual void willRead();
+
+    // create a persistent reference to this item
+    void copyPersistentReference(CFDataRef &outDataRef, bool isSecIdentityRef=false);
+       static Item makeFromPersistentReference(const CFDataRef persistentRef, bool *isIdentityRef=NULL);
+
+       // for keychain syncing
+       void doNotEncrypt () {mDoNotEncrypt = true;}
+
+       // for posting events on this item
+       void postItemEvent (SecKeychainEvent theEvent);
+
+       // Only call these functions while holding globals().apiLock.
+       bool inCache() const throw() { return mInCache; }
+       void inCache(bool inCache) throw() { mInCache = inCache; }
+
+       /* For binding to extended attributes. */
+       virtual const CssmData &itemID();
+
+       /* Overrides for SecCFObject methods */
+       bool equal(SecCFObject &other);
+    virtual CFHashCode hash();
+       
+    bool mayDelete();
+    
+protected:
+       // new item members
+       RefPointer<CssmDataContainer> mData;
+       auto_ptr<CssmClient::DbAttributes> mDbAttributes;
+       SecPointer<Access> mAccess;
+
+       // db item members
+       CssmClient::DbUniqueRecord mUniqueId;
+       Keychain mKeychain;
+       PrimaryKey mPrimaryKey;
+
+       // non-NULL only for secd items (managed by secd, not securityd)
+       CFDataRef secd_PersistentRef;
+
+private:
+       // keychain syncing flags
+       bool mDoNotEncrypt;
+
+       // mInCache is protected by globals().apiLock
+       // True iff we are in the cache of items in mKeychain
+       bool mInCache;
+
+protected:
+       Mutex mMutex;
+};
+
+
+class Item : public SecPointer<ItemImpl>
+{
+public:
+    Item();
+    Item(ItemImpl *impl);
+    Item(SecItemClass itemClass, OSType itemCreator, UInt32 length, const void* data, bool inhibitCheck);
+       Item(SecItemClass itemClass, SecKeychainAttributeList *attrList, UInt32 length, const void* data);
+    Item(const Keychain &keychain, const PrimaryKey &primaryKey, const CssmClient::DbUniqueRecord &uniqueId);
+    Item(const Keychain &keychain, const PrimaryKey &primaryKey);
+       Item(ItemImpl &item);
+};
+
+
+CFIndex GetItemRetainCount(Item& item);
+
+} // end namespace KeychainCore
+
+} // end namespace Security
+
+
+
+#endif // !_SECURITY_ITEM_H_