slcrep.h
1 /* 2 * Copyright (c) 2009,2011-2012 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 36 namespace Security { 37 namespace 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 // 45 class DYLDCacheRep : public SingleDiskRep { 46 public: 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 57 public: 58 static CFDataRef identificationFor(MachO *macho); 59 60 public: 61 DiskRep::Writer *writer(); 62 class Writer; 63 friend class Writer; 64 65 private: 66 void setup(); 67 68 private: 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 // 77 class DYLDCacheRep::Writer : public SingleDiskRep::Writer, private EmbeddedSignatureBlob::Maker { 78 friend class FileDiskRep; 79 public: 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 85 private: 86 DYLDCacheRep *rep; 87 EmbeddedSignatureBlob *mSigningData; 88 }; 89 90 91 } // end namespace CodeSigning 92 } // end namespace Security 93 94 #endif // !_H_SLCREP