#ifndef _H_DISKIMAGEREP
#define _H_DISKIMAGEREP
#include "singlediskrep.h"
#include "sigblob.h"
#include <DiskImages/DiskImages.h>
#undef check // sadness is having to live with C #defines of this kind...
#include <security_utilities/unix++.h>
namespace Security {
namespace CodeSigning {
class DiskImageRep : public SingleDiskRep {
public:
DiskImageRep(const char *path);
CFDataRef identification();
CFDataRef component(CodeDirectory::SpecialSlot slot);
size_t signingLimit();
void strictValidate(const CodeDirectory* cd, const ToleratedErrors& tolerated, SecCSFlags flags);
std::string format();
void prepareForSigning(SigningContext& state);
static bool candidate(UnixPlusPlus::FileDesc &fd);
public:
static CFDataRef identificationFor(MachO *macho);
public:
DiskRep::Writer *writer();
class Writer;
friend class Writer;
private:
void setup();
static bool readHeader(UnixPlusPlus::FileDesc& fd, UDIFFileHeader& header);
private:
UDIFFileHeader mHeader; size_t mEndOfDataOffset; size_t mHeaderOffset; const EmbeddedSignatureBlob *mSigningData; };
class DiskImageRep::Writer : public SingleDiskRep::Writer, private EmbeddedSignatureBlob::Maker {
friend class FileDiskRep;
public:
Writer(DiskImageRep *r) : SingleDiskRep::Writer(r, writerNoGlobal), rep(r), mSigningData(NULL) { }
void component(CodeDirectory::SpecialSlot slot, CFDataRef data);
void flush();
void addDiscretionary(CodeDirectory::Builder &builder);
private:
DiskImageRep *rep;
EmbeddedSignatureBlob *mSigningData;
};
} }
#endif // !_H_DISKIMAGEREP