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