1/*
2 * Copyright (c) 2003-2008,2011,2013 Apple Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
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
11 * file.
12 *
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.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24#ifndef _SECURITY_SECKEYCHAINITEMPRIV_H_
25#define _SECURITY_SECKEYCHAINITEMPRIV_H_
26
27#include <CoreFoundation/CFData.h>
28#include <Security/SecBase.h>
29#include <Security/SecKeychainItem.h>
30
31#if defined(__cplusplus)
32extern "C" {
33#endif
34
35/* Private keychain item attributes */
36enum
37{
38	kSecClassItemAttr            = 'clas',                       /* Item class (KCItemClass) */
39	kSecProtectedDataItemAttr    = 'prot',                       /* Item's data is protected (encrypted) (Boolean) */
40};
41
42/* Temporary: CRL attributes */
43enum
44{
45	kSecCrlEncodingItemAttr			 = 'cren',
46	kSecThisUpdateItemAttr			 = 'crtu',
47	kSecNextUpdateItemAttr			 = 'crnu',
48	kSecUriItemAttr					 = 'curi',	// URI from which it came
49	kSecCrlNumberItemAttr			 = 'crnm',
50	kSecDeltaCrlNumberItemAttr		 = 'dlcr'
51};
52
53/* Unlock referral item attributes */
54enum {
55	kSecReferralTypeAttr			 = 'rtyp',	// type of referral
56	kSecReferralDbNameAttr			 = 'rnam',	// database name
57	kSecReferralDbGuidAttr			 = 'rgui',	// module GUID
58	kSecReferralDbSSIDAttr			 = 'rssi',	// module subservice ID
59	kSecReferralDbSSTypeAttr		 = 'rsty',	// subservice type
60	kSecReferralDbNetnameAttr		 = 'rnnm',	// network name (blob)
61	kSecReferralKeyLabelAttr		 = 'rlbl',	// key's Label
62	kSecReferralKeyAppTagAttr		 = 'rkat'	// key's ApplicationTag
63};
64
65
66/* Extended Attribute record attributes */
67enum {
68	kExtendedAttrRecordTypeAttr		= 'eart',
69	kExtendedAttrItemIDAttr			= 'eaii',
70	kExtendedAttrAttributeNameAttr	= 'eaan',
71	kExtendedAttrAttributeValueAttr	= 'eaav'
72	/* also kSecModDateItemAttr from SecKeychainItem.h */
73};
74
75OSStatus SecKeychainItemCreateNew(SecItemClass itemClass, OSType itemCreator, UInt32 length, const void* data, SecKeychainItemRef* itemRef);
76
77OSStatus SecKeychainItemGetData(SecKeychainItemRef itemRef, UInt32 maxLength, void* data, UInt32* actualLength);
78
79OSStatus SecKeychainItemGetAttribute(SecKeychainItemRef itemRef, SecKeychainAttribute* attribute, UInt32* actualLength);
80
81OSStatus SecKeychainItemSetAttribute(SecKeychainItemRef itemRef, SecKeychainAttribute* attribute);
82
83OSStatus SecKeychainItemAdd(SecKeychainItemRef itemRef);
84
85OSStatus SecKeychainItemAddNoUI(SecKeychainRef keychainRef, SecKeychainItemRef itemRef);
86
87OSStatus SecKeychainItemUpdate(SecKeychainItemRef itemRef);
88
89OSStatus SecKeychainItemSetData(SecKeychainItemRef itemRef, UInt32 length, const void* data);
90
91OSStatus SecKeychainItemFindFirst(SecKeychainRef keychainRef, const SecKeychainAttributeList *attrList, SecKeychainSearchRef *searchRef, SecKeychainItemRef *itemRef);
92
93/*!
94	@function SecKeychainItemCopyRecordIdentifier
95	@abstract Returns the record identifier for a keychain item
96	@param itemRef The item for which the localID is to be returned
97	@param recordIdentifier The returned recordIdentifier
98    @result A result code. See "Security Error Codes" (SecBase.h).
99*/
100
101OSStatus SecKeychainItemCopyRecordIdentifier(SecKeychainItemRef itemRef, CFDataRef *recordIdentifier);
102
103/*!
104	@function SecKeychainItemCopyFromRecordIdentifier
105	@abstract Returns a SecKeychainItemRef, given a keychain and a recordIdentifier
106	@param keychain The keychain in which the item is located
107	@param itemRef The item for which the localID is to be returned
108	@param recordIdentifier The returned localID
109    @result A result code. See "Security Error Codes" (SecBase.h).
110*/
111
112OSStatus SecKeychainItemCopyFromRecordIdentifier(SecKeychainRef keychain,
113												 SecKeychainItemRef *itemRef,
114												 CFDataRef recordIdentifier);
115
116/*!
117	@function SecKeychainItemCopyAttributesAndEncryptedData
118	@abstract Copies the data and/or attributes stored in the given keychain item. You must call SecKeychainItemFreeAttributesAndData()
119			  when you no longer need the attributes and data. If you want to modify the attributes returned here, use SecKeychainModifyAttributesAndData().
120			  The data is not decrypted.
121	@param itemRef A reference to the keychain item to copy.
122	@param info List of tags of attributes to retrieve.
123	@param itemClass The item's class. You should pass NULL if not required.
124	@param attrList on output, an attribute list with the attributes specified by info. You must call SecKeychainItemFreeAttributesAndData() when you no longer need this list.
125	@param length on output the actual length of the data.
126	@param outData Pointer to a buffer containing the data in this item. Pass NULL if not required. You must call SecKeychainItemFreeAttributesAndData() when you no longer need the data.
127    @result A result code.  See "Security Error Codes" (SecBase.h). In addition, errSecParam (-50) may be returned if not enough valid parameters are supplied.
128*/
129OSStatus SecKeychainItemCopyAttributesAndEncryptedData(SecKeychainItemRef itemRef, SecKeychainAttributeInfo *info,
130													   SecItemClass *itemClass, SecKeychainAttributeList **attrList,
131													   UInt32 *length, void **outData);
132
133/*!
134	@function SecKeychainItemModifyEncryptedData
135	@abstract Updates an existing keychain item after changing its data.
136			  The data is not re-encrypted.
137	@param itemRef A reference to the keychain item to modify.
138	@param length The length of the buffer pointed to by data.
139	@param data Pointer to a buffer containing the data to store.
140    @result A result code.  See "Security Error Codes" (SecBase.h).
141	@discussion The keychain item is written to the keychain's permanent data store. If the keychain item has not previously been added to a keychain, a call to the SecKeychainItemModifyContent function does nothing and returns errSecSuccess.
142*/
143OSStatus SecKeychainItemModifyEncryptedData(SecKeychainItemRef itemRef, UInt32 length, const void *data);
144
145/*!
146	@function SecKeychainItemCreateFromEncryptedContent
147	@abstract Creates a new keychain item from the supplied parameters. The data is not re-encrypted.
148	@param itemClass A constant identifying the class of item to create.
149	@param length The length of the buffer pointed to by data.
150	@param data A pointer to a buffer containing the data to store.
151    @param keychainRef A reference to the keychain in which to add the item.
152	@param initialAccess A reference to the access for this keychain item.
153	@param itemRef On return, a pointer to a reference to the newly created keychain item (optional). When the item reference is no longer required, call CFRelease to deallocate memory occupied by the item.
154	@param itemLocalID On return, the item's local ID data (optional). When the local ID data reference is no longer required, call CFRelease to deallocate memory occupied by the reference.
155    @result A result code.  See "Security Error Codes" (SecBase.h). In addition, errSecParam (-50) may be returned if not enough valid parameters are supplied, or errSecAllocate (-108) if there is not enough memory in the current heap zone to create the object.
156*/
157OSStatus SecKeychainItemCreateFromEncryptedContent(SecItemClass itemClass, UInt32 length, const void *data,
158												   SecKeychainRef keychainRef, SecAccessRef initialAccess,
159												   SecKeychainItemRef *itemRef, CFDataRef *itemLocalID);
160#if defined(__cplusplus)
161}
162#endif
163
164#endif /* !_SECURITY_SECKEYCHAINITEMPRIV_H_ */
165