SecKeychainItem.cpp [plain text]
#include <Security/SecKeychainItem.h>
#include "SecBridge.h"
#include "KCExceptions.h"
#include "Access.h"
RefPointer<AclBearer> aclBearer(CFTypeRef itemRef)
{
CFTypeID id = CFGetTypeID(itemRef);
if (id == gTypes().item.typeId) {
if (SSGroup group = gTypes().item.required(SecKeychainItemRef(itemRef))->group())
return &*group;
} else if (id == gTypes().keyItem.typeId) {
} else if (id == gTypes().keychain.typeId) {
}
MacOSError::throwMe(errSecNoAccessForItem);
}
CFTypeID
SecKeychainItemGetTypeID(void)
{
BEGIN_SECAPI
return gTypes().item.typeId;
END_SECAPI1(_kCFRuntimeNotATypeID)
}
OSStatus
SecKeychainItemCreateFromContent(SecItemClass itemClass, SecKeychainAttributeList *attrList,
UInt32 length, const void *data, SecKeychainRef keychainRef,
SecAccessRef initialAccess, SecKeychainItemRef *itemRef)
{
BEGIN_SECAPI
KCThrowParamErrIf_(length!=0 && data==NULL);
Item item(itemClass, attrList, length, data);
if (initialAccess)
item->setAccess(gTypes().access.required(initialAccess));
Keychain::optional(keychainRef)->add(item);
if (itemRef)
*itemRef = gTypes().item.handle(*item);
END_SECAPI
}
OSStatus
SecKeychainItemModifyContent(SecKeychainItemRef itemRef, const SecKeychainAttributeList *attrList, UInt32 length, const void *data)
{
BEGIN_SECAPI
Item item = gTypes().item.required(itemRef);
item->modifyContent(attrList, length, data);
END_SECAPI
}
OSStatus
SecKeychainItemCopyContent(SecKeychainItemRef itemRef, SecItemClass *itemClass, SecKeychainAttributeList *attrList, UInt32 *length, void **outData)
{
BEGIN_SECAPI
Item item = gTypes().item.required(itemRef);
item->getContent(itemClass, attrList, length, outData);
END_SECAPI
}
OSStatus
SecKeychainItemFreeContent(SecKeychainAttributeList *attrList, void *data)
{
BEGIN_SECAPI
ItemImpl::freeContent(attrList, data);
END_SECAPI
}
OSStatus
SecKeychainItemModifyAttributesAndData(SecKeychainItemRef itemRef, const SecKeychainAttributeList *attrList, UInt32 length, const void *data)
{
BEGIN_SECAPI
Item item = gTypes().item.required(itemRef);
item->modifyAttributesAndData(attrList, length, data);
END_SECAPI
}
OSStatus
SecKeychainItemCopyAttributesAndData(SecKeychainItemRef itemRef, SecKeychainAttributeInfo *info, SecItemClass *itemClass, SecKeychainAttributeList **attrList, UInt32 *length, void **outData)
{
BEGIN_SECAPI
Item item = gTypes().item.required(itemRef);
item->getAttributesAndData(info, itemClass, attrList, length, outData);
END_SECAPI
}
OSStatus
SecKeychainItemFreeAttributesAndData(SecKeychainAttributeList *attrList, void *data)
{
BEGIN_SECAPI
ItemImpl::freeAttributesAndData(attrList, data);
END_SECAPI
}
OSStatus
SecKeychainItemDelete(SecKeychainItemRef itemRef)
{
BEGIN_SECAPI
Item item = gTypes().item.required( itemRef );
Keychain keychain = item->keychain();
KCThrowIf_( !keychain, errSecInvalidItemRef );
keychain->deleteItem( item ); END_SECAPI
}
OSStatus
SecKeychainItemCopyKeychain(SecKeychainItemRef itemRef, SecKeychainRef* keychainRef)
{
BEGIN_SECAPI
Required(keychainRef) = gTypes().keychain.handle(*gTypes().item.required(itemRef)->keychain());
END_SECAPI
}
OSStatus
SecKeychainItemCreateCopy(SecKeychainItemRef itemRef, SecKeychainRef destKeychainRef,
SecAccessRef initialAccess, SecKeychainItemRef *itemCopy)
{
BEGIN_SECAPI
Item copy = gTypes().item.required(itemRef)->copyTo(Keychain::optional(destKeychainRef));
if (itemCopy)
*itemCopy = gTypes().item.handle(*copy);
END_SECAPI
}
OSStatus
SecKeychainItemGetUniqueRecordID(SecKeychainItemRef keyItemRef, CSSM_DB_UNIQUE_RECORD* uniqueRecordID)
{
BEGIN_SECAPI
uniqueRecordID = gTypes().item.required(keyItemRef)->dbUniqueRecord();
END_SECAPI
}
OSStatus
SecKeychainItemGetDLDBHandle(SecKeychainItemRef itemRef, CSSM_DL_DB_HANDLE* dldbHandle)
{
BEGIN_SECAPI
*dldbHandle = gTypes().item.required(itemRef)->keychain()->database()->handle();
END_SECAPI
}
OSStatus SecAccessCreateFromObject(CFTypeRef sourceRef,
SecAccessRef *accessRef)
{
BEGIN_SECAPI
Required(accessRef); RefPointer<Access> access = new Access(*aclBearer(sourceRef));
*accessRef = gTypes().access.handle(*access);
END_SECAPI
}
OSStatus SecAccessModifyObject(SecAccessRef accessRef, CFTypeRef sourceRef)
{
BEGIN_SECAPI
gTypes().access.required(accessRef)->setAccess(*aclBearer(sourceRef), true);
END_SECAPI
}
OSStatus
SecKeychainItemCopyAccess(SecKeychainItemRef itemRef, SecAccessRef* accessRef)
{
BEGIN_SECAPI
Required(accessRef); RefPointer<Access> access = new Access(*aclBearer(reinterpret_cast<CFTypeRef>(itemRef)));
*accessRef = gTypes().access.handle(*access);
END_SECAPI
}
OSStatus
SecKeychainItemSetAccess(SecKeychainItemRef itemRef, SecAccessRef accessRef)
{
BEGIN_SECAPI
gTypes().access.required(accessRef)->setAccess(*aclBearer(reinterpret_cast<CFTypeRef>(itemRef)), true);
END_SECAPI
}