1/*
2 * Copyright (c) 2000-2001 Apple Computer, Inc. All Rights Reserved.
3 *
4 * The contents of this file constitute Original Code as defined in and are
5 * subject to the Apple Public Source License Version 1.2 (the 'License').
6 * You may not use this file except in compliance with the License. Please obtain
7 * a copy of the License at http://www.apple.com/publicsource and read it before
8 * using this file.
9 *
10 * This Original Code and all software distributed under the License are
11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
15 * specific language governing rights and limitations under the License.
16 */
17
18
19//
20// keyclient
21//
22#include <security_cdsa_client/keyclient.h>
23#include <security_cdsa_utilities/cssmdata.h>
24
25
26using namespace CssmClient;
27
28
29KeyImpl::KeyImpl(const CSP &csp) : ObjectImpl(csp), CssmKey()
30{
31	mActive=false;
32}
33
34KeyImpl::KeyImpl(const CSP &csp, const CSSM_KEY &key, bool copy) : ObjectImpl(csp), CssmKey(key)
35{
36	if (copy)
37		keyData() = CssmAutoData(csp.allocator(), keyData()).release();
38	mActive=true;
39}
40
41KeyImpl::KeyImpl(const CSP &csp, const CSSM_DATA &keyData) : ObjectImpl(csp),
42CssmKey((uint32)keyData.Length, csp->allocator().alloc<uint8>((UInt32)keyData.Length))
43{
44	memcpy(KeyData.Data, keyData.Data, keyData.Length);
45	mActive=true;
46}
47
48KeyImpl::~KeyImpl()
49try
50{
51    deactivate();
52}
53catch (...)
54{
55}
56
57void
58KeyImpl::deleteKey(const CSSM_ACCESS_CREDENTIALS *cred)
59{
60    StLock<Mutex> _(mActivateMutex);
61	if (mActive)
62	{
63		mActive=false;
64		check(CSSM_FreeKey(csp()->handle(), cred, this, CSSM_TRUE));
65	}
66}
67
68CssmKeySize
69KeyImpl::sizeInBits() const
70{
71    CssmKeySize size;
72    check(CSSM_QueryKeySizeInBits(csp()->handle(), CSSM_INVALID_HANDLE, this, &size));
73    return size;
74}
75
76void
77KeyImpl::getAcl(AutoAclEntryInfoList &aclInfos, const char *selectionTag) const
78{
79	aclInfos.allocator(allocator());
80	check(CSSM_GetKeyAcl(csp()->handle(), this, reinterpret_cast<const CSSM_STRING *>(selectionTag), aclInfos, aclInfos));
81}
82
83void
84KeyImpl::changeAcl(const CSSM_ACL_EDIT &aclEdit,
85	const CSSM_ACCESS_CREDENTIALS *accessCred)
86{
87	check(CSSM_ChangeKeyAcl(csp()->handle(),
88		AccessCredentials::needed(accessCred), &aclEdit, this));
89}
90
91void
92KeyImpl::getOwner(AutoAclOwnerPrototype &owner) const
93{
94	owner.allocator(allocator());
95	check(CSSM_GetKeyOwner(csp()->handle(), this, owner));
96}
97
98void
99KeyImpl::changeOwner(const CSSM_ACL_OWNER_PROTOTYPE &newOwner,
100	const CSSM_ACCESS_CREDENTIALS *accessCred)
101{
102	check(CSSM_ChangeKeyOwner(csp()->handle(),
103		AccessCredentials::needed(accessCred), this, &newOwner));
104}
105
106void KeyImpl::activate()
107{
108    StLock<Mutex> _(mActivateMutex);
109	mActive=true;
110}
111
112void KeyImpl::deactivate()
113{
114    StLock<Mutex> _(mActivateMutex);
115	if (mActive)
116	{
117		mActive=false;
118		check(CSSM_FreeKey(csp()->handle(), NULL, this, CSSM_FALSE));
119	}
120}
121