sigblob.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 // sigblob - signature (Super)Blob types 26 // 27 #include "sigblob.h" 28 #include "CSCommon.h" 29 30 31 namespace Security { 32 namespace CodeSigning { 33 34 35 CFDataRef EmbeddedSignatureBlob::component(CodeDirectory::SpecialSlot slot) const 36 { 37 const BlobCore *blob = this->find(slot); 38 39 if (blob) { 40 return blobData(slot, blob); 41 } 42 return NULL; 43 } 44 45 CFDataRef EmbeddedSignatureBlob::blobData(CodeDirectory::SpecialSlot slot, BlobCore const *blob) 46 { 47 if (CodeDirectory::slotAttributes(slot) & cdComponentIsBlob) { 48 return makeCFData(*blob); // is a native Blob 49 } else if (const BlobWrapper *wrap = BlobWrapper::specific(blob)) { 50 return makeCFData(*wrap); 51 } else { 52 MacOSError::throwMe(errSecCSSignatureInvalid); 53 } 54 } 55 56 57 void EmbeddedSignatureBlob::Maker::component(CodeDirectory::SpecialSlot slot, CFDataRef data) 58 { 59 if (CodeDirectory::slotAttributes(slot) & cdComponentIsBlob) 60 add(slot, reinterpret_cast<const BlobCore *>(CFDataGetBytePtr(data))->clone()); 61 else 62 add(slot, BlobWrapper::alloc(CFDataGetBytePtr(data), CFDataGetLength(data))); 63 } 64 65 66 CFDictionaryRef EntitlementBlob::entitlements() const 67 { 68 return makeCFDictionaryFrom(this->at<const UInt8 *>(sizeof(EntitlementBlob)), 69 this->length() - sizeof(EntitlementBlob)); 70 } 71 72 EntitlementDERBlob *EntitlementDERBlob::alloc(size_t length) { 73 size_t blobLength = length + sizeof(BlobCore); 74 if (blobLength < length) { 75 // overflow 76 return NULL; 77 } 78 79 EntitlementDERBlob *b = (EntitlementDERBlob *)malloc(blobLength); 80 81 if (b != NULL) { 82 b->BlobCore::initialize(kSecCodeMagicEntitlementDER, blobLength); 83 } 84 85 return b; 86 } 87 88 } // end namespace CodeSigning 89 } // end namespace Security