1/* 2 * Copyright (c) 2009 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// slcrep - DiskRep representing the Mac OS Shared Library Cache 26// 27#ifndef _H_SLCREP 28#define _H_SLCREP 29 30#include "singlediskrep.h" 31#include "sigblob.h" 32#include <security_utilities/unix++.h> 33#include <security_utilities/macho++.h> 34#include <security_utilities/dyldcache.h> 35 36namespace Security { 37namespace CodeSigning { 38 39 40// 41// DYLDCacheRep implements the on-disk format for the Mac OS X 42// Shared Library Cache, which coalesces a set of system libraries 43// and frameworks into one big (mappable) code blob in the sky. 44// 45class DYLDCacheRep : public SingleDiskRep { 46public: 47 DYLDCacheRep(const Context *ctx = NULL); 48 DYLDCacheRep(const char *path); 49 50 CFDataRef component(CodeDirectory::SpecialSlot slot); 51 size_t pageSize(const SigningContext &ctx); 52 size_t signingLimit(); 53 std::string format(); 54 55 static bool candidate(UnixPlusPlus::FileDesc &fd); 56 57public: 58 static CFDataRef identificationFor(MachO *macho); 59 60public: 61 DiskRep::Writer *writer(); 62 class Writer; 63 friend class Writer; 64 65private: 66 void setup(); 67 68private: 69 DYLDCache mCache; 70 const EmbeddedSignatureBlob *mSigningData; // pointer to signature SuperBlob (in mapped memory) 71}; 72 73 74// 75// The write side of a FileDiskRep 76// 77class DYLDCacheRep::Writer : public SingleDiskRep::Writer, private EmbeddedSignatureBlob::Maker { 78 friend class FileDiskRep; 79public: 80 Writer(DYLDCacheRep *r) : SingleDiskRep::Writer(r, writerNoGlobal), rep(r), mSigningData(NULL) { } 81 void component(CodeDirectory::SpecialSlot slot, CFDataRef data); 82 void flush(); 83 void addDiscretionary(CodeDirectory::Builder &builder); 84 85private: 86 DYLDCacheRep *rep; 87 EmbeddedSignatureBlob *mSigningData; 88}; 89 90 91} // end namespace CodeSigning 92} // end namespace Security 93 94#endif // !_H_SLCREP 95