Requirements.cpp
1 /* 2 * Copyright (c) 2006,2011,2014 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 // 25 // Requirements - SecRequirement API objects 26 // 27 #include "Requirements.h" 28 29 namespace Security { 30 namespace CodeSigning { 31 32 33 // 34 // Create from a Requirement blob in memory 35 // 36 SecRequirement::SecRequirement(const void *data, size_t length) 37 : mReq(NULL) 38 { 39 const Requirement *req = (const Requirement *)data; 40 if (!req->validateBlob(length)) 41 MacOSError::throwMe(errSecCSReqInvalid); 42 mReq = req->clone(); 43 } 44 45 46 // 47 // Create from a genuine Requirement object 48 // 49 SecRequirement::SecRequirement(const Requirement *req, bool transferOwnership) 50 : mReq(NULL) 51 { 52 if (!req->validateBlob()) 53 MacOSError::throwMe(errSecCSReqInvalid); 54 55 if (transferOwnership) 56 mReq = req; 57 else 58 mReq = req->clone(); 59 } 60 61 62 // 63 // Clean up a SecRequirement object 64 // 65 SecRequirement::~SecRequirement() _NOEXCEPT 66 try { 67 ::free((void *)mReq); 68 } catch (...) { 69 return; 70 } 71 72 73 // 74 // CF-level comparison of SecRequirement objects compares the entire requirement 75 // structure for equality. This means that two requirement programs are recognized 76 // as equal if they're written identically (modulo comments and syntactic sugar). 77 // Obviously, equality of outcome is not in the cards. :-) 78 // 79 bool SecRequirement::equal(SecCFObject &secOther) 80 { 81 SecRequirement *other = static_cast<SecRequirement *>(&secOther); 82 return !memcmp(this->requirement(), other->requirement(), this->requirement()->length()); 83 } 84 85 CFHashCode SecRequirement::hash() 86 { 87 return CFHash(CFTempDataWrap(*this->requirement())); 88 } 89 90 91 } // end namespace CodeSigning 92 } // end namespace Security