#ifndef _H_MACHOREP
#define _H_MACHOREP
#include "singlediskrep.h"
#include "sigblob.h"
#include <security_utilities/unix++.h>
#include <security_utilities/macho++.h>
namespace Security {
namespace CodeSigning {
class MachORep : public SingleDiskRep {
public:
MachORep(const char *path, const Context *ctx = NULL);
virtual ~MachORep();
CFDataRef component(CodeDirectory::SpecialSlot slot);
CFDataRef identification();
Universal *mainExecutableImage();
void prepareForSigning(SigningContext &context);
size_t signingBase();
size_t signingLimit();
size_t execSegBase(const Architecture *arch);
size_t execSegLimit(const Architecture *arch);
std::string format();
CFDictionaryRef diskRepInformation();
std::string recommendedIdentifier(const SigningContext &ctx);
const Requirements *defaultRequirements(const Architecture *arch, const SigningContext &ctx);
size_t pageSize(const SigningContext &ctx);
void strictValidate(const CodeDirectory* cd, const ToleratedErrors& tolerated, SecCSFlags flags);
void flush();
static bool candidate(UnixPlusPlus::FileDesc &fd);
public:
static CFDataRef identificationFor(MachO *macho);
public:
DiskRep::Writer *writer();
class Writer;
friend class Writer;
protected:
CFDataRef embeddedComponent(CodeDirectory::SpecialSlot slot);
CFDataRef infoPlist();
Requirement *libraryRequirements(const Architecture *arch, const SigningContext &ctx);
private:
static bool needsExecSeg(const MachO& macho);
Universal *mExecutable; EmbeddedSignatureBlob *mSigningData; };
class MachORep::Writer : public SingleDiskRep::Writer {
friend class FileDiskRep;
public:
Writer(MachORep *r) : SingleDiskRep::Writer(r, writerNoGlobal) { }
void component(CodeDirectory::SpecialSlot slot, CFDataRef data);
};
} }
#endif // !_H_MACHOREP