#ifndef _H_CDBUILDER
#define _H_CDBUILDER
#include "codedirectory.h"
namespace Security {
namespace CodeSigning {
class CodeDirectory::Builder : public RefCount {
NOCOPY(Builder)
public:
Builder(HashAlgorithm digestAlgorithm);
~Builder();
void executable(string path, size_t pagesize, size_t offset, size_t length);
void reopen(string path, size_t offset, size_t length);
bool opened();
void specialSlot(SpecialSlot slot, CFDataRef data);
void identifier(const std::string &code) { mIdentifier = code; }
void teamID(const std::string &team) { mTeamID = team; }
void flags(uint32_t f) { mFlags = f; }
void platform(uint8_t p) { mPlatform = p; }
std::set<Slot> filledSpecialSlots() const { return mFilledSpecialSlots; }
Scatter *scatter(unsigned count); Scatter *scatter() { return mScatter; }
void execSeg(uint64_t base, uint64_t limit, uint64_t flags) {
mExecSegOffset = base; mExecSegLimit = limit; mExecSegFlags = flags; }
void addExecSegFlags(uint64_t flags) { mExecSegFlags |= flags; }
typedef std::map<CodeDirectory::HashAlgorithm, CFCopyRef<CFDataRef> >
PreEncryptHashMap;
void generatePreEncryptHashes(bool pre) { mGeneratePreEncryptHashes = pre; }
void preservePreEncryptHashMap(PreEncryptHashMap preEncryptHashMap) {
mPreservedPreEncryptHashMap = preEncryptHashMap;
}
void runTimeVersion(uint32_t runtime) {
mRuntimeVersion = runtime;
}
size_t size(const uint32_t version); CodeDirectory *build(); size_t fixedSize(const uint32_t version);
uint32_t hashType() const { return mHashType; }
DynamicHash *getHash() const { return CodeDirectory::hashFor(this->mHashType); }
private:
Hashing::Byte *specialSlot(SpecialSlot slot)
{ assert(slot > 0 && slot <= cdSlotMax); return mSpecial + (slot - 1) * mDigestLength; }
Hashing::Byte *specialSlot(SpecialSlot slot) const
{ assert(slot > 0 && slot <= cdSlotMax); return mSpecial + (slot - 1) * mDigestLength; }
private:
Hashing::Byte *mSpecial; std::set<Slot> mFilledSpecialSlots; UnixPlusPlus::AutoFileDesc mExec; size_t mExecOffset; size_t mExecLength; size_t mPageSize; uint32_t mFlags; uint32_t mHashType; uint8_t mPlatform; uint32_t mDigestLength; std::string mIdentifier; std::string mTeamID;
size_t mSpecialSlots; size_t mCodeSlots;
Scatter *mScatter; size_t mScatterSize;
uint64_t mExecSegOffset; uint64_t mExecSegLimit; uint64_t mExecSegFlags;
bool mGeneratePreEncryptHashes; PreEncryptHashMap mPreservedPreEncryptHashMap;
uint32_t mRuntimeVersion;
CodeDirectory *mDir; };
} }
#endif //_H_CDBUILDER