keyclient.cpp
1 /* 2 * Copyright (c) 2000-2001,2011-2014 Apple 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 26 using namespace CssmClient; 27 28 29 KeyImpl::KeyImpl(const CSP &csp) : ObjectImpl(csp), CssmKey() 30 { 31 mActive=false; 32 } 33 34 KeyImpl::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 41 KeyImpl::KeyImpl(const CSP &csp, const CSSM_DATA &keyData) : ObjectImpl(csp), 42 CssmKey((uint32)keyData.Length, csp->allocator().alloc<uint8>((UInt32)keyData.Length)) 43 { 44 memcpy(KeyData.Data, keyData.Data, keyData.Length); 45 mActive=true; 46 } 47 48 KeyImpl::~KeyImpl() 49 try 50 { 51 deactivate(); 52 } 53 catch (...) 54 { 55 return; // Prevent re-throw of exception [function-try-block] 56 } 57 58 void 59 KeyImpl::deleteKey(const CSSM_ACCESS_CREDENTIALS *cred) 60 { 61 StLock<Mutex> _(mActivateMutex); 62 if (mActive) 63 { 64 mActive=false; 65 check(CSSM_FreeKey(csp()->handle(), cred, this, CSSM_TRUE)); 66 } 67 } 68 69 CssmKeySize 70 KeyImpl::sizeInBits() const 71 { 72 CssmKeySize size; 73 check(CSSM_QueryKeySizeInBits(csp()->handle(), CSSM_INVALID_HANDLE, this, &size)); 74 return size; 75 } 76 77 void 78 KeyImpl::getAcl(AutoAclEntryInfoList &aclInfos, const char *selectionTag) const 79 { 80 aclInfos.allocator(allocator()); 81 check(CSSM_GetKeyAcl(csp()->handle(), this, reinterpret_cast<const CSSM_STRING *>(selectionTag), aclInfos, aclInfos)); 82 } 83 84 void 85 KeyImpl::changeAcl(const CSSM_ACL_EDIT &aclEdit, 86 const CSSM_ACCESS_CREDENTIALS *accessCred) 87 { 88 check(CSSM_ChangeKeyAcl(csp()->handle(), 89 AccessCredentials::needed(accessCred), &aclEdit, this)); 90 } 91 92 void 93 KeyImpl::getOwner(AutoAclOwnerPrototype &owner) const 94 { 95 owner.allocator(allocator()); 96 check(CSSM_GetKeyOwner(csp()->handle(), this, owner)); 97 } 98 99 void 100 KeyImpl::changeOwner(const CSSM_ACL_OWNER_PROTOTYPE &newOwner, 101 const CSSM_ACCESS_CREDENTIALS *accessCred) 102 { 103 check(CSSM_ChangeKeyOwner(csp()->handle(), 104 AccessCredentials::needed(accessCred), this, &newOwner)); 105 } 106 107 void KeyImpl::activate() 108 { 109 StLock<Mutex> _(mActivateMutex); 110 mActive=true; 111 } 112 113 void KeyImpl::deactivate() 114 { 115 StLock<Mutex> _(mActivateMutex); 116 if (mActive) 117 { 118 mActive=false; 119 check(CSSM_FreeKey(csp()->handle(), NULL, this, CSSM_FALSE)); 120 } 121 }